MACD モメンタム インジケーター バックテスト戦略


作成日: 2023-09-24 13:21:54 最終変更日: 2023-09-24 13:21:54
コピー: 1 クリック数: 796
1
フォロー
1617
フォロワー

概要

この戦略は,MACDの動態指標とRSIの超買い超売り指標を組み合わせて,MACDの金叉/死叉が発生したときにRSIが対応する触底/触頂逆転を完了しているかどうかを検証し,より信頼できる取引信号を生成します.典型的な短期逆転戦略の考え方です.

戦略原則

  1. MACD指標のDIFF,DEA,MACD柱を計算する.DIFFがDEAを穿越すると金叉信号が発生し,下を通過すると死叉信号が発生する.

  2. RSI指標を計算し,底が反発したか,頂上が戻ったかを判断する.そして,最近段階の底か頂上があったかどうかを判断する回顧ウィンドウを設定する.

  3. MACDの金叉時,RSIが回顧窓の中で触底反転を完了した場合,見多信号が生成されます. MACDの死叉時,RSIが触頂反転を完了した場合,見空信号になります.

  4. 入場後,リスク管理のためにストップ・ロストを設定します.

戦略的優位性

  1. MACDはトレンド転換のタイミングを敏感に判断する.RSIは超買い超売り状態を判断する.

  2. MACDとRSIのトークンを検証し,偽信号をフィルターする.

  3. 窓から信号の信頼性を判断する.

  4. リスク管理に役立つ.

戦略リスク

  1. MACDとRSIの両方とも遅れているため,最適なエントリーポイントを逃している可能性があります.

  2. 2つの指標信号の出現の確率が小さいため,信号が少ない.

  3. グローバル・トレンドの方向性も考慮せず,騙されやすい.

  4. ストップダスの設定が不適切で,過度に緩やかまたは厳格である可能性があります.

対応方法:

  1. MACDとRSIのパラメータを調整し,遅滞の確率を下げます.

  2. 適切な範囲を拡大し,より多くの信号を供給する.

  3. トレンドフィルターを加え,逆転を回避する.

  4. 異なるストップダストパラメータの設定をテストし,最適性を探します.

戦略最適化の方向性

  1. SMAなどの他の均線の効果をテストする.

  2. 移動式ストップを増やし,ストップを柔軟にします.

  3. ランクインの好みや劣悪さを判断するトレンド指標を追加する.

  4. 機械学習が指標の動きを予測する.

  5. 選択するタイミングを最適化する要素を 組み合わせる

要約する

この戦略は,MACDとRSIの2つの指標の組み合わせを利用し,信頼性の高い反転信号を選した後に入場する.戦略の考え方は明確で,パラメータの調整は柔軟で,指標選択,トレンド判断,止損方法などから拡張され,安定した基盤を維持した上でより多くの取引機会を得ることができます.しかし,過度に最適化によって安定性を失うのを防ぐために注意が必要です.

ストラテジーソースコード
/*backtest
start: 2023-08-24 00:00:00
end: 2023-09-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//based on Range Strat - MACD/RSI 
// strategy("MACD/RSI - edited", 
//      overlay=true,
//      default_qty_type=strategy.percent_of_equity,
//      default_qty_value=10, precision=2, initial_capital=100000,
//      pyramiding=2,
//      commission_value=0.05)

//Backtest date range
StartDate = input(timestamp("13 Jun 2022"), title="Start Date")
EndDate = input(timestamp("13 Jun 2024"), title="Start Date")
inDateRange = true

// RSI Input Settings
rsisrc = input(title="RSI Source", defval=close, group="RSI Settings")
length = input(title="Length", defval=14, group="RSI Settings" )
overSold = input(title="Over Sold Threshold", defval=30, group="RSI Settings" )
overBought = input(title="Over Bought Threshold", defval=70, group="RSI Settings" )
rsi_lookback = input(title="RSI cross lookback period", defval=7, group="RSI Settings")

// Calculating RSI
vrsi = ta.rsi(rsisrc, length)
co = ta.crossover(vrsi, overSold)
cu = ta.crossunder(vrsi, overBought)

// Function looking for a happened condition during lookback period
f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed


coCheck = f_somethingHappened(co, rsi_lookback)
cuCheck = f_somethingHappened(cu, rsi_lookback)

// MACD Input Settings
macdsrc = input(title="MACD Source", defval=close, group="MACD Settings")
fast_length = input(title="Fast Length", defval=12, group="MACD Settings")
slow_length = input(title="Slow Length", defval=26, group="MACD Settings")
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9, group="MACD Settings")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"], group="MACD Settings")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD Settings")


// Calculating MACD
fast_ma = sma_source == "SMA" ? ta.sma(macdsrc, fast_length) : ta.ema(macdsrc, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(macdsrc, slow_length) : ta.ema(macdsrc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
delta = macd - signal

MACDcrossover = ta.crossover(delta, 0)
MACDcrossunder = ta.crossunder(delta, 0)

// Stop Loss Input Settings
longLossPerc = input(title="Long Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01
shortLossPerc = input(title="Short Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01

// Calculating Stop Loss
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



// Strategy Entry
if (not na(vrsi))
	if (inDateRange and MACDcrossover and coCheck)
		strategy.entry("LONG", strategy.long, comment="LONG")
	if (inDateRange and MACDcrossunder and cuCheck)
		strategy.entry("SHORT", strategy.short, comment="SHORT")

// Submit exit orders based on calculated stop loss price
if (strategy.position_size > 0)
    strategy.exit(id="LONG STOP", stop=longStopPrice)
if (strategy.position_size < 0)
    strategy.exit(id="SHORT STOP", stop=shortStopPrice)