移動平均クロスオーバーとダイナミックボラティリティストップロス定量戦略

SMA RSI ATR RISK-TO-REWARD RATIO TREND FOLLOWING
作成日: 2025-04-02 11:08:39 最終変更日: 2025-04-02 11:08:39
コピー: 2 クリック数: 323
2
フォロー
319
フォロワー

移動平均クロスオーバーとダイナミックボラティリティストップロス定量戦略 移動平均クロスオーバーとダイナミックボラティリティストップロス定量戦略

概要

この量的な取引戦略は,移動平均の交差,比較的強い指標 ((RSI)) のフィルタリングと平均実数範囲 ((ATR)) に基づくダイナミックストップのメカニズムを組み合わせた総合的なシステムである. この戦略は,主にRSI指標を介して中長期のトレンドを捕捉し,過剰な買い過ぎや過売りの市場環境で入場を避けるために使用され,ATR指標を使用して市場の変動に適応するためにダイナミックストップを設定します. この戦略は,15分間の時間枠で特に優れたパフォーマンスを発揮し,日中のトレンドを捕捉し,低時間枠の過剰なノイズを避けるための良いバランスを取ることができます.

戦略原則

戦略の中核となるロジックは、次の主要な要素に基づいています。

  1. 移動平均の交差信号戦略は,50周期の短期平均と200周期の長期平均である2つの単純な移動平均 (((SMA) を使用します.短期平均が長期平均より低く,RSI値が30を超える場合,システムは複数のシグナルをトリガーします.この設計は,潜在的なトレンド転換点を識別することを目的としています.

  2. RSIフィルター策略: 14サイクルRSIの指標を利用して入場フィルタリングを行う.具体的には,RSI値が30を超えるとだけ多出場が許される.これは,深部超売り区域の盲目入場を避けるのに役立つ.コードでは空白条件の枠組みが保持されているが,現在のバージョンは多出場策に焦点を当てている.

  3. ATRの動態停止戦略: 14サイクルATR指標を用いて動的ストップ値を計算する. ストップ値は入場価格減算 ((ATR値×倍数) として設定され,ATR倍数は1.0をデフォルトとする. この動的ストップメカニズムは,市場の実際の変動性に応じて自律的に調整することができ,高波動期にはより緩やかなストップスペースを提供し,低波動期にはより緊密なリスク管理を維持する.

  4. リスク・リターン比率策略は,リスク・リターン・比率 (RRR) によるストップ設定を実装し,デフォルト値は1.5である. ストップは,入場価格加算 (入場価格 - ストップ価格) ×リスク・リターン・比率として計算され,各取引の潜在的利益とリスクの適正な比率を維持することを保証する.

戦略的優位性

  1. トレンドトラッキングとフィルタリング: 戦略は,移動平均を交差してトレンドの変化を捉えるだけでなく,RSI指標でフィルタリングすることで,誤信号を軽減し,入場品質を向上させる.

  2. ダイナミックなリスク管理ATRベースのストップメカニズムは,市場の波動的な動向に合わせてストップ距離を調整し,高い波動性のある環境で固定ストップが過早に誘発される問題を回避し,低波動期に適切なリスク管理を維持する戦略の大きな亮点です.

  3. リスク・リターン・比率の最適化戦略は,リスクと報酬の比率を想定して,取引の潜在的な利益とリスクの比率を保証します.これは,勝利率が低い場合でも,長期的に資金の成長に役立ちます.

  4. 取引の可視化: 戦略には,ストップ・ロースとストップ・ポジションのリアルタイムマッピングと,完了した取引のマーカー機能が含まれています.これは,戦略の動作の可視性を大幅に高め,分析と戦略の最適化を容易にします.

  5. 資金管理統合戦略: 口座総額のパーセントをデフォルトで使って取引管理する.これは固定手数よりも柔軟で,口座の規模が変化するにつれて取引規模を自動的に調整できる.

戦略リスク

  1. トレンド反転リスク策略は移動平均を用いてトレンドを識別するものの,市場が突然反転すると,大きな損失を引き起こす可能性があります. 解決策は,より敏感な短期指標を補助確認として導入することを検討するか,またはRSIの値を調整して反転に対する感受性を向上させることです.

  2. パラメータ感度戦略のSMA周期,RSI値,ATR倍数などの重要なパラメータは,パフォーマンスに顕著な影響を及ぼします.異なる市場環境は,異なるパラメータ設定を必要とします.したがって,最適なパラメータの組み合わせを見つけるために,十分な歴史回帰が必要です.

  3. 単一市場の限界:現在のバージョンは,多策策に重点を置いているため,継続的に下落する市場ではうまく機能しない可能性があります. 解決策は,コード内の空白条件を活性化して,双方向の取引能力を実現することです.

  4. リスクの幅が大きすぎる: 極端な高波動期にはATR値が大きく上昇し,ストップ距離が大きすぎて,潜在的損失が大きくなる可能性があります.ATR倍数の上限を設定するか,固定金額ストップとATRダイナミックストップを組み合わせた混合方案を考慮することができます.

  5. 取引頻度の不確実性策略依存性中長期移動平均の交差により,取引信号が稀になり,資金利用の効率に影響を及ぼす可能性があります.解決策は,補足として短期取引信号の追加を検討するか,主要なトレンドが確立された後により短期的な指標を使用して加仓することです.

戦略最適化の方向性

  1. 多時間枠分析統合:現在の戦略は単一のタイムフレームでしか動作しない.例えば,より高いタイムフレームを使用して主要なトレンドの方向を確認し,その後,より低いタイムフレームでエントリーポイントを探し,エントリー精度を向上させるなど,複数のタイムフレームの分析を統合することを考えることができます.

  2. 空間論理の完結:戦略の空白論理を活性化して最適化して,下落市場でも同様に効果的になるようにする.これは,空白のRSI値の調整 (RSIが70より大きい場合空白) と,異なる市場方向に対する異なるパラメータの設定が必要である.

  3. 取引量指標の導入: 取引量指標を入場論理に統合することを検討し,取引量確認の場合にのみ取引シグナルを実行し,偽突破による損失を減らすのに役立ちます.

  4. を抑える戦略を最適化:現在の戦略は,ストップを設定するよりも,固定リスクリターンを使用し,トレンドが継続するときにより多くの利益を得るために,部分的な利益のロックまたはストップを追跡することを検討することができます.

  5. 取引時間フィルターを追加する: 明らかに時間的な特徴を持つ市場に対して,時間フィルターを追加して,低流動性または高不確実性の時期に取引を避ける.

  6. パラメータ自律化: 戦略が市場環境の変化に合わせてパラメータを自動的に最適化できるように,歴史的変動率または他の市場特性のパラメータの自己調整機構を実現する.

要約する

移動平均クロス,RSIフィルター,ATRダイナミックストップに基づくこの定量化戦略は,中長期トレンド取引に特に適したバランスの取れた取引の枠組みを提供します.その核心的な優位性は,技術指標分析とダイナミックリスク管理をシームレスに組み合わせることで,トレンドの変化を捉え,市場の変動に応じてリスクの開口を調整することができます.

戦略にはパラメータ感受性や片道取引の限界があるが,複数の時間枠分析,空白論理の改善,取引量確認の導入などの推奨された最適化方向によってこれらの問題は効果的に改善できる.特に,動的パラメータ調整機構をより複雑なストップストップ戦略と組み合わせることで,戦略の安定性と収益性をさらに向上させる見通しがある.

中長期のトレンド取引を模索し,リスク管理を重んじるトレーダーにとって,この戦略は,個性的な調整と継続的な最適化によって,高効率の取引システムになる可能性のある,堅固な出発点を提供します.

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

//@version=6
strategy(title=" VS-NTC> NASDQ100 Long MA+RSI+ATR", shorttitle="VS-NTC> Long NASDQ100 MA+RSI+ATR", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// ————— Inputs —————
smaLenShort  = input.int(50,  title="Short SMA Length")
smaLenLong   = input.int(200, title="Long SMA Length")
rsiLen       = input.int(14,  title="RSI Length")
atrPeriod    = input.int(14,  title="ATR Period")
atrMult      = input.float(1.0, title="Stop-Loss ATR Multiplier", step=0.1)
rrRatio      = input.float(1.5, title="Risk-to-Reward Ratio",    step=0.1)

// ————— Indicator Calculations —————
smaShort = ta.sma(close, smaLenShort)
smaLong  = ta.sma(close, smaLenLong)
rsiVal   = ta.rsi(close, rsiLen)
atrVal   = ta.atr(atrPeriod)

// ————— Entry Conditions —————
// Long Condition: 50SMA > 200SMA and RSI < 70
longCondition = (smaShort < smaLong) and (rsiVal > 30)
// Short Condition: 50SMA < 200SMA and RSI > 30 (example: avoid oversold)
// Or use RSI > 70 to short if the market is overbought.
shortCondition = false
// shortCondition = (smaShort > smaLong) and (rsiVal < 35)

// ————— Entry Logic —————
if longCondition
    strategy.entry(id="Long", direction=strategy.long)

if shortCondition
    strategy.entry(id="Short", direction=strategy.short)

// ————— Stop-Loss & Take-Profit Calculation —————
var float stopPrice       = na
var float takeProfitPrice = na

// If we have a position open, we determine SL & TP differently for Long or Short.
if strategy.position_size > 0
    // We are in a Long trade
    stopPrice       := strategy.position_avg_price - (atrVal * atrMult)
    takeProfitPrice := strategy.position_avg_price + ((strategy.position_avg_price - stopPrice) * rrRatio)

    strategy.exit("Exit SL/TP", stop=stopPrice, limit=takeProfitPrice)
else if strategy.position_size < 0
    // We are in a Short trade
    stopPrice       := strategy.position_avg_price + (atrVal * atrMult)
    // For short, the distance from entry to stop is (stopPrice - entry)
    // So the take-profit is entry - that same distance times RR
    takeProfitPrice := strategy.position_avg_price - ((stopPrice - strategy.position_avg_price) * rrRatio)

    strategy.exit("Exit SL/TP", stop=stopPrice, limit=takeProfitPrice)
else
    // No open position → reset plots to na
    stopPrice       := na
    takeProfitPrice := na

// ————— Plot the Planned Stop-Loss & Take-Profit —————
plot(stopPrice,       title="Stop Loss",   color=color.red,   linewidth=2)
plot(takeProfitPrice, title="Take Profit", color=color.green, linewidth=2)


// ————— Label Each Closed Trade (Wins & Losses) —————
var int lastClosedTradeCount = 0
currentClosedCount = strategy.closedtrades

// If there's at least one new closed trade, label it
if currentClosedCount > lastClosedTradeCount
    newTradeIndex = currentClosedCount - 1

    tradeProfit  = strategy.closedtrades.profit(newTradeIndex)
    exitBarIndex = strategy.closedtrades.exit_bar_index(newTradeIndex)
    exitPrice    = strategy.closedtrades.exit_price(newTradeIndex)

    // Win label if profit > 0
    if tradeProfit > 0
        labelText  = "Win: " + str.tostring(tradeProfit)
        labelStyle = label.style_label_up
        labelColor = color.new(color.green, 0)
        label.new(exitBarIndex, exitPrice, text=labelText, style=labelStyle, color=labelColor, size=size.tiny)

    // Loss label if profit < 0
    if tradeProfit < 0
        labelText  = "Loss: " + str.tostring(tradeProfit)
        labelStyle = label.style_label_down
        labelColor = color.new(color.red, 0)
        label.new(exitBarIndex, exitPrice, text=labelText, style=labelStyle, color=labelColor, size=size.tiny)

    lastClosedTradeCount := currentClosedCount