Strategi mengikuti tren adaptif berdasarkan regresi kernel dan pita dinamis ATR

NW ATR ROC MA
Tanggal Pembuatan: 2025-02-18 15:33:21 Akhirnya memodifikasi: 2025-02-18 15:33:21
menyalin: 0 Jumlah klik: 400
1
fokus pada
1617
Pengikut

Strategi mengikuti tren adaptif berdasarkan regresi kernel dan pita dinamis ATR

Ringkasan

Strategi ini adalah sistem pelacakan tren adaptif yang menggabungkan regresi inti Nadaraya-Watson dan gelombang dinamis ATR. Ini memprediksi tren harga melalui fungsi inti sekunder yang masuk akal dan menggunakan dukungan dan resistensi dinamis berbasis ATR untuk mengidentifikasi peluang perdagangan. Sistem ini memungkinkan pemodelan pasar yang akurat melalui jendela regresi dan parameter berat yang dapat dikonfigurasi.

Prinsip Strategi

Inti dari strategi ini adalah regresi non-parameter berdasarkan metode Nadaraya-Watson, yang menggunakan fungsi biner rasional untuk memperlancar urutan harga. Regresi dihitung dari bar awal yang ditetapkan, dengan dua parameter kunci untuk mengontrol tingkat kecocokan melalui jendela lookback ((h) dan berat relatif (®). Digabungkan dengan indikator ATR untuk membangun bandwidth dinamis, band atas dan bawah masing-masing kembali ke perkiraan nilai tambah dan pengurangan ATR.

Keunggulan Strategis

  1. Metode regresi nuklir memiliki dasar matematika yang baik untuk menangkap tren harga secara efektif tanpa over-fitting
  2. Waveband dinamis beradaptasi dengan fluktuasi pasar, memberikan resistance level dukungan yang lebih masuk akal
  3. Parameter yang dapat dikonfigurasi, dapat disesuaikan dengan karakteristik pasar yang berbeda
  4. Mekanisme pengenalan tren fleksibel, dengan pilihan modus halus atau sensitif
  5. Efek visualisasi intuitif, sinyal perdagangan jelas

Risiko Strategis

  1. Pilihan parameter yang salah dapat menyebabkan overfitting atau lag
  2. Terlalu banyak sinyal perdagangan mungkin terjadi di pasar yang bergejolak
  3. Atur ATR yang tidak masuk akal dapat menyebabkan stop loss terlalu lebar atau terlalu sempit
  4. Pada periode pergeseran tren, sinyal palsu mungkin muncul. Hal ini disarankan untuk mengoptimalkan parameter melalui retrospeksi historis, dan digabungkan dengan indikator lain sebagai konfirmasi tambahan.

Arah optimasi strategi

  1. Pendahuluan indikator volume transaksi sebagai konfirmasi tren
  2. Mengembangkan mekanisme optimasi parameter adaptasi
  3. Meningkatkan intensitas filter tren untuk mengurangi sinyal palsu pasar yang bergoyang
  4. Optimalkan mekanisme stop loss untuk meningkatkan rasio untung rugi
  5. Pertimbangkan untuk memasukkan klasifikasi lingkungan pasar, menggunakan parameter yang berbeda di pasar yang berbeda

Meringkaskan

Strategi ini dibangun dengan menggabungkan metode pembelajaran statistik dengan analisis teknis untuk membangun sistem perdagangan yang kuat dan praktis dengan dasar teoritis yang kuat. Karakteristik dan konfigurasi yang dapat disesuaikan membuatnya dapat beradaptasi dengan berbagai lingkungan pasar, tetapi perlu memperhatikan pengoptimalan parameter dan pengendalian risiko saat digunakan. Dengan perbaikan dan pengoptimalan yang berkelanjutan, strategi ini diharapkan dapat memainkan peran penting dalam perdagangan nyata.

Kode Sumber Strategi
/*backtest
start: 2025-01-18 00:00:00
end: 2025-02-17 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Lupown

//@version=5
strategy("Nadaraya-Watson non repainting Strategy", overlay=true)  // PARAMETER timeframe ODSTRÁNENÝ

//--------------------------------------------------------------------------------
// INPUTS
//--------------------------------------------------------------------------------
src = input.source(close, 'Source')
h   = input.float(8., 'Lookback Window', minval=3., tooltip='The number of bars used for the estimation. This is a sliding value that represents the most recent historical bars. Recommended range: 3-50')
r   = input.float(8., 'Relative Weighting', step=0.25, tooltip='Relative weighting of time frames. As this value approaches zero, the longer time frames will exert more influence on the estimation. As this value approaches infinity, the behavior of the Rational Quadratic Kernel will become identical to the Gaussian kernel. Recommended range: 0.25-25')
x_0 = input.int(25, "Start Regression at Bar", tooltip='Bar index on which to start regression. The first bars of a chart are often highly volatile, and omission of these initial bars often leads to a better overall fit. Recommended range: 5-25')
showMiddle    = input.bool(true, "Show middle band")
smoothColors  = input.bool(false, "Smooth Colors", tooltip="Uses a crossover based mechanism to determine colors. This often results in less color transitions overall.", inline='1', group='Colors')
lag           = input.int(2, "Lag", tooltip="Lag for crossover detection. Lower values result in earlier crossovers. Recommended range: 1-2", inline='1', group='Colors')

lenjeje = input.int(32, "ATR Period",    tooltip="Period to calculate upper and lower band", group='Bands')
coef    = input.float(2.7, "Multiplier", tooltip="Multiplier to calculate upper and lower band", group='Bands')

//--------------------------------------------------------------------------------
// ARRAYS & VARIABLES
//--------------------------------------------------------------------------------
float y1 = 0.0
float y2 = 0.0
srcArray = array.new<float>(0)
array.push(srcArray, src)
size = array.size(srcArray)

//--------------------------------------------------------------------------------
// KERNEL REGRESSION FUNCTIONS
//--------------------------------------------------------------------------------
kernel_regression1(_src, _size, _h) =>
    float _currentWeight = 0.
    float _cumulativeWeight = 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]

[currentWeight1, cumulativeWeight1] = kernel_regression1(src, size, h)
yhat1 = currentWeight1 / cumulativeWeight1

[currentWeight2, cumulativeWeight2] = kernel_regression1(src, size, h - lag)
yhat2 = currentWeight2 / cumulativeWeight2

//--------------------------------------------------------------------------------
// TREND & COLOR DETECTION
//--------------------------------------------------------------------------------
// Rate-of-change-based
bool wasBearish   = yhat1[2] > yhat1[1]
bool wasBullish   = yhat1[2] < yhat1[1]
bool isBearish    = yhat1[1] > yhat1
bool isBullish    = yhat1[1] < yhat1
bool isBearishChg = isBearish  and wasBullish
bool isBullishChg = isBullish  and wasBearish

// Crossover-based (for "smooth" color changes)
bool isBullishCross  = ta.crossover(yhat2, yhat1)
bool isBearishCross  = ta.crossunder(yhat2, yhat1)
bool isBullishSmooth = yhat2 > yhat1
bool isBearishSmooth = yhat2 < yhat1

color c_bullish    = input.color(#3AFF17, 'Bullish Color', group='Colors')
color c_bearish    = input.color(#FD1707, 'Bearish Color', group='Colors')

color colorByCross = isBullishSmooth ? c_bullish : c_bearish
color colorByRate  = isBullish       ? c_bullish : c_bearish
color plotColor    = smoothColors ? colorByCross : colorByRate

// Middle Estimate
plot(showMiddle ? yhat1 : na, "Rational Quadratic Kernel Estimate", color=plotColor, linewidth=2)

//--------------------------------------------------------------------------------
// UPPER / LOWER BANDS
//--------------------------------------------------------------------------------
upperjeje = yhat1 + coef * ta.atr(lenjeje)
lowerjeje = yhat1 - coef * ta.atr(lenjeje)

plotUpper = plot(upperjeje, "Rational Quadratic Kernel Upper", color=color.rgb(0, 247, 8), linewidth=2)
plotLower = plot(lowerjeje, "Rational Quadratic Kernel Lower", color=color.rgb(255, 0, 0), linewidth=2)

//--------------------------------------------------------------------------------
// SYMBOLS & ALERTS
//--------------------------------------------------------------------------------
plotchar(ta.crossover(close, upperjeje),  char="🥀", location=location.abovebar, size=size.tiny)
plotchar(ta.crossunder(close, lowerjeje), char="🍀", location=location.belowbar, size=size.tiny)

// Alerts for Color Changes (estimator)
alertcondition(smoothColors ? isBearishCross : isBearishChg, title="Bearish Color Change", message="Nadaraya-Watson: {{ticker}} ({{interval}}) turned Bearish ▼")
alertcondition(smoothColors ? isBullishCross : isBullishChg, title="Bullish Color Change", message="Nadaraya-Watson: {{ticker}} ({{interval}}) turned Bullish ▲")

// Alerts when price crosses upper and lower band
alertcondition(ta.crossunder(close, lowerjeje), title="Price close under lower band", message="Nadaraya-Watson: {{ticker}} ({{interval}}) crossed under lower band 🍀")
alertcondition(ta.crossover(close, upperjeje),  title="Price close above upper band", message="Nadaraya-Watson: {{ticker}} ({{interval}}) Crossed above upper band 🥀")

//--------------------------------------------------------------------------------
// STRATEGY LOGIC (EXAMPLE)
//--------------------------------------------------------------------------------
if ta.crossunder(close, lowerjeje)
    // zatvoriť short
    strategy.close("Short")
    // otvoriť long
    strategy.entry("Long", strategy.long)

if ta.crossover(close, upperjeje)
    // zatvoriť long
    strategy.close("Long")
    // otvoriť short
    strategy.entry("Short", strategy.short)