AroonとMACDを組み合わせる考え方 — 時間軸と値幅軸で勢いのズレを読む

Aroon(アルーン)とMACD(移動平均収束拡散法)は、どちらもトレンドの勢いを見る指標として紹介されることが多いものの、測っている「軸」が異なります。Aroonは直近の高値・安値を 何本前につけたか という時間の情報だけを、MACDは短期と長期の移動平均が どれだけ離れ、その差が広がっているか縮んでいるか という値幅の情報を扱います。本稿では、この2つの軸が一致する局面とズレる局面を「状態」として分類する組み合わせ方を取り上げ、その理屈とcBot実装時の設計ポイントを整理します。ダイバージェンス(価格と指標の逆行)を機械的に扱いたい自作派の方や、開発委託の要件を詰めたい方に向けた内容です。

高値更新が続く中でMACDヒストグラムの山が先に低くなり、その後更新が止まってもMACDラインだけがプラス圏に残る様子を示す3パネルの模式図

Aroonの役割

Aroonは、直近n本の中で最高値をつけた足からの経過本数をAroon Up、最安値をつけた足からの経過本数をAroon Downとして、それぞれ0〜100に換算した指標です。その足で高値を更新すればAroon Upは100となり、更新がないまま時間が経つほど階段状に下がっていきます。基礎は別記事のアルーン入門で解説しています。

この指標の特徴は、値幅を一切見ていない ことです。直前の高値をわずかに上抜けても、大きく突き抜けても、Aroon Upは同じ100を示します。そのため単独では「更新が起きている」ことは分かっても、「その更新にどれだけの力が伴っているか」は判定できません。また、レンジ相場ではUpとDownが交互に高位へ跳ねるため、両者のクロスをそのままシグナルとして扱うとダマシが増えやすい点も、単独使用時の限界として挙げられます。

MACDの役割

MACDは、短期EMA(指数平滑移動平均)から長期EMAを引いた差をMACDライン、その平滑値をシグナルライン、両者の差をヒストグラムとして表示する指標です。ヒストグラムが0より上で伸びていれば上方向の勢いが拡大中、縮んでいれば勢いが鈍っている、という読み方が一般的です。詳しくはMACDの基礎を参照してください。

単独使用時の限界は二つあります。一つは、移動平均を重ねて平滑化しているぶん反応が遅れることです。もう一つは、価格が新しい領域に進んでいるかどうかを直接は語らない ことです。高値の更新が止まっていても、過去の上昇分が移動平均に残っている間はMACDラインがプラス圏にとどまり、勢いの「残像」を見せ続けます。さらに、MACDの値は価格の単位で表されるため、銘柄や時間足をまたいで同じ閾値を使えません。ロジック設計では見落とされがちな制約です。

なぜこの組み合わせか

この組み合わせの要点は、「更新が起きているか」を時間軸で、「更新に勢いが伴っているか」を値幅軸で確認し、両者の一致とズレをそれぞれ意味のある状態として扱う ことにあります。どちらか一方で強弱を決めるのではなく、2つの答えの組を読むという発想です。

上方向を例にすると、状態は次の4つに整理できます。

状態AroonMACD一般的な読み方
一致Upが高位(更新が続く)ヒストグラムがプラスで拡大更新と勢いが揃っている
鈍化Upが高位(更新が続く)ヒストグラムの山が前回より低い更新は続くが勢いが細っている
残像Upが低下(更新が途絶えた)MACDラインはまだプラス圏勢いの数値だけが遅れて残っている
拮抗Up・Downが交互に跳ねる0付近で反転を繰り返す方向感が乏しい

特に注目したいのが「鈍化」です。高値を更新しているのにヒストグラムの山が前回より低いという形は、一般にダイバージェンスと呼ばれる構造に近いものです。ダイバージェンスを自動検出しようとすると、通常は「どこが山でどこが谷か」を決めるスイング判定が必要になり、実装の難所になります。Aroon Upが100になった足を「高値更新イベント」とみなせば、イベントごとのMACDの値を前の波と比べるだけで、スイング判定に頼らずに逆行の候補を拾えます。考え方の土台はダイバージェンスとはで整理しています。

一方の「残像」は、MACD単独では勢いが続いているように見える局面を、Aroonの側から「更新はすでに止まっている」と指摘できる状態です。つまり、AroonはMACDの遅れを、MACDはAroonの値幅への無関心を補完する関係になります。

ただし、この分類は相場の先行きを示すものではなく、判定材料を整理するための枠組み にすぎません。「鈍化」のあとに更新が再開することもあれば、「一致」の直後に反転することもあります。4状態のどれを新規エントリーの候補とし、どれを手仕舞いや様子見の検討材料にするかは、検証を通じて決める設計判断です。

パラメータをどう考えるか

ここで挙げる数値は出発点にすぎず、時間足と銘柄ごとにバックテストで確かめることが前提です。検証の進め方はバックテストとはにまとめています。

Aroonの期間: 原典の25が出発点になります。短くすると高値更新イベントが頻発して状態の判定が細かく揺れ、長くすると大きな波の更新だけが残ります。

MACDの設定: 広く使われる12/26/9が出発点です。短期寄りにすると鈍化の検知は早まる一方、ヒストグラムの山谷が増えて比較が不安定になります。

両者の時間スケールを揃えるか: この組み合わせ特有の論点です。Aroonの期間とMACDの長期EMAを近い長さにすると、両者がおおむね同じ大きさの波を見ることになり、状態の分類が解釈しやすくなります。逆にAroonを短く、MACDを長くすると「小さな更新を大きな流れの勢いで評価する」構成になり、ロジックの性格が変わります。どちらが正解ということはなく、狙う波の大きさに合わせて決めることをおすすめします。

