Strategi arbitrase statistik adaptif mengikuti momentum


Tanggal Pembuatan: 2023-12-11 16:41:27 Akhirnya memodifikasi: 2023-12-11 16:41:27
menyalin: 0 Jumlah klik: 791
1
fokus pada
1621
Pengikut

Strategi arbitrase statistik adaptif mengikuti momentum

Ringkasan

Strategi ini didasarkan pada metode Nadaraya-Watson Nuclear Regression untuk membangun sebuah beling lingkaran volatilitas dinamis yang memungkinkan sinyal perdagangan untuk membeli dan menjual dengan harga rendah dengan melacak persilangan harga dengan beling lingkaran. Strategi ini memiliki dasar analisis matematika dan dapat beradaptasi dengan perubahan pasar.

Prinsip Strategi

Inti dari strategi ini adalah menghitung harga yang bergerak di sekitar belenggu. Pertama, berdasarkan pada periode pengamatan yang disesuaikan, membangun kurva regresi inti Nadaraya-Watson dengan harga (harga close, high, low) dan mendapatkan perkiraan harga yang dihaluskan. Kemudian menghitung indikator ATR berdasarkan panjang ATR yang disesuaikan, menggabungkan faktor dekat dan faktor jauh, untuk mendapatkan jangkauan belenggu atas-bawah.

Keunggulan Strategis

  1. Berdasarkan model matematika, parameter dapat dikontrol, tidak mudah menghasilkan optimasi berlebihan
  2. Beradaptasi dengan perubahan pasar, memanfaatkan dinamika harga dan volatilitas untuk menangkap peluang perdagangan
  3. Menggunakan koordinat logarithmik, varietas yang dapat menangani periode waktu yang berbeda dan amplitudo fluktuasi
  4. Sensitivitas untuk menyesuaikan parameter kebijakan

Risiko Strategis

  1. Model matematika teoretis, kinerja hard drive mungkin kurang dari yang diharapkan
  2. Pemilihan parameter kunci membutuhkan pengalaman, pengaturan yang tidak tepat dapat mempengaruhi pendapatan
  3. Ada beberapa keterlambatan dan kemungkinan kehilangan beberapa peluang perdagangan.
  4. Pasar yang sangat bergoyang dapat menimbulkan sinyal yang salah

Untuk menghindari dan mengurangi risiko ini terutama dengan mengoptimalkan parameter, melakukan pengujian ulang, memahami faktor-faktor yang mempengaruhi, dan berhati-hati dalam menjalankan bisnis.

Arah optimasi strategi

  1. Optimalkan parameter lebih lanjut untuk menemukan kombinasi parameter terbaik
  2. Parameter pilihan otomatis menggunakan metode pembelajaran mesin
  3. Menambahkan kondisi penyaringan, mengaktifkan strategi dalam situasi pasar tertentu
  4. Menyaring sinyal yang salah dalam kombinasi dengan indikator lain
  5. Mencoba algoritma model matematika yang berbeda

Meringkaskan

Strategi ini mengintegrasikan analisis statistik dengan analisis indikator teknis, dengan cara melacak harga dan fluktuasi secara dinamis, untuk mencapai sinyal perdagangan yang murah dan murah. Parameter dapat disesuaikan sesuai dengan pasar dan kondisi mereka sendiri. Secara keseluruhan, dasar teori strategi ini kuat, kinerja praktis masih harus diverifikasi lebih lanjut.

Kode Sumber Strategi
/*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")