今回はMACDは本当に勝てるインジケーターなのか?というのを、インジケーターをストラテジー化して検証してみます。
TradingViewでインジケーターも公開しているので追って紹介ますね。
MACDとは?

相場の「勢い」と「方向」を同時に確認できるインジケーター。
3つの要素で構成されています。
- MACDライン … 短期EMAと長期EMAの差。ゼロ以上で上昇トレンド
- シグナルライン … MACDをさらに平滑化した線
- ヒストグラム … 2本の差を棒グラフ化。棒が伸びるほど勢いが強い
MACDがシグナルラインを上抜けたら買いサイン、下抜けたら売りサインが基本的な使い方です。
MACDは勝てるのか検証
今回の検証はMACDの買いと売りをそのまま持ち続ける方式です。
手数料は片道0.05%で往復0.1%。数量は資産によって増減させずに一定とします。
GOLD
5分足

QQEもSuperTrendもそうですが、穏やかな波系インジケーターは短い足がちゃんと地獄に向かいますね。
手数料負けもあると思いますが、恐ろしいことになっています。
1時間足

基本的にはマイナス続き。大きなトレンドが発生したときは上昇していますが、それでもかなり急なトレンドが起きないと基本的には目減りしていきます。
1日足

GOLDの1日足は現時点ではキレイな右肩上がりですね。コレはGOLDが

このようにキレイな右肩上がり上昇を日足レベルで続けていたため。
上手くはまればという感じですね。
BTC(ビットコイン)
5分足

やはり短い足は超特急で地面を掘りますね。
手数料&繰り返しのマイナスで絶対にやってはいけません。
1時間足

大きな時間足になるとダマシも少なくなるのでプラス圏も見えます。しかしやはり大幅マイナス。
1日足

1日足になるとプラスになっています。
しかし、せっかくの大幅プラス圏だったものが、一気にマイナスになる瞬間も。アナリ参考にしはしたくない。。
1週間足

1週間足になるとかなり毛色がかわりました。ビットコインについては安定しての大幅プラス。
BTCは元々安い値段から一気に今の値段になっています。この上昇時にもキレイなトレンドが続いたためのプラス圏ですね。
ただ、このまま値段が頭打ちになるならこのグラフも変わってくるはずです。
その他成績が良かった通貨と時間足
人気の高い通貨、
- EUR/USD
- USD/JPY
- GBP/USD
- AUD/USD
- USD/CAD
で検証しました。
USD/JPY 一週間足

これは恐ろしい結果ですね。2008年頃から続いている円安の影響だと思われます。
ほぼ20年近く右肩上がり。一週間足なのでかなり気長に考えられる人限定ではありますが、プロフィットファクター約2というのは驚異的です。
AUD/USD 一週間足

こちらも2009年頃の大きなトレンドで一気にプラスに。ただ検証の時点でプラスではありますが、右肩下がりが始まっているので今後は不安定になる可能性も高いですね。
まとめ
MACDはRSIなどと違い大きくゆっくり動く指標なので、レンジにとても弱い。しかもかなりキレイなトレンドじゃないとマイナスを繰り返すので単体で使うのは現実的ではありませんね。
あくまでフィルター。他のと組み合わせ、もしくはダイバージェンスなど使い方を工夫する必要がありそうです。
インジケーターを使って検証しましたが、必ずしも今後も同じ結果が保証されるわけではないということをご理解ください。
今回検証で使ったMACDは、トレーディングViewで
MACD Crossover Strategy [Long/Short] という名前で公開中です。

