MACDと移動平均を組み合わせる考え方 — 同じ素材から作られた指標をどう役割分担させるか
指標を2つ重ねれば判断の確度が上がる、という発想でロジックを組むと、思わぬ落とし穴に当たることがあります。MACDは2本のEMA(指数移動平均)の差から作られる指標なので、移動平均と並べても「独立した2つ目の目」にはなりません。それでもこの2つを併用する設計は広く使われています。本記事では、同じ素材から作られた指標をあえて重ねる意味を、水準を見る移動平均と変化率を見るMACDという役割分担の観点から整理します。指標どうしが独立しているかという視点は、他の組み合わせを設計するときにも効いてくる考え方です。cBotの自作を検討している方、条件を足しているのに判断が安定しないと感じている方に向けた内容です。
移動平均の役割 — いまの水準を示す
移動平均は一定期間の価格を平滑化した線で、チャート上では価格そのものと同じ縦軸に描かれます。ここが最大の特徴です。価格が線のどちら側にあるか、押しがどこまで戻ってきたか、といった判断をすべて価格と同じ単位、つまり「水準」の上で行えます。
この構成で移動平均に任せるのは、方向の前提を決めることと、価格が引き付けられる目安を示すことの2つです。傾きの向きで上下いずれの前提に立つかを決め、線そのものを戻りの到達点候補として扱う、という使い方が代表的です。
単独使用時の限界は、平滑化に伴う遅れにあります。過去の値を平均する構造上、方向が変わってから線に反映されるまで時間がかかります。またレンジでは価格が線をまたいで往復するため、水準としての意味が薄れます。そしてもう1つ、線が上を向いているという事実は分かっても、その動きがいま加速しているのか減速しているのかまでは、線の位置からは読み取れません。
MACDの役割 — 変化の速さを示す
MACD(Moving Average Convergence Divergence)は、期間の短いEMAから期間の長いEMAを引いた差を線にした指標です。さらにその線を平滑化したシグナル線と、両者の差を棒で表すヒストグラムを添えて構成されます。成り立ちの詳細はMACDの基礎で扱っています。
差を取るという操作の意味は、2本の線の開き具合を数値化することにあります。短期側が長期側から離れていくほどMACDの値は大きくなり、近づくほどゼロへ寄ります。つまりMACDが表しているのは価格の水準ではなく、水準が変化していく速さのほうです。チャート上でも別パネルに描かれ、縦軸の単位が価格から切り離されています。
単独使用時の限界も、この性質から出てきます。MACDの値が大きいことは動きが速いことを示すだけで、価格がどの水準にあるかという情報は含みません。ゼロラインを上へ抜けたという事実も、短期EMAが長期EMAを上回ったという相対関係の変化であって、価格が意味のある節目を超えたことを示すものではないのです。加えて、平滑化を重ねる構造のため、細かい振れの多い局面ではクロスが頻発しやすい面もあります。
なぜこの組み合わせか — 独立していない指標を重ねる意味
ここが本記事の中心です。まず率直に確認しておくと、MACDと移動平均は独立した指標ではありません。MACDの原材料は移動平均そのものであり、移動平均が上向きに転じる場面とMACDが上向きに転じる場面は、当然ながら重なりやすくなります。両者の一致をもって「2つの指標が同意した」と読むのは、実際には同じ計算の結果を2回数えているだけ、という危うさを含みます。
一般に、組み合わせがノイズフィルターとして機能することを期待できるのは、見ている断面が違う場合です。ではMACDと移動平均に断面の違いはあるのか。あります。移動平均は価格と同じ単位で水準を示し、MACDは水準の変化率を示します。位置と速度、という関係です。この2つは同じ材料から作られていても、答えている質問が違います。
そう捉え直すと、実用的な使い方が見えてきます。
- 価格が移動平均の上にあり、MACDも拡大方向 → 水準と速度がそろっている状態
- 価格は移動平均の上にあるが、ヒストグラムは縮小方向 → 水準は保っているが変化が減速している状態
- 価格は移動平均を割り込んだが、MACDはゼロより上 → 水準の前提が崩れかけている一方、速度の記録はまだ残っている状態
- 価格も移動平均も方向感がなく、MACDもゼロ付近 → 前提そのものが成立していない状態
注目したいのは2番目と3番目、つまり両者がずれている状態です。同族の指標だからこそ、判定が一致しない場面は「どちらかが先に変化した」ことを意味します。一致には情報量が少なく、ずれのほうに情報がある、という逆転が起きるのがこの組み合わせの特徴だと考えられます。
したがって設計方針としては、一致をAND条件として重ねて厳しくするよりも、ずれの発生を状態の変化として検出するほうが、2指標の性質に合っています。純粋に二重確認の相手が欲しいのであれば、RSIや出来高系のように計算の材料が異なる指標を別途置くほうが筋が通ります。MACDとRSIの組み合わせのように素材の違う指標を合わせる設計が広く使われているのは、この独立性の問題と無関係ではないでしょう。
トレードオフも書いておきます。ずれを見る設計は、扱う対象が瞬間のシグナルではなく状態の遷移になるぶん、実装が複雑になります。また減速がそのまま転換につながるとは限らず、強い流れの中の一時的な小休止でも同じ形が現れます。ずれの検出は撤退や見送りの検討材料であって、逆方向に張る根拠にはならない、という線引きをあらかじめしておくと、運用時の期待とのずれを防げます。
パラメータをどう考えるか
調整対象は、移動平均の種類と期間、そしてMACDの短期・長期・シグナルの3つの期間です。ここで気をつけたいのは、移動平均の期間とMACDの長期期間が近い値だと、両者がほぼ同じ動きになり、分業そのものが成立しなくなる点です。
実務的な考え方としては、移動平均は環境の水準を示す役として少し長めに置き、MACDは変化の検出を担う役として標準とされる12・26・9を出発点にする、といった具合に、担当するスケールを意図的にずらします。逆に、移動平均の期間をMACDの長期期間とそろえて完全に同期させる設計もあり得ますが、その場合は分業ではなく同じ情報の表示形式を使い分けているだけ、と理解しておくほうが正確です。
時間足についても同様の視点が使えます。短い時間足ほどクロスの回数は増え、ずれの検出も頻繁になります。どちらの方向性を取るにせよ唯一の正解はありません。期間を1つずつ動かして挙動の差を確認するバックテストの工程を、採用の前に必ず挟んでください。
cBot化する際の考慮点
cTraderのcBotとして実装する場合に押さえておきたい論点を整理します。
確定足で揃える: 移動平均もMACDも、形成中のバーでは値が動き続けます。判定はOnBarで1本前の確定値に統一し、水準と変化率の参照タイミングをずらさないようにします。
ウォームアップ: MACDは長期EMAとシグナル線で二段の平滑化を経るため、値が安定するまでに長期期間の数倍の本数を要します。移動平均の期間とMACDの長期期間の大きいほうを基準に、Bars.Count の下限チェックを判定の前段へ置きます。
イベントではなく状態として持つ: ずれの検出対象は一瞬のクロスではなく、続いている状態です。水準の判定と変化率の判定をそれぞれフラグとして保持し、その組み合わせが前の足から変わったときに遷移として扱う構造にすると、新規の判定にも保有中の判定にも同じ土台を使い回せます。
縮小の判定幅: ヒストグラムの縮小は、直近値と数本前の値の比較で近似できます。1本差だけで見ると細かい凹凸を拾ってしまうため、比較する本数はパラメータ化して検証で調整できるようにしておきます。
単位の違いに注意: 移動平均は価格と同じ単位、MACDは価格差の単位です。両者を同じしきい値で比較する実装は成立しません。銘柄をまたいで使う場合は、MACD側を価格やATRで正規化するか、しきい値ではなく傾きの符号で判定する設計にすると移植性が上がります。
// OnBar内: 水準(移動平均)と変化率(MACD)を別々のフラグとして評価する
var ma = Indicators.MovingAverage(Bars.ClosePrices, MaPeriod, MovingAverageType.Exponential);
var macd = Indicators.MacdCrossOver(Bars.ClosePrices, LongCycle, ShortCycle, SignalPeriods);
if (Bars.Count < Math.Max(MaPeriod, LongCycle) * 3) return; // ウォームアップ不足を弾く
double hist = macd.MACD.Last(1) - macd.Signal.Last(1);
double histOld = macd.MACD.Last(1 + Span) - macd.Signal.Last(1 + Span);
bool levelUp = Bars.ClosePrices.Last(1) > ma.Result.Last(1); // 水準: 価格が線の上にある
bool speedUp = hist > histOld; // 変化率: 差が拡大方向にある
bool diverged = levelUp && !speedUp; // ずれ: 水準は保つが減速している
計算負荷はどちらの指標も軽く、OnBar運用であれば問題になりません。実装初期は水準フラグ・変化率フラグ・ずれの判定結果をバーごとにログへ残し、チャートと突き合わせて意図した場面で成立しているかを目視で確かめる工程を挟むと、調整の当たりが付けやすくなります。
実装の流れ
処理は「水準 → 変化率 → 突き合わせ → 行動」の一方向に整理できます。
- 入力: 対象銘柄と時間足を決め、確定足ベースで移動平均とMACDを更新する
- 水準判定: 価格と移動平均の位置関係、および線の傾きから、上向き・下向き・方向感なしを分類する
- 変化率判定: MACDのゼロラインとの位置と、ヒストグラムの拡大・縮小から、加速・減速・横ばいを分類する
- 突き合わせ: 2つの分類の組み合わせを、そろい・ずれ・前提なしの3状態へ振り分ける
- 行動決定: 新規はそろいの状態のみを候補とし、保有中はずれへの遷移を撤退検討の合図として扱い、前提なしは見送りとして記録する
ポイントは、2つの判定を1つの複合条件にまとめないことです。同族の指標だからこそ、まとめてしまうと水準で弾かれたのか変化率で弾かれたのかが後から分からなくなります。判定を分けてログに残しておけば、どちらの層が実際に効いているのかを実データで数え直せます。
どう活用するか
素材が同じ指標を重ねても独立した確認にはならない、という視点は、この2指標に限らず応用が利きます。自作したい方は、Claude Codeと併走するcBot開発の設計メモとして、手元のロジックに入っている条件を「素材は何か」「答えている質問は何か」の2軸で棚卸ししてみてください。実質的に重複している条件が見つかることも少なくありません。実装を任せたい方は、ai-programming.xyzで個別の開発相談を承っています。体系的に学びたい方に向けては、スクールで指標の成り立ちから判定ロジックの実装までを順を追って学べます。
本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。