AroonとRSIを組み合わせる考え方 — 押し目を「長さ」と「深さ」の二軸で測る

上昇の途中で価格が一服したとき、それを「押し目」として扱うか「流れの終わり」として扱うかは、ロジック設計でもっとも迷いやすい分岐の一つです。本記事では、この判断材料を 押し目の長さ(高値から何本経ったか) と 押し目の深さ(勢いがどこまで冷めたか) の2つに分け、前者をAroon(アルーン)、後者をRSI(相対力指数)に担当させる組み合わせを取り上げます。

押し目をRSIだけで測ると「いつまで待つか」が決まらず、Aroonだけで測ると「どこまで下げたか」が分かりません。二軸で見ることで、押し目の評価に 期限 を設けられる点がこの構成の特徴です。押し目買い系のcBotを自作したい方、開発委託の要件を整理したい方に向けて、設計の考え方を共有します。特定の設定が成果を保証するという話ではありません。

上段の価格が高値をつけた後に押し、中段のAroon Upが階段状に下がり、下段のRSIが中間帯まで冷めてから持ち直す様子を示し、Aroon Upが下限を割る前の区間だけを評価窓として網掛けした3パネルの模式図

Aroonの役割

Aroonは、直近n本の中で最高値をつけた足から何本経ったかをAroon Up、最安値をつけた足から何本経ったかをAroon Downとして、0〜100に換算した指標です。読み方の基礎はアルーン入門で解説しています。

この組み合わせで注目するのは、Aroon Upが 高値更新からの経過本数をそのまま表している という性質です。高値を更新した足で100になり、更新がなければ1本ごとに一定幅ずつ下がります。つまりAroon Upは、押し目の「長さ」を測る時計として使えます。

単独使用時の限界は、値幅を一切見ていないことです。高値からわずかに下げただけの押しも、大きく崩れた押しも、経過本数が同じならAroon Upは同じ値を示します。また、レンジ相場ではUpとDownが交互に高位へ跳ねるため、両者の位置関係だけで方向を決めるとダマシが増えやすくなります。

RSIの役割

RSIは、一定期間の上昇幅と下落幅のうち、上昇側がどれだけの割合を占めるかを0〜100で表すオシレーターです。基本はRSIの基礎にまとめています。

この構成では、RSIを「買われ過ぎ・売られ過ぎ」の判定には使いません。上昇局面で高位にあったRSIが、押しの過程で中間帯までどれだけ冷めたかという 押し目の深さ の物差しとして使います。

単独使用時の限界は2つあります。1つは、トレンドの強い局面では高位・低位に張り付き、逆張りの目安として機能しにくいこと。もう1つは、時間の概念を持たないことです。RSIが中間帯でゆっくり横ばいになっている場面が、「押し目の最中」なのか「流れが止まって横ばいへ移った後」なのかを、RSI単独では区別できません。

なぜこの組み合わせか

押し目を評価するときに知りたいのは、「どれくらい下げたか」と「どれくらい続いているか」の両方です。RSIが前者に、Aroonが後者に答えるため、2つを組にすると押し目を次の4つに仕分けられます。

押し目の型長さ(Aroon Up)深さ(RSI)一般的な読み方
短く浅い高位を保つ中間帯で下げ止まる一服の範囲にとどまっている材料
短く深い高位を保つ低位まで急低下一服を超えた急な崩れの可能性
長く浅い下限まで低下中間帯で横ばい勢いが抜けて横ばいへ移った可能性
長く深い下限まで低下低位で推移流れそのものが変わった可能性

一般論として、押し目買いの文脈で検討対象になりやすいのは「短く浅い」型です。残りの3つは、それぞれ別の理由で見送りや警戒の材料になります。

この構成の要点は、Aroon Upの下限が押し目評価の期限になる ことです。RSIだけで押し目を待つ設計では、条件が整うまで何十本でも待ち続けてしまい、横ばいへ移った後の反発を「押し目からの戻り」として拾う場面が出てきます。Aroon Upが下限を割った時点で「この高値に対する押し目の評価は終了」と決めておけば、古くなった前提で判定し続けることを防げます。

逆方向の補完もあります。Aroon Upが高位にある間でも、RSIが低位まで急低下していれば「時間は短いが崩れ方が大きい」押しだと判別できます。つまりRSIはAroonの値幅への無関心を、AroonはRSIの時間への無関心を補う関係です。押し目そのものの考え方は押し目と戻りの基礎も参考になります。

なお、Aroonを別の指標と組み合わせて「状態を分類する」発想はAroonとMACDの組み合わせでも扱っています。そちらは高値更新の最中の勢いの細り方を、本記事は更新が止まった後の押しの形を見ている点が異なります。

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

ここで挙げる値は出発点にすぎず、銘柄と時間足ごとに検証することが前提です。

Aroonの期間と下限: 期間25が出発点としてよく使われます。期間25の場合、Aroon Upは1本ごとに4ずつ下がる計算になるため、下限を60に置くと「高値から10本程度まで」を押し目の評価期間とみなすことになります。下限を高くすれば短い押しだけを、低くすれば長めの押しまでを対象にする、という関係です。換算の細部は実装によって1本ずれる場合があるため、使う環境で値を突き合わせて確認してください。

