Strategie zur Mehrfachfilterung von Gaußschen Kanälen: So erstellen Sie ein robustes quantitatives Handelssystem

GAUSSIAN Kijun-Sen VAPI ATR TRAILING
Erstellungsdatum: 2025-09-02 18:22:32 zuletzt geändert: 2025-09-09 09:39:46
Kopie: 0 Klicks: 333
2
konzentrieren Sie sich auf
319
Anhänger

Strategie zur Mehrfachfilterung von Gaußschen Kanälen: So erstellen Sie ein robustes quantitatives Handelssystem Strategie zur Mehrfachfilterung von Gaußschen Kanälen: So erstellen Sie ein robustes quantitatives Handelssystem

Warum funktionieren herkömmliche Technologie-Indikatoren in einem komplexen Markt nicht?

In der Quantitative Trading-Branche haben wir oft ein zentrales Problem: Ein einzelner technischer Indikator ist in der Lage, falsche Signale aus dem Marktgeräusch zu erzeugen, was zu häufigen Stop-Losses und Kapitalrücknahmen führt. Wie kann man also ein Trading-System aufbauen, das sowohl Trends erfasst als auch Geräusche effektiv filtert?

Die heute analysierte Gauss-Kanal-Mehrfachfilterstrategie bietet uns eine Lösung, die es wert ist, eingehend untersucht zu werden, indem sie die technischen Kennzahlen in vier verschiedenen Dimensionen geschickt kombiniert.

Kerntechnologie-Architektur: Wie funktionieren die vier Filtermechanismen zusammen?

1. Gaussian Channel - Kern der Trenderkennung

Die Grundlage der Strategie ist ein 4-stufiger Gauss-Filter mit einer Stichprobenfenster von 144 Zyklen. Anders als bei herkömmlichen Moving Averages eliminiert der Gauss-Filter den Großteil des Marktrausches durch mathematische Modellierung, während er gleichzeitig auf Preisänderungen empfindlich bleibt.

