ATRとRSIの組み合わせ — 値幅の状態でオシレーターの読み方を切り替える

RSIは0〜100の範囲に収まるため、どの局面でも同じ数字が同じ意味を持つように見えます。ところが実際には、値幅が大きい時期に出た高い数値と、ほとんど動かない時期に出た同じ数値とでは、その後に起こりやすいことが違います。本記事では、ATRで「いまがどれくらい動く時期か」を先に確定させ、その結果に応じてRSIの読み方そのものを切り替える、という2指標の組み立て方を整理します。ATRを損切り幅の計算に使う一般的な用法ではなく、オシレーターの解釈を切り替えるスイッチとして先に置く点が特徴です。RSIの水準で判定を組んでみたものの、うまく噛み合う時期とそうでない時期の差が大きいと感じている方に向けた内容です。

上段に価格とATRを、下段にRSIを配置した模式図。左半分の値幅が乏しい局面ではRSIが小さな値動きで上下の端まで振れ、右半分の値幅が大きい局面ではRSIが上端付近に張り付いている様子を対比している

ATRの役割 — 動きの大きさだけを測る層

ATR(Average True Range)は、前の足の終値を含めた実質的な値幅を一定期間で平均した指標です。上がったか下がったかという方向の情報は一切持たず、「どれくらい動いたか」という大きさだけを返します。この構成でATRに任せるのは売買の判定ではなく、いま置かれている局面の分類です。

方向を持たない指標なので、単独では入る位置も出る位置も決まりません。そのぶん、他の指標の前提を用意する係としては扱いやすい性質を持っています。値幅が縮んで動きが乏しい時期なのか、値幅が広がって動きやすい時期なのか、という二分だけでも後続の判定は変わります。

限界もはっきりしています。過去の値幅を平均している以上、状態が急に切り替わる場面では追随が遅れます。もう一つ見落としやすいのが、ATRの値が価格そのものの単位で返ってくることです。銘柄が違えば桁が変わり、時間足が違えば大きさが変わり、同じ銘柄でも時期によって水準が動きます。そのため「ATRがいくつ以上なら値幅が大きい」という固定値の条件は、書いた時点の相場にしか通用しません。後述するとおり、比較に使う前に相対化する工程が必要になります。

RSIの役割 — 位置を0〜100へ正規化する層

RSIは、一定期間の値上がり幅と値下がり幅の比率を0〜100の範囲に置き換えるオシレーター系の指標です。ここでは、ATRが分類した局面の内側で「押し込まれているのか、伸び切っているのか」という位置を示す係を担当します。

注目したいのは、この指標が比率である点です。分子と分母の両方に値幅が入るため、割り算をした時点で「その値動きが大きかったのか小さかったのか」という情報は落ちます。どの局面でも同じ目盛りで読めるのはこの正規化のおかげですが、同時に、捨てられた情報のぶんだけ数値の意味があいまいになります。

限界はここから生まれます。値幅が乏しい局面では、わずかな値動きでも比率が偏りやすく、RSIは軽く上下の端まで届きます。反対に流れが強い局面では、高い水準や低い水準に長く留まり続けます。どちらも「端に届いた=行き過ぎ」という読み方が成立しにくい状態です。価格とRSIの向きが食い違うダイバージェンスも示唆にはなりますが、それが何本後に効くのかまでは示しません。

なぜ値幅と過熱感を組み合わせるのか

この2つが噛み合う理由は単純で、RSIが捨てた情報をATRが持っているからです。補完関係は一方向に働きます。ATRがRSIの読み方に前提を与え、RSIはその前提の内側で位置を返す、という役割分担です。

局面ごとに読み替えの方向を決めておくと、条件の性質が変わります。

同じRSIの数値でも、通す条件が局面ごとに変わるという点がこの構成の中身です。ノイズフィルターとして機能することが期待できるのは、主にひとつ目の「値幅が乏しい局面での端到達」を機械的に外せる部分になります。レンジとトレンドの区別をADXのような方向性の指標で行う構成と比べると、こちらは値幅という一次元の量だけで分類するぶん、判定の理由を後から説明しやすい利点があります。

ただし、切り替えの分岐を増やすほど過去のデータへ合わせ込む余地は広がります。局面の分類は二分、多くても三分に留めておくのが実務的です。三つ目の層としてリスク幅の設計まで足す場合は、移動平均・RSI・ATRの三層構成の考え方が参考になります。

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

調整対象は、ATRの期間、局面を分けるしきい値、RSIの期間と参照水準、そして局面ごとの読み替えルールです。数が多いので、動かす順番を決めておくと迷いにくくなります。

ATRの期間は、短くすると直近の変化に敏感になり、長くすると平均的な水準へ寄ります。局面の分類が目的であれば、1本ごとの上下に振り回されない程度の長さを選ぶ方向で考えます。RSIの期間は、短くすると反応が増えて振れが大きくなり、長くすると滑らかになって機会が減ります。

