Strategi Perdagangan Penembusan Saluran Regresi Linear

Penulis:ChaoZhang, Tarikh: 2024-02-18 15:00:53
Tag:

img

Ringkasan

Strategi ini menggunakan jalur atas dan bawah saluran regresi linear, digabungkan dengan penyimpangan standard berganda untuk menetapkan isyarat beli dan jual pecah, untuk menubuhkan kedudukan apabila harga pecah.

Logika Strategi

Logik teras strategi ini berdasarkan jalur atas, jalur bawah dan garis tengah saluran regresi linear. Proses pengiraan khusus adalah seperti berikut:

  1. Mengira nilai regresi linear linreg harga, dan tempoh seterusnyas nilai regresi linear linreg_p

  2. Mengira cerun cerun dan pertalian pertalian garis regresi linear berdasarkan linreg

  3. Mengira penyimpangan penyimpangan harga berbanding garis regresi

  4. Tetapkan dev kelipatan penyimpangan untuk mendapatkan offset kumpulan atas dan bawah

  5. Apabila harga pecah ke atas dari band bawah, set membeli isyarat membeli

  6. Apabila harga pecah ke bawah dari band atas, set sell isyarat jual

  7. Apabila harga berbalik dari garis tengah saluran, set mengambil keuntungan isyarat keluar

  8. Tetapkan logik perdagangan berdasarkan isyarat beli, jual dan keluar

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah bahawa ia menggunakan trend jangka menengah dan panjang yang tercermin oleh saluran regresi linear.

  1. Band atas dan bawah dapat mencerminkan julat normal turun naik harga.

  2. Perpindahan garis tengah sebagai isyarat mengambil keuntungan dapat memaksimumkan keuntungan dan mengelakkan kerugian yang disebabkan oleh pembalikan selepas membuat keuntungan.

  3. Saluran regresi linear mempunyai beberapa kelewatan, yang dapat menapis bunyi pasaran jangka pendek dengan berkesan dan menjadikan isyarat perdagangan lebih boleh dipercayai.

  4. Strategi ini mempunyai beberapa parameter dan mudah dilaksanakan, sesuai untuk perdagangan algoritma.

Analisis Risiko

Terdapat beberapa risiko untuk strategi ini:

  1. Kelewatan saluran regresi linear mungkin terlepas trend selepas perubahan jangka pendek yang drastik. Tempohnya boleh diperpendek untuk mengoptimumkan.

  2. Tetapan yang tidak betul dari pengganda penyimpangan juga boleh membawa kepada isyarat palsu. Parameter boleh dioptimumkan melalui backtesting.

  3. Mengandalkan hanya isyarat pecah boleh membawa kepada kerugian whipsaw. Indikator lain boleh digunakan untuk penapisan isyarat.

  4. Terdapat beberapa risiko pemasangan lengkung. menggabungkan dengan penunjuk saluran lain atau menguji sumber data yang berbeza boleh membantu.

Arahan pengoptimuman

Arah pengoptimuman utama untuk strategi ini:

  1. Mengoptimumkan panjang saluran regresi linear untuk mengimbangi lag dan kepekaan.

  2. Mengoptimumkan pengganda penyimpangan untuk meningkatkan kualiti isyarat sambil memaksimumkan kawalan risiko.

  3. Tambah penunjuk lain untuk penapisan isyarat untuk meningkatkan kadar kemenangan, contohnya EMA, KDJ dll.

  4. Tambahkan mekanisme stop loss seperti ATR trailing stop loss.

  5. Uji kesan sumber data yang berbeza pada strategi, contohnya penutupan yang disesuaikan, data indeks dll.

  6. Sesuaikan parameter atau berat isyarat secara dinamik berdasarkan keadaan pasaran.

Kesimpulan

Ringkasnya, ini adalah sistem penembusan yang menggunakan saluran regresi linear sebagai penunjuk isyarat. Logik strategi jelas dan mudah difahami, dengan beberapa parameter, menjadikan perdagangan langsung agak mudah dilaksanakan. Walau bagaimanapun, bagaimana untuk mengoptimumkan parameter secara dinamik berdasarkan keadaan pasaran yang berubah dan menggabungkan indikator lain untuk penapisan isyarat adalah kunci kejayaan strategi ini. Melalui ujian dan pengoptimuman berterusan, strategi ini boleh menjadi sistem kuantitatif yang menjana keuntungan yang stabil.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Robotrading
//@version=4

strategy("robotrading linreg", "linreg", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, commission_value = 0.1)

//Settings
source      = input(close)
length      = input(100, minval=1)
offset      = input(0, minval=0)
dev         = input(2.0, "Deviation")
smoothing   = input(1, minval=1)
mtf_val     = input("", "Resolution", input.resolution)
signals     = input("Recent", "Signals Display", options=["Recent", "All"])
goto        = input(0, "End At Bar Index")

//Lin.reg.
cc(x) => x=="Red"?color.red:x=="Lime"?color.lime:x=="Orange"?color.orange:x=="Teal"?color.teal:x=="Yellow"?color.yellow:x=="Black"?color.black:color.white
data(x) => sma(security(syminfo.tickerid, mtf_val!="" ? mtf_val : timeframe.period, x), smoothing)
linreg = data(linreg(source, length, offset))
linreg_p = data(linreg(source, length, offset+1))

//Deviation
x = bar_index
slope = linreg - linreg_p
intercept = linreg - x*slope
deviationSum = 0.0
for i = 0 to length-1
    deviationSum:= deviationSum + pow(source[i]-(slope*(x-i)+intercept), 2)  
deviation = sqrt(deviationSum/(length))
x1 = x-length
x2 = x
y1 = slope*(x-length)+intercept
y2 = linreg

//Cross
dm_current = -deviation*dev + y2
dp_current = deviation*dev + y2
ex_current = (dm_current + dp_current) / 2
buy = crossunder(close, dm_current)
sell = crossover(close, dp_current)
exit = crossover(close, ex_current) or crossunder(close, ex_current)

//Channel
updating = goto <= 0 or x < goto
// if updating
//     line b = line.new(x1, y1, x2, y2, xloc.bar_index, extend.right, color.aqua, width = 3)
//     line.delete(b[1])
//     line dp = line.new(x1, deviation*dev + y1, x2, deviation*dev + y2, xloc.bar_index, extend.right, color.red, width = 3)
//     line.delete(dp[1])
//     line dm = line.new(x1, -deviation*dev + y1, x2, -deviation*dev + y2, xloc.bar_index, extend.right, color.lime, width = 3)
//     line.delete(dm[1])

//Lines
plot(dm_current, color = color.lime)
plot(dp_current, color = color.red)
plot(ex_current)
    
//Trading
if ex_current > 0
    strategy.entry("Long", strategy.long, na, limit = dm_current)
    strategy.entry("Short", strategy.short, na, limit = dp_current)
    strategy.exit("ExitLong", "Long", limit = ex_current)
    strategy.exit("ExitShort", "Short", limit = ex_current)

Lebih lanjut