ROCと移動平均の組み合わせ — 変化率で勢いを測り方向を確認する

ROC(Rate of Change/変化率)と移動平均は、どちらも終値から計算されますが、取り出している情報の性質が違います。移動平均は価格をならして「いまどちらを向いているか」という位置と方向を整理し、ROC は一定期間前と比べて価格が何パーセント動いたかを示すことで「その動きがどれくらいの速さか」を数値化します。方向を担当する層と、速さの変化を担当する層に分けて相場を眺める、という組み立て方になります。

本記事では、この 2 つを重ねると何が読み取りやすくなるのか、そして cBot に落とし込むときにどこで設計が詰まりやすいのかを整理します。あくまで判断材料を組み立てるための考え方であり、特定の設定が成果を約束するものではありません。

上段に価格と移動平均、下段にゼロラインを挟んだROCを配置し、勢いの拡大局面と減速局面を対比した模式図

ROC の役割

ROC は、n 本前の終値と現在の終値の差を、n 本前の終値に対する割合として表した指標です。計算式そのものは単純で、ゼロを中心に上下へ振れるオシレーター(一定の中心線のまわりを往復するタイプの指標)として描かれます。値がプラス圏にあれば n 本前より価格が高い、マイナス圏なら低い、という素直な読み方になります。

単独で使うと、勢いの方向と、その勢いが拡大しているか縮小しているかが見えてきます。ゼロラインを上抜けた直後は上方向の変化が出始めた局面、ROC の値そのものが大きくなり続けている間は変化のペースが上がっている局面、といった具合です。価格が高値を更新しているのに ROC の山が前の山より低いときは、ダイバージェンス(価格と指標の方向のズレ)として、勢いの鈍化を疑う手がかりにもなります。

一方で、単独利用時の限界もはっきりしています。ROC は「いくら動いたか」しか見ておらず、現在の価格が相場全体のどのあたりに位置しているかは教えてくれません。また、RSI のように 0〜100 の固定レンジに収まらないため、「この値なら過熱」といった閾値が銘柄や時間足ごとに変わってしまいます。さらに、比較対象が n 本前の 1 本だけである以上、その基準となる足が大きく動いていた場合、現在値が静かでも ROC が跳ねることがあります。レンジ相場ではゼロラインを何度もまたぐため、単体ではノイズが多い指標だと考えておくのが無難です。

移動平均の役割

移動平均 は、一定期間の価格を平均してなめらかな線として描く指標で、相場環境の整理役として広く使われています。価格が移動平均より上にあるか下にあるか、線自体がどちらに傾いているかを見るだけで、いまの局面を大まかに分類できます。

単独利用でも、方向のバイアスや、期間の異なる移動平均どうしの位置関係から、トレンドが継続しているのか崩れかけているのかをおおまかに把握できます。判断の土台として据えやすい、扱いやすさが持ち味です。

ただし、過去の価格を平均する構造上、反応には必ずラグ(遅れ)が伴います。価格の勢いが明らかに変わっていても、線の傾きに表れるまでには時間がかかります。また、レンジ相場では価格が線を何度もまたぐため、方向を示すシグナルがダマシになりやすくなります。そして移動平均は、いま進んでいる方向が加速しているのか失速しているのかという「速さの変化」までは、直接には示してくれません。

なぜこの組み合わせか

移動平均が位置と方向を、ROC が変化の速さを担当する、という役割分担がこの組み合わせの骨格です。移動平均は平滑化によってラグを抱える代わりに安定しており、ROC は生の価格差を扱うため敏感な代わりにノイズを拾います。性格が逆方向に振れている 2 つを、同じ足の上で並べて読む形になります。

具体的には、価格が移動平均の上にあり、かつ ROC がゼロより上で拡大しているなら「方向と勢いの向きがそろっている」状態として整理できます。逆に、価格は移動平均の上にとどまっているのに ROC がピークを越えて縮み始めているなら、「方向はまだ上だが、その方向を押し上げる力が弱まりつつある」という読み方になります。移動平均の傾きだけを見ていると気づきにくい変化を、ROC が先に数値として示してくれる、という補完関係です。

反対の向きの補完も成立します。ROC 単体の弱点だった「レンジでゼロラインを往復する」という性質は、移動平均を環境フィルターとして前段に置くことで扱いやすくなります。移動平均が明確な傾きを持たない局面では ROC の振れを判断材料から外す、といった切り分けが可能になるためです。この二段構えは、シグナルの信頼性を多角的に判定する材料になります。

ただし正直に言えば、両者はどちらも同じ終値の系列から計算されており、出来高系の指標を重ねる場合ほど独立性は高くありません。似た情報源を重ねても判断材料の総量はそれほど増えないため、相場の強弱そのものを見たい場合は ADX のような別系統を加えるほうが、輪郭がはっきりする場合があります。

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

