モメントブレイク戦略

作者: リン・ハーンチャオチャン,日付: 2023年11月15日 11:09:21
タグ:

img

概要

モメントブレイクアウト戦略は,市場の動向をフォローする定量的な取引戦略である.市場価格の動向と強さを決定するために,市場価格の動向と強さを決定するために,歴史的な価格に基づいてモメント指標を計算し,市場の中長期的傾向を把握することを目的としている.モメントがマイナスからポジティブに切り替えたときに長くなって,モメントがポジティブからマイナスに切り替えたときに短くなっている.この戦略は,明らかなトレンドを持つ市場に適しており,過剰なリターンを達成することができます.

戦略の論理

この戦略の核心はモメントインジケーターに基づいている.モメントインジケーターは,現在の期間の閉店価格をN期前の閉店価格をマイナスとする.最新のバーの閉店がN期前のものよりも高くなった場合,モメントはポジティブであり,上昇傾向を示す.最新のバーの閉店がN期前のものよりも低い場合,モメントはネガティブであり,下落傾向を示す.

この戦略はまず mom0 に保存された現在の閉店マイナス18期前の閉店である18期モメントを計算し,その後 mom1 に保存された mom0 の1期モメントを計算します.

mom0>0 と mom1>0 のとき,強い上向きモメントを示す長い信号が生成される. mom0<0 と mom1<0 のとき,強い下向きモメントを示す短い信号が生成される.

ストラテジーは,最新の長信号と短信号の時間を記録する.長信号時間が短信号時間よりも最近である場合,長ポジションを保持する.短信号時間が長い信号時間よりも最近である場合,短ポジションを保持する.

利点分析

この戦略の利点は以下の通りです.

  1. 論理は単純で分かりやすいので,定量取引の初心者にも適しています.

  2. モメント インディケーターは,中長期のトレンドを追跡する際に,比較的高い収益率で市場動向と強さを把握することができます.

  3. 二重モメントフィルターは 誤ったブレイクによる損失を 避けるのに役立ちます

  4. トレンドポジションを設定し,トレンド市場での過剰収益を達成するために,シグナル後にポジションを追加します.

  5. タイムリーストップ・ロスの出口は,単一の取引損失の大きさを制御し,逆転による大きな損失を回避します.

リスク分析

この戦略のリスクは以下の通りです.

  1. 上向きのトレンドで短期的な引き下がり中にストップ損失出口,トレンド全体を把握できず,ストップ損失範囲を拡大することを検討することができます.

  2. 取引の頻度を減らすためにフィルターを緩めることを検討することができる.

  3. トレンド逆転後も元の方向に保持すると損失が増加します.逆転を検出するためにトレンド指標を組み込むことができます.

  4. パラメータの設定が正しくない場合,信号が欠落したり,誤った信号が生じる.パラメータは,異なる市場のために調整する必要があります.

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

戦略を最適化する方法:

  1. 時間枠と市場に基づいてインパント長度計算を調整することでインパントパラメータを最適化します. 信号品質を改善します.

  2. MACD,KDなどの他の指標フィルターを追加し,トレンド逆転による損失を回避します.

  3. ストップ・ロスの戦略を最適化し,トレンドにおけるストップを拡大し,トレンドでない市場におけるストップを締めくくります.

  4. ポジションのサイズを調整するルールを追加し,非トレンドのサイズを小さくし,トレンドのサイズを拡大して,より多くの利益を得ます.

  5. 適応性を向上させるために,異なる製品に対してパラメータを個別に最適化します.

  6. マシン学習アルゴリズムを組み込み パラメータを動的に最適化します

結論

モメントブレイクアウト戦略は,直感的なトレンドフォローシステムである.中期から長期間のトレンドを効果的に把握し,トレンド市場中に良い利益を達成することができる.ストップ損失最適化やトレンドを判断するための他の指標を使用してリスク管理も重要です.継続的な最適化により,この戦略は安定した利益を生む定量的な取引システムに発展することができます.


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

//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close

momentum(seria, length) =>
    mom = seria - seria[length]
    mom

mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)

/////////////// Strategy /////////////// 
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Stop Losses Long ///////////////
_5 = input(false,  "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1l = atr(atrLkbl)

longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]

slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na

/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1s = atr(atrLkbs)

shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]

slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na

_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")

/////////////// Execution ///////////////
if testPeriod()
    if useLongs
        strategy.entry("L", strategy.long, when=long)
        strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
    if useShorts
        strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
        strategy.entry("S", strategy.short, when=short)
    if not useShorts
        strategy.close("L", when=short)
    if not useLongs
        strategy.close("S", when=long)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)

もっと