CCIと移動平均線を組み合わせる考え方 — 乖離の物差しを二層で使い分ける設計
CCI(商品チャネル指数)の計算式を分解すると、その中心には「一定期間の代表価格の単純移動平均」が置かれています。つまりCCIは、すでに内部に移動平均を1本抱えた指標です。そこへ別途、期間の異なる移動平均線を重ねる — これが本記事で扱う組み合わせです。
同じ「平均からどれだけ離れているか」という物差しを、短い期間と長い期間の二層で使う構成になるため、役割分担の考え方も期間の決め方も、他の組み合わせとは少し違う視点が必要になります。想定読者は、CCIを使ってみたものの±100の意味づけに迷っている方、環境認識を組み込んだcBotを自作してみたい方です。特定の設定が成果を保証するという話ではなく、設計へ落とし込むときの考え方を共有することが目的です。
CCIの役割
CCIは、高値・安値・終値を平均した代表価格(Typical Price)が、その単純移動平均からどれだけ離れているかを、同じ期間の平均偏差で割って正規化した指標です。指標そのものの読み方はCCIの基礎にまとめています。
この組み合わせを考えるうえで押さえておきたい性質が2つあります。
第一に、CCIは分母に平均偏差を置くため、値幅の大小をある程度ならしたうえで乖離を測っている 点です。静かな相場での「平均から離れた」と、荒れた相場での「平均から離れた」を、近い尺度で比べようとする設計になっています。
第二に、RSIやストキャスティクスと違い、上限・下限がない 点です。±100はあくまで慣習的な目安であり、0〜100に収まるオシレーターのような「これ以上は上がりようがない」という天井は存在しません。+300も-400も原理的にあり得ます。
単独使用時の限界も、この2つの性質から出てきます。正規化しているとはいえ分母は過去の平均偏差なので、ボラティリティが切り替わる局面では追随が遅れます。また上限がないため、「±100を超えた=行き過ぎ」という読み方が、そのまま強い方向性の初動と重なってしまう場面が残ります。CCIは「平均からどれだけ離れたか」には答えますが、「その離れ方が一時的なものか、水準そのものの移動か」までは答えてくれない指標です。
移動平均線の役割
移動平均線は、一定期間の価格を平均して中心線を可視化する指標です。基本的な性質は移動平均線の基礎を参照してください。
この構成では、移動平均線にCCIとは別の期間を割り当てます。狙いは、「価格がいまどちら側の水準にいるか」「中心線自体がどちらへ傾いているか」という、CCIより長い時間軸の情報を持ち込むことです。
単独使用時の弱点は2つあります。過去の平均である以上どうしても反応に遅れが出ること、そしてレンジ相場では価格が中心線を何度も跨ぐためダマシが増えることです。方向感の乏しい局面で移動平均線だけを見ても、判断材料としては弱くなります。
ただし本記事の構成では、移動平均線を「引き金」としては使いません。傾きと位置関係で場面を仕分ける役に徹してもらうと、遅れという弱点はむしろ許容しやすくなります。仕分け役に求められるのは検知の早さではなく、判定の安定性だからです。
なぜこの組み合わせか
形としては一般的な「トレンドフィルター+オシレーター」に似ていますが、この組み合わせには固有の前提があります。CCIの内部にも移動平均が入っている という点です。
CCIの期間と重ねる移動平均線の期間が近いと、2つはほぼ同じ情報を別の形で表示しているだけになります。期間20のCCIに期間20の移動平均線を重ねても、独立した2つ目の判断材料は増えません。この組み合わせが意味を持つのは、期間に十分な差をつけて、短期の乖離と長期の水準という二層構造を作ったとき です。
その前提の上で、読み方の例を挙げます。
- 価格が移動平均線の上、かつ移動平均線が上向き → 上方向の水準にいる場面と判定する材料
- その場面でCCIが-100付近まで沈んでから反発 → 短期的な行き過ぎからの戻り候補
- 価格が移動平均線の下、かつ移動平均線が下向き → 下方向の水準にいる場面と判定する材料
- その場面でCCIが+100付近まで浮いてから反落 → 短期的な戻りが一巡した候補
- 価格が移動平均線の近傍にあり、線がほぼ水平 → 二層の関係が成立しないため見送り
要点は最後の項目です。移動平均線が水平に近いとき、「価格が線の上か下か」という情報はほとんど中身を持ちません。上側の条件も下側の条件も等しく成立しやすくなり、仕分けの機能そのものが失われます。フィルターが効いていない状態を検出して見送る条件 を、エントリー条件と同じ重みで設計に入れておくのが現実的です。
環境を仕分ける役割を別の指標に任せる設計はCCIとADXの組み合わせでも扱っています。移動平均線に仕分けさせる場合は「方向を持つ代わりにトレンドの強度は測れない」、ADXに仕分けさせる場合は「強度を測る代わりに方向を持たない」という違いがあります。どちらが優れているという話ではなく、何を仕分けの軸に置きたいかで選ぶ部分だと考えられます。
パラメータをどう考えるか
唯一の正解があるわけではないので、検証を前提に方向性だけ整理します。
CCI側 は期間14や20が出発点としてよく使われます。短くするほど±100の外側への出入りが増えて敏感になり、長くするほど反応が減って滑らかになります。しきい値も±100に固定する必要はなく、±150や±200を使う流儀もあります。上限のない指標である以上、しきい値の意味は銘柄・時間足ごとのCCIの分布に依存します。過去データでCCI値の分布を取ってみると、自分の対象で±100がどの程度の頻度で出る水準なのかを把握できます。
移動平均線側 は、CCIの期間の3倍以上を目安に置くと二層の役割分担がはっきりします。CCIが20なら移動平均線は60〜100、といった具合です。数字そのものより、2つの期間が近づきすぎていないか を確認する視点のほうが重要になります。
時間足を分ける構成も選択肢です。上位足の移動平均線で水準を、下位足のCCIでタイミングを見るマルチタイムフレーム構成にすると、期間差を自然に確保できます。
いずれの設定でも、自分の銘柄・時間足で過去データを使って挙動を確認する工程は省略しないでください。
cBot化する際の考慮点
cTraderのcBotとして実装する場合、この構成に特有の注意点があります。
確定足で判定する: 未確定の足ではCCIも移動平均線も動き続けます。OnBarで1本前の確定値を使うと判定が安定します。
「傾き」を式として定義する: 「移動平均線が上向き」は目で見れば自明でも、コードの上では曖昧です。1本前と比べて大きいのか、N本前と比べた変化量が一定以上なのか、判定式を先に固定します。ここを決めずに実装すると、水平に近い局面で条件が細かく反転し続けます。
位置関係にはヒステリシスを設ける: 価格が移動平均線の近傍を出入りする局面では、上下フラグが頻繁に切り替わります。「N本連続で上側にある」「線から一定以上離れている」といった条件を足すと状態が安定します。距離の基準にはATRの基礎で扱っているような変動幅の物差しが使えます。
反転の検出は2時点比較で: 「CCIが-100を上抜けた」は、前の足で-100以下、直近の確定足で-100より上、という2時点の比較で初めて言えます。1時点の大小関係だけでは、外側に張り付いている間ずっと真になり続けます。
足数不足のガード: 移動平均線の期間をCCIより長く取る設計なので、必要本数は移動平均線側で決まります。起動直後はNaNが返る可能性があるため、バー数のチェックとNaN判定を判定の先頭に置きます。
判定部分の骨組みを疑似コードで示します。
// OnBar内: 確定した1本前の足で判定する
var cci = Indicators.CommodityChannelIndex(20);
var ma = Indicators.MovingAverage(Bars.ClosePrices, 80, MovingAverageType.Exponential);
if (Bars.Count < 120) return;
double maNow = ma.Result.Last(1);
double maPast = ma.Result.Last(6); // 傾きは複数本前と比較して判定する
double close = Bars.ClosePrices.Last(1);
if (double.IsNaN(maNow) || double.IsNaN(maPast)) return;
bool aboveMa = close > maNow; // 状態(毎足評価)
bool risingMa = maNow > maPast; // 傾きの定義を式として固定する
// 短期の乖離はイベントとして2時点で検出する
bool cciTurnUp = cci.Result.Last(2) <= -100 && cci.Result.Last(1) > -100;
bool longCandidate = aboveMa && risingMa && cciTurnUp;
位置関係と傾きは「状態」、CCIの反転は「イベント」であり、寿命が異なります。別々の変数に保持しておくと、「水準が整ってから数本以内の反転だけを採用する」といった条件を後から足しやすくなります。
実装の流れ
全体像を入力→計算→判定→出力の流れで整理します。
- 入力: 監視する銘柄・時間足を決め、移動平均線の期間に見合った本数の4本値を取得する
- 計算: CCIと移動平均線を別系列として保持し、それぞれ確定足の値を参照する
- 水準判定: 価格と移動平均線の位置関係、および傾きから、上方向・下方向・水平のいずれかを決める。水平なら以降をスキップする
- 乖離判定: 水準と同じ側のCCI反転だけを、2時点比較でイベントとして検出する
- リスク確認: 変動幅を基準に損切り幅を先に設計し、成立しないセットアップは見送る
- 出力・記録: シグナル(BUY候補 / SELL候補 / WAIT)と、判定に使ったCCI・移動平均線の値を記録する
長期側の判定を先に置き、そこで絞り込んでから短期側を評価する順序がポイントです。逆にすると、採用しない反転まで毎回評価することになり、条件の見通しも悪くなります。
どう活用するか
「同じ物差しを期間差で二層に使う」という骨格は、CCIを他の乖離系オシレーターに置き換えても崩れにくい構造です。自分で組んでみたい方は、Claude Codeを併走させたcBot開発の設計メモとして本記事の節構成を流用してみてください。作るより相談したいという方は、ai-programming.xyzで個別の実装相談を承っています。体系的に学びたい方に向けては、スクールで環境認識つきロジックを実装しながら学べる構成を用意しています。
本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。