多次元適応型移動平均行列とATR動的精密取引戦略

MA ATR HMA TEMA DEMA VWMA ZLEMA ALMA KAMA EMA SMA WMA
作成日: 2025-04-16 15:50:36 最終変更日: 2025-04-16 15:50:36
コピー: 0 クリック数: 412
2
フォロー
319
フォロワー

多次元適応型移動平均行列とATR動的精密取引戦略 多次元適応型移動平均行列とATR動的精密取引戦略

概要

多次元自己適応移動平均マトリックスとATR動的精度取引戦略は,急速に変化する市場条件のために設計された高度な量化取引システムである.この戦略の核心は,複数のタイプの移動平均とATR (平均リアル波幅) フィルターを組み合わせて,高度に柔軟で自己適応的な取引マトリックスを形成することである.市場傾向と波動性を正確に捉えることで,この戦略は,高周波取引環境で高確率のエントリー場とエグジント場を識別することができ,同時に,厳格なリスク管理措置を施すことができる.

戦略原則

この戦略の核心となるのは,いくつかの重要な要素の協同作業である.

  1. 高階移動平均マトリックス戦略は,SMA,EMA,SMMA,HMA,TEMA,WMA,VWMA,ZLEMA,ALMA,KAMA,DEMAを含む,最大11種類の異なる移動平均を実現しています. 各移動平均は,独自の計算方法と反応特性を備えており,市場条件に応じて柔軟に選択できます. システムは,2つの移動平均 ((高速と遅い) を主要なトレンド指標として採用し,その交差点と相対位置は,基本取引信号を生成するために使用されます.

  2. ATRベースのリスク管理戦略:ATRの指標を活用して市場の変動を測定し,以下のような複数の側面に適用します.

    • 波動性評価:ATRと閉盘価格の比率を波動性値のフィルター条件として使用する
    • 入場フィルター:入場するには,価格がスローモーション平均と十分な距離を保たなければならないことを確認する (ATRの倍数で計算する)
    • ダイナミックなリスク管理:ATRベースの固定ストップ,目標利益,トラッキングストップを設定し,現在の市場の変動に合わせてリスク管理を行う
  3. 多時間枠のトレンドフィルター戦略: 信号の信頼性を高め,取引の方向がより大きな市場動向と一致していることを確認するために,より高い時間枠 ((15分) の移動平均のトレンドを検索する.

  4. 取引量と時間窓口の検証:取引は最小取引量要件を満たし,取引量突破が発生し,定義された取引時間ウィンドウ内でのみ実行され,取引品質がさらに向上する.

  5. 信号生成論理

    • 多頭条件:速動平均と遅動平均より高い価格,速動平均は遅動平均より高い価格,ATRフィルター,交付量条件および時間窓要求を満たす
    • 空頭条件:逆の状況における対称条件
  6. 複合的な退出論理戦略は,固定ストップ (ATRの倍数),目標利益 (ATRの倍数),追跡ストップ (ATRに基づく動的調整) の3層の退出メカニズムを使用し,各取引に全面的なリスク保護を提供します.

戦略的優位性

この戦略のコードを分析すると,以下のような顕著なメリットが見られます.

  1. 優れた適応力: 交互に切り替えられる複数の移動平均型 ((HMAからKAMAなど) により,戦略は異なる市場条件に適応できる.この柔軟性は,トレーダーが現在の市場環境に応じて最適な指標を選択し,戦略全体を書き直す必要がないことを可能にします.

  2. ダイナミックなリスク管理ATRベースのリスク制御メカニズムにより,ストップ・ロズとリターンの目標が市場の変動に合わせて自動的に調整されることを保証します.この方法は,波動性の高い市場ではよりよい保護を提供し,トレンド市場ではより多くの利益を捕獲することができます.

  3. 複数のシグナルフィルタリング: 移動平均の交差,交割量分析,波動的値と複数の時間枠のトレンドフィルタを組み合わせることで,戦略は誤信号を効果的に軽減し,取引の質を向上させる.特に15分間の時間枠のトレンドフィルタ機能は,逆転取引の可能性を大幅に減少させる.

  4. 入学条件の詳細この戦略は,技術指標の交差だけでなく,価格とスローモーション平均との間に十分なATRの距離を保つことを要求します.これは横断市場での頻繁に取引を避けるのに役立ち,偽の突破による損失を軽減します.

  5. 透明なパフォーマンス監視: 組み込みのメジャーボードは,現在の利益/損失,株式,ATR (原始値とパーセント) と移動平均の間のギャップを含む,重要なパフォーマンス指標のリアルタイム表示を提供し,トレーダーに戦略の状態をいつでも評価できるようにします.

戦略リスク

この戦略の設計は精巧ですが,以下の潜在的なリスクがあります.

  1. パラメータ最適化トラップ策略には多くのパラメータが含まれている (移動平均の種類と周期,ATR周期と倍数など),過度に最適化すると曲線適合が起こり,策略は実盤取引でうまく機能しない. 解決策は,市場横断と時間帯横断のテストをしっかりして行い,パラメータを過度に調整するのを避けることである.

  2. 急速な逆転のリスクATRのダイナミックストップを使用しているにもかかわらず,市場が突然反転した場合 (重大ニュースリリース後など) は,ストップが発動する前に価格が飛躍し,予想以上の損失を招く可能性があります.

  3. 信号が遅れた: すべての移動平均は本質的に遅延性がある.HMAやZLEMAのような低遅延の変形でさえ,急速な市場で理想的なエントリーポイントを逃す可能性があります.既存のシグナルシステムを補完するために,運動量または価格行動指標を組み合わせることを考えることができます.

  4. 交付量依存性策略: 取引量が急増したときにシグナルを発信するが,特定の市場または時間帯で取引量が誤解を招く可能性がある. 必要に応じて,取引量フィルターを調整するか,特定の市場条件でこの機能を無効にすることを検討する.

  5. タイムウィンドウの制限指定された取引時間ウィンドウでは,重要な夜間または早取引の機会を逃す可能性があります.特定の市場の最も活発な時間に応じて取引時間を調整することが推奨されています.

戦略最適化の方向性

プログラミングの分析から,以下のような最適化方法が考えられます.

  1. 適応パラメータの調整:現在の戦略は固定パラメータ設定を使用する. 高級最適化としては,市場状況 (トレンド,波動,範囲) に基づいて自動的に調整するパラメータを実現する.例えば,高波動期間にATRの倍数を自動的に増加させたり,異なる市場環境で移動平均のタイプを切り替えることができる.

  2. 機械学習モデルを統合する: 機械学習の層を導入することで,現在の市場条件下でどの移動平均型が最適であるかを予測し,最適な移動平均の組み合わせを自動的に選択します.これは,歴史的なデータにおける異なる指標の相対的なパフォーマンスを分析することによって実現できます.

  3. 改善のトレンドを特定する既存の15分トレンドフィルターに加えて,より複雑なトレンド認識アルゴリズム,例えばHurst指数または方向運動指標 ((DMI) などを組み込むことで,トレンドの強さと持続性をより正確に決定できます.

  4. 退出策を強化する: 現在の退出戦略は,トレンドラインの突破,重要なサポート/レジスタンスレベル,または波動性の急激な変化などの市場構造に基づく退出シグナルを追加することでさらに最適化できます. これは,トレンドが終了する前に利益をロックするのに役立ちます.

  5. リスク調整したポジションの規模: 固定取引数ではなく,現在の変動性と口座資金に基づいてダイナミックなポジションスケールの調整を実現する.例えば,高波動期間のポジションを削減し,低波動期間のポジションを適度に増加させ,リスク・リターン比率を最適化する.

  6. 関連市場のフィルタリング関連市場の監視 (株式指数取引の場合,VIXに注目する) または,資産間の関連性によって信号の質を高めます.関連市場は一致した方向的な動きを示しているときに取引の信頼性を高めることができます.

要約する

多次元の自己適応移動平均マトリックスとATR動的精密取引戦略は,包括的で高度な量化取引方法を表しています.複数の移動平均型の優位性と厳格なATR基礎のリスク管理を組み合わせることで,この戦略は,良好なリスク管理を維持しながら,異なる市場条件に適応することができます.その多層の信号フィルタリング機構,正確なエントリー条件,そして全面的な退出論理は,高確率の取引機会を識別できる強力なシステムを生み出しています.

この戦略の真の価値は,その柔軟性と適応性であり,特定の市場と個人リスクの好みに合わせてトレーダーにカスタマイズすることができます. 戦略の性能は,推奨された最適化方向,特に自律的なパラメータ調整と機械学習の統合によってさらに向上する可能性があります.

高頻度取引環境で技術的に強固で規律的なシステムを適用しようとするトレーダーにとって,この戦略は,技術的な精度とリスク管理を組み合わせた堅固な枠組みを提供します.

ストラテジーソースコード
/*backtest
start: 2024-04-16 00:00:00
end: 2025-04-15 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Dskyz (DAFE) MAtrix with ATR-Powered Precision", 
     overlay=true, 
     default_qty_type=strategy.fixed, 
     initial_capital=1000000, 
     commission_value=0, 
     slippage=1, 
     pyramiding=10)

// ==================================================================
// USER-DEFINED FUNCTIONS
// ==================================================================

// Hull Moving Average (HMA)
hma(src, len) =>
    halfLen = math.round(len * 0.5)
    sqrtLen = math.round(math.sqrt(len))
    wmaf = ta.wma(src, halfLen)
    wmaFull = ta.wma(src, len)
    ta.wma(2 * wmaf - wmaFull, sqrtLen)

// Triple Exponential Moving Average (TEMA)
tema(src, len) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    ema3 = ta.ema(ema2, len)
    3 * (ema1 - ema2) + ema3

// Double Exponential Moving Average (DEMA)
dema(src, len) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    2 * ema1 - ema2

// VWMA - Volume Weighted Moving Average
vwma(src, len) =>
    ta.vwma(src, len)

// ZLEMA - Zero Lag EMA
zlema(src, len) =>
    lag = math.floor((len - 1) / 2)
    ta.ema(2 * src - src[lag], len)

// ALMA - Arnaud Legoux Moving Average
alma(src, len, offset=0.85, sigma=6) =>
    ta.alma(src, len, offset, sigma)

// Custom Kaufman Adaptive Moving Average (KAMA)
kama(src, len) =>
    fastSC = 2.0 / (2 + 1)
    slowSC = 2.0 / (30 + 1)
    change = math.abs(src - src[len])
    volatility = 0.0
    for i = 0 to len - 1
        volatility += math.abs(src - src[i])
    er = volatility != 0 ? change / volatility : 0.0
    sc = math.pow(er * (fastSC - slowSC) + slowSC, 2)
    var float kama_val = na
    kama_val := na(kama_val) ? ta.sma(src, len) : kama_val + sc * (src - kama_val)
    kama_val

// ==================================================================
// INPUTS
// ==================================================================

fastLength   = input.int(9, "[MA] Fast MA Length", minval=1)
slowLength   = input.int(19, "[MA] Slow MA Length", minval=1)
fastMAType   = input.string("SMA", "Fast MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])
slowMAType   = input.string("SMA", "Slow MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])

atrPeriod           = input.int(14, "ATR Period", minval=1)
atrMultiplier       = input.float(1.5, "ATR Multiplier for Filter", minval=0.1, step=0.1)
useTrendFilter      = input.bool(true, "[Filter Settings] Use 15m Trend Filter")
minVolume           = input.int(10, "Minimum Volume", minval=1)
volatilityThreshold = input.float(1.0, "Volatility Threshold (%)", minval=0.1, step=0.1) / 100
tradingStartHour    = input.int(9, "Trading Start Hour (24h)", minval=0, maxval=23)
tradingEndHour      = input.int(16, "Trading End Hour (24h)", minval=0, maxval=23)
trailOffset         = input.float(0.5, "[Exit Settings] Trailing Stop Offset ATR Multiplier", minval=0.01, step=0.01)
profitTargetATRMult = input.float(1.2, "Profit Target ATR Multiplier", minval=0.1, step=0.1)
fixedStopMultiplier = input.float(1.3, "Fixed Stop Multiplier", minval=0.5, step=0.1)
fixedQuantity       = input.int(2, "Trade Quantity", minval=1)

resetDashboard      = input.bool(false, "Reset Dashboard Stats")

// ==================================================================
// CALCULATIONS
// ==================================================================

volumeOk    = volume >= minVolume
currentHour = hour(time)
timeWindow  = currentHour >= tradingStartHour and currentHour <= tradingEndHour
volumeSpike = volume > 1.2 * ta.sma(volume, 10)

// ATR Calculation
atr          = ta.atr(atrPeriod)
volatility   = nz(atr / close, 0)
volatilityOk = volatility <= volatilityThreshold

// ==================================================================
// MOVING AVERAGES CALCULATIONS
// ==================================================================

var float fastMA = na
var float slowMA = na

// Fast MA Logic
if fastMAType == "SMA"
    fastMA := ta.sma(close, fastLength)
else if fastMAType == "EMA"
    fastMA := ta.ema(close, fastLength)
else if fastMAType == "SMMA"
    fastMA := ta.rma(close, fastLength)
else if fastMAType == "HMA"
    fastMA := hma(close, fastLength)
else if fastMAType == "TEMA"
    fastMA := tema(close, fastLength)
else if fastMAType == "WMA"
    fastMA := ta.wma(close, fastLength)
else if fastMAType == "VWMA"
    fastMA := vwma(close, fastLength)
else if fastMAType == "ZLEMA"
    fastMA := zlema(close, fastLength)
else if fastMAType == "ALMA"
    fastMA := alma(close, fastLength)
else if fastMAType == "KAMA"
    fastMA := kama(close, fastLength)
else if fastMAType == "DEMA"
    fastMA := dema(close, fastLength)

// Slow MA Logic
if slowMAType == "SMA"
    slowMA := ta.sma(close, slowLength)
else if slowMAType == "EMA"
    slowMA := ta.ema(close, slowLength)
else if slowMAType == "SMMA"
    slowMA := ta.rma(close, slowLength)
else if slowMAType == "HMA"
    slowMA := hma(close, slowLength)
else if slowMAType == "TEMA"
    slowMA := tema(close, slowLength)
else if slowMAType == "WMA"
    slowMA := ta.wma(close, slowLength)
else if slowMAType == "VWMA"
    slowMA := vwma(close, slowLength)
else if slowMAType == "ZLEMA"
    slowMA := zlema(close, slowLength)
else if slowMAType == "ALMA"
    slowMA := alma(close, slowLength)
else if slowMAType == "KAMA"
    slowMA := kama(close, slowLength)
else if slowMAType == "DEMA"
    slowMA := dema(close, slowLength)

// ==================================================================
// TREND FILTER & SIGNAL LOGIC
// ==================================================================

// Retrieve 15-minute MAs for trend filtering
[fastMA15m, slowMA15m] = request.security(syminfo.tickerid, "15", [ta.sma(close, fastLength), ta.sma(close, slowLength)])
trend15m    = fastMA15m > slowMA15m ? 1 : fastMA15m < slowMA15m ? -1 : 0
trendLongOk = not useTrendFilter or trend15m >= 0
trendShortOk= not useTrendFilter or trend15m <= 0

// ATR-based Price Filter
atrFilterLong  = close > slowMA + atr * atrMultiplier
atrFilterShort = close < slowMA - atr * atrMultiplier

// Signal Logic: MA alignment + filters
maAbove       = close > fastMA and fastMA > slowMA
maBelow       = close < fastMA and fastMA < slowMA
longCondition = maAbove and trendLongOk and atrFilterLong and volumeOk and volumeSpike and timeWindow and volatilityOk
shortCondition= maBelow and trendShortOk and atrFilterShort and volumeOk and volumeSpike and timeWindow and volatilityOk

// ==================================================================
// ENTRY LOGIC
// ==================================================================

if strategy.position_size == 0 and longCondition
    strategy.entry("Long", strategy.long, qty=fixedQuantity)
if strategy.position_size == 0 and shortCondition
    strategy.entry("Short", strategy.short, qty=fixedQuantity)

// ==================================================================
// EXIT LOGIC
// ==================================================================
if strategy.position_size > 0
    strategy.exit("Long Exit", "Long",
         stop  = strategy.position_avg_price - atr * fixedStopMultiplier,
         limit = strategy.position_avg_price + atr * profitTargetATRMult,
         trail_offset = atr * trailOffset,
         trail_points = atr * trailOffset)
if strategy.position_size < 0
    strategy.exit("Short Exit", "Short",
         stop  = strategy.position_avg_price + atr * fixedStopMultiplier,
         limit = strategy.position_avg_price - atr * profitTargetATRMult,
         trail_offset = atr * trailOffset,
         trail_points = atr * trailOffset)

// ==================================================================
// VISUALS: PLOT MAs
// ==================================================================

plot(fastMA, color=color.blue, linewidth=2, title="Fast MA")
plot(slowMA, color=color.red, linewidth=2, title="Slow MA")

// ==================================================================
// METRICS CALCULATIONS (for Dashboard)
// ==================================================================

// Additional metrics:
atrPct   = close != 0 ? (atr / close) * 100 : na               // ATR as percentage of Close
maGapPct = (slowMA != 0) ? (math.abs(fastMA - slowMA) / slowMA) * 100 : na  // % difference between MAs

// Open PnL Calculation
currentPnL = strategy.position_size != 0 ? (close - strategy.position_avg_price) * strategy.position_size : 0

// Persistent variable for highest equity (for drawdown calculation)
var float highestEquity = strategy.equity
highestEquity := math.max(highestEquity, strategy.equity)
totalDrawdown = strategy.equity - highestEquity

// Reset dashboard metrics if reset toggle is on.
if resetDashboard
    highestEquity := strategy.equity

// ==================================================================
// DASHBOARD: WATERMARK LOGO (Bottom-Right)
// ==================================================================
var table watermarkTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.rgb(0, 50, 137), border_width=1)
if barstate.islast
    table.cell(watermarkTable, 0, 0, "⚡ Dskyz - DAFE Trading Systems", text_color=color.rgb(159, 127, 255, 80), text_size=size.large)

// ==================================================================
// DASHBOARD: METRICS TABLE (Bottom-Left)
// ==================================================================
var table dashboard = table.new(position.middle_right, 2, 12, bgcolor=color.new(#000000, 29), border_color=color.rgb(80, 80, 80), border_width=1)
if barstate.islast
    // Row 0 – Dashboard Title (duplicated in both columns to simulate spanning)
    table.cell(dashboard, 0, 0, "⚡(DAFE) Trading Systems", text_color=color.rgb(135, 135, 135), text_size=size.small)
    
    // Row 1 – Position
    table.cell(dashboard, 0, 1, "Position", text_color=color.gray)
    positionText = strategy.position_size > 0 ? "Long" : strategy.position_size < 0 ? "Short" : "Flat"
    table.cell(dashboard, 1, 1, positionText, text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.blue)
    
    // Row 2 – Current PnL
    table.cell(dashboard, 0, 2, "Current P/L", text_color=color.gray)
    table.cell(dashboard, 1, 2, str.tostring(currentPnL, "#.##"), text_color=(currentPnL > 0 ? color.green : currentPnL < 0 ? color.red : color.gray))
    
    // Row 3 – Equity
    table.cell(dashboard, 0, 3, "Equity", text_color=color.gray)
    table.cell(dashboard, 1, 3, str.tostring(strategy.equity, "#.##"), text_color=color.white)

    // Row 4 – Closed Trades
    table.cell(dashboard, 0, 4, "Closed Trades", text_color=color.gray)
    table.cell(dashboard, 1, 4, str.tostring(strategy.closedtrades), text_color=color.white)

    // Row 5 – Title Step
    table.cell(dashboard, 0, 5, "Metrics", text_color=color.rgb(76, 122, 23))
   
    // Row 6 – Fast MA
    table.cell(dashboard, 0, 6, "Fast MA", text_color=color.gray)
    table.cell(dashboard, 1, 6, str.tostring(fastMA, "#.##"), text_color=color.white)
    
    // Row 7 – Slow MA
    table.cell(dashboard, 0, 7, "Slow MA", text_color=color.gray)
    table.cell(dashboard, 1, 7, str.tostring(slowMA, "#.##"), text_color=color.white)
    
    // Row 8 – ATR (Raw)
    table.cell(dashboard, 0, 8, "ATR", text_color=color.gray)
    table.cell(dashboard, 1, 8, str.tostring(atr, "#.##"), text_color=color.white)
    
    // Row 9 – ATR (%)
    table.cell(dashboard, 0, 9, "ATR (%)", text_color=color.gray)
    table.cell(dashboard, 1, 9, str.tostring(atrPct, "#.##") + "%", text_color=color.white)
    
    // Row 10 – MA Gap (%)
    table.cell(dashboard, 0, 10, "MA Gap (%)", text_color=color.gray)
    table.cell(dashboard, 1, 10, na(maGapPct) ? "N/A" : str.tostring(maGapPct, "#.##") + "%", text_color=color.white)
    
    // Row 11 – Volatility (%)
    table.cell(dashboard, 0, 11, "Volatility (%)", text_color=color.gray)
    table.cell(dashboard, 1, 11, str.tostring(volatility * 100, "#.##") + "%", text_color=color.white)