局面を分けるしきい値は、緩めれば「値幅が乏しい」と判定される場面が減って通過数が増え、厳しくすればその逆になります。ここは絶対的な正解のある値ではなく、対象と時間足ごとに確かめる前提で置きます。決済側の幅にも同じATRを使うのであれば、ATRベースの利確幅設計の考え方と揃えておくと、入口と出口で別々の物差しを持たずに済みます。

いずれも「反応を速くするのか、安定させるのか」という方向性の理解に留め、一度に複数を動かさないことが大切です。ひとつずつ固定してバックテストで挙動を確かめる進め方が現実的です。

cBot化する際の考慮点

cTraderのcBotとして実装する場合、この構成に特有の論点がいくつかあります。

ATRの相対化: 前述のとおり、ATRの絶対値を固定しきい値と比べる書き方は使い回せません。ATRを価格で割って比率にする、長期のATRとの比を取る、直近の一定本数のなかでの順位に置き換える、といった無次元化のいずれかを先に通します。どれを選ぶかで挙動が変わるため、比較対象として実装しておくと検証しやすくなります。

レジームのばたつき: しきい値の近辺では、判定が毎バー入れ替わることがあります。切り替えに2つのしきい値を使うヒステリシス方式にするか、同じ判定が一定本数続いたときだけ切り替える、といった安定化を入れておくと挙動が読みやすくなります。

参照タイミングの統一: 形成中のバーではATRもRSIも値が動き続けます。判定はすべて確定済みのバーで行い、2つの参照位置を揃えます。

ゼロ除算と起動直後のガード: 相対化で割り算を行う以上、分母が極端に小さくなる場面への備えが必要です。下限を設けるか、一定以下なら判定を見送る分岐を用意します。必要なバー数はATRの期間と相対化に使う参照期間の合計になるため、そちらを基準に本数チェックを通します。

保有中の扱い: 局面はポジションを持っている最中にも切り替わります。切り替えの判定を入口だけに適用し、出口は別ルールで固定しておくと、途中でルールが入れ替わって決済条件が消える事故を避けられます。

// 例: レジーム判定 → 読み替え の順に評価する(参照はすべて確定済みのバー)
var atr = Indicators.AverageTrueRange(AtrPeriod, MovingAverageType.Exponential);
var rsi = Indicators.RelativeStrengthIndex(Bars.ClosePrices, RsiPeriod);

if (Bars.Count < AtrPeriod + RefPeriod + 5) return;      // 参照本数のガード

double atrNow  = atr.Result.Last(1);
double atrBase = 0;                                       // 参照期間のATR平均
for (int i = 1; i <= RefPeriod; i++) atrBase += atr.Result.Last(i);
atrBase /= RefPeriod;
if (atrBase < MinAtr) return;                             // 分母の下限ガード

double atrRatio = atrNow / atrBase;                       // 無次元化した値幅の水準
bool   isQuiet  = atrRatio < QuietThreshold;              // しきい値は検証対象

double r = rsi.Result.Last(1);
// 局面ごとに、同じRSI値へ別の条件を当てる
bool signal = isQuiet
    ? false                                               // 値幅が乏しい局面は判定を見送る
    : (r > MidLevel && rsi.Result.Last(2) <= MidLevel);   // 中央付近からの復帰を見る

実装の流れ

処理は、値幅を測る → 局面を分ける → その局面の読み方でRSIを見る、という一方向の流れに整理できます。

確定済みバーでATRとRSIを更新し、ATRを相対化して値幅が乏しい局面と大きい局面に分け、それぞれのRSIの読み替えを経て、通過した場合だけ発注と管理へ進むフロー図

  1. 入力: 対象と時間足を決め、ATRとRSIを確定済みのバーで更新します
  2. 相対化: ATRを比率や順位に置き換え、桁や時期に依存しない値へそろえます
  3. 分類: しきい値とヒステリシスを通して、値幅が乏しい局面か、大きい局面かを確定させます
  4. 読み替え: 確定した局面に対応するRSIの条件だけを評価します
  5. 発注・管理: 通過した場合だけ、あらかじめ決めた損切り幅とロットで発注し、決済の管理へ引き継ぎます

2つを1つの複合条件へまとめず、局面フラグとRSI条件を独立して持たせるのがポイントです。どちらの局面で何回弾かれたのかを後から集計でき、しきい値の見直しに使える材料が残ります。

どう活用するか

自作派の方は、Claude Code でcBotを組むときの設計メモとして、この「先に局面を決めてから指標を読む」という順番を流用してみてください。RSIを他のオシレーターへ差し替えても枠組みはそのまま成立します。

委託派の方は、ai-programming.xyz で実装を相談するとき、「ATRは相対化して局面判定に使いたい」という要件を最初に共有しておくと、仕様の詰めが早く進みます。教育派の方は、手元にあるRSI単体のロジックへ局面フラグを後から足す課題として扱うと、同じ数値でも前提によって意味が変わることを、手を動かしながら確認できます。

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