Estrategia adaptativa de seguimiento de tendencias basada en regresión de kernel y bandas dinámicas ATR

NW ATR ROC MA
Fecha de creación: 2025-02-18 15:33:21 Última modificación: 2025-02-18 15:33:21
Copiar: 0 Número de Visitas: 400
1
Seguir
1617
Seguidores

Estrategia adaptativa de seguimiento de tendencias basada en regresión de kernel y bandas dinámicas ATR

Descripción general

La estrategia es un sistema de seguimiento de tendencias adaptativo que combina la regresión nuclear de Nadaraya-Watson y la banda dinámica de ATR. Previene las tendencias de precios a través de una función de núcleo binario racional y utiliza el soporte y la resistencia dinámicos basados en ATR para identificar oportunidades de negociación. El sistema permite una modelación precisa del mercado a través de ventanas de regresión y parámetros de peso configurables.

Principio de estrategia

El núcleo central de la estrategia es la regresión de núcleos no paramétricos basada en el método de Nadaraya-Watson, que utiliza funciones de núcleos binarios lógicos para suavizar la secuencia de precios. La regresión comienza a calcularse desde la barra inicial establecida, controlando el grado de ajuste a través de los dos parámetros clave de la ventana de regresión (h) y el peso relativo ® a través de la ventana de regresión (h) y el peso relativo ® a través de la ventana de regresión (h).

Ventajas estratégicas

  1. El método de regresión nuclear tiene una buena base matemática para capturar de manera efectiva las tendencias de precios sin exceso de ajuste
  2. Las bandas de onda dinámica se ajustan a la volatilidad del mercado para proporcionar un soporte más razonable y resistente
  3. Los parámetros son altamente configurables y se pueden ajustar de manera flexible a las diferentes características del mercado
  4. El mecanismo de identificación de tendencias es flexible y puede elegir entre un modo suave o sensible.
  5. La visualización es intuitiva y las señales de transacción son claras.

Riesgo estratégico

  1. La selección incorrecta de los parámetros puede causar exceso de ajuste o retraso
  2. Se podrían generar demasiadas señales de negociación en mercados convulsionados
  3. La configuración inadecuada de los multiplicadores de ATR puede causar pérdidas demasiado amplias o demasiado estrechas
  4. Las señales falsas pueden aparecer durante el período de cambio de tendencia Se recomienda la optimización de los parámetros a través de la retroalimentación histórica y la combinación de otros indicadores como confirmación auxiliar.

Dirección de optimización de la estrategia

  1. Introducción de indicadores de volumen de negocios como confirmación de tendencias
  2. Desarrollo de mecanismos de optimización de parámetros de adaptación
  3. Aumento de la intensidad de la tendencia, filtros para disminuir las señales falsas de los mercados de oscilación
  4. Optimización del mecanismo de detención de pérdidas para mejorar la rentabilidad
  5. Considere la inclusión de clasificaciones de entornos de mercado, con diferentes parámetros en diferentes mercados

Resumir

La estrategia combina métodos de aprendizaje estadístico con análisis técnico para construir un sistema de negociación con una sólida base teórica y práctica. Sus características de adaptabilidad y configurabilidad lo permiten adaptarse a diferentes entornos de mercado, pero su uso requiere atención a la optimización de parámetros y control de riesgos.

