Strategi Sinyal Perdagangan Pas Kuadrat

Penulis:ChaoZhang, Tanggal: 23 September 2023 15:40:57
Tag:

Gambaran umum

Strategi ini menyesuaikan kurva kuadrat dengan titik tinggi / rendah bar untuk menghasilkan sinyal perdagangan ketika harga menembus garis yang sesuai.

Logika Strategi

Komponen dan aturan utama adalah:

  1. Fitting kurva pada titik tinggi / rendah menggunakan regresi kuadrat.

  2. Beli sinyal ketika dekat putus di atas band atas.

  3. Jual sinyal ketika dekat putus di bawah band bawah.

  4. N periode verifikasi untuk menghindari pemutusan palsu.

  5. Tidak ada aturan keluar tetap, mengoptimalkan keluar melalui backtesting.

Strategi ini mencoba untuk mengidentifikasi harga kunci secara matematis dan perdagangan breakout, sistem breakout khas.

Keuntungan

Dibandingkan dengan sistem breakout lainnya, keuntungan utamanya adalah:

  1. Kecocokan matematika lebih obyektif daripada penilaian subjektif.

  2. Pendekatan baru yang menggabungkan analisis teknis dan model statistik.

  3. Verifikasi multi-periode menghindari pemutusan palsu.

  4. Backtesting dapat mengoptimalkan exit dan periode tunggu.

  5. Mudah diterapkan dengan penyesuaian yang fleksibel.

  6. Model diperbarui secara otomatis tanpa intervensi manual.

  7. Dapat menguji ketahanan parameter di berbagai produk dan kerangka waktu.

  8. Potensi untuk mengoptimalkan lebih lanjut dengan pembelajaran mesin.

  9. Pendekatan baru secara keseluruhan dengan nilai eksploratif.

Risiko

Namun, risikonya adalah:

  1. Kinerja pemasangan tergantung pada pengaturan parameter, risiko overfit.

  2. Jalur yang dipasang lambat, tidak bisa sepenuhnya menghindari kerugian.

  3. Tidak ada konfirmasi volume, risiko terperangkap.

  4. Arbitrage statistik menantang untuk alfa persisten.

  5. Periode backtest terbatas, perlu untuk memverifikasi ketahanan.

  6. Kemampuan beradaptasi dengan berbagai pasar membutuhkan validasi.

  7. Ukuran tetap tidak memiliki penyesuaian dinamis.

  8. Butuh evaluasi ketat dari rasio reward/risiko.

Peningkatan

Berdasarkan analisis, peningkatan dapat mencakup:

  1. Uji ketahanan parameter di seluruh rezim pasar.

  2. Tambahkan indikator konfirmasi volume.

  3. Mengoptimalkan masuk/keluar logika untuk sinyal berkualitas tinggi.

  4. Membangun model ukuran posisi dinamis.

  5. Masukkan stop untuk membatasi kerugian.

  6. Mengoptimalkan strategi manajemen risiko.

  7. Validasi backtest jendela bergulir.

  8. Mengevaluasi stabilitas multi-pasar.

  9. Manfaatkan pembelajaran mesin untuk optimasi model.

Kesimpulan

Dalam kesimpulan, strategi ini memiliki beberapa nilai inovatif dan merit eksperimen. Tetapi kelangsungan hidup jangka panjang dari arbitrase statistik tetap belum terbukti. pengujian dalam sampel yang komprehensif pada ketahanan, risiko / imbalan adalah kunci untuk mencegah overfit dan mempertahankan kemampuan beradaptasi.


/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

strategy(title = " Strategy Quadratic Semaphore ",
         shorttitle = "SQS",
         overlay = true,
         precision = 8,
         calc_on_order_fills = true,
         calc_on_every_tick = true,
         backtest_fill_limits_assumption = 0,
         default_qty_type = strategy.fixed,
         default_qty_value = 2,
         initial_capital = 10000,
         pyramiding=5,
         currency = currency.USD,
         linktoseries = true)

//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)

FromMonth         = input(defval = 1, title = "Month", minval = 1)
FromDay           = input(defval = 1, title = "Day", minval = 1)
FromYear          = input(defval = 2019, title = "Year", minval = 2014)

backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth           = input(defval = 31, title = "Month", minval = 1)
ToDay             = input(defval = 12, title = "Day", minval = 1)
ToYear            = input(defval = 9999, title = "Year", minval = 2014)

Config            = input(title = "══════════════ Config ══════════════", defval = true, type = input.bool)
p = input(6)
length = input(30)
//
backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))
//
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

x1 = bar_index
x2 = sqrt(x1)
y = high
//
S11 = sum(x2,length) - sqrt(sum(x1,length)) / length  
S12 = sum(x1*x2,length) - (sum(x1,length) * sum(x2,length)) / length  
S22 = sum(sqrt(x2),length) - sqrt(sum(x2,length)) / length            
Sy1 = sum (y*x1,length) - (sum(y,length) * sum(x1,length)) / length   
Sy2 = sum (y*x2,length) - (sum(y,length) * sum(x2,length)) / length   
//
max1 = sma(x1,length) 
max2 = sma(x2,length)
may = sma(y,length)
b2 = ((Sy1 * S22) - (Sy2*S12))/(S22*S11 - sqrt(S12))
b3 = ((Sy2 * S11) - (Sy1 * S12))/(S22 * S11 - sqrt(S12))
b1 = may - b2*max1 - b3*max2
qr = b1 + b2*x1 + b3*x2
//
yl = low
//
Sy1l = sum(yl*x1,length) - (sum(yl,length) * sum(x1,length)) / length  
Sy2l = sum(yl*x2,length) - (sum(yl,length) * sum(x2,length)) / length  
//
mayl = sma(yl,length)
b2l = ((Sy1l * S22) - (Sy2l*S12))/(S22*S11 - sqrt(S12))
b3l = ((Sy2l * S11) - (Sy1l * S12))/(S22 * S11 - sqrt(S12))
b1l = mayl - b2l*max1 - b3l*max2
qrl = b1l + b2l*x1 + b3l*x2
//
period = round(p/2)+1
hh = qr[period]
ll = qrl[period]
countH = 0
countL = 0
buy=0
sell=0
//
for i = 1 to period-1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

for i = period+1 to p+1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

if countH==p
    pivotH = high[period]
    buy := 1
    
if countL==p
    pivotL = low[period]
    sell := 1
//    
plotshape(buy == 1 , text='💣', style=shape.arrowup, location=location.belowbar, color=#32CD32, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 , text='🔨', style=shape.arrowdown, location=location.abovebar, color=#FF0000, textcolor=color.white, offset=0, transp=0,size=size.auto)
//

if (backTestPeriod())
    strategy.entry("long", true, 1, when = buy == 1)
    strategy.entry("short", false, 1, when = sell == 1) 


Lebih banyak