複数期間のモメンタム駆動型適応型ボラティリティフィルタリング戦略

momentum volatility SMA ATR stdev SPX
作成日: 2025-02-24 09:38:10 最終変更日: 2025-02-24 09:38:10
コピー: 0 クリック数: 346
2
フォロー
319
フォロワー

複数期間のモメンタム駆動型適応型ボラティリティフィルタリング戦略 複数期間のモメンタム駆動型適応型ボラティリティフィルタリング戦略

概要

この戦略は,多周期的な動態指標と変動率フィルターに基づいた高級取引システムである.これは,3ヶ月,6ヶ月,9ヶ月および12ヶ月という4つの時間周期の価格動態を計算して,総合的な動態量評価システムを構築している.同時に,戦略は,変動率の値下げを設定することによって取引リスクを制御するための年率の変動率フィルターメカニズムを導入している.この戦略は,継続的な上昇傾向があり,比較的安定した変動を伴う取引機会を捕捉することに焦点を当てており,典型的なトレンド追跡システムである.

戦略原則

戦略の核心的な論理には以下の重要な要素が含まれています.

  1. 動量計算: ((現在の価格/歴史的価格-1) の方法を使用して,4つの時間周期の動量指標をそれぞれ計算する.
  2. 波動率フィルター:日利率の標準差を計算し,年化処理を行い,それを既定の値 ((0.5) と比較して,波動率が高い期間をフィルターする.
  3. 信号生成:総合動量指標が負の正転で波動率が値以下であるときに多信号が生成される.動量指標が負の平仓であるとき.
  4. リスク管理:1%のストップ・ロスと50%のストップ・ストップを使用して,単一取引のリスクを制御する.

戦略的優位性

  1. 多次元動態分析:複数の時間周期の動態を総合的に考慮することによって,価格動向の強さと持続性をより全面的に評価することができる.
  2. 適応波動率フィルタリング: 波動率を動的に計算してフィルタリングすることで,高波動期間の偽信号を効果的に回避する.
  3. 優れたリスク管理: ストップ・ローズとストップ・スローズを設定し,単一取引のリスクを効果的に制御します.
  4. システム化された意思決定:主観的な判断による干渉を避けるため,戦略は完全にシステム化された.

戦略リスク

  1. トレンド反転リスク: 強いトレンドが突然反転した場合,大きな損失を負う可能性があります.
  2. パラメータの感受性:戦略効果は,動量周期,波動率の値などのパラメータの設定に敏感である.
  3. 市場環境依存: 波動的な市場では頻繁に偽信号が生じることがあります.
  4. スライドポイントの影響: 市場流動性が不足している場合,取引コストが高くなる可能性があります.

戦略最適化の方向性

  1. 動的パラメータ最適化:市場状況に応じて動量周期と波動率の値を動的に調整する自己適応パラメータ調整メカニズムを導入することができる.
  2. 市場状態分類:市場状態識別モジュールを追加し,異なる市場環境で異なるパラメータ設定を採用する.
  3. シグナル確認メカニズム: 取引シグナルを確認し,戦略の安定性を高めるための追加の技術指標を導入する.
  4. 資金管理の最適化:信号の強度に応じて保有規模を動的に調整し,資金利用の効率を向上させることができる.

要約する

この戦略は,多周期的な動態分析と波動率フィルタリングを組み合わせて,完全なトレンド追跡取引システムを構築している.その核心的な優点は,体系化された意思決定プロセスと完善したリスク管理機構にある.いくつかの固有のリスクがあるにもかかわらず,提案された最適化方向によって,戦略は,改善の余地がある.全体的に,これは,合理的で論理的に厳格に設計された取引戦略であり,低波動率のトレンド市場での適用に適している.

ストラテジーソースコード
/*backtest
start: 2024-02-25 00:00:00
end: 2025-02-22 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("GOATED Long-Only", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Strategy parameters
var float VOLATILITY_THRESHOLD = input.float(0.5, "Volatility Threshold", minval=0.1, maxval=1.0, step=0.1)
var int TRADING_DAYS_PER_YEAR = 252
var float SQRT_TRADING_DAYS = math.sqrt(TRADING_DAYS_PER_YEAR)

// Trade parameters
var float STOP_LOSS = input.float(0.05, "Stop Loss %", minval=0.01, maxval=0.20, step=0.01)
var float TAKE_PROFIT = input.float(0.15, "Take Profit %", minval=0.05, maxval=0.50, step=0.01)

// Momentum periods (in trading days)
var int MOMENTUM_3M = input.int(63, "3-Month Momentum Period", minval=20)
var int MOMENTUM_6M = input.int(126, "6-Month Momentum Period", minval=40)
var int MOMENTUM_9M = input.int(189, "9-Month Momentum Period", minval=60)
var int MOMENTUM_12M = input.int(252, "12-Month Momentum Period", minval=80)

// Function to calculate momentum for a specific period
momentum(period) =>
    close / close[period] - 1

// Function to calculate annualized volatility
calcVolatility() =>
    returns = ta.change(close) / close[1]
    stdDev = ta.stdev(returns, TRADING_DAYS_PER_YEAR)
    annualizedVol = stdDev * SQRT_TRADING_DAYS
    annualizedVol

// Calculate individual momentum scores
float mom3m = momentum(MOMENTUM_3M)
float mom6m = momentum(MOMENTUM_6M)
float mom9m = momentum(MOMENTUM_9M)
float mom12m = momentum(MOMENTUM_12M)

// Calculate average momentum score
var int validPeriods = 0
var float totalMomentum = 0.0

validPeriods := 0
totalMomentum := 0.0

if not na(mom3m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom3m

if not na(mom6m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom6m

if not na(mom9m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom9m

if not na(mom12m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom12m

float compositeMomentum = validPeriods > 0 ? totalMomentum / validPeriods : na

// Calculate volatility
float annualizedVolatility = calcVolatility()

// Generate trading signals
var float MOMENTUM_THRESHOLD = input.float(0.0, "Momentum Threshold", minval=-1.0, maxval=1.0, step=0.01)
bool validVolatility = not na(annualizedVolatility) and annualizedVolatility <= VOLATILITY_THRESHOLD
bool validMomentum = not na(compositeMomentum) and compositeMomentum > MOMENTUM_THRESHOLD

// Store previous momentum state
bool prevValidMomentum = nz(validMomentum[1])

// Entry and exit conditions
bool longCondition = validVolatility and validMomentum and not prevValidMomentum
bool exitLongCondition = validVolatility and (not validMomentum) and prevValidMomentum

// Plot signals
plotshape(longCondition, title="Long Entry", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(exitLongCondition, title="Long Exit", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot momentum and volatility indicators
plot(compositeMomentum, "Composite Momentum", color=color.blue, linewidth=2)
hline(MOMENTUM_THRESHOLD, "Momentum Threshold", color=color.gray, linestyle=hline.style_dashed)

plot(annualizedVolatility, "Annualized Volatility", color=color.purple, linewidth=1)
hline(VOLATILITY_THRESHOLD, "Volatility Threshold", color=color.gray, linestyle=hline.style_dashed)

// Strategy execution - Long positions
if (longCondition)
    strategy.entry("Long", strategy.long)
    
if (strategy.position_size > 0)
    float longStopLoss = strategy.position_avg_price * (1 - STOP_LOSS)
    float longTakeProfit = strategy.position_avg_price * (1 + TAKE_PROFIT)
    strategy.exit("Exit Long", "Long", stop=longStopLoss, limit=longTakeProfit)
    if (exitLongCondition)
        strategy.close("Long", comment="Signal Exit")