Strategi Isyarat Dagangan yang Sesuai Kuadrat

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

Ringkasan

Strategi ini menyesuaikan kurva kuadrat ke titik tinggi / rendah bar untuk menjana isyarat perdagangan apabila harga memecahkan garis yang dipasang.

Logika Strategi

Komponen dan peraturan utama adalah:

  1. Sesuaikan lengkung pada titik tinggi / rendah menggunakan regresi kuadrat.

  2. Beli isyarat apabila hampir pecah di atas band atas.

  3. Jual isyarat apabila dekat pecah di bawah band bawah.

  4. N tempoh pengesahan untuk mengelakkan pecah palsu.

  5. Tiada peraturan keluar tetap, optimum keluar melalui backtesting.

Strategi ini cuba untuk mengenal pasti harga utama secara matematik dan berdagang breakout, sistem breakout biasa.

Kelebihan

Berbanding dengan sistem breakout lain, kelebihan utama adalah:

  1. Kecocokan matematik lebih objektif daripada penilaian subjektif.

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

  3. Pengesahan berbilang tempoh mengelakkan pemutusan palsu.

  4. Ujian balik boleh mengoptimumkan keluar dan tempoh menunggu.

  5. Mudah dilaksanakan dengan penyesuaian fleksibel.

  6. Model dikemas kini secara automatik tanpa campur tangan manual.

  7. Boleh menguji ketahanan parameter merentasi produk dan jangka masa.

  8. Potensi untuk mengoptimumkan lebih lanjut dengan pembelajaran mesin.

  9. Pendekatan baru secara keseluruhan dengan nilai eksplorasi.

Risiko

Walau bagaimanapun, risiko adalah:

  1. Prestasi pemasangan bergantung pada penyesuaian parameter, risiko pemasangan berlebihan.

  2. Talian yang dipasang lambat, tidak dapat mengelakkan kerugian sepenuhnya.

  3. Tiada pengesahan jumlah, risiko terperangkap.

  4. Arbitraj statistik adalah mencabar untuk alfa berterusan.

  5. Tempoh backtest terhad, perlu mengesahkan ketahanan.

  6. Kebolehsesuaian pelbagai pasaran memerlukan pengesahan.

  7. Saiz tetap tidak mempunyai penyesuaian dinamik.

  8. Perlu penilaian ketat nisbah ganjaran / risiko.

Peningkatan

Berdasarkan analisis, penambahbaikan mungkin melibatkan:

  1. Uji ketahanan parameter di seluruh rejimen pasaran.

  2. Tambah penunjuk pengesahan jumlah.

  3. Mengoptimumkan logik masuk / keluar untuk isyarat yang lebih berkualiti.

  4. Membina model saiz kedudukan dinamik.

  5. Masukkan hentian untuk mengehadkan kerugian.

  6. Mengoptimumkan strategi pengurusan risiko.

  7. Pembuktian backtest tingkap bergulir.

  8. Menilai kestabilan pelbagai pasaran.

  9. Memanfaatkan pembelajaran mesin untuk pengoptimuman model.

Kesimpulan

Kesimpulannya, strategi ini mempunyai beberapa nilai inovatif dan merit eksperimen. Tetapi daya maju jangka panjang arbitrase statistik masih belum terbukti. Ujian dalam sampel yang komprehensif mengenai ketahanan, risiko / ganjaran adalah kunci untuk mengelakkan overfit dan mengekalkan daya adaptasi.


/*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 lanjut