가우시안 채널 다중 필터링 전략: 강력한 양적 거래 시스템 구축 방법

GAUSSIAN Kijun-Sen VAPI ATR TRAILING
생성 날짜: 2025-09-02 18:22:32 마지막으로 수정됨: 2025-09-09 09:39:46
복사: 0 클릭수: 333
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

가우시안 채널 다중 필터링 전략: 강력한 양적 거래 시스템 구축 방법 가우시안 채널 다중 필터링 전략: 강력한 양적 거래 시스템 구축 방법

왜 전통적인 기술 지표가 복잡한 시장에서 실패하는가?

양자 거래의 핵심적인 문제는 단일 기술 지표가 시장의 소음 속에서 잘못된 신호를 만들어서 자주 스톱로스와 금전 철수를 초래한다는 것입니다. 그렇다면 어떻게 트렌드를 포착하면서도 소음을 효과적으로 필터링하는 거래 시스템을 구축할 수 있을까요?

오늘 우리가 분석한 고스 채널의 다중 필터링 전략은 4개의 다른 차원의 기술적인 지표들을 교묘하게 조합하여 우리에게 깊이 있게 연구할 가치가 있는 해결책을 제공합니다.

핵심 기술 아키텍처: 4개의 필터링 메커니즘이 어떻게 함께 작동하는가?

1. 가우시안 채널 - 트렌드 식별의 핵심

전략의 기초는 144주기의 샘플링 창을 사용하는 4단 고스피 필터이다. 전통적인 이동 평균과 달리 고스피 필터는 수학적인 모델링을 통해 대부분의 시장 소음을 제거하면서도 가격 변화에 대한 민감성을 유지한다.

키변수 설정:

  • 고스 극점 수:4 ((균형적 지연성과 평평함)
  • 샘플링 주기:144 (중기 추세를 잡기)
  • 필로파 배수:1.414 ((표준차 배수, 통로 폭을 제어)

2. 키-센 선 ((130주기) - 중·장기 경향 확인

여기서는 전통적인 26주기보다는 130주기 키-센 선이 트렌드 필터로 사용되었다. 이 조정의 의미는 무엇입니까?

더 긴 주기 설정은:

  • 가짜 침입 신호를 줄여
  • 거래 방향이 주류와 일치하는지 확인합니다.
  • 신호 품질을 높이고 거래 빈도를 낮추는 것

3. VAPI 지표 - 거래량 가격 분석

VAPI (Volume Adjusted Price Indicator) 는 거래량과 가격 변화의 관계를 분석하여 시장 참가자의 진정한 의도를 판단합니다. VAPI > 0일 때 더 많은 것을 지원하고, < 0일 때는 공백을 지원합니다.

4. ATR 동적 상쇄 - 위험 제어 메커니즘

11주기 ATR의 4.5배를 절감 거리로 사용해서, 이 설정은 시장의 변동성을 고려하면서도 시장 소음으로 촉발되는 너무 밀린 절감을 피한다.

재무 관리 혁신: 7525 분기 전략의 지혜

이 전략에서 가장 배울만한 것은 이 전략의 독특한 재무 관리 방식입니다.

분주 논리:

  • 75% 포지션: 고정 3.5배 리스크 리턴 스톱
  • 25% 포지션: 동적 추적 중지

왜 이런 식으로 설계되었을까요?

  1. 기본 수익을 보장하는 것75% 지점의 고정 제약은 대부분의 투자에 대해 안정적인 수익을 보장합니다.
  2. 과잉 수익을 잡는 것: 25% 포지션의 추적 상쇄는 추세가 지속될 때 더 큰 수익을 얻을 수 있습니다.
  3. 위험 분산다양한 탈퇴 메커니즘이 단일 전략이 실패할 위험을 낮춰줍니다.

위험 제어 시스템: 다단계 보호 메커니즘

1. 입국 위험 제어

  • 거래당 리스크는 계좌 자금의 3%로 제한됩니다.
  • ATR 기반의 동적 포지션 계산

2. 포지션 리스크 관리

  • 메인 스톱: ATR의 4.5배
  • 추적 중지: 동적 조정, 잠금 변동
  • 추가 제약: 10% 고정 수익 보호

3. 신호 필터링 메커니즘 네 가지 기술 지표가 동시에 확인되어 가짜 신호의 확률이 크게 감소했다.

전략의 장점과 한계 분석

핵심 장점:

  1. 신호 품질다중 필터링 메커니즘은 거래 신호의 신뢰성을 크게 향상시킵니다.
  2. 위험은 통제할 수 있습니다.: 완벽한 스톱 로즈 및 포지션 관리 시스템
  3. 매우 적응력이 좋다ATR의 동적 조정: 시장의 다양한 변동에 적응하기 위해
  4. 수익 최적화“이런 전략은 안정적인 수익과 초과 수익을 균형을 맞추고 있습니다”.

잠재적인 한계:

  1. 추세 의존이 시장의 위기상황에서 실적은 떨어질 수 있습니다.
  2. 매개 변수 민감여러 변수들이 다양한 품종에 따라 최적화되어야 합니다.
  3. 뒤떨어진 모습“다중 필터링으로 인해 입장이 늦어질 수 있습니다”.

실전 적용 추천

1. 품종 선택 주요 통화 쌍, 주식 지수 선물 등과 같은 강한 추세를 가진 품종을 선호하십시오.

2. 변수 최적화 특정 거래 품종에 대한 역사적 데이터에 따라 재검토 최적화를 권장하고, 특히 다음을 고려하십시오:

  • 고스 통로의 샘플링 주기
  • 키준센의 주기 길이는
  • ATR 중지 손실 배수

3. 시장 환경 적응 명백하게 흔들리는 시장에서, 전략을 일시 중지하거나 매개 변수 설정을 조정하는 것을 고려할 수 있다.

요약: 양적 거래에 대한 체계적인 사고

이 전략의 가치는 단지 기술적인 실현에만 있는 것이 아니라 체계적인 사고로 나타난다:

  1. 다차원 검증트렌드, 거래량, 변동성 등 다양한 관점에서 거래 신호를 검증합니다.
  2. 위험 우선“위험 통제 체계가 전략의 기본입니다”.
  3. 수익 최적화“분류 전략으로 서로 다른 수익 목표를 균형 잡는다”.

이 전략은 양자 거래자에게 좋은 프레임워크 참조를 제공합니다. 중요한 것은 변수를 따라다니는 것이 아니라, 설계 사상을 이해하고 자신의 거래 종류와 위험 선호도에 따라 적절하게 조정하는 것입니다.

기억하세요, 최고의 전략은 가장 복잡한 것이 아니라, 당신의 거래 스타일과 시장 환경에 가장 적합한 것입니다.

전략 소스 코드
/*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")