金と銀の裁定取引戦略


作成日: 2026-03-12 11:50:47 最終変更日: 2026-03-12 11:50:47
コピー: 0 クリック数: 22
2
フォロー
413
フォロワー

金と銀の裁定取引戦略 金と銀の裁定取引戦略

ZSCORE, RSI, ATR, SMA, EMA

Z-Score 統計アバター:金銀比の数学ゲーム

これは普通のトレンド追跡策略ではありません。XAG/XAU統計的利策略は,金銀価格に長期平均値回帰関係があるという核心的な仮定に基づいています。Z-Scoreが±2の標準差を突破すると,価格が統計的に意味のある極限に達し,回帰の機会を捕獲する場に入ります。復元データによると,この統計的利策法は,貴金属市場において明らかなリスク調整後の収益優位性を持っています。

20サイクル標準化比率:従来の関連性分析よりも正確

戦略の核心は,標準化価格比率モデルを構築することである。20周期SMAをXAGとXAUにそれぞれ標準化してから,比率を計算し,3周期EMAで平滑化することである。この処理方法は,単純な価格比率よりも安定しており,短期的なノイズを効果的にフィルターします。標準化比率のZ-Scoreが±2の範囲を超えると,現在の価格が歴史的平均値から2標準差を超える偏差を示し,統計的には小確率のイベントであり,平均値の回帰に場を提供します。

RSIフィルター:50の境界線の巧妙な使用

伝統的なRSI超買超売り信号とは異なり,ここではRSI=50を多空フィルタ条件として使用する. RSI<50であれば多買が許され,RSI>50であれば空売りが許される.この設計論理は明快である:相対的に弱い時に買って反発を待つ,相対的に強い時に売って反調を待つ.このフィルタリング機構は,逆転取引のリスクを効果的に軽減し,信号品質を向上させる.

3:8のATRのリスク・リターン・比率:数学的に正の期待

ストップはATRの3倍,ストップはATRの8倍で,リスクと利益の比率は1.2.67に達する.この設計は,統計的アゲージの特徴に基づいている:平均値の戻り率は高く,しかし,十分な容認の余地を与えることが必要である.14周期ATRは,ストップのレベルが市場の波動的な変化に適応することを保証する.歴史の回顧は,この比率は貴金属ペア取引で期待される正の利益を達成することができることを示している.

適用シナリオ: 振動市場がトレンド市場より優れている

統計的利策は横軸の振動状況で最適のパフォーマンスを発揮する,なぜなら,このとき平均値の回帰特性がより顕著であるからです.一方的なトレンド市場では,価格が平均値から長期にわたって偏る可能性があり,その結果,策略がより大きな引き戻しのリスクに直面する.市場の変動率が穏健で,明らかな一方的なトレンドがないときに使用することをお勧めします.また,貴金属市場はマクロ経済要因の影響が大きいので,重大イベントの間は慎重に使用する必要があります.

リスクヒント: 統計モデルの限界

歴史的統計的関係が将来の継続を保証するものではない。金銀比率は,需要供給構造の変化,通貨政策の違いなどの要因により長期にわたる偏差が発生する可能性がある。戦略は,特に市場の構造的変化の間,継続的な損失のリスクがある。リスク管理を厳格に実施し,一回の取引リスクを口座資金の2%を超えないように管理し,定期的に戦略の有効性を評価することを推奨する。

ストラテジーソースコード
//@version=6
strategy("Stat Arb(xag & xau)")

// ══════════════════════════════════════════════════════════════
// BENCHMARK DATA
// ══════════════════════════════════════════════════════════════
float benchClose = request.security("XAG_USDT.swap", timeframe.period, close)

// ══════════════════════════════════════════════════════════════
// HELPER FUNCTIONS
// ══════════════════════════════════════════════════════════════
f_cov(float src1, float src2, int len) =>
    ta.sma(src1 * src2, len) - ta.sma(src1, len) * ta.sma(src2, len)

f_var(float src, int len) =>
    ta.sma(src * src, len) - math.pow(ta.sma(src, len), 2)

// ══════════════════════════════════════════════════════════════
// SPREAD ENGINE — NORMALIZED RATIO
// ══════════════════════════════════════════════════════════════
int lookback = 20

float pairSma   = ta.sma(close,      lookback)
float benchSma  = ta.sma(benchClose, lookback)
float pairNorm  = pairSma  != 0 ? close      / pairSma  * 100.0 : 100.0
float benchNorm = benchSma != 0 ? benchClose / benchSma * 100.0 : 100.0
float modelRaw  = benchNorm != 0 ? pairNorm / benchNorm : 1.0
float model     = ta.ema(modelRaw, 3)

