定量的統計に基づく2倍の標準偏差の動的VWAPショックブレイクスルー取引戦略

VWAP SD VOL HL2
作成日: 2025-01-06 16:31:36 最終変更日: 2025-01-06 16:31:36
コピー: 2 クリック数: 438
1
フォロー
1617
フォロワー

定量的統計に基づく2倍の標準偏差の動的VWAPショックブレイクスルー取引戦略

概要

この戦略は、VWAP (出来高加重平均価格) と標準偏差チャネルに基づいたトレンドブレイクアウト戦略です。 VWAP と上限および下限の標準偏差チャネルを計算して動的な価格変動範囲を構築し、価格が上昇したときに取引機会を捉えます。この戦略は、主に標準偏差バンドのブレイクスルーシグナルに依存して取引を行い、利益目標と注文間隔を設定してリスクを制御します。

戦略原則

  1. コア指標の計算:
  • 日中HL2価格と取引量を使用してVWAPを計算する
  • 価格変動に基づいて標準偏差を計算する
  • 上チャネルと下チャネルの標準偏差の1.28倍を設定する
  1. トランザクションロジック:
  • エントリー条件: 価格が下限を越え、上限まで上昇する
  • 終了条件: 設定された利益目標の達成
  • 頻繁な取引を避けるために最小注文間隔を設定する

戦略的優位性

  1. 基本統計
  • VWAPに基づく価格ピボット参照
  • 標準偏差を使用してボラティリティを測定する
  • 取引範囲を動的に調整する
  1. リスク管理
  • 固定利益目標を設定する
  • 取引頻度の制御
  • ロングオンリー戦略はリスクを軽減する

戦略リスク

  1. 市場リスク
  • 激しいボラティリティは誤ったブレイクアウトにつながる可能性がある
  • トレンドの転換点を正確に把握するのは難しい
  • 一方的な下落はより大きな損失につながる
  1. パラメータリスク
  • 標準偏差倍数設定感度
  • 利益目標設定を最適化する必要がある
  • 取引間隔は利益パフォーマンスに影響する

最適化の方向

  1. 信号の最適化
  • トレンド判定フィルターを追加
  • 取引量の変化によって確認
  • 検証するために他のテクニカル指標を追加する
  1. リスク管理の最適化
  • ストップロスポジションを動的に設定する
  • ボラティリティに基づいてポジションを調整する
  • 注文管理メカニズムの改善

要約する

これは、統計原理とテクニカル分析を組み合わせた定量的な取引戦略です。 VWAPと標準偏差バンドの調整により、比較的信頼性の高い取引システムが構築されます。この戦略の核となる利点は、科学的な統計的根拠と完璧なリスク管理メカニズムにありますが、実際のアプリケーションでは、パラメータと取引ロジックを継続的に最適化する必要があります。

ストラテジーソースコード
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5 
strategy("VWAP Stdev Bands Strategy (Long Only)", overlay=true)

// Standard Deviation Inputs
devUp1 = input.float(1.28, title="Stdev above (1)")
devDn1 = input.float(1.28, title="Stdev below (1)")

// Show Options
showPrevVWAP = input(false, title="Show previous VWAP close?")
profitTarget = input.float(2, title="Profit Target ($)", minval=0) // Profit target for closing orders
gapMinutes = input.int(15, title="Gap before new order (minutes)", minval=0) // Gap for placing new orders

// VWAP Calculation
var float vwapsum = na
var float volumesum = na
var float v2sum = na
var float prevwap = na // Track the previous VWAP
var float lastEntryPrice = na // Track the last entry price
var int lastEntryTime = na // Track the time of the last entry

start = request.security(syminfo.tickerid, "D", time)
newSession = ta.change(start)

vwapsum := newSession ? hl2 * volume : vwapsum[1] + hl2 * volume
volumesum := newSession ? volume : volumesum[1] + volume
v2sum := newSession ? volume * hl2 * hl2 : v2sum[1] + volume * hl2 * hl2

myvwap = vwapsum / volumesum
dev = math.sqrt(math.max(v2sum / volumesum - myvwap * myvwap, 0))

// Calculate Upper and Lower Bands
lowerBand1 = myvwap - devDn1 * dev
upperBand1 = myvwap + devUp1 * dev

// Plot VWAP and Bands with specified colors
plot(myvwap, style=plot.style_line, title="VWAP", color=color.green, linewidth=1)
plot(upperBand1, style=plot.style_line, title="VWAP Upper (1)", color=color.blue, linewidth=1)
plot(lowerBand1, style=plot.style_line, title="VWAP Lower (1)", color=color.red, linewidth=1)

// Trading Logic (Long Only)
longCondition = close < lowerBand1 and close[1] >= lowerBand1 // Price crosses below the lower band

// Get the current time in minutes
currentTime = timestamp("GMT-0", year(timenow), month(timenow), dayofmonth(timenow), hour(timenow), minute(timenow))

// Check if it's time to place a new order based on gap
canPlaceNewOrder = na(lastEntryTime) or (currentTime - lastEntryTime) >= gapMinutes * 60 * 1000

// Close condition based on profit target
if (strategy.position_size > 0)
    if (close - lastEntryPrice >= profitTarget)
        strategy.close("B")
        lastEntryTime := na // Reset last entry time after closing

// Execute Long Entry
if (longCondition and canPlaceNewOrder)
    strategy.entry("B", strategy.long)
    lastEntryPrice := close // Store the entry price
    lastEntryTime := currentTime // Update the last entry time

    // Add label for the entry
    label.new(bar_index, close, "B", style=label.style_label_down, color=color.green, textcolor=color.white, size=size.small)

// Optional: Plot previous VWAP for reference
prevwap := newSession ? myvwap[1] : prevwap[1]
plot(showPrevVWAP ? prevwap : na, style=plot.style_circles, color=close > prevwap ? color.green : color.red)