マルチコア回帰ダイナミックリアクタートレンド追従戦略

ATR SMA RSI DR MKR TP SL TS
作成日: 2025-02-24 09:22:48 最終変更日: 2025-07-21 13:03:01
コピー: 1 クリック数: 313
2
フォロー
319
フォロワー

マルチコア回帰ダイナミックリアクタートレンド追従戦略 マルチコア回帰ダイナミックリアクタートレンド追従戦略

概要

この戦略は,ダイナミックリアクターとマルチカーネル回帰を組み合わせたトレンド追跡システムである.ATRチャネル,SMA均等,高士核回帰とエパネチニコフ核回帰を融合させることで市場トレンドを捉え,RSI指標を使用して信号フィルタリングを行う.この戦略には,ダイナミックストップ損失,多重利益目標,ストップ損失追跡などの完全なポジション管理システムが含まれている.

戦略原則

戦略の核心は2つの主要な部分で構成されている.第一部はダイナミックリアクタ (DR) で,ATRとSMAをベースに自己適応価格チャネルを構築している.チャネルの幅はATRの倍数によって決定され,チャネルの位置はSMAの動きに合わせて調整されている.価格がチャネルを突破すると,システムはトレンド方向を更新する.第二部はマルチコア回帰 (MKR) で,高斯核回帰とエパネチニコフ核回帰の2つの異なる核関数を組み合わせている.異なる帯域幅パラメータと重みを設定することにより,システムは価格動きによりよく適合することができる.取引信号はMKRラインとDRラインの交差で生成され,RSI指標によってフィルターされ,買取・販売区域の取引を回避する.

戦略的優位性

  1. 適応性:ダイナミックリアクタと多核回帰の組み合わせにより,戦略は異なる市場環境と変動条件に自動的に適応できます.
  2. リスク管理の改善: ダイナミック・ストップ・ローズ,分期利益,トラッキング・ストップ・ローズなど,複数のリスク管理メカニズムを含む.
  3. 信号品質:RSIフィルタリングと2本の線の交差確認により,偽信号を効果的に減らすことができます.
  4. 計算効率が高い:複雑な核帰帰算法を使用しているものの,計算方法を最適化することで,戦略のリアルタイム性能を保証する.

戦略リスク

  1. パラメータ感性:戦略効果はATR倍数,核関数帯域などのパラメータの設定に大きく依存し,不適切なパラメータは過剰取引や機会を逃す可能性があります.
  2. 遅滞性: 移動平均と回帰アルゴリズムを使用しているため,急速な状況では一定の遅滞がある可能性があります.
  3. 市場適応性:戦略はトレンド市場ではうまく機能するが,区間振動市場では頻繁に偽信号を生じることがあります.
  4. 計算の複雑さ:多核回帰部分の計算はより複雑であり,高周波取引環境では性能最適化に注意が必要である.

戦略最適化の方向性

  1. パラメータの自適化:自適化メカニズムを導入し,市場の変動に応じてATR倍数とコア関数の帯域を動的に調整することができる.
  2. 信号の最適化: 取引量,価格形態などの補助指標を追加することを考慮し,信号の信頼性を向上させる.
  3. リスクコントロール:市場の変動率の動向に応じて,ストップ・ロスと利益の目標の比率を調整することができる.
  4. 市場フィルター:市場環境認識モジュールを追加し,異なる市場条件で異なる取引戦略を使用する.

要約する

これは,近代的な統計学的方法と伝統的な技術分析を融合した完全な取引システムである.この戦略は,ダイナミックリアクタとマルチコア回帰の革新的な組み合わせ,そして完善したリスク管理機構により,優れた適応性と安定性を示している.いくつかの最適化が必要な場所があるが,継続的な改善とパラメータ最適化によって,この戦略は,異なる市場環境で安定したパフォーマンスを維持することが期待されている.

ストラテジーソースコード
/*backtest
start: 2024-07-20 00:00:00
end: 2025-07-19 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":2000000}]
*/

//@version=5
strategy("DR+MKR Signals – Band SL, Multiple TP & Trailing Stop", overlay=true, default_qty_value=10)

// =====================================================================
// PART 1: Optimized Dynamic Reactor
// =====================================================================
atrLength  = input.int(10, "ATR Length", minval=1)         // Lower value for increased sensitivity
smaLength  = input.int(10, "SMA Length", minval=1)         // Lower value for a faster response
multiplier = input.float(1.2, "ATR Multiplier", minval=0.1, step=0.1) // Adjusted for tighter bands