Código Fuente de la Estrategia
/*backtest
start: 2025-01-18 00:00:00
end: 2025-02-17 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Lupown

//@version=5
strategy("Nadaraya-Watson non repainting Strategy", overlay=true)  // PARAMETER timeframe ODSTRÁNENÝ

//--------------------------------------------------------------------------------
// INPUTS
//--------------------------------------------------------------------------------
src = input.source(close, 'Source')
h   = input.float(8., 'Lookback Window', minval=3., tooltip='The number of bars used for the estimation. This is a sliding value that represents the most recent historical bars. Recommended range: 3-50')
r   = input.float(8., 'Relative Weighting', step=0.25, tooltip='Relative weighting of time frames. As this value approaches zero, the longer time frames will exert more influence on the estimation. As this value approaches infinity, the behavior of the Rational Quadratic Kernel will become identical to the Gaussian kernel. Recommended range: 0.25-25')
x_0 = input.int(25, "Start Regression at Bar", tooltip='Bar index on which to start regression. The first bars of a chart are often highly volatile, and omission of these initial bars often leads to a better overall fit. Recommended range: 5-25')
showMiddle    = input.bool(true, "Show middle band")
smoothColors  = input.bool(false, "Smooth Colors", tooltip="Uses a crossover based mechanism to determine colors. This often results in less color transitions overall.", inline='1', group='Colors')
lag           = input.int(2, "Lag", tooltip="Lag for crossover detection. Lower values result in earlier crossovers. Recommended range: 1-2", inline='1', group='Colors')

lenjeje = input.int(32, "ATR Period",    tooltip="Period to calculate upper and lower band", group='Bands')
coef    = input.float(2.7, "Multiplier", tooltip="Multiplier to calculate upper and lower band", group='Bands')

//--------------------------------------------------------------------------------
// ARRAYS & VARIABLES
//--------------------------------------------------------------------------------
float y1 = 0.0
float y2 = 0.0
srcArray = array.new<float>(0)
array.push(srcArray, src)
size = array.size(srcArray)

//--------------------------------------------------------------------------------
// KERNEL REGRESSION FUNCTIONS
//--------------------------------------------------------------------------------
kernel_regression1(_src, _size, _h) =>
    float _currentWeight = 0.
    float _cumulativeWeight = 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]

[currentWeight1, cumulativeWeight1] = kernel_regression1(src, size, h)
yhat1 = currentWeight1 / cumulativeWeight1

[currentWeight2, cumulativeWeight2] = kernel_regression1(src, size, h - lag)
yhat2 = currentWeight2 / cumulativeWeight2

//--------------------------------------------------------------------------------
// TREND & COLOR DETECTION
//--------------------------------------------------------------------------------
// Rate-of-change-based
bool wasBearish   = yhat1[2] > yhat1[1]
bool wasBullish   = yhat1[2] < yhat1[1]
bool isBearish    = yhat1[1] > yhat1
bool isBullish    = yhat1[1] < yhat1
bool isBearishChg = isBearish  and wasBullish
bool isBullishChg = isBullish  and wasBearish

// Crossover-based (for "smooth" color changes)
bool isBullishCross  = ta.crossover(yhat2, yhat1)
bool isBearishCross  = ta.crossunder(yhat2, yhat1)
bool isBullishSmooth = yhat2 > yhat1
bool isBearishSmooth = yhat2 < yhat1

color c_bullish    = input.color(#3AFF17, 'Bullish Color', group='Colors')
color c_bearish    = input.color(#FD1707, 'Bearish Color', group='Colors')

color colorByCross = isBullishSmooth ? c_bullish : c_bearish
color colorByRate  = isBullish       ? c_bullish : c_bearish
color plotColor    = smoothColors ? colorByCross : colorByRate

// Middle Estimate
plot(showMiddle ? yhat1 : na, "Rational Quadratic Kernel Estimate", color=plotColor, linewidth=2)

//--------------------------------------------------------------------------------
// UPPER / LOWER BANDS
//--------------------------------------------------------------------------------
upperjeje = yhat1 + coef * ta.atr(lenjeje)
lowerjeje = yhat1 - coef * ta.atr(lenjeje)

plotUpper = plot(upperjeje, "Rational Quadratic Kernel Upper", color=color.rgb(0, 247, 8), linewidth=2)
plotLower = plot(lowerjeje, "Rational Quadratic Kernel Lower", color=color.rgb(255, 0, 0), linewidth=2)

//--------------------------------------------------------------------------------
// SYMBOLS & ALERTS
//--------------------------------------------------------------------------------
plotchar(ta.crossover(close, upperjeje),  char="🥀", location=location.abovebar, size=size.tiny)
plotchar(ta.crossunder(close, lowerjeje), char="🍀", location=location.belowbar, size=size.tiny)

// Alerts for Color Changes (estimator)
alertcondition(smoothColors ? isBearishCross : isBearishChg, title="Bearish Color Change", message="Nadaraya-Watson: {{ticker}} ({{interval}}) turned Bearish ▼")
alertcondition(smoothColors ? isBullishCross : isBullishChg, title="Bullish Color Change", message="Nadaraya-Watson: {{ticker}} ({{interval}}) turned Bullish ▲")

// Alerts when price crosses upper and lower band
alertcondition(ta.crossunder(close, lowerjeje), title="Price close under lower band", message="Nadaraya-Watson: {{ticker}} ({{interval}}) crossed under lower band 🍀")
alertcondition(ta.crossover(close, upperjeje),  title="Price close above upper band", message="Nadaraya-Watson: {{ticker}} ({{interval}}) Crossed above upper band 🥀")

//--------------------------------------------------------------------------------
// STRATEGY LOGIC (EXAMPLE)
//--------------------------------------------------------------------------------
if ta.crossunder(close, lowerjeje)
    // zatvoriť short
    strategy.close("Short")
    // otvoriť long
    strategy.entry("Long", strategy.long)

if ta.crossover(close, upperjeje)
    // zatvoriť long
    strategy.close("Long")
    // otvoriť short
    strategy.entry("Short", strategy.short)