Estrategia de filtrado de volatilidad adaptativa basada en el impulso de múltiples períodos

momentum volatility SMA ATR stdev SPX
Fecha de creación: 2025-02-24 09:38:10 Última modificación: 2025-02-24 09:38:10
Copiar: 0 Número de Visitas: 345
2
Seguir
319
Seguidores

Estrategia de filtrado de volatilidad adaptativa basada en el impulso de múltiples períodos Estrategia de filtrado de volatilidad adaptativa basada en el impulso de múltiples períodos

Descripción general

La estrategia es un sistema de negociación avanzado basado en indicadores de dinámica multicíclica y filtración de la volatilidad. Construye un sistema de calificación de dinámica integral mediante el cálculo de la movilidad de los precios en cuatro períodos de tiempo de 3 meses, 6 meses, 9 meses y 12 meses. Al mismo tiempo, la estrategia introduce un mecanismo de filtración de la volatilidad anual para controlar el riesgo de negociación mediante la configuración de un valor mínimo de la volatilidad.

Principio de estrategia

La lógica central de la estrategia incluye los siguientes elementos clave:

  1. Calculación de la dinámica: el método de cálculo de la dinámica de los 4 períodos de tiempo se utiliza para calcular el precio actual / precio histórico -1.
  2. Filtración de la tasa de fluctuación: se calcula la diferencia estándar de la tasa de ganancia diaria y se procesa anualmente, mediante su comparación con el umbral predeterminado ((0.5)), para filtrar la tasa de fluctuación alta durante el período.
  3. Generación de señales: se produce una señal múltiple cuando el indicador de movimiento integral se corrige por un giro negativo y la tasa de fluctuación está por debajo del umbral; cuando el indicador de movimiento se estabiliza cuando se vuelve negativo.
  4. Gestión de riesgos: El riesgo de una sola operación se controla con un stop loss del 1% y un stop loss del 50%.

Ventajas estratégicas

  1. Análisis multidimensional de la dinámica: permite evaluar de manera más integral la intensidad y la persistencia de las tendencias de precios al considerar de manera integral la dinámica de varios períodos de tiempo.
  2. Filtración de frecuencia de oscilación adaptativa: Evita las falsas señales durante las altas oscilaciones mediante el cálculo dinámico y la filtración de la frecuencia de oscilación.
  3. Control de riesgo: Se establecen límites de pérdidas y límites de pérdidas para controlar el riesgo de una sola transacción.
  4. Decisiones sistematizadas: Las estrategias están completamente sistematizadas, evitando la interferencia de los juicios subjetivos.

Riesgo estratégico

  1. Riesgo de reversión de la tendencia: puede sufrir grandes pérdidas en caso de una reversión repentina de una tendencia fuerte.
  2. Sensibilidad de parámetros: los efectos de la estrategia son sensibles a la configuración de parámetros como el ciclo de potencia, el umbral de fluctuación.
  3. Dependencia del entorno del mercado: En un mercado convulso, pueden producirse frecuentes falsas señales.
  4. Efectos de los puntos de deslizamiento: los costos de las transacciones pueden ser más altos cuando el mercado no es tan líquido.

Dirección de optimización de la estrategia

  1. Optimización de parámetros dinámicos: Se puede introducir un mecanismo de ajuste de parámetros adaptativos para ajustar los ciclos de potencia y los valores mínimos de la tasa de fluctuación según la situación dinámica del mercado.
  2. Clasificación de estados de mercado: agregar un módulo de identificación de estados de mercado, con diferentes configuraciones de parámetros en diferentes entornos de mercado.
  3. Mecanismo de confirmación de señales: introducción de indicadores técnicos adicionales para confirmar las señales de negociación y mejorar la estabilidad de la estrategia.
  4. Optimización de la gestión de fondos: se puede ajustar la escala de la tenencia de acuerdo con la dinámica de la intensidad de la señal, para lograr una mejor eficiencia en el uso de fondos.

Resumir

La estrategia, combinada con análisis de la dinámica de varios períodos y filtración de la volatilidad, construye un sistema de comercio de seguimiento de tendencias completo. Su principal ventaja reside en el proceso de toma de decisiones sistematizado y el mecanismo de control de riesgos perfectos. Aunque existen algunos riesgos inherentes, la estrategia aún tiene un gran espacio de mejora a través de la dirección de optimización propuesta.

