Strategi Perdagangan Breakout Saluran Regresi Linear

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

img

Gambaran umum

Strategi ini menggunakan band atas dan bawah saluran regresi linier, dikombinasikan dengan standar deviasi ganda untuk mengatur sinyal beli dan jual pecah, untuk menetapkan posisi ketika harga pecah.

Logika Strategi

Logika inti dari strategi ini didasarkan pada pita atas, pita bawah dan garis tengah saluran regresi linier.

  1. Menghitung nilai regresi linier linreg harga, dan periode berikutnyas nilai regresi linier linreg_p

  2. Menghitung kemiringan kemiringan dan pemotongan pemotongan garis regresi linier berdasarkan linreg

  3. Menghitung deviasi deviasi harga relatif terhadap garis regresi

  4. Tetapkan dev ganda dari penyimpangan untuk mendapatkan offset dari band atas dan bawah

  5. Ketika harga keluar ke atas dari band bawah, mengatur sinyal beli beli

  6. Ketika harga keluar ke bawah dari band atas, mengatur sinyal jual jual

  7. Ketika harga terbalik dari garis tengah saluran, mengatur mengambil keuntungan sinyal keluar

  8. Atur logika perdagangan berdasarkan sinyal beli, jual dan keluar

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah bahwa ia memanfaatkan tren jangka menengah dan panjang yang tercermin dari saluran regresi linier.

  1. Band atas dan bawah dapat secara efektif mencerminkan rentang normal fluktuasi harga.

  2. Crossover garis tengah sebagai sinyal mengambil keuntungan dapat memaksimalkan keuntungan dan menghindari kerugian yang disebabkan oleh pembalikan setelah menghasilkan keuntungan.

  3. Saluran regresi linier memiliki beberapa keterlambatan, yang dapat secara efektif menyaring kebisingan pasar jangka pendek dan membuat sinyal perdagangan lebih dapat diandalkan.

  4. Strategi ini memiliki beberapa parameter dan mudah diterapkan, cocok untuk perdagangan algoritmik.

Analisis Risiko

Ada beberapa risiko untuk strategi ini:

  1. Lag dari saluran regresi linier dapat melewatkan tren setelah perubahan jangka pendek drastis. Periode dapat dipersingkat untuk mengoptimalkan.

  2. Pengaturan yang salah dari deviasi multiplier juga dapat menyebabkan sinyal palsu. Parameter dapat dioptimalkan melalui backtesting.

  3. Mengandalkan hanya sinyal breakout dapat menyebabkan kerugian whipsaw. Indikator lain dapat digunakan untuk penyaringan sinyal.

  4. Ada beberapa risiko pencocokan kurva. Kombinasi dengan indikator saluran lain atau pengujian sumber data yang berbeda dapat membantu.

Arahan Optimasi

Arah optimasi utama untuk strategi ini:

  1. Optimalkan panjang saluran regresi linier untuk menyeimbangkan lag dan sensitivitas.

  2. Mengoptimalkan pengganda penyimpangan untuk meningkatkan kualitas sinyal sambil memaksimalkan kontrol risiko.

  3. Tambahkan indikator lain untuk penyaringan sinyal untuk meningkatkan tingkat kemenangan, misalnya EMA, KDJ dll.

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

  5. Uji dampak dari sumber data yang berbeda pada strategi, misalnya penutupan yang disesuaikan, data indeks dll.

  6. Sesuaikan secara dinamis parameter atau bobot sinyal berdasarkan kondisi pasar.

Kesimpulan

Secara singkat, ini adalah sistem breakout yang menggunakan saluran regresi linier sebagai indikator sinyal. Logika strategi jelas dan mudah dipahami, dengan beberapa parameter, membuat perdagangan langsung relatif mudah dilaksanakan. Namun, bagaimana mengoptimalkan parameter secara dinamis berdasarkan perubahan kondisi pasar dan menggabungkan indikator lain untuk penyaringan sinyal adalah kunci keberhasilan strategi ini. Melalui pengujian dan pengoptimalan berkelanjutan, strategi ini dapat menjadi sistem kuantitatif yang menghasilkan 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 banyak