ナダラヤ・ワトソン回帰とATRチャンネルに基づく戦略の傾向

作者: リン・ハーンチャオチャン,日付: 2024-02-22 15:15:03
タグ:

img

概要

この戦略は,トレンド方向とエントリーポイントを特定するために,ナダライア=ワトソン回帰とATRチャネルを組み合わせるトレンドフォロー戦略である.価格が下のレールを突破するとロングになり,価格が上部のレールを突破するとポジションを閉じる.ストップ・ロストメカニズムも設定されている.

戦略の論理

まず,この戦略は,異なる遅延を持つ2つの回帰曲線を計算するために,ナダライア=ワトソン・カーネル回帰を用いて,トレンド方向を決定するために,2つの曲線のクロスオーバーを比較する.具体的には,それぞれh-期とh-遅延期の回帰曲線を計算する.h-期回帰曲線がh-期回帰曲線を横切ると,長い信号を示します.h-期回帰曲線がh-期回帰曲線を下回ると,短い信号を示します.

第二に,この戦略はエントリーポイントを決定するためにATRチャネルを使用する.上列は回帰曲線プラスn期ATR倍数で,下列は回帰曲線マイナスn期ATR倍数である.価格は下列を突破すると長になり,価格が上列を突破すると短くなります.

最後に,ストップ・ロスのメカニズムが設定されます.価格がストップ・ロスの連続バーのエントリー価格を下回る場合は,ストップ・ロスはポジションを閉じる.

利点分析

この戦略は回帰分析とチャネルブレークスルーを組み合わせ,傾向の方向性と勢いを比較的正確に把握することができる.傾向を特定するために移動平均のような単一の指標を使用すると比較して,この方法は誤った信号を削減し,したがって戦略の安定性を向上させる.

さらに,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)

もっと