Strategi Momentum Stochastic

Penulis:ChaoZhang, Tarikh: 2024-01-22 10:13:23
Tag:

img

Ringkasan

Strategi Momentum Stochastic adalah strategi perdagangan kuantitatif yang menggabungkan Indeks Momentum Stochastic (SMI) dan Indeks Kekuatan Relatif (RSI). Ia menggunakan SMI untuk mengenal pasti kawasan overbought dan oversold di pasaran, dengan RSI cepat bertindak sebagai penapis isyarat. Ia juga melaksanakan penapis badan untuk pemilihan isyarat yang lebih boleh dipercayai.

Prinsip Strategi

Indeks Momentum Stochastic

Indeks Momentum Stochastic (SMI) adalah penunjuk teknikal biasa yang digunakan dalam perdagangan kuantitatif yang menggabungkan kekuatan penunjuk momentum dan osilasi.

Khususnya, SMI dikira sebagai:

SMI = (dekat - (HH + LL) /2)/(0.5*(HH - LL)) * 100

di mana HH adalah harga tertinggi selama N hari yang lalu, dan LL adalah harga terendah.

Oleh itu, SMI menggabungkan kedua-dua penghakiman momentum trend dan penghakiman pembalikan osilasi. Nilai di atas 80 dianggap terlalu banyak dibeli, sementara nilai di bawah 20 dianggap terlalu banyak dijual. Strategi ini menghasilkan isyarat perdagangan apabila SMI mencapai tahap terlalu banyak dibeli atau terlalu banyak dijual ini.

RSI pantas

Indeks Kekuatan Relatif (RSI) adalah penunjuk overbought/oversold standard. Strategi ini menggunakan RSI cepat dengan tempoh 7 untuk menilai keadaan overbought/oversold jangka pendek.

Bacaan di bawah 20 dianggap terlalu banyak dijual, sementara yang di atas 80 dianggap terlalu banyak dibeli mengikut RSI cepat. Isyarat dihasilkan apabila ambang ini dilanggar.

Penapis Badan

Strategi ini juga melaksanakan penapis badan dengan memeriksa saiz badan candlestick untuk menapis isyarat tertentu.

Ini menapis beberapa isyarat palsu dan meningkatkan kebolehpercayaan.

Kelebihan

Kombo pelbagai penunjuk

Pendekatan ini menggabungkan SMI, RSI pantas, dan penapis badan ke dalam sistem 3 bahagian yang kukuh.

Pengesanan Overbought/Oversold

Kedua-dua SMI dan RSI cepat sangat baik untuk mengesan trend yang habis. Dengan berdagang pembalikan purata dari kawasan yang terlalu meluas ini, strategi mematuhi membeli rendah dan menjual tinggi.

Perdagangan Dua Arah

Keupayaan untuk membeli kedua-dua penurunan dan perhimpunan pendek memaksimumkan peluang di seluruh keadaan pasaran.

Kawalan Risiko

Penapis badan mengelakkan whipsaws dengan menolak isyarat keyakinan rendah dalam keadaan berbelit-belit.

Risiko

Whipsaws

Sering beralih panjang / pendek membawa risiko whipsaw. mengoptimumkan logik boleh mengurangkan ini.

Perdagangan yang Sesak

Isyarat boleh mengelompokkan peserta pasaran dan memacu pembalikan cepat semasa masuk.

Angsa Hitam

Kejadian melampau boleh mengubah semua model. Stop loss pintar diperlukan untuk mengawal risiko sistematik.

Peningkatan

Pengoptimuman Parameter

Ujian tempoh SMI/RSI yang berbeza dan ambang penapis badan boleh mendedahkan nilai optimum untuk pulangan yang lebih tinggi.

Perhentian Dinamik

Memasukkan hentian berdasarkan turun naik atau ATR akan lebih baik mengandungi risiko kedudukan dan portfolio.

Pembelajaran Mesin

Model yang meramalkan tahap penunjuk masa depan boleh mengenal pasti titik perubahan lebih awal.

Kesimpulan

Ringkasnya, dengan mengintegrasikan SMI, RSI cepat, dan penapis badan, strategi ini telah mewujudkan sistem overbought / oversold yang cukup komprehensif. Pendekatan pelbagai isyarat meningkatkan ketepatan, sementara keupayaan perdagangan dua hala dan kawalan risiko menyumbang kepada keseimbangan. Dengan pengoptimuman parameter dan model yang berterusan, ia menunjukkan janji untuk menangkap keuntungan dalam jangka panjang.


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

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMIsignal < -1 * limit and close < open and body and usesmi
dn1 = SMIsignal > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Lebih lanjut