マルチファクタートレンドフォロー型クオンツ戦略

SAR EMA RSI ADX ATR
作成日: 2025-04-24 17:23:29 最終変更日: 2025-04-24 17:23:29
コピー: 0 クリック数: 355
2
フォロー
319
フォロワー

マルチファクタートレンドフォロー型クオンツ戦略 マルチファクタートレンドフォロー型クオンツ戦略

概要

この戦略は,パラグラフ・リバース・インデックス (SAR),インデックス・ムービング・アヴェア (EMA),相対的に強いインデックス (RSI) と平均トレンド・インデックス (ADX) を組み合わせた多要素のトレンド追跡システムである.複数の技術指標の協同作用によって潜在的なトレンドの方向性を認識し,トレンドが確認されたときに取引を発行する.信号戦略は,平均真波幅 (ATR) に基づくダイナミックリスク管理方法,自動ストップ・ロスの計算,およびストップ・ストップのレベルも採用している.

戦略原則

  1. トレンド確認: 価格がパラグラフを突破して指数 (SAR) を回転し,閉じる価格が急速EMAより高いとき,上昇傾向を確認する. 価格がSARを下回り,閉じる価格が急速EMAより低いとき,下降傾向を確認する.
  2. パワーフィルター: RSI指標のフィルター信号を使用し,多時RSI>60と空時RSI<40を要求し,取引がより強い動力の方向で行われることを確認する.
  3. トレンドの強度確認:ADX指標 ((値30) を使ってトレンドの強さを検証し,波動的な市場での取引を避ける.
  4. リスク管理動的ストップ ((1.5倍ATR) とストップ ((2倍ATR) を計算し,口座資金の固定パーセント ((デフォルト2%) に基づいてポジションの大きさを計算する.

戦略的優位性

  1. 多要素検証: SAR,EMA,RSI,ADXの4つの指標の複数の検証により,信号品質が著しく向上した.
  2. ダイナミックなリスク管理ATR-basedのストップ・ストップは,市場の変動に自動的に適応します.
  3. トレンド強度フィルター:ADXの値が偽突破を有効にフィルターし,強いトレンド市場でのみ取引する.
  4. ポジションの自動計算: リスクベースのポジション管理は,取引ごとにリスクが一致することを保証します.
  5. 明確な視覚的フィードバック背景の色で取引シグナルを直感的に表示する.

戦略リスク

  1. 遅滞のリスクSARとEMAはトレンドの指数で,トレンドが逆転すると遅滞する可能性があります.
  2. パラメータ感度:RSI長さ ((6) とEMA周期 ((2) の短い周期設定は,過度な取引を引き起こす可能性があります.
  3. ADXの減価リスク固定ADX値 ((30) は,異なる市場条件で不安定なパフォーマンスを示す可能性があります.
  4. 変動がリスクを増大させるATRの倍数固定は,極端な波動の間,ストップダメージを過幅にすることがあります.
    解決方法
  • ADX 値と RSI パラメータの動態最適化
  • 波動性フィルターを追加する (VIX指数など)
  • 漸進的ポジション管理による固定パーセントの代替

最適化の方向

  1. パラメータの動態化: 固定パラメータを市場の状況に基づく動的パラメータに変更します.例えば,波動率を使用してATR倍数調整します.
  2. 機械学習の統合: 過去データでトレーニングモデルを最適化した指標パラメータ群.
  3. 複数時間枠確認高いタイムフレームへの参加傾向が確認されました.
  4. 異常波動のフィルターニュースで重要な出来事が起こる前後,取引を停止する.
  5. 複合的な退出戦略: ストップ・ローズ・トラッキングとタイム・アウトなど,複数の退出メカニズムを組み合わせた.

要約する

この多要素トレンド戦略は,指標の協調性と厳格なリスク管理によってトレンド市場において優れている. 核心的な優位性は,シグナルの複数の検証と動的リスク制御にあるが,そのパラメータの感受性および遅れのリスクに注意する必要がある. 将来の最適化は,パラメータ自適応機構と市場状態の識別に焦点を当てて,戦略の強さを向上させるべきである.

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

//@version=5
strategy("🚀 Estrategia SAR+EMA+RSI con Alertas", overlay=true)

// ———— PARÁMETROS ————
riskPerTrade = input.float(2.0, title="Riesgo por operación (%)", minval=0.5, step=0.5)
sarStart = input.float(0.02, title="SAR Start", minval=0.001)
sarIncrement = input.float(0.02, title="SAR Increment", minval=0.001)
sarMax = input.float(0.2, title="SAR Max", minval=0.1)
rsiLength = input.int(6, title="RSI Length", minval=3, maxval=10)
emaFastLength = input.int(2, title="EMA Rápida", minval=1, maxval=5)
adxThreshold = input.int(30, title="ADX mínimo", minval=20, maxval=50)
atrMultiplier = input.float(1.5, title="Multiplicador ATR para SL", step=0.1)

// ———— INDICADORES ————
sar = ta.sar(sarStart, sarIncrement, sarMax)
emaFast = ta.ema(close, emaFastLength)
rsi = ta.rsi(close, rsiLength)
[diplus, diminus, adx] = ta.dmi(14, 14) // Ahora pasamos length y adxSmoothing

atr = ta.atr(14)

// ———— CONDICIONES ————
longCondition = ta.crossover(close, sar) and close > emaFast and rsi > 60 and adx >= adxThreshold
shortCondition = ta.crossunder(close, sar) and close < emaFast and rsi < 40 and adx >= adxThreshold

// ———— FUNCIÓN MENSAJE ALERTA ————
getAlertMessage(isLong) =>
    slPoints = atr * atrMultiplier
    message = (isLong ? "🚀 COMPRA " : "🔻 VENTA ") + syminfo.ticker + "\n" +
      "Precio: " + str.tostring(math.round(close, 2)) + "\n" +
      "SL: " + str.tostring(math.round(isLong ? (close - slPoints) : (close + slPoints), 2)) + "\n" +
      "TP: " + str.tostring(math.round(isLong ? (close + slPoints * 2) : (close - slPoints * 2), 2)) + "\n" +
      "RSI: " + str.tostring(math.round(rsi, 1)) + "\n" +
      "ADX: " + str.tostring(math.round(adx, 1))
    message

// ———— ALERTAS ————
if (longCondition)
    alert(getAlertMessage(true), alert.freq_once_per_bar_close)

if (shortCondition)
    alert(getAlertMessage(false), alert.freq_once_per_bar_close)



if (longCondition)
    alert(getAlertMessage(true), alert.freq_once_per_bar_close)

if (shortCondition)
    alert(getAlertMessage(false), alert.freq_once_per_bar_close)

// ———— ENTRADAS DE ESTRATEGIA ————
riskAmount = strategy.equity * (riskPerTrade / 100)
slPoints = atr * atrMultiplier
qty = riskAmount / close

if (longCondition)
    strategy.entry("Long", strategy.long, qty=qty)
    strategy.exit("Exit Long", "Long", stop=close - slPoints, limit=close + slPoints * 2)

if (shortCondition)
    strategy.entry("Short", strategy.short, qty=qty)
    strategy.exit("Exit Short", "Short", stop=close + slPoints, limit=close - slPoints * 2)

// ———— VISUALIZACIÓN ————
plot(sar, title="SAR", color=color.red, style=plot.style_cross)
plot(emaFast, title="EMA Rápida", color=color.blue)
bgcolor(longCondition ? color.new(color.green, 90) : shortCondition ? color.new(color.red, 90) : na)