나다라야-왓슨 회귀와 ATR 통로에 기반한 트렌드 추적 전략

저자:차오장, 날짜: 2024-02-22 15:15:03
태그:

基于Nadaraya-Watson回归和ATR通道的趋势跟踪策略

개요

이 전략은 추세 추적 전략으로, 나다라야-왓슨 회귀와 ATR 통로를 결합하여 추세 방향과 입구점을 식별한다. 가격이 하향선을 돌파할 때 더 많이 하고, 가격이 하향선을 돌파할 때 평형한다. 동시에 스톱 손실 메커니즘을 설정한다.

전략적 원칙

우선, 이 전략은 나다라야-왓슨 핵 회귀를 사용하여 두 개의 다른 지연의 회귀 곡선을 계산하고 두 회귀 곡선의 교차점을 비교하여 경향 방향을 판단합니다. 구체적으로, h-단계와 h-단계의 회귀 곡선을 각각 계산하여, h-단계 곡선이 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)

더 많은 내용