Nadaraya-Watson 회귀 및 ATR 채널 기반 추세 추종 전략


생성 날짜: 2024-02-22 15:15:03 마지막으로 수정됨: 2024-02-22 15:15:03
복사: 1 클릭수: 962
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

Nadaraya-Watson 회귀 및 ATR 채널 기반 추세 추종 전략

개요

이 전략은 트렌드 추적 전략으로, Nadaraya-Watson 회귀와 ATR 통로를 결합하여 트렌드 방향과 진입 지점을 식별합니다. 가격이 하향 궤도를 돌파 할 때, 더 많이하십시오. 가격이 궤도를 돌파 할 때, 평소하십시오. 동시에 손실 제도를 설정합니다.

전략 원칙

우선, 이 전략은 나다라야-왓슨 핵 회귀를 사용하여 두 개의 서로 다른 지연기의 회귀 곡선을 계산하고, 두 회귀 곡선의 교차점을 비교하여 트렌드 방향을 판단한다. 구체적으로, 각각 h기 및 h-lag기 회귀 곡선을 계산하여, h기 곡선 위에 h기 곡선을 통과할 때 유리한 것으로 판단하고, h기 곡선 아래 h기 곡선을 통과할 때 유리한 것으로 판단한다.

둘째, 이 전략은 ATR 통로를 사용하여 입시점을 결정한다. n기 ATR의 곱을 더한 상반기 ATR의 곱을 회귀 곡선으로, n기 ATR의 곱을 빼한 하반기 ATR의 곱을 하반기 회귀 곡선으로 사용한다. 가격이 상반기를 돌파할 때 공을 보고 입시하고, 하반기를 돌파할 때 더 보고 입시한다.

마지막으로, 스톱로스 메커니즘을 설정한다. 가격이 연속적으로 stopLossBars 루트 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)