Código Fuente de la Estrategia
/*backtest
start: 2024-02-25 00:00:00
end: 2025-02-22 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("GOATED Long-Only", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Strategy parameters
var float VOLATILITY_THRESHOLD = input.float(0.5, "Volatility Threshold", minval=0.1, maxval=1.0, step=0.1)
var int TRADING_DAYS_PER_YEAR = 252
var float SQRT_TRADING_DAYS = math.sqrt(TRADING_DAYS_PER_YEAR)

// Trade parameters
var float STOP_LOSS = input.float(0.05, "Stop Loss %", minval=0.01, maxval=0.20, step=0.01)
var float TAKE_PROFIT = input.float(0.15, "Take Profit %", minval=0.05, maxval=0.50, step=0.01)

// Momentum periods (in trading days)
var int MOMENTUM_3M = input.int(63, "3-Month Momentum Period", minval=20)
var int MOMENTUM_6M = input.int(126, "6-Month Momentum Period", minval=40)
var int MOMENTUM_9M = input.int(189, "9-Month Momentum Period", minval=60)
var int MOMENTUM_12M = input.int(252, "12-Month Momentum Period", minval=80)

// Function to calculate momentum for a specific period
momentum(period) =>
    close / close[period] - 1

// Function to calculate annualized volatility
calcVolatility() =>
    returns = ta.change(close) / close[1]
    stdDev = ta.stdev(returns, TRADING_DAYS_PER_YEAR)
    annualizedVol = stdDev * SQRT_TRADING_DAYS
    annualizedVol

// Calculate individual momentum scores
float mom3m = momentum(MOMENTUM_3M)
float mom6m = momentum(MOMENTUM_6M)
float mom9m = momentum(MOMENTUM_9M)
float mom12m = momentum(MOMENTUM_12M)

// Calculate average momentum score
var int validPeriods = 0
var float totalMomentum = 0.0

validPeriods := 0
totalMomentum := 0.0

if not na(mom3m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom3m

if not na(mom6m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom6m

if not na(mom9m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom9m

if not na(mom12m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom12m

float compositeMomentum = validPeriods > 0 ? totalMomentum / validPeriods : na

// Calculate volatility
float annualizedVolatility = calcVolatility()

// Generate trading signals
var float MOMENTUM_THRESHOLD = input.float(0.0, "Momentum Threshold", minval=-1.0, maxval=1.0, step=0.01)
bool validVolatility = not na(annualizedVolatility) and annualizedVolatility <= VOLATILITY_THRESHOLD
bool validMomentum = not na(compositeMomentum) and compositeMomentum > MOMENTUM_THRESHOLD

// Store previous momentum state
bool prevValidMomentum = nz(validMomentum[1])

// Entry and exit conditions
bool longCondition = validVolatility and validMomentum and not prevValidMomentum
bool exitLongCondition = validVolatility and (not validMomentum) and prevValidMomentum

// Plot signals
plotshape(longCondition, title="Long Entry", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(exitLongCondition, title="Long Exit", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot momentum and volatility indicators
plot(compositeMomentum, "Composite Momentum", color=color.blue, linewidth=2)
hline(MOMENTUM_THRESHOLD, "Momentum Threshold", color=color.gray, linestyle=hline.style_dashed)

plot(annualizedVolatility, "Annualized Volatility", color=color.purple, linewidth=1)
hline(VOLATILITY_THRESHOLD, "Volatility Threshold", color=color.gray, linestyle=hline.style_dashed)

// Strategy execution - Long positions
if (longCondition)
    strategy.entry("Long", strategy.long)
    
if (strategy.position_size > 0)
    float longStopLoss = strategy.position_avg_price * (1 - STOP_LOSS)
    float longTakeProfit = strategy.position_avg_price * (1 + TAKE_PROFIT)
    strategy.exit("Exit Long", "Long", stop=longStopLoss, limit=longTakeProfit)
    if (exitLongCondition)
        strategy.close("Long", comment="Signal Exit")