Tendência Seguindo a Estratégia Baseada na Regressão Nadaraya-Watson e no Canal ATR

Autora:ChaoZhang, Data: 2024-02-22 15:15:03
Tags:

img

Resumo

Esta estratégia é uma estratégia de tendência que combina a regressão de Nadaraya-Watson e o canal ATR para identificar a direção da tendência e os pontos de entrada.

Estratégia lógica

Em primeiro lugar, esta estratégia usa a regressão do núcleo de Nadaraya-Watson para calcular duas curvas de regressão com lags diferentes, e compara o cruzamento das duas curvas para determinar a direção da tendência. Especificamente, calcula as curvas de regressão de período h e período h-lag, respectivamente. Quando a curva de período h-lag cruza a curva de período h, indica um sinal longo. Quando a curva de período h-lag cruza abaixo da curva de período h, indica um sinal curto.

Em segundo lugar, esta estratégia usa o canal ATR para determinar os pontos de entrada. O trilho superior é a curva de regressão mais o multiplicador ATR de n períodos e o trilho inferior é a curva de regressão menos o multiplicador ATR de n períodos.

Finalmente, um mecanismo de stop loss é definido. Se o preço permanecer abaixo do preço de entrada para barras consecutivas de stopLossBars, a posição será fechada por stop loss.

Análise das vantagens

Esta estratégia combina análise de regressão e ruptura de canal, o que pode capturar a direção da tendência e o impulso com relativa precisão.

Além disso, o canal ATR define pontos de entrada razoáveis, evitando entradas erradas em torno dos pontos de reversão da tendência.

Por conseguinte, esta estratégia tem vantagens como uma forte capacidade de identificação de tendências, entradas e saídas relativamente precisas, risco de perda de parada única controlado, etc.

Análise de riscos

O maior risco desta estratégia é que, quando o preço atravessa o canal ATR, ele pode estar apenas fazendo uma reversão ou consolidação, o que leva a uma entrada inadequada ou uma perda rápida de parada após a entrada.

Além disso, tanto as curvas de regressão quanto os canais ATR precisam de alguma otimização de parâmetros.

Orientações de otimização

Podemos considerar a combinação de outros indicadores para julgar tendências e sinais de reversão, tais como VOLUME, MACD etc. para melhorar a estabilidade e precisão da estratégia.

A função do núcleo na análise de regressão também pode ser ajustada, como tentar o núcleo de Epanechnikov, para ver se efeitos de melhor ajuste podem ser obtidos.

O período ATR e o multiplicador do canal ATR também necessitam de testes e otimização repetidos para encontrar a melhor combinação de parâmetros.

Resumo

Esta estratégia combina o uso da análise de regressão e da ruptura do canal para identificar a direção e a força da tendência, entra em pontos razoáveis e define stop loss, realizando assim uma tendência estável após a estratégia.


/*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)

Mais.