Schlüsselparameter:

  • Gauss-Punktzahl: 4 ((Balance zwischen Rückständigkeit und Glattheit)
  • Stichprobenzyklus: 144 (für die Erfassung von mittleren Trends)
  • Filterwellenmenge: 1,414 (Standarddifferenzmenge, zur Steuerung der Kanalbreite)

2. Kijun-Sen-Linie ((130-Zyklus) - Mittel- und Langzeittrends bestätigt

Die Kijun-Sen-Linie mit 130 Zyklen wird hier als Trendfilter verwendet, anstatt der traditionellen 26-Zyklen.

Eine längere Periode ermöglicht:

  • Verringerung der Falschmeldungen
  • Sicherstellen, dass die Handelsrichtung mit den Haupttrends übereinstimmt
  • Erhöhung der Signalqualität und Verringerung der Transaktionsfrequenz

3. VAPI-Indikator - Analyse der Preise für die Auslieferung

Der Volume Adjusted Price Indicator (VAPI) beurteilt die tatsächlichen Absichten der Marktteilnehmer, indem er die Beziehung zwischen dem Umsatz und den Preisänderungen analysiert. Wenn der VAPI > 0 ist, wird mehr unterstützt, wenn < 0 ist, wird weniger unterstützt.

4. ATR-Dynamische Verlust - Risikokontrollmechanismen

Die Verwendung von 4,5 mal der 11-Zyklus-ATR als Stopp-Distanz berücksichtigt die Marktvolatilität und verhindert, dass ein zu enges Stopp durch Marktlärm ausgelöst wird.

Innovative Vermögensverwaltung: Die Weisheit der 7525-Sparte

Das Beste, was man von dieser Strategie lernen kann, ist ihre einzigartige Art, Geld zu verwalten:

Aufteilung der Logik:

  • 75%-Position: Fixes Risiko mit 3,5x höherer Rendite als Stop-Loss
  • 25% der Positionen: dynamische Verfolgung von Stop-Losses

Warum wurde es so entworfen?

  1. Sicherung der BasiseinkünfteDie Festanlage von 75 Prozent garantiert einen stabilen Ertrag für die meisten Investitionen.
  2. Überschüssige GewinneDer Tracking-Stopp von 25 Prozent ermöglicht einen höheren Gewinn, wenn der Trend fortbesteht.
  3. GefährdungsunterschiedeDie unterschiedlichen Austrittsmechanismen verringern das Risiko, dass eine einzige Strategie fehlschlägt.

Risikokontrollsysteme: mehrstufige Schutzmechanismen

1. Eintrittsrisikokontrolle

  • Das Risiko pro Transaktion wird auf 3% des Kontogeldes begrenzt.
  • Dynamische Positionsberechnung basierend auf ATR

2. Risikomanagement von Positionen

  • Hauptstop: 4,5 mal so hoch wie ATR
  • Tracking-Stopp: Dynamische Anpassung, Lockerung von Schwankungen
  • Zusätzliche Sperre: 10% Fixed Income Protection

3. Signalfiltermechanismus Vier technische Kennzahlen bestätigen gleichzeitig, dass die Wahrscheinlichkeit von Falschsignalen erheblich reduziert wird.

Analyse der strategischen Stärken und Grenzen

Kernstärken:

  1. Gute SignalqualitätDie Mehrfachfilterung erhöht die Zuverlässigkeit der Handelssignale erheblich.
  2. Risiken sind zu kontrollieren- Gute Stop-Loss- und Positionsmanagement-Systeme
  3. Äußerst anpassungsfähigATR: Dynamische Anpassung an unterschiedliche Marktschwankungen
  4. ErtragsoptimierungDie Strategie der Aufteilung der Positionen hat die Stabilitätserträge mit den Überschüssen ausgeglichen.

Mögliche Einschränkungen:

  1. TrendabhängigkeitDie Banken sind in der Lage, ihre Kunden zu unterstützen, wenn es um die Erhöhung ihrer Marktanteile geht.
  2. ParameterempfindlichMehrfache Parameter müssen für verschiedene Sorten optimiert werden
  3. RückstandDie Filterung könnte zu einer Verzögerung des Eintritts führen.

Einsatzempfehlungen

1. Auswahl der Sorten Sie sollten die Trendvarianten bevorzugen, z. B. die wichtigsten Währungspaare, Aktienindex-Futures usw.

2. Optimierung der Parameter Es wird empfohlen, die Rückverfolgung und Optimierung auf der Grundlage der historischen Daten für bestimmte Handelsarten vorzunehmen, wobei insbesondere Folgendes zu beachten ist:

  • Sammelzyklus im Gauss-Kanal
  • Die Dauer der Kijun-Sen-Zyklen
  • ATR Stop-Loss-Multiplier

3. Anpassung an die Marktbedingungen In einem offensichtlich schwankenden Markt kann eine Aussetzung der Strategie oder eine Anpassung der Parameter-Einstellungen in Betracht gezogen werden.

Zusammenfassung: Systematisches Denken bei der Quantifizierung von Transaktionen

Der Wert dieser Strategie liegt nicht nur in ihrer technischen Umsetzung, sondern auch in der systematischen Denkweise, die sie darstellt:

  1. Mehrdimensionale ValidierungDas sind die wichtigsten Faktoren, die den Handel anbieten.
  2. Risiken sind wichtigDie Strategie basiert auf einem soliden Risikokontrollsystem.
  3. ErtragsoptimierungDas ist eine sehr wichtige Frage.

Für Quantitative Trader bietet diese Strategie eine gute Referenz. Der Schlüssel liegt nicht darin, die Parameter zu übertragen, sondern die Designidee zu verstehen und entsprechend der eigenen Handelsvariante und Risikopräferenz anzupassen.

Denken Sie daran, dass die beste Strategie nicht die komplizierteste ist, sondern diejenige, die am besten zu Ihrem Handelsstil und zu Ihrem Marktumfeld passt.

Strategiequellcode
/*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")