Zスコア動的移動平均クロスオーバー定量取引戦略

Z-SCORE SMA MA ALERT trading
作成日: 2025-06-27 11:37:40 最終変更日: 2025-06-27 11:37:40
コピー: 0 クリック数: 356
2
フォロー
319
フォロワー

Zスコア動的移動平均クロスオーバー定量取引戦略 Zスコア動的移動平均クロスオーバー定量取引戦略

概要

Z-Scoreダイナミック均線交差定量取引戦略は,統計学的Zスコア原理と移動平均交差信号に基づく総合的な取引システムである.この戦略は,価格の標準化偏差を計算し,短期と長期の滑らかな移動平均の交差を組み合わせて,買入シグナルを形成する.この方法は,価格の絶対的な変化を考慮するだけでなく,統計的分布における価格の相対的な位置を重視し,確率と統計学的原理に基づく市場入場と退場の仕組みを提供する.

戦略原則

この戦略の核心は,Z-Scoreの統計指標に基づいて取引決定を行うことです.Z-Scoreは,データポイントの平均から多少の標準差を測定する統計量であり,計算式は:Z = (X - μ) / σで,Xは現在の価格,μは平均,σは標準差です.

戦略の実行には以下のステップが含まれる:

  1. まず,閉店価格に基づく原始Z-Score値を計算し,ユーザ定義のベースサイクル ((デフォルト3) を使用します.
  2. 原始Z-Scoreの短期平滑処理 ((デフォルト周期は3) と長期平滑処理 ((デフォルト周期は5)
  3. 短期Zスコアラインが長期Zスコアラインを穿越すると,買入シグナルが生成されます.
  4. 短期Zスコア線の下から長期Zスコア線を通過すると,売り込み信号が生じる.
  5. 過剰な取引を避けるために,信号間隔メカニズムが導入された.すなわち,同じ2つの信号の間に一定数のK線が間隔されなければならない.

同時に,戦略は,従来の移動平均 (((MA) を補助的な参照として提供し,短期 (((5サイクル),中期 (((21サイクル) と長期 (((60サイクル) の3つの平均線を含む.これらの平均線は,トレーダーが価格傾向の変化をより直観的に観察するのを助けます.

戦略的優位性

  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)