Strategi Pembebasan Momentum

Penulis:ChaoZhang, Tarikh: 2023-11-15 11:09:21
Tag:

img

Ringkasan

Strategi Momentum Breakout adalah strategi perdagangan kuantitatif yang mengikuti trend pasaran. Ia mengira penunjuk momentum berdasarkan harga sejarah untuk menentukan trend dan kekuatan pergerakan harga pasaran, bertujuan untuk menangkap trend jangka menengah hingga panjang di pasaran. Ia pergi lama apabila momentum melintasi dari negatif ke positif, dan pergi pendek apabila momentum melintasi dari positif ke negatif. Strategi ini sesuai untuk pasaran dengan trend yang jelas dan boleh mencapai pulangan yang berlebihan.

Logika Strategi

Inti strategi ini adalah berdasarkan penunjuk momentum. Penunjuk momentum adalah harga penutupan tempoh semasa dikurangkan daripada harga penutupan N tempoh lalu. Apabila penutupan bar terakhir lebih tinggi daripada N tempoh lalu, momentum adalah positif, menunjukkan trend menaik; apabila penutupan bar terakhir lebih rendah daripada N tempoh lalu, momentum adalah negatif, menunjukkan trend menurun.

Strategi pertama mengira momentum 18 tempoh, yang merupakan penutupan semasa dikurangkan penutupan 18 tempoh yang lalu, disimpan dalam mom0. Ia kemudian mengira momentum 1 tempoh mom0, disimpan dalam mom1.

Apabila mom0>0 dan mom1>0, isyarat panjang dihasilkan, menunjukkan momentum menaik yang kuat. Apabila mom0<0 dan mom1<0, isyarat pendek dihasilkan, menunjukkan momentum menurun yang kuat.

Strategi ini merekodkan masa isyarat panjang dan pendek yang paling baru. Apabila masa isyarat panjang lebih baru daripada masa isyarat pendek, ia memegang kedudukan panjang. Apabila masa isyarat pendek lebih baru daripada masa isyarat panjang, ia memegang kedudukan pendek.

Analisis Kelebihan

Kelebihan strategi ini termasuk:

  1. Logiknya mudah dan mudah difahami, sesuai untuk pemula dalam perdagangan kuantitatif.

  2. Penunjuk momentum boleh menangkap trend pasaran dan kekuatan dengan kadar kemenangan yang agak tinggi apabila mengesan trend jangka menengah hingga panjang.

  3. Penapis momentum berganda membantu mengelakkan kehilangan daripada terobosan palsu.

  4. Ia menambah kedudukan selepas isyarat untuk menubuhkan kedudukan trend dan mencapai pulangan yang berlebihan semasa pasaran trend.

  5. Keluar stop loss tepat pada masanya mengawal saiz kerugian perdagangan tunggal dan mengelakkan kerugian besar daripada pembalikan.

Analisis Risiko

Beberapa risiko strategi ini perlu diperhatikan:

  1. Keluar stop loss semasa penurunan jangka pendek dalam trend menaik, tidak dapat menangkap keseluruhan trend.

  2. Perdagangan terbuka dan tertutup yang kerap di pasaran yang berbeza meningkatkan kos dari komisen dan slippage.

  3. Tetap memegang dalam arah asal selepas pembalikan trend membesarkan kerugian.

  4. Tetapan parameter yang tidak betul menyebabkan isyarat hilang atau menghasilkan isyarat palsu.

Arahan pengoptimuman

Beberapa cara untuk mengoptimumkan strategi:

  1. Mengoptimumkan parameter momentum dengan menyesuaikan pengiraan panjang momentum berdasarkan jangka masa dan pasaran.

  2. Tambah penapis penunjuk lain seperti MACD, KD untuk mengelakkan kerugian daripada pembalikan trend.

  3. Mengoptimumkan strategi stop loss dengan memperluaskan berhenti dalam trend dan mengetatkan berhenti di pasaran bukan trend.

  4. Tambahkan peraturan saiz kedudukan untuk mengurangkan saiz dalam bukan trend dan meningkatkan saiz dalam trend untuk menangkap lebih banyak keuntungan.

  5. Mengoptimumkan parameter secara berasingan untuk produk yang berbeza untuk meningkatkan daya adaptasi.

  6. Menggabungkan algoritma pembelajaran mesin untuk mengoptimumkan parameter secara dinamik.

Kesimpulan

Strategi Momentum Breakout adalah sistem trend berikut yang intuitif. Ia dapat menangkap dengan berkesan trend jangka menengah hingga panjang dan mencapai keuntungan yang baik semasa pasaran trend. Pengurusan risiko melalui pengoptimuman stop loss dan menggunakan penunjuk lain untuk menilai trend juga penting. Dengan pengoptimuman berterusan, strategi ini boleh dibangunkan menjadi sistem perdagangan kuantitatif yang menjana keuntungan yang stabil.


/*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)

Lebih lanjut