Strategi Arbitrage Statistik Adaptif Pelacakan Momentum

Penulis:ChaoZhang, Tanggal: 2023-12-11 16:41:27
Tag:

img

Gambaran umum

Strategi ini membangun amplop volatilitas dinamis berdasarkan metode regresi kernel Nadaraya-Watson untuk menghasilkan sinyal perdagangan membeli rendah dan menjual tinggi dengan melacak situasi silang antara harga dan band amplop.

Logika Strategi

Inti dari strategi ini adalah untuk menghitung amplop dinamis harga. Pertama, dengan menggunakan jendela lookback kustom, ia membangun kurva regresi kernel Nadaraya-Watson harga (dekat, tinggi, rendah) untuk mendapatkan perkiraan harga yang halus. Kemudian ia menghitung ATR berdasarkan panjang ATR kustom, dan membentuk band amplop atas dan bawah dengan faktor dekat dan jauh. Ketika harga masuk ke amplop dari bawah, sinyal beli dihasilkan. Ketika harga keluar dari amplop dari atas, sinyal jual dipicu. Dengan melacak hubungan dinamis antara harga dan sifat statistik terkait volatilitas, strategi menyesuaikan keputusan tradingnya secara adaptif.

Keuntungan

  1. Berdasarkan model matematis dengan parameter yang dapat dikontrol, kemungkinan overfitting lebih sedikit.
  2. Beradaptasi dengan perubahan pasar dengan memanfaatkan hubungan dinamis antara harga dan volatilitas untuk menangkap peluang perdagangan.
  3. Skala log bekerja dengan baik dengan kerangka waktu dan instrumen yang berbeda dengan magnitudo volatilitas yang bervariasi.
  4. Parameter yang dapat disesuaikan untuk menyesuaikan sensitivitas strategi.

Risiko

  1. Sifat teoritis dari model matematika, mungkin berkinerja buruk dalam perdagangan langsung.
  2. Parameter kunci membutuhkan keahlian, pengaturan yang tidak tepat dapat merusak profitabilitas.
  3. Masalah yang tertinggal dapat menyebabkan kehilangan beberapa peluang perdagangan.
  4. Rentan terhadap whipsaws di pasar yang sangat volatile.

Optimalisasi yang tepat, backtest yang cukup, pemahaman faktor kunci dan ukuran posisi yang bijaksana dalam perdagangan langsung dapat membantu mengurangi risiko ini.

Arah Peningkatan

  1. Lebih lanjut mengoptimalkan parameter untuk menemukan kombinasi terbaik.
  2. Menerapkan metode pembelajaran mesin untuk memilih parameter optimal secara otomatis.
  3. Tambahkan filter untuk mengaktifkan strategi di lingkungan pasar tertentu.
  4. Masukkan indikator lain untuk menyaring sinyal yang menyesatkan.
  5. Coba algoritma model matematika yang berbeda.

Kesimpulan

Strategi ini menggabungkan analisis statistik dan analisis indikator teknis untuk menghasilkan sinyal perdagangan dengan melacak secara dinamis hubungan antara harga dan volatilitas. Parameter dapat disesuaikan berdasarkan kondisi pasar dan kebutuhan pribadi. Secara keseluruhan, meskipun memiliki dasar teoritis yang kuat, kinerja sebenarnya masih perlu diverifikasi lebih lanjut. Seseorang harus memperlakukannya dengan hati-hati dan berdagang dengan hati-hati.


/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © Julien_Eche
//@version=5

strategy("Nadaraya-Watson Envelope Strategy", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=20)

// Helper Functions
getEnvelopeBounds(_atr, _nearFactor, _farFactor, _envelope) => 
    _upperFar = _envelope + _farFactor*_atr
    _upperNear = _envelope + _nearFactor*_atr
    _lowerNear = _envelope - _nearFactor*_atr
    _lowerFar = _envelope - _farFactor*_atr
    _upperAvg = (_upperFar + _upperNear) / 2
    _lowerAvg = (_lowerFar + _lowerNear) / 2 
    [_upperNear, _upperFar, _upperAvg, _lowerNear, _lowerFar, _lowerAvg]

customATR(length, _high, _low, _close) =>
    trueRange = na(_high[1])? math.log(_high)-math.log(_low) : math.max(math.max(math.log(_high) - math.log(_low), math.abs(math.log(_high) - math.log(_close[1]))), math.abs(math.log(_low) - math.log(_close[1])))
    ta.rma(trueRange, length)

