MACDトレンドフォロー戦略


作成日: 2023-12-11 14:57:00 最終変更日: 2023-12-11 14:57:00
コピー: 0 クリック数: 649
1
フォロー
1621
フォロワー

MACDトレンドフォロー戦略

概要

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