float zMean  = ta.sma(model, lookback)
float zStd   = ta.stdev(model, lookback)
float zScore = zStd != 0 ? (model - zMean) / zStd : 0.0

// ══════════════════════════════════════════════════════════════
// RSI FILTER — BELOW / ABOVE 50
// ══════════════════════════════════════════════════════════════
float rsiVal    = ta.rsi(close, 14)
bool  rsiLongOk  = rsiVal < 50.0
bool  rsiShortOk = rsiVal > 50.0

// ══════════════════════════════════════════════════════════════
// ENTRY SIGNALS
// Z crosses below -2 = long, above +2 = short
// ══════════════════════════════════════════════════════════════
bool enterLong  = ta.crossunder(zScore, -2.0) and rsiLongOk
bool enterShort = ta.crossover(zScore,   2.0) and rsiShortOk

// ══════════════════════════════════════════════════════════════
// ATR STOP + TAKE PROFIT
// Stop:  8x ATR from entry (hardcoded)
// TP:    3x ATR from entry (hardcoded), stamped at entry
// ══════════════════════════════════════════════════════════════
float atrVal = ta.atr(14)

var float tpLevel   = na
var float slLevel   = na
var float entryPrice = na

bool isNewEntry = strategy.position_size != 0 and strategy.position_size[1] == 0
if isNewEntry
    entryPrice := strategy.position_avg_price
    if strategy.position_size > 0
        tpLevel := entryPrice + atrVal * 3.0
        slLevel := entryPrice - atrVal * 8.0
    else
        tpLevel := entryPrice - atrVal * 3.0
        slLevel := entryPrice + atrVal * 8.0

if strategy.position_size == 0
    tpLevel    := na
    slLevel    := na
    entryPrice := na

// ══════════════════════════════════════════════════════════════
// EXIT CONDITIONS — high/low for intrabar touch
// ══════════════════════════════════════════════════════════════
bool tpHitLong  = strategy.position_size > 0 and not na(tpLevel) and high >= tpLevel
bool tpHitShort = strategy.position_size < 0 and not na(tpLevel) and low  <= tpLevel
bool slHitLong  = strategy.position_size > 0 and not na(slLevel) and low  <  slLevel
bool slHitShort = strategy.position_size < 0 and not na(slLevel) and high >  slLevel

// ══════════════════════════════════════════════════════════════
// EXECUTION
// ══════════════════════════════════════════════════════════════
if enterLong
    strategy.close("Short", comment="Flip")
    strategy.entry("Long",  strategy.long)
if enterShort
    strategy.close("Long",  comment="Flip")
    strategy.entry("Short", strategy.short)

if tpHitLong
    strategy.close("Long",  comment="TP")
if tpHitShort
    strategy.close("Short", comment="TP")
if slHitLong
    strategy.close("Long",  comment="SL")
if slHitShort
    strategy.close("Short", comment="SL")

// ══════════════════════════════════════════════════════════════
// VISUALS
// ══════════════════════════════════════════════════════════════
hline( 2.0, "+2",  color=color.new(color.red,  20), linestyle=hline.style_dashed)
hline(-2.0, "-2",  color=color.new(color.teal, 20), linestyle=hline.style_dashed)
hline( 0.0, "Mid", color=color.gray,                linestyle=hline.style_solid)

color zCol = zScore >= 0 ? color.new(color.red, 10) : color.new(color.teal, 10)
plot(zScore, title="Z Score", color=zCol, linewidth=3)

bgcolor(zScore >  2.0 ? color.new(color.red,  90) : na, title="Overbought Zone")
bgcolor(zScore < -2.0 ? color.new(color.teal, 90) : na, title="Oversold Zone")
bgcolor(strategy.position_size > 0 ? color.new(color.teal, 93) : na, title="In Long")
bgcolor(strategy.position_size < 0 ? color.new(color.red,  93) : na, title="In Short")

plotshape(enterLong,  style=shape.triangleup,   location=location.bottom, color=color.teal, size=size.small)
plotshape(enterShort, style=shape.triangledown, location=location.top,    color=color.red,  size=size.small)
plotshape(tpHitLong or tpHitShort, style=shape.flag,   location=location.top, color=color.yellow, size=size.tiny, text="TP")
plotshape(slHitLong or slHitShort, style=shape.xcross, location=location.top, color=color.orange, size=size.tiny, text="SL")