Strategi Penapisan Pelbagai Saluran Gaussian: Cara Membina Sistem Dagangan Kuantitatif yang Teguh

GAUSSIAN Kijun-Sen VAPI ATR TRAILING
Tarikh penciptaan: 2025-09-02 18:22:32 Akhirnya diubah suai: 2025-09-09 09:39:46
Salin: 0 Bilangan klik: 333
2
fokus pada
319
Pengikut

Strategi Penapisan Pelbagai Saluran Gaussian: Cara Membina Sistem Dagangan Kuantitatif yang Teguh Strategi Penapisan Pelbagai Saluran Gaussian: Cara Membina Sistem Dagangan Kuantitatif yang Teguh

Mengapa Indeks Teknologi Tradisional Tidak Berkesan di Pasaran Kerumitan?

Dalam bidang perdagangan kuantitatif, kita sering menghadapi masalah utama: satu indikator teknikal mudah menghasilkan isyarat palsu dalam bising pasaran, yang menyebabkan kehilangan dan penarikan dana yang kerap. Jadi, bagaimana untuk membina sistem perdagangan yang dapat menangkap trend dan menyaring bising dengan berkesan?

Strategi penapisan pelbagai saluran Gaussian yang dianalisis hari ini, dengan menggabungkan empat dimensi teknikal yang berbeza, memberikan kita penyelesaian yang patut dikaji.

Arkitektur Teknologi Utama: Bagaimana Kerangka Penapisan Berempat Berkolaborasi?

1. Gaussian Channel - Pusat Pengiktirafan Trend

Dasar strategi ini adalah penapis Gaussian 4 peringkat dengan tetapan sampel 144 kitaran. Tidak seperti purata bergerak tradisional, penapis Gaussian menghilangkan sebahagian besar bunyi pasaran melalui pemodelan matematik, sambil mengekalkan kepekaan terhadap perubahan harga.

