Strategi mengikut aliran berdasarkan regresi Nadaraya-Watson dan saluran ATR


Tarikh penciptaan: 2024-02-22 15:15:03 Akhirnya diubah suai: 2024-02-22 15:15:03
Salin: 1 Bilangan klik: 962
1
fokus pada
1617
Pengikut

Strategi mengikut aliran berdasarkan regresi Nadaraya-Watson dan saluran ATR

Gambaran keseluruhan

Strategi ini adalah strategi trend-following yang menggabungkan Nadaraya-Watson Regression dan saluran ATR untuk mengenal pasti arah trend dan titik-titik masuk. Apabila harga menembusi ke bawah, lakukan lebih banyak; apabila harga menembusi ke atas, tutup.

Prinsip Strategi

Pertama, strategi ini menggunakan Nadaraya-Watson Nuclear Regression untuk mengira kurva regresi pada dua tempoh kelewatan yang berbeza, dan kemudian membandingkan persimpangan dua kurva regresi untuk menentukan arah trend. Secara khusus, menghitung kurva regresi pada tempoh h dan tempoh h-lag secara berasingan, untuk menilai keuntungan apabila melalui kurva h di atas kurva h-lag; untuk menilai keuntungan apabila melalui kurva h di bawah kurva h-lag.

Kedua, strategi ini menggunakan saluran ATR untuk menentukan titik masuk. Peringkat ATR pada tahap n ditambah pada kurva pengembalian dan penurunan pada tahap n dikurangkan dari ATR pada tahap n. Apabila harga menembusi tahap atas, ia akan melihat lebih tinggi dan masuk, dan apabila ia menembusi tahap bawah, ia akan melihat lebih tinggi dan masuk.

Akhirnya, mekanisme hentian kerugian telah ditetapkan. Jika harga berturut-turut stopLossBars akar K adalah lebih rendah daripada harga masuk, hentian kerugian akan dikeluarkan.

Analisis kelebihan strategi

Strategi ini menggabungkan analisis regresi dan penembusan saluran untuk menangkap arah dan kekuatan trend pasaran dengan lebih tepat. Kaedah ini mengurangkan isyarat palsu dan meningkatkan kestabilan strategi berbanding dengan menggunakan indikator seperti rata-rata bergerak untuk mengenal pasti trend.

Selain itu, saluran ATR menetapkan titik masuk yang munasabah untuk mengelakkan masuk salah di dekat titik perubahan trend.

Oleh itu, strategi ini mempunyai kelebihan seperti keupayaan untuk mengenal pasti trend yang kuat, keluar yang lebih tepat, dan risiko kerugian tunggal yang terkawal.

Analisis risiko

Risiko terbesar dalam strategi ini ialah apabila penembusan saluran ATR berlaku, harga mungkin sedang melakukan pembalikan atau penataan, yang menyebabkan tidak sesuai untuk masuk atau keluar dari pasaran dengan cepat selepas masuk.

Selain itu, keluk regresi dan saluran ATR memerlukan pengoptimuman parameter tertentu. Jika parameter tidak ditetapkan dengan betul, analisis regresi tidak berkesan, atau lebar ATR terlalu besar atau terlalu kecil, akan mempengaruhi kesan strategi.

Arah pengoptimuman

Anda boleh mempertimbangkan untuk menggabungkan trend dan isyarat pembalikan dengan petunjuk lain, seperti VOLUME, MACD, dan lain-lain, untuk meningkatkan kestabilan dan ketepatan strategi.

Fungsi teras dalam analisis regresi juga boleh disesuaikan, seperti mempertimbangkan teras Epanechnikov dan sebagainya, untuk melihat sama ada kesesuaian yang lebih baik dapat diperoleh.

Kitaran ATR dan penggandaan saluran ATR juga memerlukan pengoptimuman ujian berulang untuk mencari kombinasi parameter terbaik.

ringkaskan

Strategi ini menggunakan analisis regresi dan kaedah penembusan saluran secara komprehensif, mengenal pasti arah dan kekuatan trend, masuk ke dalam tempat yang munasabah, dan menetapkan hentian, untuk mencapai strategi pengesanan trend yang stabil. Masih banyak ruang untuk mengoptimumkan sub-strategi yang layak untuk diuji dan diperbaiki lebih lanjut.

Kod sumber strategi
/*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"}]
*/

//@version=5
strategy("Custom Strategy with Stop Loss and EMA", overlay=true)

src = input(close, title='Source')
h = input(10, title='Lookback Window', tooltip='The number of bars used for the estimation.')
r = input(10, title='Relative Weighting', tooltip='Relative weighting of time frames.')
x_0 = input(50, title='Start Regression at Bar',  tooltip='Bar index on which to start regression.')
lag = input(2, title='Lag', tooltip='Lag for crossover detection.')
stopLossBars = input(3, title='Stop Loss Bars', tooltip='Number of bars to check for stop loss condition.')
emaPeriod = input(46, title='EMA Period',  tooltip='Period for Exponential Moving Averages.')

lenjeje = input(32, title='ATR Period', tooltip='Period to calculate upper and lower band')
coef = input(2.7, title='Multiplier', tooltip='Multiplier to calculate upper and lower band')

// Function for Nadaraya-Watson Kernel Regression
kernel_regression1(_src, _size, _h) =>
    _currentWeight = 0.0
    _cumulativeWeight = 0.0
    for i = 0 to _size + x_0
        y = _src[i] 
        w = math.pow(1 + (math.pow(i, 2) / ((math.pow(_h, 2) * 2 * r))), -r)
        _currentWeight += y * w
        _cumulativeWeight += w
    [_currentWeight, _cumulativeWeight]

// Calculate Nadaraya-Watson Regression
[currentWeight1, cumulativeWeight1] = kernel_regression1(src, h, h)
yhat1 = currentWeight1 / cumulativeWeight1
[currentWeight2, cumulativeWeight2] = kernel_regression1(src, h-lag, h-lag)
yhat2 = currentWeight2 / cumulativeWeight2

// Calculate Upper and Lower Bands
upperjeje = yhat1 + coef * ta.atr(lenjeje)
lowerjeje = yhat1 - coef * ta.atr(lenjeje)

// Plot Upper and Lower Bands
plot(upperjeje, color=color.rgb(0, 247, 8), title="Upper Band", linewidth=2)
plot(lowerjeje, color=color.rgb(255, 0, 0), title="Lower Band", linewidth=2)

// Calculate EMAs
emaLow = ta.ema(low, emaPeriod)
emaHigh = ta.ema(high, emaPeriod)

// Plot EMAs
plot(emaLow, color=color.rgb(33, 149, 243, 47), title="EMA (Low)", linewidth=2)
plot(emaHigh, color=color.rgb(255, 153, 0, 45), title="EMA (High)", linewidth=2)

// Long Entry Condition
longCondition = low < lowerjeje
strategy.entry("Long", strategy.long, when=longCondition)

// Stop Loss Condition
stopLossCondition = close[1] < strategy.position_avg_price and close[2] < strategy.position_avg_price and close[3] < strategy.position_avg_price
strategy.close("Long", when=stopLossCondition)

// Close and Reverse (Short) Condition
shortCondition = high > upperjeje
strategy.close("Long", when=shortCondition)
strategy.entry("Short", strategy.short, when=shortCondition)