나다라야-왓슨 회귀와 ATR 채널에 기초한 전략을 따르는 경향

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

img

전반적인 설명

이 전략은 트렌드 방향과 진입 지점을 식별하기 위해 나다라야-왓슨 회귀와 ATR 채널을 결합한 트렌드 다음 전략입니다. 가격이 하부 레일을 깨고 가격이 상부 레일을 깨면 포지션을 닫습니다. 또한 스톱 로스 메커니즘이 설정됩니다.

전략 논리

우선, 이 전략은 나다라야-왓슨 커널 회귀를 사용하여 다른 지연과 함께 두 회귀 곡선을 계산하고, 추세 방향을 결정하기 위해 두 곡선의 교차를 비교합니다. 구체적으로, 각각 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)

더 많은