RSIの期間と帯域: 期間14が出発点です。「中間帯」をどの範囲に置くか、どこから下を「深すぎる」とみなすかは、この組み合わせでもっとも結果を左右しやすい設定です。

注意したいのは、帯域の境界を細かく詰めるほど、過去データへの当てはめになりやすい点です。境界を少しずらしただけで検証結果が大きく変わるなら、その設定は偶然に依存している可能性があります。境界の前後で結果がなだらかに変化するかを確かめ、検証に使っていない期間で挙動を見直す工程を入れることをおすすめします。進め方はバックテストとはで整理しています。

cBot化する際の考慮点

cTraderのcBotとして組む場合、設計段階で決めておきたい点を挙げます。

確定足で評価する: AroonもRSIも未確定の足では値が動きます。OnBarで1本前の確定値を参照するのが基本です。

押し目の起点を状態として持つ: 「Aroon Upが100になった足」を押し目評価の起点とし、評価中フラグを立てます。起点以降のRSIの最小値を記録しておくと、「深さ」を1時点の値ではなく押し目全体で判定できます。

無効化の条件を先に書く: 評価を終了する条件は、Aroon Upの下限割れだけではありません。評価中にAroon Downが100になった場合、つまりn本内の安値を更新した場合も、押し目の前提が崩れたとみなして評価を打ち切る設計が考えられます。

反発は2時点で検出する: RSIの持ち直しは、前の足との比較で初めて判定できます。1時点の大小関係だけでは、中間帯にいる間ずっと条件が真になり続けます。

損切りは独立に置く: 押し目の型の判定は、損切りの代わりにはなりません。押し目の安値や変動幅(ATRの基礎を参照)を基準に、発注時点でストップロスを設定する前提で設計してください。

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

private Aroon _aroon;
private RelativeStrengthIndex _rsi;
private bool _inPullback;          // 押し目を評価中か
private double _rsiLow = double.NaN; // 起点以降のRSI最小値(押し目の深さ)

protected override void OnStart()
{
    _aroon = Indicators.Aroon(25);
    _rsi = Indicators.RelativeStrengthIndex(Bars.ClosePrices, 14);
}

protected override void OnBar()
{
    double up = _aroon.Up.Last(1);
    double down = _aroon.Down.Last(1);
    double rsiNow = _rsi.Result.Last(1);
    double rsiPrev = _rsi.Result.Last(2);
    if (double.IsNaN(up) || double.IsNaN(down) || double.IsNaN(rsiNow) || double.IsNaN(rsiPrev)) return;

    if (up > 99.9) { _inPullback = true; _rsiLow = rsiNow; return; } // 高値更新で起点をリセット
    if (!_inPullback) return;

    if (up < UpFloor || down > 99.9) { _inPullback = false; return; } // 長すぎる押し・安値更新で打ち切り

    _rsiLow = Math.Min(_rsiLow, rsiNow);
    bool shallow = _rsiLow <= CoolLevel && _rsiLow >= DeepLevel; // 中間帯で下げ止まったか
    bool turnUp = rsiNow > rsiPrev;                              // 持ち直しは2時点で判定
    bool candidate = shallow && turnUp;
    // candidate と up・_rsiLow をログへ渡し、後段の発注判断の材料にする
}

UpFloor・CoolLevel・DeepLevel はパラメータとして外に出しておくと、検証時に差し替えやすくなります。下方向はAroon DownとRSIを対称に扱えば同じ骨格で組めます。

実装の流れ

処理を入力→計算→判定→出力の順に整理します。

  1. 入力・計算: OnBarで確定足のAroon(Up/Down)とRSIを取得し、NaNと起動直後の足数不足を除外する
  2. 起点検出: Aroon Upが100になった足を押し目評価の起点とし、評価中フラグとRSI最小値を初期化する
  3. 期限判定: Aroon Upが下限を割った、またはAroon Downが100になった場合は評価を打ち切る
  4. 深さ判定: 起点以降のRSI最小値が中間帯に収まっているかを確認し、深すぎる押しは見送る
  5. 反発検出: RSIの持ち直しを2時点比較で検出し、候補とする
  6. 出力・記録: 候補の有無と、判定に使ったAroon Up・RSI最小値・経過本数をログに残す

期限判定を深さ判定より先に置くのがポイントです。古くなった押し目を先に除外しておけば、RSIの条件を評価する対象が絞られ、ログを見返したときにも「なぜ見送ったか」を追いやすくなります。

確定足の取得から押し目の起点検出、Aroon Upの下限による期限判定、RSI最小値による深さ判定、反発の2時点検出を経て記録へ進み、期限切れや深すぎる押しは見送る処理フロー図

どう活用するか

「長さと深さの二軸で押し目を仕分け、期限を設ける」という骨格は、RSIをストキャスティクスに、Aroonを高値からの経過本数のカウンターに置き換えても成り立つ構造です。自作派の方は、Claude Codeと対話しながら、まず無効化条件と期限の定義から言葉で詰めてみてください。委託派の方は、ai-programming.xyzへ相談される際に「押し目の長さと深さを別々に判定したい」と伝えていただくと、要件のすり合わせがスムーズになります。体系的に学びたい方には、状態の保持と打ち切り条件の設計を学ぶ題材として、スクールでも扱いやすい構成です。実装の参考になれば幸いです。

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