時間足については、短い足ほど高値更新イベントの回数が増え、比較の対象も細かくなります。短期足はノイズ寄り、長めの足は判定回数が少なめ、という方向性を踏まえて検証範囲を決めると効率的です。

cBot化する際の考慮点

cTraderのcBotとして組むときに、設計段階で決めておきたい点を整理します。

確定足で評価する: 未確定の足ではAroonもMACDも値が動くため、OnBarイベントで1本前の確定足を参照するのが基本です。OnTickで判定すると、足の途中で高値更新イベントが発生しては消える揺れを拾ってしまいます。

ウォームアップ期間を長めに取る: MACDはEMAを重ねて計算するため、計算開始直後の値は初期値の影響を受けやすく、Aroonより安定に時間がかかります。NaNの除外に加えて、起動後しばらくは判定しない待機本数を設けておくと、バックテスト冒頭の不自然なシグナルを防げます。

「何と何を比べるか」を先に定義する: 鈍化判定で最も設計が分かれるのがここです。高値更新が連続する足同士でヒストグラムを比べても差が出にくいため、「Aroon Upが高位にある間のヒストグラム最大値」を波ごとに記録し、前の波の最大値と比べる、といった比較単位の定義が必要になります。Aroon Downが優勢に切り替わったら記録をリセットする処理も欠かせません。

MACDの値は相対で扱う: 前述のとおりMACDは価格単位のため、ヒストグラムの絶対値に閾値を置く設計は銘柄をまたいで使えません。符号、前の足との大小、前の波との比較といった相対的な使い方に留めると、複数銘柄へ展開しやすくなります。

ポジション管理とは切り離す: 「鈍化」や「残像」は手仕舞いを検討する材料にはなりますが、損切りの代わりにはなりません。状態判定とは独立に、発注時点でストップロスを置く設計を前提としてください。

骨格となるコード断片を示します。

private Aroon _aroon;
private MacdCrossOver _macd;
private double _prevWavePeak = double.NaN;  // 前の波のヒストグラム最大値
private double _currWavePeak = double.NaN;  // 現在の波のヒストグラム最大値

protected override void OnStart()
{
    _aroon = Indicators.Aroon(25);
    _macd = Indicators.MacdCrossOver(Bars.ClosePrices, 26, 12, 9);
}

protected override void OnBar()
{
    double up = _aroon.Up.Last(1);              // 確定足で評価
    double hist = _macd.Histogram.Last(1);
    double histPrev = _macd.Histogram.Last(2);
    if (double.IsNaN(up) || double.IsNaN(hist) || double.IsNaN(histPrev)) return;

    bool newHigh = up > 99.9;                    // この足で高値を更新した
    bool expanding = hist > 0 && hist > histPrev;

    if (newHigh)
    {
        _currWavePeak = double.IsNaN(_currWavePeak) ? hist : Math.Max(_currWavePeak, hist);
        bool weakening = !double.IsNaN(_prevWavePeak) && hist > 0 && hist < _prevWavePeak;
        // expanding / weakening を組にして「一致」「鈍化」の判定材料としてログへ渡す
    }
    // 波の終わり(Upの低下やDown優勢)を検知したら _currWavePeak を _prevWavePeak へ移す
}

波の終わりをどう定義するか(Aroon Upがどこまで下がったら区切るか)は、この組み合わせで特に検証が必要な設計項目の一つです。また、同値の高値が並んだときにどの足を最高値とみなすかは実装によって異なる場合があるため、他プラットフォームのロジックを移植する際は値を突き合わせて確認しておくと安心です。

実装の流れ

処理は次の4段階に分けると見通しがよくなります。

  1. データ取得と計算: OnBarで確定足を対象に、Aroon(Up/Down)とMACD(ライン・ヒストグラム)を計算し、NaNとウォームアップ期間を除外する
  2. イベント検出: Aroon Upが100になった足を高値更新イベントとして記録する(下方向はDownで対称に扱う)
  3. 状態分類: ヒストグラムの符号・拡大縮小・前の波との比較、MACDラインの位置から、一致/鈍化/残像/拮抗のいずれかに分類する
  4. 出力: 状態ラベルを後段の執行ロジックとログへ渡し、状態の遷移もあわせて記録する

ポイントは、Aroon×MACDの部分を売買判断そのものではなく、相場の状態にラベルを貼る分類器 として独立させることです。「一致のときだけ新規を検討する」「鈍化に遷移したら建値ストップへの移行を検討する」といった使い方は後段で差し替えられるため、同じ分類器を複数の戦略案の検証に使い回せます。状態ごとの出現頻度や遷移の順序をログに残しておけば、検証の設計にも役立ちます。

確定足での計算から高値更新イベントの検出、MACDとの比較を経て、一致・鈍化・残像・拮抗の4状態に分類し後段へ渡す処理フロー図

どう活用するか

自作派の方は、本稿の「イベント検出 → 状態分類 → 出力」の構成を、そのままクラスやメソッドの分け方の目安として、Claude Codeと対話しながら組み立ててみてください。特に鈍化判定の比較単位は、言葉で定義を詰めてからコードに落とすと手戻りが減ります。委託派の方は、ai-programming.xyzへ相談される際に「Aroonの高値更新とMACDのズレで状態を分類したい」と伝えていただくと、要件のすり合わせがスムーズになります。体系的に学びたい方にとって、2つの指標の答えを掛け合わせて状態を定義する題材は、条件分岐の設計を学ぶ教材として扱いやすいはずです。実装の参考になれば幸いです。

本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。