ROC のパラメータは、比較対象となる期間 n だけです。短くすると直近の変化に敏感になり、細かい振れを拾いやすくなります。長くすると滑らかになる代わりに、変化に気づくタイミングは遅れます。短期売買向けか、より大きな流れを見たいのかで方向性が変わる、という程度に考えておくとよいでしょう。

移動平均側は期間と種類が中心です。指数移動平均(EMA)は直近の価格に敏感で、単純移動平均(SMA)は素直にならされます。組み合わせる際は、ROC の期間を移動平均の期間より短めに置いて「遅い方向レイヤーと速い変化レイヤー」という関係を明確にしておくと、役割が混ざりにくくなります。両方を同じくらい長くすると、似た動きの線が 2 本並ぶだけになりがちです。

判定の閾値についても一言添えておきます。ROC はレンジが固定されないため、「この値を超えたら」という固定閾値は銘柄や時間足を変えた瞬間に意味が変わります。移植性を重視するなら、直近の ROC の振れ幅や ATR を使って相対化する設計を検討してみてください。どの設定が正解という性質のものではないので、バックテストとフォワード検証で挙動を確かめてから組み込む流れが安全です。

cBot化する際の考慮点

実装面では、データが揃うタイミングと、ROC 特有の跳ねの扱いが主な論点になります。

cTrader では ROC は Indicators.PriceROC として用意されており、移動平均と同様に確定足の値を参照できます。両者は互いに依存しないため計算順序の制約はありませんが、参照する足をそろえておかないと「移動平均は 1 本前、ROC は現在足」といった混在が起こり、バックテストと実運用で挙動がずれる原因になります。判定は OnBar の確定足に一本化し、Last(1) 系で統一するのが無難です。

起動直後は、ROC の期間ぶん+1 本の履歴が揃っていないと値が意味を持ちません。移動平均の期間と合わせて必要本数を計算し、足りない間は判定自体をスキップする実装にしておくと安心です。また、週明けのギャップや指標発表直後は、基準となる足との差が急に開いて ROC が大きく振れることがあります。この跳ねをそのまま条件に使うと、実勢とかけ離れた判定になりやすいため、スプレッド拡大時やイベント前後を除外するフィルターと併用する設計を検討する価値があります。

計算負荷は両指標とも軽いので、ティックごとに再計算する必要はありません。ポジション管理との連携では、ROC の縮小を決済トリガーに直結させると、押し目の途中で降りてしまう挙動になりがちです。決済幅は ATR ベースなど別系統で設計し、ROC は「エントリー可否の材料」に役割を絞ると、構成が整理しやすくなります。

// 例: 方向レイヤー(移動平均)と変化レイヤー(ROC)を分けて評価する
var ma  = Indicators.MovingAverage(Bars.ClosePrices, 50, MovingAverageType.Exponential);
var roc = Indicators.PriceROC(Bars.ClosePrices, 20);

double close = Bars.ClosePrices.Last(1);

bool aboveMa   = close > ma.Result.Last(1);          // 方向: 価格が移動平均の上か
bool rocPlus   = roc.Result.Last(1) > 0;             // 変化: ゼロラインより上か
bool rocRising = roc.Result.Last(1) > roc.Result.Last(3); // 変化: 拡大しているか

実装の流れ

戦略全体を段階に分けると、次のような並びになります。

環境認識から移動平均とROCの並列計算、方向と勢いの整合判定、フィルターを経て発注・管理に至る戦略フロー図

  1. 環境認識: 上位足の方向や値動きの性質から、トレンド寄りかレンジ寄りかを切り分けます。
  2. データ取得: OnBar で確定足を受け取り、必要本数が揃っているかを先に確認します。
  3. 並列計算: 同じ足に対して、移動平均と ROC をそれぞれ算出します。
  4. 整合判定: 「価格と移動平均の位置関係」と「ROC の符号・拡大縮小」を掛け合わせ、方向と勢いの状態を分類します。
  5. フィルター: 経済指標の前後、スプレッド異常、保有ポジション数などをチェックします。
  6. 発注・管理: 条件が揃った場合のみ、リスク管理ルールに沿ってロットと決済条件を設定します。

このレイヤーは、エントリーそのものを決めるのではなく「いまがどの状態か」を返す部品として実装しておくと、後から補助指標を差し替えるときに影響範囲を小さく抑えられます。

どう活用するか

自分で cBot を書く方は、Claude Code を使った実装の練習題材としても扱いやすい構成です。移動平均と ROC はどちらも計算がシンプルなので、指標そのものより「2 つの状態をどう分類して 1 つのフラグにまとめるか」という設計部分に集中できます。

実装に手が回らない、あるいは既存ロジックの前段フィルターとして組み込みたい方は、ai-programming.xyz で個別の実装相談を承っています。

体系的に学びたい方は、スクールで判定ロジックの分解と検証手順を、実際の開発フローに沿って学ぶことができます。

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