ストラテジーとアラート機能も付けてあるので必要な方はお使いください。
英語が苦手な方は、ソースコード版は説明文等日本語にしてあります。
//@version=6
// ── MACD設定 ──────────────────────────────────────────────────────────────
float sourceInput = input.source(close, "ソース", group = "📊 MACD")
int fastLenInput = input.int(12, "短期期間", minval = 1, group = "📊 MACD")
int slowLenInput = input.int(26, "長期期間", minval = 1, group = "📊 MACD")
int sigLenInput = input.int(9, "シグナル期間", minval = 1, group = "📊 MACD")
string oscTypeInput = input.string("EMA", "オシレーター MA種別", ["EMA", "SMA"], group = "📊 MACD", display = display.none)
string sigTypeInput = input.string("EMA", "シグナル MA種別", ["EMA", "SMA"], group = "📊 MACD", display = display.none)
// ── ストラテジー設定 ──────────────────────────────────────────────────────
string entryInput = input.string("MACDxSignal", "エントリー条件",
options = ["MACDxSignal", "HistCross0"], group = "⚙️ ストラテジー設定",
tooltip = "MACDxSignal: MACDラインがシグナルラインをクロス / HistCross0: ヒストグラムが0をクロス")
bool longInput = input.bool(true, "ロング有効", group = "⚙️ ストラテジー設定")
bool shortInput = input.bool(true, "ショート有効", group = "⚙️ ストラテジー設定")
float qtyInput = input.float(1.0, "ロットサイズ", minval = 0.01, step = 0.01, group = "⚙️ ストラテジー設定")
// commission_value / slippage は const 必須のため直接指定
// ストラテジープロパティタブからも変更可能
strategy("MACD Crossover Strategy [Long/Short]", "MACD X [L/S]",
overlay = false,
commission_type = strategy.commission.percent,
commission_value = 0.1,
slippage = 2,
default_qty_type = strategy.fixed,
default_qty_value = 1)
// ── MA関数 ────────────────────────────────────────────────────────────────
ma(float source, int length, simple string maType) =>
switch maType
"EMA" => ta.ema(source, length)
"SMA" => ta.sma(source, length)
// ── MACD計算 ──────────────────────────────────────────────────────────────
float maFast = ma(sourceInput, fastLenInput, oscTypeInput)
float maSlow = ma(sourceInput, slowLenInput, oscTypeInput)
float macd = maFast - maSlow
float signal = ma(macd, sigLenInput, sigTypeInput)
float hist = macd - signal
color hColor = hist >= 0 ? hist > hist[1] ? #26a69a : #b2dfdb : hist > hist[1] ? #ffcdd2 : #ff5252
// ── エントリーシグナル ────────────────────────────────────────────────────
bool longSignal = entryInput == "MACDxSignal" ? ta.crossover(macd, signal) : ta.crossover(hist, 0)
bool shortSignal = entryInput == "MACDxSignal" ? ta.crossunder(macd, signal) : ta.crossunder(hist, 0)
// ── エントリー / エグジット ───────────────────────────────────────────────
if longSignal
if longInput
strategy.entry("Long", strategy.long, qty = qtyInput)
else if strategy.position_size < 0
strategy.close("Short")
if shortSignal
if shortInput
strategy.entry("Short", strategy.short, qty = qtyInput)
else if strategy.position_size > 0
strategy.close("Long")
// ── アラート条件 ──────────────────────────────────────────────────────────
alertcondition(longSignal, "🟢 Long Entry", "MACD: Long entry signal triggered")
alertcondition(shortSignal, "🔴 Short Entry", "MACD: Short entry signal triggered")
alertcondition(hist[1] >= 0 and hist < 0, "📉 Hist Falling", "MACD Histogram: switched from rising to falling")
alertcondition(hist[1] <= 0 and hist > 0, "📈 Hist Rising", "MACD Histogram: switched from falling to rising")
// ── プロット ──────────────────────────────────────────────────────────────
hline(0, "Zero", #787b8680)
plot(hist, "Histogram", hColor, style = plot.style_columns)
plot(macd, "MACD", color.blue)
plot(signal, "Signal Line", #ff6d00)
plotshape(longSignal and longInput, "Long Signal", shape.triangleup, location.bottom, color.new(color.green, 0), size = size.small)
plotshape(shortSignal and shortInput, "Short Signal", shape.triangledown, location.top, color.new(color.red, 0), size = size.small)
コチラです。よければ検証等にお使いください。

コメント