資源の読み込みに... 荷物...

ダイナミック・モメント・RSI戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月7日 15:47:42
タグ:

概要

この戦略の主な考え方は,RSI指標の平滑期を動的にして,価格とインパクトの相関に基づいて自動的に調整し,RSI指標の有用性を向上させることである.

戦略の論理

戦略は,まず価格の勢いを計算し,その後価格と勢いの間の相関係数を計算する.相関係数が1に近い場合,価格と勢いが非常に肯定的に相関していることを意味します.相関係数が-1に近い場合,価格と勢いが非常に否定的に相関していることを意味します.

価格とモメントの相関に基づいて,RSIインジケーターのスムージング期間を調整することができる.相関が高いときは,より短いRSI期間を使用.相関が低い場合は,より長いRSI期間を使用.

具体的には,この戦略では,RSI期間範囲をデフォルトで20-50に設定します.価格とモメント間の相関係数を計算した後,線形マッピングを使用して,相関係数を最終RSIスムーズ化期間として20-50範囲にマッピングします.

RSIのパラメータは,市場状況に基づいて自動的に調整される.価格の変化がモメント変化と強く相関している場合,より敏感になるため,短期間RSIを使用する.相関が弱い場合,信号へのノイズの影響を軽減するために,より長期間RSIを使用する.

利点分析

  • 動的パラメータ調整は市場変化に適応する
  • 固定期間の指標の制限を回避する
  • 滑らかな期間は自動的に最適化され,手動に最適なパラメータを選択する必要はありません
  • 異なる製品に対する設定可能なRSI期間範囲

リスク分析

  • コレレーション計算自体は遅延を導入し,価格のターニングポイントを見逃す可能性があります
  • 価格と勢力の相関性だけを考慮するのは 単純すぎ,他の要因を無視する
  • デフォルト RSI 期間範囲はすべての製品に適合しない可能性があります.最適化が必要です.
  • RSI 期間を調整するために変動などの他の要因を考慮してください.

オプティマイゼーションの方向性

  • 遅延を減らすために異なる相関計算方法を試す
  • 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")



もっと