ボラティリティ・モメンタムとキャパシティ加重トレンドクロスオーバー戦略

VMI VWPC ATR RMA 波动加速度指标 容量加权价格中心 趋势跟踪
作成日: 2025-07-14 14:35:54 最終変更日: 2025-07-14 14:35:54
コピー: 1 クリック数: 197
2
フォロー
319
フォロワー

ボラティリティ・モメンタムとキャパシティ加重トレンドクロスオーバー戦略 ボラティリティ・モメンタムとキャパシティ加重トレンドクロスオーバー戦略

概要

波動量と容量加重トレンド交差戦略は,市場に基づく量化取引システムで,市場が低波動から高波動に変化する点を識別して取引決定を行う.この戦略は,波動量指標 ((VMI) と容量加重価格センター ((VWPC) の2つの重要な指標を組み合わせている.VMIは波動率の加速度を測定し,市場が平穏な状態から活発な状態に移行するときに入場し,波動が混沌としたピークに達したときに退場する.VWPCは,取引量に基づくトレンドフィルターとして,典型的な価格を使用して市場全体の方向性を決定する.この組み合わせは,市場が低波動から高波動に変化する際の動きを捉え,取引方向が全体的な傾向と一致することを確保することを目的としています.

戦略原則

この戦略の核心原則は,市場の波動的な変化の周期とトレンドの方向を利用して取引決定を行うことです.具体的には:

  1. 波動量指標 ((VMI) の計算

    • まず,現在の平均リアル範囲 (ATR) とその変化を計算します.
    • ATRの上昇加速度とATRの低下加速度を区別する.
    • 移動平均 (RMA) を使ってこれらの加速度値を平らげる
    • 相対強度を計算し,それを0-100の範囲のVMI値に変換する
  2. 容量加重価格センター (VWPC) 計算

    • 典型的な価格 ((高,低,閉店価格の平均値) と取引量に基づいて計算
    • 典型的な価格と対応する取引量の重み付けにより,高い取引量の価格レベルを強調する指標が得られます.
    • この指標は市場の”重心”であり,全体的なトレンドの方向性を決定するのに役立ちます.
  3. 取引ロジックは2段階で行われます.

    • 準備段階 ((“Armed”条件):VMIが近いうちに平穏領域にあるか ((設定された平穏領域の値を下回っているか) をチェックする
    • トリガーフェーズ ((“Fire”条件):VMIが静止区間の値を超えるとトリガーされる
    • エントリー条件: トレンド方向 ((価格がVWPCより上向きで,逆に下向きである) と上記の2段階の条件を同時に満たす
    • 出発条件:VMIがカオスゾーンの値に達したときに平仓 ((波動がピークに達したことを示します)

戦略は,取引方向を設定し,異なる市場環境に対応するためにパラメータを最適化することができます.

戦略的優位性

この戦略のコードを詳しく分析すると,以下の利点が明らかになる.

  1. 市場サイクルに基づく取引タイミングの選択この戦略は,市場が低波動から高波動に変化する点をVMI指標で識別し,これはしばしば新しい価格の動きの始まりを象徴し,トレンドの初期に入場するのに役立ちます.

  2. 取引量とトレンドの確認:VWPCは,取引量重量を加えることで,単純移動平均よりも代表的なトレンド指標を提供し,偽信号を減らす.

  3. 明確な入場・出場条件策略は,明確な入場論理 ((波動が増加し始める) と出場論理 ((波動が極限に達する) を有し,主観的な判断を回避する.

  4. 適応性が高い:パラメータの最適化により,この戦略は異なる市場環境と取引品種に適応できます.特にVMIの平穏地帯とカオスゾーンの値は,市場の特性に合わせて調整できます.

  5. リスク管理の統合戦略は,ポジション管理 ((デフォルトでアカウントの資金の15%を使用する) と逆取引制限 ((pyramiding=0)) を内蔵し,リスクを制御するのに役立ちます.

  6. ビジュアルアシスタント: 戦略は,VWPCのトレンドラインとエントリー/アウトジンのシグナルをグラフに描画し,トレーダーが市場状態と戦略の論理を直感的に理解できるようにする.

  7. コンピュータの効率性:ta.rmaとta.barssinceなどの内置関数を使用することで,戦略の計算効率が高く,リアルタイム取引アプリケーションに適しています.

戦略リスク

この戦略には多くの利点がありますが,以下の潜在的なリスクがあります.

  1. 波動性のある偽ブレークスルーリスク: 市場の短期的な波動性の上昇後に迅速な後退が起こり,誤ったシグナルを引き起こす場合がある. 解決策はVMI平静区間の値の調整または確認条件の追加である.

  2. トレンド判断の遅延:VWPCは,トレンド指標として一定の遅れがある可能性があり,市場が急激に転換する時に適切な対応ができない可能性があります. 短期的な動力指標と組み合わせて補助判断を考慮することができます.

  3. パラメータ感度: 戦略性能はパラメータ設定 (特にVMI長さと値) に敏感であり,異なる市場環境には異なるパラメータの組み合わせが必要になる可能性がある. 異なる市場環境に対するパラメータの最適化のために反射を推奨する.

  4. 取引頻度の不確実性戦略は波動性に基づいているため,異なる市場段階で取引シグナルの頻度は大きく異なる可能性があり,全体的な収益率と撤回制御に影響を与える.

  5. 取引コストの影響戦略は取引手数料を考慮しているものの,実際の取引では,スライドポイントやその他の取引コストが戦略のパフォーマンスをさらに影響する可能性があります.

  6. 取引量データに依存する:VWPC指標は取引量データに依存し,特定の市場または時間帯では,取引量データが不正確または信頼できない可能性があり,基準の正確さに影響する.

戦略最適化の方向性

このコードを分析すると,以下の最適化方向が考えられます.

  1. 波動的なフィルターに追加: 歴史的変動に基づく動的値調整機構を導入し,VMIの平穏地帯と混沌地帯の値が,市場全体の変動レベルに合わせて自動的に調整され,戦略の適応性を向上させることができる.

  2. トレンド確認の強化:VWPCに基づいて多時間枠のトレンド確認を追加したり,他のトレンド指標 (例えば方向性指標ADX) と組み合わせたりして,トレンド判断の正確性を向上させることができます.

  3. 出場メカニズムの最適化:現在の戦略は,VMIがカオスゾーンに達したときにのみ出場する. リスクと利益のロックをよりよく制御するために,ストップと目標利益のレベル,または変動率に基づくダイナミックストップ戦略を追加することを検討することができます.

  4. 取引量フィルターを増やす: 取引量確認条件を追加し,取引量が増えた場合にのみ入場し,低流動性の環境での取引を避ける.

  5. タイムフィルターを追加する: 特定の市場では,特定の時間帯に波動的なパターンが存在し,時間フィルター条件を追加して,既知の低効率の取引時間を回避できます.

  6. パラメータ自律化: 最近の市場パフォーマンスに基づいてパラメータを自動的に調整するメカニズムを開発し,市場変化に戦略をより良く適応させることができる.

  7. 資金管理の最適化: 変動率に基づくダイナミックなポジション管理を実現し,異なる変動環境下で取引規模を調整し,リスクと利益のバランスをとることができる.

要約する

波動量と容量加重トレンド交差策略は,波動性の分析とトレンド追跡を組み合わせた量化取引システムである.それは,市場が平穏から活発に変化する点をVMI指標で捉え,波動がピークに達したときに退場する.同時に,VWPC指標を使用して,取引の方向が全体的なトレンドと一致することを確保する.この戦略の核心的な優点は,市場の波動周期の重要な転換点を捉えることができ,取引量情報フィルターとトレンドの方向を組み合わせて,取引品質を向上させることにある.

しかし,この戦略は,波動的偽突破,トレンド判断の遅延,パラメータの感受性などの課題にも直面している. ダイナミックな値調整,トレンド確認の強化,出場論理の最適化,自己適応パラメータの実現などの方法を導入することにより,戦略の安定性と適応性をさらに向上させることができる.

最終的に,この戦略は,市場と波動的なサイクルに基づいた取引の枠組みを提供し,様々な市場環境で適用されます.しかし,トレーダーは,特定の取引品種と市場の特徴に応じて,パラメータの最適化と戦略の調整を行う必要があります.

ストラテジーソースコード
/*backtest
start: 2024-07-14 00:00:00
end: 2025-07-12 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":200000}]
*/

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TiamatCrypto

//@version=5
strategy("Market Entropy Strategy V2.5", 
         overlay=true, 
         initial_capital=10000, 
         default_qty_type=strategy.percent_of_equity, 
         default_qty_value=15, // Slightly more aggressive allocation
         commission_type=strategy.commission.percent,
         commission_value=0.075,
         pyramiding=0) // Allow only one trade in one direction

// --- General Settings ---
trade_direction = input.string("Both", "Trade Direction", options=["Long", "Short", "Both"], group="General Settings")

// --- Inputs for Optimization ---
// VMI Settings
vmi_length = input.int(14, "VMI Length", group="VMI Settings")
atr_period = input.int(10, "ATR Period for VMI", group="VMI Settings")
vmi_calm_zone = input.int(25, "VMI Calm Zone (Entry Level)", group="VMI Settings", step=5)
vmi_chaos_zone = input.int(85, "VMI Chaos Zone (Exit Level)", group="VMI Settings", step=5)

// VWPC Settings
vwpc_length = input.int(50, "VWPC Filter Length", group="VWPC Trend Filter")
setup_lookback = input.int(10, "How far to look for 'Armed' (candles)", group="Entry Logic")

// --- Indicator #1: Volatility Momentum Index (VMI) ---
current_atr = ta.atr(atr_period)
atr_change = current_atr - current_atr[1]
up_accel = atr_change > 0 ? atr_change : 0
down_accel = atr_change < 0 ? -atr_change : 0
avg_up_accel = ta.rma(up_accel, vmi_length)
avg_down_accel = ta.rma(down_accel, vmi_length)
rs_vmi = avg_down_accel == 0 ? 0 : avg_up_accel / avg_down_accel
vmi = avg_down_accel == 0 ? 100 : avg_up_accel == 0 ? 0 : 100 - (100 / (1 + rs_vmi))

// --- Indicator #2: Volume-Weighted Price Center (VWPC) ---
// Function to calculate VWPC
f_vwpc(length) =>
    sum_price_volume = 0.0
    sum_volume = 0.0
    // We use the typical price, which better represents the candle
    typical_price = (high + low + close) / 3
    for i = 0 to length - 1
        sum_price_volume += typical_price[i] * nz(volume[i])
        sum_volume += nz(volume[i])
    sum_volume == 0 ? typical_price : sum_price_volume / sum_volume

vwpc = f_vwpc(vwpc_length)

// --- Strategy Logic ---

// Trend Definition
is_uptrend = close > vwpc
is_downtrend = close < vwpc

// Phase 1: "Armed" Condition (Setup)
// We check if VMI WAS in the calm zone in the recent past
was_calm_recently = ta.barssince(vmi < vmi_calm_zone) < setup_lookback

// Phase 2: "Fire" Condition (Trigger)
// VMI is currently crossing the Calm Zone upwards
trigger_fire = ta.crossover(vmi, vmi_calm_zone)

// Combination for ENTRY
buy_signal = is_uptrend and was_calm_recently and trigger_fire
sell_signal = is_downtrend and was_calm_recently and trigger_fire

// Condition for EXIT ("Exhaustion")
// The same condition applies for both long and short - peak chaos
exit_signal = ta.crossover(vmi, vmi_chaos_zone)

// --- Executing Orders ---
// Entry Conditions
allow_longs = trade_direction == "Long" or trade_direction == "Both"
allow_shorts = trade_direction == "Short" or trade_direction == "Both"

// Entries
if (buy_signal and allow_longs)
    strategy.entry("Buy", strategy.long, comment="Enter LONG (Armed->Fire)")

if (sell_signal and allow_shorts)
    strategy.entry("Sell", strategy.short, comment="Enter SHORT (Armed->Fire)")

// Exits
if (strategy.position_size > 0 and exit_signal)
    strategy.close("Buy", comment="Exit LONG (Chaos)")

if (strategy.position_size < 0 and exit_signal)
    strategy.close("Sell", comment="Exit SHORT (Chaos)")

// --- Plotting on the chart for visual inspection ---
plot(vwpc, "VWPC Center of Gravity", color=color.new(color.yellow, 0), linewidth=2)
plotshape(buy_signal and allow_longs, "LONG Entry", shape.labelup, location.belowbar, color=color.new(color.aqua, 0), text="ENTRY ↑", textcolor=color.white, size=size.small)
plotshape(sell_signal and allow_shorts, "SHORT Entry", shape.labeldown, location.abovebar, color=color.new(color.fuchsia, 0), text="ENTRY ↓", textcolor=color.white, size=size.small)

// Plotting the exit signal for a better overview
exit_marker_y_pos = strategy.position_size > 0 ? high : low
plotshape(series=(exit_signal and strategy.position_size != 0 ? exit_marker_y_pos : na), title="Exit", style=shape.xcross, location=location.absolute, color=color.new(color.orange, 0), size=size.tiny, text="END")