Z-점수 동적 이동 평균 교차 양적 거래 전략

Z-SCORE SMA MA ALERT trading
생성 날짜: 2025-06-27 11:37:40 마지막으로 수정됨: 2025-06-27 11:37:40
복사: 0 클릭수: 356
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

Z-점수 동적 이동 평균 교차 양적 거래 전략 Z-점수 동적 이동 평균 교차 양적 거래 전략

개요

Z-Score 동적 평평선 교차량 거래 전략은 통계학 Z 점수 원리와 이동 평균 교차 신호에 기반한 통합 거래 시스템이다. 이 전략은 가격의 표준화 오차 ((Z-Score) 를 계산하고, 단기 및 장기 평평 이동 평균의 교차와 결합하여 구매 및 판매 신호를 형성한다. 이 방법은 가격의 절대적인 변화를 고려하는 것 이상으로, 통계적 분포에서 가격의 상대적인 위치에 더 많은 관심을 기울이며, 따라서 확률 및 통계학 원리에 기반한 시장 진입 및 출구 메커니즘을 제공한다.

전략 원칙

이 전략의 핵심은 Z-Score 통계 지표에 기반한 거래 결정을 하는 것이다. Z-Score는 데이터 포인트의 평균에서 얼마나 많은 표준 차이를 측정하는 수치이며, 계산 공식은 다음과 같다: Z = (X - μ) / σ, 여기서 X는 현재 가격, μ는 평균, σ는 표준 차이를 의미한다.

전략 구현은 주로 다음과 같은 단계를 포함합니다.

  1. 먼저, 사용자 정의 기본 주기 (기본 3) 를 사용하여 종점 가격에 기반한 원시 Z-Score 값을 계산합니다.
  2. 원시 Z-Score에 대한 단기 평준화 처리 (기본 주기는 3) 및 장기 평준화 처리 (기본 주기는 5)
  3. 단기 Z-Score 라인에서 장기 Z-Score 라인을 뚫을 때 구매 신호가 생성됩니다.
  4. 단기 Z-Score 라인 아래에서 장기 Z-Score 라인을 통과할 때, 판매 신호가 생성됩니다.
  5. 과도한 거래를 방지하기 위해 신호 간격 메커니즘이 도입되었다. 즉, 두 개의 동일한 신호 사이에 일정 수의 K선을 간격해야 한다.

동시에, 전략은 전통적인 이동 평균 ((MA) 을 보조 참조로 제공하며, 단기 ((5주기), 중기 ((21주기) 및 장기 ((60주기) 의 세 개의 평균선을 포함합니다. 이러한 평균선은 거래자가 가격 동향의 변화를 더 직관적으로 관찰할 수 있도록 도와줍니다.

전략적 이점

  1. 기본 통계Z-Score 지표는 통계학적인 원리에 기초하여 가격 변동을 표준화하여 비정상적인 가격 변화를 식별하는 데 도움이됩니다. Z-Score가 매우 높거나 매우 낮으면 가격이 평균에서 크게 벗어나고 평균으로 돌아가는 기회가있을 수 있음을 나타냅니다.

  2. 이중 필터링전략은 Z-Score 지표와 이동 평균을 동시에 사용해서 이중 확인 메커니즘을 형성한다. Z-Score 교차는 주요 신호를 제공하며 이동 평균 시스템은 트렌드 확인의 보조 도구로 사용할 수 있다.

  3. 유연한 변수 설정: 사용자는 Z-Score의 계산주기, 평준화 파라미터 및 신호 간격을 다른 시장 및 거래 품종의 특성에 따라 조정하여 전략의 개인화를 구현할 수 있습니다.

  4. 실시간 거래 피드백전략은 그래픽 인터페이스를 통해 직관적으로 구매 및 판매 신호를 표시하며, 거래자가 전략의 성능을 신속하게 평가할 수 있도록 포지션 상태 및 수익 손실에 대한 실시간 피드백을 제공합니다.

  5. 사전 경고 기능: 통합 예고 시스템, 구매 또는 판매 신호가 발생하면 실시간 경고를 발산하여 거래자가 거래 기회를 잡을 수 있도록 도와줍니다.

전략적 위험

  1. 매개변수 민감도Z-Score의 계산과 미끄러운 매개 변수는 전략 성능에 중요한 영향을 미칩니다. 잘못된 매개 변수 설정은 과도한 거래 또는 중요한 신호를 놓칠 수 있습니다.

  2. 시장의 약점수평 변동 시장에서, Z-Score는 종종 평균을 통과하여 과도한 거래 신호를 발생시키고 거래 비용을 증가시키고 지속적인 손실을 초래할 수 있습니다. 전략에 트렌드 필터 조건을 추가하거나 변동 시장이 확인되면 거래를 중단하는 것을 고려할 수 있습니다.

  3. 통계적 가정의 위험: Z-Score는 가격 변동이 정규 분포에 부합한다고 가정하지만 실제 시장에서의 가격 변동에는 꼬리 위험과 비정상적인 변동이있을 수 있습니다. 극단적인 시장 환경에서 전략은 실패 할 수 있습니다.

  4. 뒤처진 문제: 이동 평균의 부드러운 처리가 사용됨에 따라 신호는 다소 지연되어, 급격히 변동하는 시장에서 입출금 시기가 적절하지 않을 수 있습니다.

  5. 손해 방지 장치의 부재: 현재 전략 버전에는 명확한 손해 방지 장치가 포함되어 있지 않으며, 시장이 크게 변동하는 경우 큰 손실이 발생할 수 있습니다. 실제 적용에서 위험을 제어하기 위해 손해 방지 조건을 추가하는 것이 좋습니다.

최적화 방향

  1. 트렌드 필터 추가: 시장 상태를 식별하기 위해 추가적인 트렌드 지표 (ADX 또는 브린 대역폭과 같은) 를 도입할 수 있으며, 강한 트렌드 시장과 흔들리는 시장에서 다른 전략 파라미터 또는 거래 논리를 사용합니다.

  2. 사용자 정의 변수를 추가합니다.: 시장의 변동성에 따라 Z-Score 계산주기와 신호 간격을 조정하여 전략이 다른 시장 환경에 더 잘 적응할 수 있도록 한다.

  3. 위험 관리 개선: ATR 또는 고정 비율에 기반한 손해 제도를 도입하고, 일회 거래 위험을 제어하기 위해 합리적인 포지션 관리 규칙을 설계하십시오.

  4. 다주기 분석: 종합적으로 다른 시간 주기의 Z-Score 신호를 고려하고, 여러 시간 주기의 신호가 일치할 때만 거래를 실행하여 신호의 신뢰성을 높인다.

  5. 다른 지표와 함께Z-Score를 거래량, 상대적으로 강한 지표 (RSI) 또는 브린 띠와 같은 다른 기술 지표와 결합하여 더 포괄적인 거래 조건을 구축하는 것이 고려 될 수 있습니다.

  6. 최적화된 피드백 프레임워크확장 전략 평가 기준: 총 수익뿐만 아니라 최대 회수, 샤프 비율, 수익률과 같은 종합 지표를 고려하여 전략 성능을 전체적으로 평가하십시오.

요약하다

Z-Score 동적 평평선 교차량 거래 전략은 통계적 방법을 통해 가격을 표준화하고, 이동 평균 교차 신호와 결합하여 거래 의사 결정에 대한 체계화된 방법을 제공합니다. 이 전략은 이론적 기반이 튼튼하고, 명확한 신호가있는 가격 편향 후 평균으로 돌아가는 거래 기회를 찾는 데 특히 적합합니다.

그러나 거래자는 이 전략을 적용할 때 변수 최적화와 위험 통제에 주의를 기울여야 하며, 특히 다양한 시장 환경에서 전략의 성과에 차이가 있을 수 있다. 트렌드 필터를 증가시키고, 위험 관리를 개선하고, 다중 지표 결합을 통해 전략의 안정성과 적응성을 더욱 향상시킬 수 있다.

결국, 모든 거래 전략은 실제 시장 환경에서 엄격하게 검증되고 지속적으로 최적화되어야합니다. Z-Score 전략은 수량 거래 도구로서 거래자에게 통계학적 원칙에 기반한 시장 분석 및 의사 결정을위한 프레임 워크를 제공하여 거래자가 실제에서 탐색하고 심층적으로 연구하는 것이 좋습니다.

전략 소스 코드
/*backtest
start: 2024-07-13 18:40:00
end: 2025-06-25 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":50000000}]
*/

//@version=6
strategy("Z Score 主图策略 — v1.02", overlay=true)

// 参数
enableZScore = input.bool(true, title="启用Z分数策略")
zBaseLength  = input.int(3, minval=1, title="Z分数基础周期")
shortSmooth  = input.int(3, title="短期平滑")
longSmooth   = input.int(5, title="长期平滑")
gapBars      = input.int(5, minval=1, title="相同信号间隔K线数")

// Z 分数
f_zscore(src, len) =>
    mean = ta.sma(src, len)
    std = ta.stdev(src, len)
    (src - mean) / std

zRaw   = f_zscore(close, zBaseLength)
zShort = ta.sma(zRaw, shortSmooth)
zLong  = ta.sma(zRaw, longSmooth)

baseLongCond = zShort > zLong
baseExitCond = zShort < zLong

// 信号间隔
var int lastEntryBar = na
var int lastExitBar  = na

// 策略逻辑
if enableZScore
    if baseLongCond and (na(lastEntryBar) or bar_index - lastEntryBar > gapBars)
        strategy.entry("Z Score", strategy.long)
        lastEntryBar := bar_index
        alert("Z分数策略触发买入信号,建议开多仓", alert.freq_once_per_bar)

    if baseExitCond and (na(lastExitBar) or bar_index - lastExitBar > gapBars)
        strategy.close("Z Score", comment="Z Score")
        lastExitBar := bar_index
        alert("Z分数策略触发卖出信号,建议平仓离场", alert.freq_once_per_bar)

// 买卖图标
plotshape(baseLongCond and (na(lastEntryBar) or bar_index - lastEntryBar > gapBars),
     title="买入信号", location=location.belowbar, color=color.green, style=shape.labelup, text="买")

plotshape(baseExitCond and (na(lastExitBar) or bar_index - lastExitBar > gapBars),
     title="卖出信号", location=location.abovebar, color=color.red, style=shape.labeldown, text="卖")

// 盈亏表格
var table positionTable = table.new(position.bottom_right, 2, 2, border_width=1)
table.cell(positionTable, 0, 0, "开仓价", text_color=color.white, bgcolor=color.gray)
table.cell(positionTable, 1, 0, "未实现盈亏 (%)", text_color=color.white, bgcolor=color.gray)

isLong        = strategy.position_size > 0
entryPrice    = strategy.position_avg_price
unrealizedPnL = isLong ? (close - entryPrice) / entryPrice * 100 : na
pnlColor      = unrealizedPnL > 0 ? color.green : unrealizedPnL < 0 ? color.red : color.gray

if isLong
    table.cell(positionTable, 0, 1, str.tostring(entryPrice, "#.####"), text_color=color.gray, bgcolor=color.new(color.gray, 90))
    table.cell(positionTable, 1, 1, str.tostring(unrealizedPnL, "#.##") + " %", text_color=pnlColor, bgcolor=color.new(pnlColor, 90))
else
    table.cell(positionTable, 0, 1, "—", text_color=color.gray, bgcolor=color.new(color.gray, 90))
    table.cell(positionTable, 1, 1, "—", text_color=color.gray, bgcolor=color.new(color.gray, 90))
    // === 显示 MA 均线 ===
showMA        = input.bool(true, title="显示 MA 均线")
maShortPeriod = input.int(5, title="短期 MA 周期")
maMidPeriod   = input.int(21, title="中期 MA 周期")
maLongPeriod  = input.int(60, title="长期 MA 周期")

maShort = ta.sma(close, maShortPeriod)
maMid   = ta.sma(close, maMidPeriod)
maLong  = ta.sma(close, maLongPeriod)

plot(showMA ? maShort : na, title="MA 短期", color=color.rgb(0, 9, 11, 1), linewidth=1)
plot(showMA ? maMid   : na, title="MA 中期", color=color.orange, linewidth=1)
plot(showMA ? maLong  : na, title="MA 长期", color=color.blue, linewidth=1)