この戦略の主な考え方は,RSI指標の平滑期を動的にして,価格とインパクトの相関に基づいて自動的に調整し,RSI指標の有用性を向上させることである.
戦略は,まず価格の勢いを計算し,その後価格と勢いの間の相関係数を計算する.相関係数が1に近い場合,価格と勢いが非常に肯定的に相関していることを意味します.相関係数が-1に近い場合,価格と勢いが非常に否定的に相関していることを意味します.
価格とモメントの相関に基づいて,RSIインジケーターのスムージング期間を調整することができる.相関が高いときは,より短いRSI期間を使用.相関が低い場合は,より長いRSI期間を使用.
具体的には,この戦略では,RSI期間範囲をデフォルトで20-50に設定します.価格とモメント間の相関係数を計算した後,線形マッピングを使用して,相関係数を最終RSIスムーズ化期間として20-50範囲にマッピングします.
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")