atrValue  = ta.atr(atrLength)
smaValue  = ta.sma(close, smaLength)

basicUpper = smaValue + atrValue * multiplier
basicLower = smaValue - atrValue * multiplier

var float finalUpper = basicUpper
var float finalLower = basicLower
if bar_index > 0
    finalUpper := close[1] > finalUpper[1] ? math.max(basicUpper, finalUpper[1]) : basicUpper
if bar_index > 0
    finalLower := close[1] < finalLower[1] ? math.min(basicLower, finalLower[1]) : basicLower

var int trend = 1
if bar_index > 0
    trend := close > finalUpper[1] ? 1 : close < finalLower[1] ? -1 : nz(trend[1], 1)

drLine = trend == 1 ? finalLower : finalUpper
p_dr   = plot(drLine, color = trend == 1 ? color.green : color.red, title="Dynamic Reactor", linewidth=2)

// =====================================================================
// PART 2: Optimized Multi Kernel Regression
// =====================================================================
regLength = input.int(30, "Regression Period", minval=1)  // Lower value for increased sensitivity
h1        = input.float(5.0, "Gaussian Band (h1)", minval=0.1) // Adjusted for a better fit
h2        = input.float(5.0, "Epanechnikov Band (h2)", minval=0.1)
alpha     = input.float(0.5, "Gaussian Kernel Weight", minval=0, maxval=1)

f_gaussian_regression(bw) =>
    num = 0.0
    den = 0.0
    for i = 0 to regLength - 1
        weight = math.exp(-0.5 * math.pow(i / bw, 2))
        num += close[i] * weight
        den += weight
    num / (den == 0 ? 1 : den)

f_epanechnikov_regression(bw) =>
    num = 0.0
    den = 0.0
    for i = 0 to regLength - 1
        ratio = i / bw
        weight = math.abs(ratio) <= 1 ? (1 - math.pow(ratio, 2)) : 0
        num += close[i] * weight
        den += weight
    num / (den == 0 ? 1 : den)

regGauss = f_gaussian_regression(h1)
regEpan  = f_epanechnikov_regression(h2)
multiKernelRegression = alpha * regGauss + (1 - alpha) * regEpan
p_mkr = plot(multiKernelRegression, color = trend == 1 ? color.green : color.red, title="Multi Kernel Regression", linewidth=2)

fill(p_dr, p_mkr, color = trend == 1 ? color.new(color.green, 80) : color.new(color.red, 80), title="Trend Fill")

// =====================================================================
// PART 3: Buy and Sell Signals + RSI Filter
// =====================================================================
rsi = ta.rsi(close, 14)
buySignal  = ta.crossover(multiKernelRegression, drLine) and rsi < 70
sellSignal = ta.crossunder(multiKernelRegression, drLine) and rsi > 30

plotshape(buySignal, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny, title="Buy Signal")
plotshape(sellSignal, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, title="Sell Signal")

alertcondition(buySignal, title="Buy Alert", message="Buy Signal generated")
alertcondition(sellSignal, title="Sell Alert", message="Sell Signal generated")

// =====================================================================
// PART 4: Trade Management – Dynamic Stop Loss & Adaptive Take Profit
// =====================================================================
var float riskValue = na
if strategy.position_size == 0
    riskValue := na

enterLong() =>
    strategy.entry("Long", strategy.long,comment='开多仓')
    close - finalLower

enterShort() =>
    strategy.entry("Short", strategy.short,comment='开空仓')
    finalUpper - close

if (buySignal)
    riskValue := enterLong()

if (sellSignal)
    riskValue := enterShort()

exitLongOrders() =>
    entryPrice = strategy.position_avg_price
    TP1 = entryPrice + riskValue
    strategy.exit("Long_TP1", from_entry="Long", limit=TP1, qty_percent=50, comment="平多仓TP 1:1")
    strategy.exit("Long_TS", from_entry="Long", trail_offset=riskValue * 0.8, trail_points=riskValue * 0.8, comment="平多仓Trailing Stop")

if (strategy.position_size > 0)
    exitLongOrders()

exitShortOrders() =>
    entryPrice = strategy.position_avg_price
    TP1 = entryPrice - riskValue
    strategy.exit("Short_TP1", from_entry="Short", limit=TP1, qty_percent=50, comment="平空仓TP 1:1")
    strategy.exit("Short_TS", from_entry="Short", trail_offset=riskValue * 0.8, trail_points=riskValue * 0.8, comment="平空仓Trailing Stop")

if (strategy.position_size < 0)
    exitShortOrders()