モメンタム相関RSI戦略


作成日: 2023-10-07 15:47:42 最終変更日: 2023-10-07 15:47:42
コピー: 0 クリック数: 751
1
フォロー
1617
フォロワー

概要

この戦略の核心となる考え方は,RSIの平滑周期を動的にして,価格と動力の間の関連性に応じて自動的に調整することで,RSIの実用性を改善することです.

戦略原則

この戦略は,まず価格の動力を計算し,次に価格と動力の間の相関係数を計算する.相関係数が1に近づくと,価格と動力の高度に正の関係を示し,相関係数が1に近づくと,価格と動力の高度が負の関係を示している.

価格と動力の関連性に応じて,RSI指標の平滑周期の長さを調整することができます.関連性が高いときは,より短いRSI周期を使用します.関連性が低い場合は,より長いRSI周期を使用します.

具体的には,この戦略は,RSI周期長さを20-50という範囲に設定しています. 価格と動力の関連系数を計算した後,RSIの最終的な平滑周期長さを20-50という範囲に,線形マッピングの方法によって,関連する系数をマッピングします.

これにより,市場の状況に応じてRSI指標のパラメータを自動的に調整することができ,価格の変化と動力の変化が強く関連している場合,より短いRSIを使用し,より敏感にすることができます.関連性が弱い場合,より長いRSIを使用し,シグナルに対するノイズの影響を減らすことができます.

優位分析

  • 市場の変化に対応する動的調整パラメータ
  • 固定周期指標の使用の限界を回避する
  • 滑り回路の自動最適化,最適パラメータの選択は不要
  • RSI周期の設定範囲は,異なる品種に適用されます

リスク分析

  • 関連性計算自体が遅滞をもたらし,価格の転換点を逃す可能性があります.
  • 価格と動力の関連性だけを重視し,他の要素を無視する
  • 標準のRSI周期範囲は,すべての品種に適合しない可能性があり,最適化が必要です.
  • 変動率などの他の要因と組み合わせてRSIサイクルを調整することも考慮できます.

最適化の方向

  • 異なるRelated性計算方法を試して,遅延を減らす
  • 関連性のみに頼るのではなく,RSIサイクルを決定する要素をさらに導入することを検討してください.
  • 各種を回測し,最適のデフォルトのRSI周期範囲を見つけます.
  • 完全な線形マッピングではなく,関連性因子重量を設定できます.
  • 特定の市場環境で不適切なRSIサイクルを使用しないようにフィルター条件を追加

要約する

この戦略は,RSIの平滑周期を動的に調整する考え方を学ぶ価値がありますが,具体的には改善の余地があります.重要なことは,RSIのパラメータ選択に影響を及ぼす決定的な要因を見つけ,それを量化可能な指標に変換することです.同時に,モデルを完全に依存しないことと,経験とフィットバックに基づいてパラメータの範囲を最適化する必要もあります.全体的に,これは非常に革新的な考えであり,継続的な最適化と改善後に実用化の可能性があります.

ストラテジーソースコード
/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
strategy("Dynamic RSI Momentum", "DRM Strategy", process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50 )

// +++++++++++++++++++++
// ++      INPUT      ++ 
// +++++++++++++++++++++

// Momentum
len = input.int(10, "Momentum Length", 1,      group = "Dynamic RSI Momentum")
src = input.source(close, "Source",   group = "Dynamic RSI Momentum")

min_rsi = input.int(20, "Min RSI", group = "Dynamic RSI Momentum")
max_rsi = input.int(50, "Max RSI", group = "Dynamic RSI Momentum")

upLvl = input.float(70, "OverBought", 0, 100, group = "Dynamic RSI Momentum")
dnLvl = input.float(30, "OverSold",   0, 100, group = "Dynamic RSI Momentum")

// +++++++++++++++++++++
// ++   CALCULATION   ++ 
// +++++++++++++++++++++

// RMA Function
rmaFun(src, len) =>
    sma   = ta.sma(src, len) 
	alpha = 1/len
	sum   = 0.0
	sum  := na(sum[1]) ? sma : alpha * src + (1 - alpha) * nz(sum[1])

// RSI Function 
rsiFun(src, len) =>     
    100 - 100 / (1 + rmaFun(src - src[1] > 0 ? src - src[1] : 0, len) / 
                     rmaFun(src[1] - src > 0 ? src[1] - src : 0, len))

// Momentum
momVal = src - src[len]

// Calculation Price vs Momentum
corr  = ta.correlation(src, momVal, len)
corr := corr > 1 or corr < -1 ? float(na) : corr

rsiLen = 0
rsiLen := int(min_rsi + nz(math.round((1 - corr) * (max_rsi-min_rsi) / 2, 0), 0))

rsiMom = rsiFun(src, rsiLen)


// +++++++++++++++++++++
// ++    STRATEGY     ++ 
// +++++++++++++++++++++

long  = ta.crossover(rsiMom, dnLvl)
short = ta.crossunder(rsiMom, upLvl) 


// +++> Long <+++++
if long and not na(rsiMom)
    strategy.entry("Long", strategy.long)

// +++> Short <+++++
if short and not na(rsiMom)
    strategy.entry("Short", strategy.short)

// +++++++++++++++++++++
// ++      PLOT       ++ 
// +++++++++++++++++++++

plot(rsiMom, "Dynamic RSI Momentum", rsiMom < dnLvl ? color.green : rsiMom > upLvl ? color.red : color.yellow)

hline(50, "Mid Line", color.gray)

upperLine = hline(upLvl, "Upper Line", color.gray)
lowerLine = hline(dnLvl, "Lower Line", color.gray)
fill(upperLine, lowerLine, color.new(color.purple, 90), "Background Fill")