MACD トレンド 戦略をフォローする

作者: リン・ハーンチャオチャン開催日:2023年12月11日14時57分
タグ:

img

概要

MACDトレンドフォロー戦略は,MACD指標に基づいた定量的な取引戦略である.この戦略は,市場動向を決定し価格動向を追跡するためにMACD黄金十字と死亡十字のシグナルを識別する.

戦略の論理

MACD トレンドフォロー戦略の基本論理は:

  1. MACD線と信号線を計算する.
  2. MACD線が0を超えると 一番高い点を記録し 死点信号を待つ
  3. MACD線が0を下回ると 最下位を記録して 金色のクロス信号を待って
  4. ロングエントリーポイントとして現在の閉店価格を記録し ストップ・ロストポイントを設定し ロングポジションを開きます
  5. ショートエントリーポイントとして現在の閉店価格を記録し ストップ・ロストポイントを設定し ショートポジションを開きます
  6. ロングポジションを保持するときは,利益比が既定の目標に達するか,引き下げがストップ・ロストポイントに達した場合,利益を実現するためにポジションを閉じる.
  7. ショートポジションを保持する際に,利益比が既定の目標に達するか,引き下げがストップ・ロストポイントに達した場合,利益を実現するためにポジションを閉じる.

このトレンドフォローメカニズムによって 戦略は市場のトレンドを タイミングで把握し 利益を得ることができます

利点分析

MACD トレンドフォロー戦略には以下の利点があります.

  1. 戦略信号の源は単一で明確で,MACD指標によって直接生成され,信号の干渉を避けます.
  2. MACD指標の黄金十字と死十字の特徴を利用して,正確な判断で市場傾向の方向性を決定します.
  3. 利潤を追跡する能力が強くなっています
  4. 適切なリスク管理とストップ・ロスト・メカニズム

リスク分析

MACD トレンドフォロー戦略には以下のリスクもあります.

  1. MACDインジケーターは誤った信号を生む傾向があり,これは超短期取引で損失につながる可能性があります.
  2. 誤ったストップ損失点設定は単一の損失を拡大させる可能性があります.
  3. 利潤追跡比とストップ損失のバランスを取るのは困難で,過剰な追跡が損失につながるリスクがある.

上記のリスクに対処するために,以下の最適化措置が可:

  1. 偽信号をフィルタリングするために他の指標と組み合わせます.
  2. ストップ・ロストポイントを動的に調整します
  3. 利潤追跡比とストップ・ロストポイントのパラメータを最適化します

オプティマイゼーションの方向性

MACD トレンドフォロー戦略は,次の側面で最適化することができます:

  1. 誤信号率を減らすためにMACD指標パラメータを最適化する.MACDの異なるサイクルパラメータをテストすることができます.

  2. 信号をフィルタリングするために取引量などの他の指標を追加します.最小取引量の条件を設定できます.

  3. 動的ストップ・ロスト・メカニズムを設定します ストップ・ロスト・ポイントは 変動に応じて動的に調整できます

  4. ポジションを開くための信号決定ロジックを最適化し,より厳格なトリガー条件を設定できます.

  5. 信号をフィルタリングするために機械学習モデルを組み込む. 信号の信頼性を判断するためにモデルを訓練することができます.

結論

一般的に,MACDトレンドフォロー戦略は比較的成熟した定量戦略である.市場トレンド方向性を決定するためにMACD指標を利用し,価格動向を効果的に追跡できるストップ・ロスのメカニズムでリスクを制御する.しかし,MACD指標自体は,誤った信号を生成しやすいいくつかの欠点もあります.したがって,この戦略のさらなる最適化のための余地があります.主に指標パラメータ,ストップ・ロスのメカニズム,信号フィルタリングなどの側面です.


/*backtest
start: 2023-11-10 00:00:00
end: 2023-12-10 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("MACD Cross Strategy", overlay=true)

// Get MACD values
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
var float entryLongPrice = na
var float entryShortPrice = na

var float highestLongProfit = 0
var float highestShortProfit = 0

var float highestMACD = 0
var float lowestMACD = 0
var bool haveOpenedLong = false
var bool haveOpenedShort = false

var float stoploss = 0.04 // To be adjust for different investment
var float minProfit = 0.05 // To be adjust for different investment

if macdLine > 0
    lowestMACD := 0
    highestMACD := math.max(highestMACD, macdLine)
    haveOpenedShort := false
else
    highestMACD := 0
    lowestMACD := math.min(lowestMACD, macdLine)
    haveOpenedLong := false

// Enter long position when MACD line crosses above the signal line
if ta.crossover(macdLine, signalLine) and macdLine < highestMACD and macdLine > 0 and haveOpenedLong == false
    strategy.entry("Long", strategy.long)
    strategy.exit("Exit Long", from_entry = "Long", stop=close*(1 - stoploss))
    entryLongPrice := close
    haveOpenedLong := true

if ta.crossunder(macdLine, signalLine) and macdLine > lowestMACD and macdLine < 0 and haveOpenedShort == false
    strategy.entry("Short", strategy.short)
    strategy.exit("Exit Short", from_entry = "Short", stop=close*(1 + stoploss))
    entryShortPrice := close
    haveOpenedShort := true

// log.info("entryLongPrice:{0}", entryLongPrice)
if strategy.position_size > 0
    profit = close - entryLongPrice
    log.info("profit:{0}", profit)
    if profit > 0
        highestLongProfit := math.max(highestLongProfit, profit)
        if profit / entryLongPrice > minProfit and highestLongProfit * 0.8 > profit
            strategy.close("Long")
            highestLongProfit := 0

if strategy.position_size < 0
    profit = entryShortPrice - close
    if profit > 0
        highestShortProfit := math.max(highestShortProfit, profit)
        log.info("highestShortProfit={0}, profit={1}", highestShortProfit, profit)
        if profit / entryShortPrice > minProfit and highestShortProfit * 0.8 > profit
            strategy.close("Short")
            highestShortProfit := 0

もっと