customKernel(x, h, alpha, x_0) =>
    sumWeights = 0.0
    sumXWeights = 0.0
    for i = 0 to h
        weight = math.pow(1 + (math.pow((x_0 - i), 2) / (2 * alpha * h * h)), -alpha)
        sumWeights := sumWeights + weight
        sumXWeights := sumXWeights + weight * x[i]
    sumXWeights / sumWeights

// Custom Settings
customLookbackWindow = input.int(8, 'Lookback Window (Custom)', group='Custom Settings')
customRelativeWeighting = input.float(8., 'Relative Weighting (Custom)', step=0.25, group='Custom Settings')
customStartRegressionBar = input.int(25, "Start Regression at Bar (Custom)", group='Custom Settings')

// Envelope Calculations
customEnvelopeClose = math.exp(customKernel(math.log(close), customLookbackWindow, customRelativeWeighting, customStartRegressionBar))
customEnvelopeHigh = math.exp(customKernel(math.log(high), customLookbackWindow, customRelativeWeighting, customStartRegressionBar))
customEnvelopeLow = math.exp(customKernel(math.log(low), customLookbackWindow, customRelativeWeighting, customStartRegressionBar))
customEnvelope = customEnvelopeClose
customATRLength = input.int(60, 'ATR Length (Custom)', minval=1, group='Custom Settings')
customATR = customATR(customATRLength, customEnvelopeHigh, customEnvelopeLow, customEnvelopeClose)
customNearATRFactor = input.float(1.5, 'Near ATR Factor (Custom)', minval=0.5, step=0.25, group='Custom Settings')
customFarATRFactor = input.float(2.0, 'Far ATR Factor (Custom)', minval=1.0, step=0.25, group='Custom Settings')
[customUpperNear, customUpperFar, customUpperAvg, customLowerNear, customLowerFar, customLowerAvg] = getEnvelopeBounds(customATR, customNearATRFactor, customFarATRFactor, math.log(customEnvelopeClose))

// Colors
customUpperBoundaryColorFar = color.new(color.red, 60)
customUpperBoundaryColorNear = color.new(color.red, 80)
customBullishEstimatorColor = color.new(color.teal, 50)
customBearishEstimatorColor = color.new(color.red, 50)
customLowerBoundaryColorNear = color.new(color.teal, 80)
customLowerBoundaryColorFar = color.new(color.teal, 60)

// Plots
customUpperBoundaryFar = plot(math.exp(customUpperFar), color=customUpperBoundaryColorFar, title='Upper Boundary: Far (Custom)')
customUpperBoundaryAvg = plot(math.exp(customUpperAvg), color=customUpperBoundaryColorNear, title='Upper Boundary: Average (Custom)')
customUpperBoundaryNear = plot(math.exp(customUpperNear), color=customUpperBoundaryColorNear, title='Upper Boundary: Near (Custom)') 
customEstimationPlot = plot(customEnvelopeClose, color=customEnvelope > customEnvelope[1] ? customBullishEstimatorColor : customBearishEstimatorColor, linewidth=2, title='Custom Estimation')
customLowerBoundaryNear = plot(math.exp(customLowerNear), color=customLowerBoundaryColorNear, title='Lower Boundary: Near (Custom)')
customLowerBoundaryAvg = plot(math.exp(customLowerAvg), color=customLowerBoundaryColorNear, title='Lower Boundary: Average (Custom)') 
customLowerBoundaryFar = plot(math.exp(customLowerFar), color=customLowerBoundaryColorFar, title='Lower Boundary: Far (Custom)')

// Fills
fill(customUpperBoundaryFar, customUpperBoundaryAvg, color=customUpperBoundaryColorFar, title='Upper Boundary: Farmost Region (Custom)')
fill(customUpperBoundaryNear, customUpperBoundaryAvg, color=customUpperBoundaryColorNear, title='Upper Boundary: Nearmost Region (Custom)')
fill(customLowerBoundaryNear, customLowerBoundaryAvg, color=customLowerBoundaryColorNear, title='Lower Boundary: Nearmost Region (Custom)')
fill(customLowerBoundaryFar, customLowerBoundaryAvg, color=customLowerBoundaryColorFar, title='Lower Boundary: Farmost Region (Custom)')


longCondition = ta.crossover(close, customEnvelopeLow)
if (longCondition)
    strategy.entry("Buy", strategy.long)

exitLongCondition = ta.crossover(customEnvelopeHigh, close)
if (exitLongCondition)
    strategy.close("Buy")


Lebih banyak