VWAP 편차 대역 및 변동성 필터 거래 전략

VWAP ATR 偏差带 波动性过滤
생성 날짜: 2025-04-07 11:57:02 마지막으로 수정됨: 2025-04-07 11:57:10
복사: 0 클릭수: 510
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

VWAP 편차 대역 및 변동성 필터 거래 전략 VWAP 편차 대역 및 변동성 필터 거래 전략

개요

VWAP 편차띠와 변동성 필터링 거래 전략은 거래량 가중 평균 가격 (VWAP) 과 표준 격차 통로를 기반으로 한 일일 거래 시스템이다. 이 전략은 VWAP를 가격의 중심 참조점으로 사용하여 알 브룩스의 H1/H2 및 L1/L2 역전 형태를 결합하고 ATR의 변동성 필터를 통해 낮은 변동성 환경을 필터링하여 구조화된 거래 의사 결정 프레임워크를 형성한다.

전략 원칙

이 전략의 핵심은 다음과 같은 몇 가지 핵심 요소에 기반합니다.

  1. 매 거래일 VWAP 계산을 고정: 각 거래일 초에 VWAP 계산을 재설정하여 가격 기준점이 당일 거래 활동과 밀접하게 연관되어 있는지 확인한다. 전략은 표준 차이를 사용하여 VWAP 위와 아래의 변동 영역을 생성하며, 기본 설정은 2배의 표준 차이를 설정한다.

  2. 출입 신호

    • 다중 입점 ((H1/H2): 가격 오픈이 아래 2배의 표준 편차 변수 영역보다 낮지만, 닫기 영역이 이 변수 영역보다 높으며, 동시에 충분한 다중 입점 강도가 있다 ((bar 영역 내의 닫기 위치를 통해 계산) ).
    • 공백 입구 ((L1/L2): 가격이 상위 2배 표준 차치 편차 영역보다 높게 열리지만, 공백 강도가 충분하면서 이 편차 영역보다 낮은 닫기.
  3. 변동성 필터

    • ATR ((14) 를 사용하여 시장의 변동성을 측정합니다.
    • 표준 편차 범위가 너무 작을 때 거래 신호를 건너뛰기 (ATR의 3배 미만) 로 낮은 변동성 환경에서 실수로 진입하는 것을 피합니다.
  4. 손해 중지 설정

    • 다단: 신호 기둥 하위점 빼기 정지 버퍼 영역
    • 빈 머리: 신호 기둥의 높음과 스탠드 버퍼 영역
  5. 이득을 얻기 위한 전략

    • 다공영방향에 대해 독립적으로 구성할 수 있는 다른 출장 논리
    • 옵션은 VWAP로 돌아가거나, 특정 편차대 목표치에 도달하거나, 자동 수익을 차단할 수 있습니다.
  6. 안전한 탈퇴

    • 정해진 수의 역형 기둥이 연속적으로 나타났을 때 안전 탈퇴를 유발합니다.
    • 다중 머리: 연속 X 음경
    • 빈 머리: 연속으로 X개의 태양 기둥

전략은 완전한 신호 강도 계산 기계를 구현하여, 상점 가격의 높은 낮은 범위의 상대적인 위치를 계산하여 각 신호의 품질을 평가한다. 신호 강도가 최소 경계를 달성했을 때만 유효한 입시 신호를 고려한다.

전략적 이점

코드에 대한 심층적인 분석 결과, 이 전략은 다음과 같은 중요한 장점을 가지고 있습니다:

  1. 시장 구조에 기반한 입점전략은 단순히 가격의 변동을 추적하는 것이 아니라, 가격의 특정 반전 형태를 구하기 위한 것입니다. 반전 영역 근처에서, 이는 거래가 회귀 평균의 통계적 우위를 따라 진행된다는 것을 의미합니다.

  2. 다중 필터링 장치: 변동성 필터, 신호 강도 요구 사항 및 특정 가격 형태를 통해 거래 신호를 다층적으로 필터링하여 오해를 일으키는 신호를 현저히 줄입니다.

  3. 유연한 위험 관리이 전략은 신호 기둥에 기반한 긴밀한 중지, 조정 가능한 수익 목표 및 안전한 퇴출 메커니즘을 포함한 여러 가지 위험 제어 도구를 제공하여 거래자가 다른 시장 환경에 따라 위험 요소를 조정할 수 있습니다.

  4. 독립적인 다공간 구성전략: 전략은 거래자가 독립적으로 다중 헤드 및 공표 거래의 입출력 조건을 구성할 수 있도록 해줍니다. 이는 방향성 선호 시장에서 성능을 최적화하는 데 매우 가치가 있습니다.

  5. 시각 보조이 전략에는 VWAP, 편향선 표시 및 낮은 변동 영역의 고조명과 같은 풍부한 시각 옵션이 포함되어 있으며, 거래자가 시장 상태와 잠재적인 신호를 더 직관적으로 이해할 수 있도록 도와줍니다.

  6. VWAP로 설정된 세션: 매 거래일 VWAP를 재계산하여 가격 기준점이 현재 시장 활동과 항상 관련되어 있다는 것을 보장하고, 노후화된 기준점을 사용하는 문제를 피합니다.

  7. 신호 품질을 강조합니다.: 신호 강도를 계산하여, 전략은 가격과 오차 영역의 기계적 교차가 아닌 고품질 반전 신호에 초점을 맞추고 있습니다.

전략적 위험

이 전략은 훌륭하게 설계되었지만, 다음과 같은 잠재적인 위험들이 있습니다.

  1. 동향 시장의 역전 위험: 평균값 회귀에 기반한 전략으로서, 강한 트렌드 시장에서 역향 신호를 자주 유발하여 연속적인 손실을 초래할 수 있다. 해결 방법: 강한 트렌드 환경에서 역향 방향으로 거래를 비활성화하거나 필터 조건을 추가할 수 있다.

  2. 매개변수 민감도전략 성능은 표준 차의 배수, 정지 크기 및 신호 강도 값과 같은 여러 핵심 파라미터에 크게 의존합니다. 해결 방법: 전체적인 파라미터 최적화 및 민감성 분석을 수행하여 다양한 시장 조건에서 안정적인 파라미터 세트를 찾습니다.

  3. 시간 필터 부족전략은 거래 시기의 특성을 고려하지 않으며, 시장의 개방 또는 폐쇄와 같은 특히 높은 변동성의 시간에 잘못된 신호를 일으킬 수 있습니다. 해결 방법: 특정 시장 시간에 거래하는 것을 피하기 위해 시간 필터를 추가하십시오.

  4. 고정 손실 위험: 고정 점수를 사용하는 스톱은 다양한 변동성 환경에서 일관되게 작동하지 않을 수 있습니다. 해결 방법: ATR 기반의 동적 스톱을 사용하여 스톱을 현재의 시장 변동성에 맞게 조정하는 것을 고려하십시오.

  5. 거래량 필터링의 부족전략: VWAP를 사용하지만, 낮은 거래량 환경을 직접 필터링하지 않습니다. 이는 유동성이 부족할 경우 신뢰할 수없는 신호를 유발할 수 있습니다. 해결 방법: 거래량 하락 조건을 추가하여 충분한 유동성 환경에서만 거래하도록합니다.

  6. 안전한 퇴각의 시점: 고정된 수의 역형 기둥이 조기에 안전 탈퇴를 유발할 수 있거나, 정말로 탈퇴가 필요할 때 충분히 빠르게 반응하지 않을 수 있다. 해결 방법: 가격 변동의 폭과 기둥의 수를 결합한 동적 안전 탈퇴 메커니즘을 고려한다.

전략 최적화 방향

코드 분석을 바탕으로 다음과 같은 최적화 방향이 있습니다.

  1. 동적 편차의 배수: 현재 전략은 고정된 2배의 표준 차이를 입점 촉발 조건으로 사용한다. 시장의 변동성 역학에 따라 이 배수를 조정하는 것을 고려할 수 있으며, 높은 변동성 시장에서 더 큰 배수를 사용하며, 낮은 변동성 시장에서 더 작은 배수를 사용하여 다른 시장 환경에 적응한다.

  2. 시간 필터 추가특정 시간대에 대한 거래 필터링을 수행하여 시장의 개시, 종료 및 점심 시간 같은 불안정한 기간을 피하거나 특정 효율적인 거래 시간에 집중하십시오.

  3. 통합 시장 구조 분석: 더 높은 시간 프레임의 트렌드 분석에 참여하고, 더 큰 트렌드와 일치하는 방향으로만 거래하거나, 반-트렌드 신호에 대해 더 엄격한 필터링 조건을 사용합니다.

  4. 안전 탈퇴 메커니즘 최적화: 현재의 안전 탈퇴는 고정된 수에 기반한 반전 기둥 모양이다. 가격 이동의 폭과 결합하여 탈퇴를 유발할 수 있습니다. 예를 들어, 가격 회수 후 최대 이윤 이동의 특정 비율을 초과하면 탈퇴를 유발할 수 있습니다.

  5. 트랜잭션 수량 확인입시 신호가 형성될 때 거래량 확인 조건을 추가하여 신호가 충분한 시장 참여와 함께 신호의 신뢰성을 높여줍니다.

  6. 동적 절감 관리: 고정 점수 중지 손실을 ATR 기반의 동적 중지로 대체하거나, 모바일 중지 기능을 구현하여 이미 얻은 이익을 보호하십시오.

  7. 더하기 적당 손실 필터출입 전에 잠재적인 목표와 중지 손실의 비율을 계산하고, 충분한 수익/손실 비율을 가진 거래만 실행한다.

  8. 계절과 달력 효과 통합: 특정 시장의 계절적 패턴과 달력 효과를 분석하고 활용하여 통계적으로 더 유리한 시기에 거래를 강화하거나 불리한 시기에 거래를 줄입니다.

이러한 최적화는 전략의 안정성과 수익성을 향상시킬 수 있으며, 특히 다양한 시장 환경에서 적응력을 향상시킬 수 있습니다.

요약하다

VWAP 편차 영역과 변동성 필터링 거래 전략은 기술 분석의 여러 핵심 개념을 결합한 잘 설계된 일일 거래 시스템입니다. VWAP를 가격 중심 기준점으로 사용하여 표준 격차를 통해 편차 영역을 계산하고 가격이 이 영역에서 반발 할 때 거래 기회를 잡습니다. 이 전략의 핵심 장점은 다층적인 필터링 메커니즘과 유연한 위험 관리 시스템으로 다양한 시장 환경에 적응 할 수 있습니다.

강력한 추세 시장에서의 역전 위험과 변수 민감성 같은 잠재적인 위험에도 불구하고, 이러한 위험은 추가적인 최적화로 완화될 수 있습니다. 최적화 방향은 동적으로 편차 배열을 조정하는 것, 시간 필터를 추가하는 것, 더 높은 시간 프레임 분석을 통합하는 것, 손해 관리 개선 등이 포함됩니다.

전반적으로, 이것은 경험있는 거래자에게 더 커스터마이징 및 개선에 적합한 기초적인 전략 프레임 워크입니다. 특정 시장과 거래 스타일에 맞게 최적화함으로써, 특히 변동성이 적고 평균 회귀 경향이있는 시장 환경에서 신뢰할 수있는 일일 거래 도구가 될 잠재력이 있습니다.

전략 소스 코드
/*backtest
start: 2025-03-30 00:00:00
end: 2025-03-31 20:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("VWAP Strategy", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1, initial_capital=2000)

// === Inputs ===
src = input.source(hlc3, "Source")
stopPoints = input.float(20.0, "Stop Buffer (Points from Signal Bar High/Low)", step=0.25)

exitModeLong = input.string("VWAP", "Long Exit Rule", options=["VWAP", "Deviation Band", "None"])
exitModeShort = input.string("VWAP", "Short Exit Rule", options=["VWAP", "Deviation Band", "None"])
targetLongDeviation = input.float(2.0, "Long Target Deviation", step=0.1)
targetShortDeviation = input.float(2.0, "Short Target Deviation", step=0.1)

enableSafetyExit = input.bool(true, "Enable Safety Exit")
numOpposingBars = input.int(3, "Opposing Bars for Safety Exit", minval=1)

allowLongs = input.bool(true, "Allow Long Trades")
allowShorts = input.bool(true, "Allow Short Trades")

minStrength = input.float(0.7, "Minimum Signal Strength (0-1)", step=0.05)

showVWAP = input.bool(true, "Show VWAP")
showBands = input.bool(true, "Show Entry Bands")
showLowVolZones = input.bool(true, "Highlight Low Vol Zones")

// === VWAP Session Logic ===
var float sumSrc = na
var float sumVol = na
var float sumSrcSqVol = na

newSession = ta.change(time("D"))
if newSession or na(sumSrc)
    sumSrc := 0.0
    sumVol := 0.0
    sumSrcSqVol := 0.0

sumSrc += src * volume
sumVol += volume
sumSrcSqVol += math.pow(src, 2) * volume

vwap = sumSrc / sumVol
variance = (sumSrcSqVol / sumVol) - math.pow(vwap, 2)
stdev = math.sqrt(variance)

// === Deviation Bands ===
bandEntryMult = 2.0
entryUpper = vwap + stdev * bandEntryMult
entryLower = vwap - stdev * bandEntryMult

targetUpperLong = vwap + stdev * targetLongDeviation
targetLowerShort = vwap - stdev * targetShortDeviation

// === ATR-Based Volatility Filter ===
atrVal = ta.atr(14)
isVolTooLow = stdev * 2 < atrVal * 3
bgcolor(showLowVolZones and isVolTooLow ? color.new(color.orange, 85) : na, title="Low Volatility Zone")

// === Signal Strength Calculations ===
barRange = high - low
bullStrength = barRange > 0 ? (close - low) / barRange : 0
bearStrength = barRange > 0 ? (high - close) / barRange : 0

// === Entry Triggers with Strength Filter ===
isH1H2 = open < entryLower and close > entryLower and bullStrength >= minStrength
isL1L2 = open > entryUpper and close < entryUpper and bearStrength >= minStrength

plotshape(isH1H2, title="H1/H2", location=location.belowbar, color=color.lime, style=shape.triangleup, size=size.tiny)
plotshape(isL1L2, title="L1/L2", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.tiny)

// === Signal Bar Stop Tracking ===
var float signalLow = na
var float signalHigh = na

// === Entry Logic ===
longCondition = allowLongs and isH1H2 and strategy.position_size == 0 and not isVolTooLow
shortCondition = allowShorts and isL1L2 and strategy.position_size == 0 and not isVolTooLow

if longCondition
    strategy.entry("Long", strategy.long)
    signalLow := low

if shortCondition
    strategy.entry("Short", strategy.short)
    signalHigh := high

// === Reset Signal Bar Info
if strategy.position_size == 0
    signalLow := na
    signalHigh := na

// === Apply Signal-Bar-Based Stop
if strategy.opentrades > 0
    if strategy.position_size > 0 and not na(signalLow)
        strategy.exit("Long SL", from_entry="Long", stop=signalLow - stopPoints)
    if strategy.position_size < 0 and not na(signalHigh)
        strategy.exit("Short SL", from_entry="Short", stop=signalHigh + stopPoints)

// === Target Exits (Independent per side)
exitLongVWAP = strategy.position_size > 0 and exitModeLong == "VWAP" and high >= vwap
exitLongDev  = strategy.position_size > 0 and exitModeLong == "Deviation Band" and high >= targetUpperLong
exitShortVWAP = strategy.position_size < 0 and exitModeShort == "VWAP" and low <= vwap
exitShortDev  = strategy.position_size < 0 and exitModeShort == "Deviation Band" and low <= targetLowerShort

if exitModeLong != "None" and (exitLongVWAP or exitLongDev)
    strategy.close("Long", comment="Target Exit")

if exitModeShort != "None" and (exitShortVWAP or exitShortDev)
    strategy.close("Short", comment="Target Exit")

// === Safety Exit
bullishBar(i) => close[i] > open[i]
bearishBar(i) => close[i] < open[i]

bullCount = 0
bearCount = 0
for i = 0 to numOpposingBars - 1
    bullCount += bullishBar(i) ? 1 : 0
    bearCount += bearishBar(i) ? 1 : 0

exitSafetyLong = enableSafetyExit and strategy.position_size > 0 and bearCount == numOpposingBars
exitSafetyShort = enableSafetyExit and strategy.position_size < 0 and bullCount == numOpposingBars

if exitSafetyLong
    strategy.close("Long", comment="Safety Exit")

if exitSafetyShort
    strategy.close("Short", comment="Safety Exit")

// === Plotting ===
plot(showVWAP ? vwap : na, color=color.blue, title="VWAP")
pUpper = plot(showBands ? entryUpper : na, color=color.green, title="Upper Entry Band")
pLower = plot(showBands ? entryLower : na, color=color.red, title="Lower Entry Band")
fill(pUpper, pLower, color=color.new(color.gray, 85))