Strategi mengikuti tren berdasarkan regresi Nadaraya-Watson dan saluran ATR


Tanggal Pembuatan: 2024-02-22 15:15:03 Akhirnya memodifikasi: 2024-02-22 15:15:03
menyalin: 1 Jumlah klik: 962
1
fokus pada
1617
Pengikut

Strategi mengikuti tren berdasarkan regresi Nadaraya-Watson dan saluran ATR

Ringkasan

Strategi ini adalah strategi pelacakan tren yang menggabungkan Nadaraya-Watson Regression dan saluran ATR untuk mengidentifikasi arah tren dan titik masuk. Ketika harga menerobos ke bawah, lakukan over; ketika harga menerobos ke atas, posisi kosong.

Prinsip Strategi

Pertama, strategi ini menggunakan Nadaraya-Watson Kernel Regression untuk menghitung kurva regresi pada dua periode keterlambatan yang berbeda, dan kemudian membandingkan persimpangan dua kurva regresi untuk menentukan arah tren. Secara khusus, menghitung kurva regresi pada periode h dan periode h-lag masing-masing, untuk menilai prospek ketika melewati kurva h di atas kurva h-lag; untuk menilai prospek ketika melewati kurva h di bawah kurva h-lag.

Kedua, strategi ini menggunakan saluran ATR untuk menentukan titik masuk. Jalur atas untuk kurva kembalinya ditambah dengan n kali ATR, dan jalur bawah untuk kurva kembalinya dikurangi dengan n kali ATR. Saat harga menembus jalur atas, lihatlah lebih tinggi dan masuk, dan ketika harga menembus jalur bawah, lihatlah lebih tinggi dan masuk.

Akhirnya, ada mekanisme stop loss. Jika harga berturut-turut stopLossBars akar K lebih rendah dari harga masuk, maka stop loss keluar.

Analisis Keunggulan Strategi

Strategi ini menggabungkan analisis regresi dan terobosan saluran untuk menangkap arah dan intensitas tren pasar dengan lebih akurat. Ini mengurangi sinyal palsu dan meningkatkan stabilitas strategi dibandingkan dengan mengidentifikasi tren dengan indikator seperti moving averages.

Selain itu, saluran ATR mengatur titik masuk yang masuk akal untuk menghindari masuk yang salah di dekat titik pembalikan tren.

Jadi, strategi ini memiliki kelebihan seperti kemampuan untuk mengidentifikasi tren yang kuat, keluar yang lebih akurat, dan risiko stop loss yang dapat dikontrol.

Analisis risiko

Risiko terbesar dari strategi ini adalah bahwa saat menembus saluran ATR, harga mungkin melakukan pembalikan atau penataan, sehingga menyebabkan tidak cocok untuk masuk atau keluar dari pasar segera setelah masuk.

Selain itu, kurva regresi dan saluran ATR memerlukan optimasi parameter tertentu. Jika parameter tidak diatur dengan benar, analisis regresi tidak efektif, atau ATR terlalu besar atau terlalu kecil, akan mempengaruhi efektivitas strategi.

Arah optimasi

Pertimbangan untuk mengevaluasi tren dan sinyal reversal dalam kombinasi dengan indikator lain, seperti volume, MACD, dan lain-lain, dapat digunakan untuk meningkatkan stabilitas dan akurasi strategi.

Fungsi inti dalam analisis regresi juga dapat disesuaikan, misalnya dengan mempertimbangkan inti Epanechnikov, untuk melihat apakah hasil yang lebih baik dapat diperoleh.

Siklus dan perkalian ATR dari saluran ATR juga memerlukan pengujian berulang dan pengoptimalan untuk menemukan kombinasi parameter yang optimal.

Meringkaskan

Strategi ini menggunakan analisis regresi dan metode terobosan saluran untuk mengidentifikasi arah dan kekuatan tren, masuk di titik yang masuk akal, dan mengatur stop loss, sehingga strategi pelacakan tren yang stabil. Ada banyak ruang untuk mengoptimalkan substrategi yang layak untuk pengujian lebih lanjut.

Kode 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)