ナダラヤ・ワトソン回帰とATRチャネルに基づくトレンドフォロー戦略


作成日: 2024-02-22 15:15:03 最終変更日: 2024-02-22 15:15:03
コピー: 1 クリック数: 962
1
フォロー
1617
フォロワー

ナダラヤ・ワトソン回帰とATRチャネルに基づくトレンドフォロー戦略

概要

この戦略は,Nadaraya-Watson回帰とATR通路を組み合わせたトレンド追跡戦略で,トレンドの方向とエントリーポイントを識別します. 価格が下位軌道に突入すると,多額の取引をします. 価格が上位軌道に突入すると,平仓します. 同時に,ストップ・損失の仕組みを設定します.

戦略原則

まず,この策略は,Nadaraya-Watson核回帰を使用して,2つの異なる遅延期の回帰曲線を計算し,その後,2つの回帰曲線の交差を比較してトレンド方向を判断する.具体的には,h期およびh-lag期の回帰曲線をそれぞれ計算し,h期曲線をh期曲線上を通過すると看板と判断する.h期曲線下を通過すると看板と判断する.

次に,この戦略はATR通路を使用して入場点を決定する。上線は回帰曲線にn期ATRの倍数加え,下線は回帰曲線にn期ATRの倍数減る。価格が上線を突破すると空を見,入場し,下線を突破すると多見,入場する。

最後に,ストップ・ロスの仕組みを設定します. 価格が連続的にストップ・ロス・バーズ根K線を下回ると,ストップ・ロスは終了します.

戦略的優位分析

この戦略は,回帰分析とチャネルブレイクスルーを組み合わせて,市場トレンドの方向と強さをより正確に把握できます.移動平均線などの指標を単独で使用するよりも,この方法は,偽信号を減少させ,戦略の安定性を高めます.

さらに,ATR通路は合理的なエントリーポイントを設定し,トレンドの逆転点の近くで誤ったエントリーを避ける. 止損機構は,単一の損失を効果的に制御する.

この戦略は,トレンドを識別する能力が強く,出場比率は正確で,単一のストップ・ロスのリスクは制御可能である.

リスク分析

この策略の最大のリスクは,ATR通路を突破すると,価格が反転または調整をすることになり,不適格な入場または入場後すぐに終了することになります.

さらに,回帰曲線とATR通路は,一定のパラメータ最適化が必要である.パラメータが正しく設定されていなければ,回帰分析の効果が悪く,またはATR幅が大きすぎて小さすぎると,戦略の効果に影響する.

最適化の方向

戦略の安定性と正確性を高めるために,VOLUME,MACDなどの他の指標と組み合わせてトレンド判断と反転信号を考慮することができます.

帰帰分析の核関数も,エパネチニコフ核などの考慮で,よりよい適合効果が得られるかどうかを見るために調整することができる.

ATRチャネルのATR周期と倍数は,また,最適なパラメータの組み合わせを見つけるために,繰り返しテストを最適化する必要があります.

要約する

この戦略は,回帰分析とチャネルブレイク方法の総合的な適用により,トレンドの方向と強さを識別し,合理的なポイントで入場し,ストップを設定し,安定したトレンド追跡戦略を実現します. 副戦略の最適化スペースは大きく,さらなるテスト改善に値します.

ストラテジーソースコード
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Custom Strategy with Stop Loss and EMA", overlay=true)

src = input(close, title='Source')
h = input(10, title='Lookback Window', tooltip='The number of bars used for the estimation.')
r = input(10, title='Relative Weighting', tooltip='Relative weighting of time frames.')
x_0 = input(50, title='Start Regression at Bar',  tooltip='Bar index on which to start regression.')
lag = input(2, title='Lag', tooltip='Lag for crossover detection.')
stopLossBars = input(3, title='Stop Loss Bars', tooltip='Number of bars to check for stop loss condition.')
emaPeriod = input(46, title='EMA Period',  tooltip='Period for Exponential Moving Averages.')

lenjeje = input(32, title='ATR Period', tooltip='Period to calculate upper and lower band')
coef = input(2.7, title='Multiplier', tooltip='Multiplier to calculate upper and lower band')

// Function for Nadaraya-Watson Kernel Regression
kernel_regression1(_src, _size, _h) =>
    _currentWeight = 0.0
    _cumulativeWeight = 0.0
    for i = 0 to _size + x_0
        y = _src[i] 
        w = math.pow(1 + (math.pow(i, 2) / ((math.pow(_h, 2) * 2 * r))), -r)
        _currentWeight += y * w
        _cumulativeWeight += w
    [_currentWeight, _cumulativeWeight]

// Calculate Nadaraya-Watson Regression
[currentWeight1, cumulativeWeight1] = kernel_regression1(src, h, h)
yhat1 = currentWeight1 / cumulativeWeight1
[currentWeight2, cumulativeWeight2] = kernel_regression1(src, h-lag, h-lag)
yhat2 = currentWeight2 / cumulativeWeight2

// Calculate Upper and Lower Bands
upperjeje = yhat1 + coef * ta.atr(lenjeje)
lowerjeje = yhat1 - coef * ta.atr(lenjeje)

// Plot Upper and Lower Bands
plot(upperjeje, color=color.rgb(0, 247, 8), title="Upper Band", linewidth=2)
plot(lowerjeje, color=color.rgb(255, 0, 0), title="Lower Band", linewidth=2)

// Calculate EMAs
emaLow = ta.ema(low, emaPeriod)
emaHigh = ta.ema(high, emaPeriod)

// Plot EMAs
plot(emaLow, color=color.rgb(33, 149, 243, 47), title="EMA (Low)", linewidth=2)
plot(emaHigh, color=color.rgb(255, 153, 0, 45), title="EMA (High)", linewidth=2)

// Long Entry Condition
longCondition = low < lowerjeje
strategy.entry("Long", strategy.long, when=longCondition)

// Stop Loss Condition
stopLossCondition = close[1] < strategy.position_avg_price and close[2] < strategy.position_avg_price and close[3] < strategy.position_avg_price
strategy.close("Long", when=stopLossCondition)

// Close and Reverse (Short) Condition
shortCondition = high > upperjeje
strategy.close("Long", when=shortCondition)
strategy.entry("Short", strategy.short, when=shortCondition)