Strategi Isyarat Dagangan Quadratic Fit


Tarikh penciptaan: 2023-09-23 15:40:57 Akhirnya diubah suai: 2023-09-23 15:40:57
Salin: 2 Bilangan klik: 627
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ini menggunakan kurva dua kali untuk menyesuaikan garis K yang tinggi dan rendah untuk membentuk isyarat perdagangan. Apabila harga sebenar menembusi kurva penyesuaian, ia menghasilkan isyarat beli dan jual. Strategi ini cuba menggunakan model matematik untuk mengenal pasti sokongan dan rintangan utama untuk melakukan perdagangan pecah.

Prinsip Strategi

Komponen dan peraturan utama strategi ini adalah seperti berikut:

  1. Menyesuaikan tinggi dan rendah: Menggunakan kelompokan binari terendah kurva duaan untuk menyesuaikan tinggi dan rendah garis K.

  2. Isyarat beli: Isyarat beli dihasilkan apabila harga penutupan K line menembusi kurva atas.

  3. Sinyal jual: Sinyal jual dihasilkan apabila harga penutupan K-Line menembusi kurva bawah.

  4. Pengesahan N kitaran: memerlukan penembusan berterusan N kitaran untuk berkuatkuasa, mengelakkan penembusan palsu.

  5. Isyarat kedudukan rendah: Tiada isyarat kedudukan rendah yang jelas, dengan pengoptimuman pengesanan semula untuk menentukan masa memegang kedudukan.

Strategi ini cuba untuk mengenal pasti harga kritikal melalui model matematik dan masuk ke dalam pasaran apabila berlaku penembusan, yang merupakan sistem penembusan tipikal.

Analisis kelebihan

Kelebihan utama strategi ini berbanding dengan sistem penembusan yang lain ialah:

  1. Menggunakan model matematik untuk menyesuaikan diri, lebih objektif daripada subjektif.

  2. Ia menggabungkan teknik perdagangan dengan model statistik, dan kaedahnya adalah baru.

  3. Memperkenalkan pengesahan berbilang kitaran untuk menapis penembusan palsu.

  4. Pengoptimuman retrospektif boleh mencari masa yang optimum untuk memegang kedudukan.

  5. Ia tidak sukar untuk dilaksanakan dan boleh disesuaikan secara fleksibel.

  6. Model ini dikemas kini secara automatik tanpa memerlukan penyelenggaraan manual.

  7. Parameter kecergasan boleh diperiksa untuk pelbagai jenis dan kitaran.

  8. Pembelajaran mesin boleh diperkenalkan untuk pengoptimuman dan pengesahan yang lebih lanjut.

  9. Secara keseluruhannya, ia adalah sesuatu yang baru dan patut diteliti.

Analisis risiko

Tetapi strategi ini juga mempunyai risiko:

  1. Kesan yang sesuai bergantung kepada pilihan parameter, mungkin terlalu optimum.

  2. Terdapat kelewatan pada keluk kesesuaian yang tidak dapat mengelakkan kerugian sepenuhnya.

  3. Tidak mengambil kira jumlah transaksi, terdapat risiko disekat.

  4. Arbitrase statistik sukar untuk mendapatkan keuntungan tambahan yang stabil dalam jangka masa panjang.

  5. Tempoh pengesanan adalah pendek, dan model perlu disahkan.

  6. Adaptasi alam sekitar pelbagai varieti perlu diuji.

  7. Posisi tetap tidak boleh disesuaikan secara dinamik.

  8. Peratusan penarikan balik pendapatan perlu dinilai dengan ketat.

Arah pengoptimuman

Berdasarkan analisis di atas, strategi ini boleh dipertingkatkan dalam beberapa aspek:

  1. Pengujian kekuatan parameter dalam persekitaran pasaran yang berbeza.

  2. Tambah indikator pengesahan jumlah transaksi.

  3. Optimumkan logik keluar masuk dan meningkatkan kualiti isyarat.

  4. Membina model pengurusan kedudukan dinamik.

  5. Memperkenalkan strategi hentikan kerugian untuk menghadkan kerugian.

  6. Strategi pengurusan wang yang dioptimumkan

  7. Pengesahan tetingkap bergulir.

  8. Penilaian kemampuan pendapatan stabil pelbagai jenis.

  9. Model ini dioptimumkan dengan pembelajaran mesin.

ringkaskan

Secara keseluruhan, strategi ini mempunyai nilai inovasi dan eksperimen. Namun, keuntungan stabil jangka panjang Statistical Arbitrage masih menghadapi ujian. Dalam penilaian semula, strategi perlu diperiksa secara menyeluruh mengenai kestabilan, risiko dan keuntungan strategi, untuk mengelakkan overfit, supaya strategi tetap dapat menyesuaikan diri dalam pasaran yang berubah-ubah.

Kod sumber strategi
/*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)