Tetapan parameter utama:

  • Nombor titik Gaussian: 4 ((seimbang ketinggalan dan kelancaran)
  • Tempoh sampel: 144 (menangkap trend pertengahan)
  • Pekali gelombang filter: 1.414 ((pekali perbezaan standard, mengawal lebar saluran)

2. Kijun-Sen line ((130 kitaran) - Pengesahan trend jangka panjang

Di sini, garis Kijun-Sen 130 kitaran digunakan sebagai penapis trend, dan bukannya kitaran 26 kitaran tradisional.

Tetapan kitaran yang lebih panjang membolehkan:

  • Mengurangkan isyarat penembusan palsu
  • Memastikan arah dagangan selaras dengan trend utama
  • Meningkatkan kualiti isyarat dan mengurangkan kekerapan transaksi

3. Indeks VAPI - Analisis Harga Pertukaran

VAPI ((Volume Adjusted Price Indicator) menilai niat sebenar peserta pasaran dengan menganalisis hubungan antara jumlah transaksi dan perubahan harga. Apabila VAPI > 0 menyokong lebih banyak, apabila < 0 menyokong kosong.

4. ATR Dynamic Stop Loss - Mekanisme Kawalan Risiko

Menggunakan 4.5 kali ganda ATR 11 kitaran sebagai jarak hentian, tetapan ini mengambil kira turun naik pasaran dan mengelakkan hentian yang terlalu ketat yang dicetuskan oleh bunyi pasaran.

Inovasi Pengurusan Dana: Kebijaksanaan Strategi Pembahagian 7525

Salah satu perkara yang paling menarik untuk dipelajari mengenai strategi ini ialah cara yang unik untuk menguruskan wang:

Logik pembahagian:

  • 75% kedudukan: 3.5 kali lebih tinggi risiko berbanding stop loss
  • 25% kedudukan: Dinamika Tracking Stop Loss

Mengapa ia direka sedemikian?

  1. Memastikan pendapatan asas:Pembatasan tetap untuk kedudukan 75% menjamin pulangan yang stabil untuk sebahagian besar pelaburan
  2. Menangkap keuntungan yang berlebihan: 25% kedudukan terhad untuk mendapatkan keuntungan yang lebih besar jika trend berterusan
  3. Penyebaran risikoMekanisme penarikan diri yang berbeza mengurangkan risiko kegagalan strategi tunggal

Sistem kawalan risiko: mekanisme perlindungan bertingkat

1. Kawalan risiko kemasukan

  • Had risiko setiap transaksi kepada 3% daripada jumlah akaun
  • Pengiraan kedudukan dinamik berdasarkan ATR

2. Pengurusan risiko pegangan

  • Kerugian utama: 4.5 kali ATR
  • Tracking stop loss: penyesuaian dinamik, kunci float
  • Penangguhan tambahan: 10% perlindungan pendapatan tetap

3. Sistem penapisan isyarat Empat petanda teknikal yang disahkan pada masa yang sama, mengurangkan kebarangkalian isyarat palsu.

Analisis kelebihan dan kekurangan strategi

Kelebihan Utama:

  1. Kualiti isyarat yang tinggiMekanisme penapisan berganda meningkatkan kebolehpercayaan isyarat perdagangan
  2. Risiko yang boleh dikawalSistem Pengurusan Stop Loss dan Kedudukan yang Baik
  3. Sangat boleh menyesuaikan diriATR berubah mengikut keadaan pasaran yang berbeza
  4. Pengoptimuman pendapatanStrategi pembahagian saham menyeimbangkan keuntungan stabil dengan keuntungan berlebihan

Batasan yang berpotensi:

  1. Trend bergantungMalaysia: Mungkin kurang baik dalam pasaran yang bergolak
  2. Sensitiviti parameterBeberapa parameter perlu dioptimumkan untuk pelbagai jenis:
  3. Ketinggalan zamanPenapisan berganda boleh menyebabkan kelewatan masa masuk

Cadangan untuk kegunaan dalam peperangan

1. Pilihan Pilih varian yang mempunyai trend yang kuat, seperti pasangan mata wang utama, indeks saham, dan sebagainya.

2. Optimasi parameter Dianjurkan untuk mengkaji semula dan mengoptimumkan berdasarkan data sejarah untuk jenis transaksi tertentu, dengan tumpuan khusus kepada:

  • Tempoh pengambilan sampel Goss Channel
  • Kijun-Sen tempoh
  • ATR Stop Loss Multiple

3. Sesuaikan diri dengan keadaan pasaran Dalam pasaran yang jelas bergolak, anda boleh mempertimbangkan untuk menangguhkan strategi atau menyesuaikan parameter.

Ringkasan: Pemikiran sistematik dalam kuantiti perdagangan

Nilai strategi ini tidak hanya terletak pada pencapaian teknikalnya, tetapi lebih kepada pemikiran sistematik yang ia wujudkan:

  1. Pengesahan pelbagai dimensi: Memeriksa isyarat dagangan dari pelbagai sudut seperti trend, jumlah dagangan, turun naik
  2. Keutamaan risiko“Sistem kawalan risiko yang baik adalah asas kepada strategi ini.
  3. Pengoptimuman pendapatanMenimbang sasaran pendapatan yang berbeza melalui strategi pembahagian.

Strategi ini menyediakan rujukan kerangka yang baik untuk peniaga kuantitatif. Kuncinya bukan untuk memindahkan parameter, tetapi untuk memahami pemikiran reka bentuknya dan menyesuaikan dengan baik mengikut jenis perdagangan dan keutamaan risiko anda.

Ingat, strategi terbaik bukanlah yang paling rumit, tetapi yang paling sesuai dengan gaya dagangan anda dan keadaan pasaran.

Kod sumber strategi
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-01 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/

// @version=6
strategy("Gaussian Channel Strategy – GC + Kijun (120) + VAPI Gate + ATR(4.5x) + 75/25 TP-TRAIL + Extra %TP",
     overlay=true)

// =============================
// ======= INPUTS ==============
// =============================
N_poles   = input.int(4,   "Gaussian Poles", minval=1, maxval=9)
per       = input.int(144, "Sampling Period", minval=2)
mult      = input.float(1.414, "Filtered TR Multiplier", step=0.001)
src       = input.source(hlc3, "Source")
modeLag   = input.bool(false, "Reduced Lag Mode")
modeFast  = input.bool(false, "Fast Response Mode")

kijunLen  = input.int(130, "Kijun-Sen Period")

vapiLen   = input.int(10, "VAPI Length")
vapiThresh= input.float(0.0, "VAPI Threshold (0 = zero line)")

atrLen    = input.int(11, "ATR Length (RMA)")
slATRmul  = input.float(4.5, "SL = ATR ×", step=0.1)
rr_fixed  = input.float(3.5, "Fixed TP RR (Leg A)", step=0.1)
allocA    = input.float(75,  "Allocation %: Fixed TP Leg", minval=1, maxval=99)
riskPct   = input.float(3.0, "Risk % of Equity per Trade", step=0.1, minval=0.1, maxval=10)

tpEnable    = input.bool(true,  "Enable Extra % Take Profit")
tpPctLong   = input.float(10.0, "Extra Long TP % of Entry",  step=0.1, minval=0)
tpPctShort  = input.float(10.0, "Extra Short TP % of Entry", step=0.1, minval=0)

// =============================
// ===== CORE COMPONENTS =======
// =============================
atr = ta.rma(ta.tr(true), atrLen)

donchian_avg(len) => (ta.highest(high, len) + ta.lowest(low, len)) / 2.0
kijun = donchian_avg(kijunLen)

// --- VAPI_LB (LazyBear) ---
rs(x, len) => ta.cum(x) - nz(ta.cum(x)[len])
v_x   = (2*close - high - low) / math.max(high - low, syminfo.mintick)
v_tva = rs(volume * v_x, vapiLen)
v_tv  = rs(volume, vapiLen)
v_va  = 100 * (v_tva / v_tv)

// =============================
// ===== Gaussian Channel ======
// =============================
f_filt9x(_a, _s, _i) =>
    int _m2 = 0, int _m3 = 0, int _m4 = 0, int _m5 = 0, int _m6 = 0,
    int _m7 = 0, int _m8 = 0, int _m9 = 0, float _f = 0.0, _x = (1 - _a)
    _m2 := _i == 9 ? 36  : _i == 8 ? 28 : _i == 7 ? 21 : _i == 6 ? 15 : _i == 5 ? 10 : _i == 4 ? 6 : _i == 3 ? 3 : _i == 2 ? 1 : 0
    _m3 := _i == 9 ? 84  : _i == 8 ? 56 : _i == 7 ? 35 : _i == 6 ? 20 : _i == 5 ? 10 : _i == 4 ? 4 : _i == 3 ? 1 : 0
    _m4 := _i == 9 ? 126 : _i == 8 ? 70 : _i == 7 ? 35 : _i == 6 ? 15 : _i == 5 ? 5  : _i == 4 ? 1 : 0
    _m5 := _i == 9 ? 126 : _i == 8 ? 56 : _i == 7 ? 21 : _i == 6 ? 6  : _i == 5 ? 1  : 0 
    _m6 := _i == 9 ? 84  : _i == 8 ? 28 : _i == 7 ? 7  : _i == 6 ? 1  : 0 
    _m7 := _i == 9 ? 36  : _i == 8 ? 8  : _i == 7 ? 1  : 0 
    _m8 := _i == 9 ? 9   : _i == 8 ? 1  : 0 
    _m9 := _i == 9 ? 1   : 0
    _f := math.pow(_a, _i) * nz(_s) +
         _i  *     _x      * nz(_f[1])      - (_i >= 2 ?
         _m2 * math.pow(_x, 2)  * nz(_f[2]) : 0) + (_i >= 3 ?
         _m3 * math.pow(_x, 3)  * nz(_f[3]) : 0) - (_i >= 4 ?
         _m4 * math.pow(_x, 4)  * nz(_f[4]) : 0) + (_i >= 5 ?
         _m5 * math.pow(_x, 5)  * nz(_f[5]) : 0) - (_i >= 6 ?
         _m6 * math.pow(_x, 6)  * nz(_f[6]) : 0) + (_i >= 7 ?
         _m7 * math.pow(_x, 7)  * nz(_f[7]) : 0) - (_i >= 8 ?
         _m8 * math.pow(_x, 8)  * nz(_f[8]) : 0) + (_i == 9 ?
         _m9 * math.pow(_x, 9)  * nz(_f[9]) : 0)

f_pole(_a, _s, _i) =>
    _f1 =            f_filt9x(_a, _s, 1),      _f2 = (_i >= 2 ? f_filt9x(_a, _s, 2) : 0), _f3 = (_i >= 3 ? f_filt9x(_a, _s, 3) : 0)
    _f4 = (_i >= 4 ? f_filt9x(_a, _s, 4) : 0), _f5 = (_i >= 5 ? f_filt9x(_a, _s, 5) : 0), _f6 = (_i >= 6 ? f_filt9x(_a, _s, 6) : 0)
    _f7 = (_i >= 7 ? f_filt9x(_a, _s, 7) : 0), _f8 = (_i >= 8 ? f_filt9x(_a, _s, 8) : 0), _f9 = (_i == 9 ? f_filt9x(_a, _s, 9) : 0)
    _fn = _i == 1 ? _f1 : _i == 2 ? _f2 : _i == 3 ? _f3 : _i == 4 ? _f4 : _i == 5 ? _f5 : _i == 6 ? _f6 : _i == 7 ? _f7 : _i == 8 ? _f8 : _i == 9 ? _f9 : na
    [_fn, _f1]

beta  = (1 - math.cos(4*math.asin(1)/per)) / (math.pow(1.414, 2/N_poles) - 1)
alpha = - beta + math.sqrt(math.pow(beta, 2) + 2*beta)

lag = (per - 1) / (2.0 * N_poles)

srcdata = modeLag ? src + (src - nz(src[lag])) : src
tr_raw  = ta.tr(true)
trdata  = modeLag ? tr_raw + (tr_raw - nz(tr_raw[lag])) : tr_raw

[filt_n, filt_1]       = f_pole(alpha, srcdata, N_poles)
[filt_n_tr, filt_1_tr] = f_pole(alpha, trdata,  N_poles)

filt   = modeFast ? (filt_n + filt_1)/2.0 : filt_n
filttr = modeFast ? (filt_n_tr + filt_1_tr)/2.0 : filt_n_tr

hband = filt + filttr * mult
lband = filt - filttr * mult

// =============================
// ===== Signals & Filters =====
// =============================
doLong  = close > filt and close > kijun and v_va > vapiThresh
doShort = close < filt and close < kijun and v_va < -vapiThresh

// =============================
// ===== Position Sizing =======
// =============================
riskValue   = strategy.equity * (riskPct/100.0)
slDist      = atr * slATRmul
qtyTotal    = slDist > 0 ? riskValue / slDist : 0.0
qtyA        = qtyTotal * (allocA/100.0)
qtyB        = qtyTotal * ((100 - allocA)/100.0)

// =============================
// ===== Order Execution =======
// =============================
var float trailStopL = na
var float trailStopS = na

inLong  = strategy.position_size > 0
inShort = strategy.position_size < 0
entryPx = strategy.position_avg_price

// Entries
if doLong and not inLong and strategy.position_size <= 0
    strategy.order("L-A", strategy.long, qty=qtyA)
    strategy.order("L-B", strategy.long, qty=qtyB)
    trailStopL := na
if doShort and not inShort and strategy.position_size >= 0
    strategy.order("S-A", strategy.short, qty=qtyA)
    strategy.order("S-B", strategy.short, qty=qtyB)
    trailStopS := na

// LONG management
if inLong
    slL = entryPx - slDist
    tpA = entryPx + rr_fixed * slDist

    // Leg A: 固定RR止盈 + 止损
    strategy.exit("TP/SL-LA", from_entry="L-A", limit=tpA, stop=slL)

    // Leg B: 追踪止损
    trailStopL := na(trailStopL[1]) or strategy.position_size[1] <= 0 ? slL : math.max(trailStopL[1], close - slDist)
    strategy.exit("Trail-LB", from_entry="L-B", stop=trailStopL)

    // 额外百分比止盈
    if tpEnable and high >= entryPx * (1 + tpPctLong/100.0)
        strategy.close("L-A", comment="ExtraTP")
        strategy.close("L-B", comment="ExtraTP")

// SHORT management
if inShort
    slS = entryPx + slDist
    tpA = entryPx - rr_fixed * slDist

    // Leg A: 固定RR止盈 + 止损
    strategy.exit("TP/SL-SA", from_entry="S-A", limit=tpA, stop=slS)

    // Leg B: 追踪止损
    trailStopS := na(trailStopS[1]) or strategy.position_size[1] >= 0 ? slS : math.min(trailStopS[1], close + slDist)
    strategy.exit("Trail-SB", from_entry="S-B", stop=trailStopS)

    // 额外百分比止盈
    if tpEnable and low <= entryPx * (1 - tpPctShort/100.0)
        strategy.close("S-A", comment="ExtraTP")
        strategy.close("S-B", comment="ExtraTP")

// =============================
// ===== 图表绘制 ==============
// =============================
fcolor = filt > nz(filt[1]) ? color.new(color.lime, 0) : filt < nz(filt[1]) ? color.new(color.red, 0) : color.new(color.gray, 0)
plotFilter = plot(filt,  title="GC Filter",    color=fcolor, linewidth=2)
plotH      = plot(hband, title="GC High Band", color=fcolor)
plotL      = plot(lband, title="GC Low Band",  color=fcolor)
fill(plotH, plotL, color=color.new(fcolor, 80))

plot(kijun, "Kijun-Sen", color=color.new(color.maroon, 0))

// 信号标记
plotshape(doLong,  title="Long Setup",  style=shape.triangleup,   location=location.belowbar, color=color.new(color.lime, 0), size=size.tiny, text="ENTRY L")
plotshape(doShort, title="Short Setup", style=shape.triangledown, location=location.abovebar, color=color.new(color.fuchsia, 0), size=size.tiny, text="ENTRY S")