3. 2. 2025

5 0

CUSUM

Indicador CUSUM en StrategyQuant

En la entrada de hoy, vamos a echar un vistazo más de cerca a una implementación personalizada del indicador CUSUM (suma acumulada). Utilizada a menudo en el control de procesos estadísticos, la técnica CUSUM ayuda a detectar pequeños cambios en el nivel medio de una serie. Esta implementación concreta está diseñada para su integración en StrategyQuant, ofreciendo a los operadores una forma dinámica de controlar los cambios del mercado y reaccionar ante ellos.

¿Qué es CUSUM?

CUSUM es una técnica de análisis secuencial que acumula las desviaciones de un valor objetivo a lo largo del tiempo. Al comparar la suma acumulada con los umbrales definidos, resulta más fácil detectar incluso los cambios más sutiles en el comportamiento de los precios. En nuestra aplicación, dos acumuladores distintos -uno para los movimientos al alza (CUSUM Positivo) y otro para los movimientos a la baja (CUSUM Negativo)- señalan cuándo el cambio en la serie de precios subyacente es significativo.

Guía de códigos

El indicador se define como una clase Java que extiende

IndicatorBlock

garantizando una integración perfecta con el ecosistema de StrategyQuant. Vamos a desglosar los componentes clave:

Parámetros y entradas

  • Datos del gráfico: El indicador utiliza un gráfico (normalmente el precio de cierre) como fuente de datos.
  • Punto: Determina el tamaño de la ventana sobre la que se calculan la media móvil y la desviación típica. Esto es crucial, ya que define la sensibilidad del indicador.
  • Umbral (k): Establece el umbral de detección. Un umbral más alto significa que el indicador se vuelve menos sensible, reduciendo las señales falsas.
  • Deriva (μ): Tiene en cuenta la deriva prevista en el proceso, lo que permite detectar cambios menores pero persistentes.

@Parámetro(defaultChartIndex=0)
public ChartData Gráfico;

@Parameter(category="Por defecto", name="Periodo", minValue=1, maxValue=10000, defaultValue="20", step=1)
public int Periodo;

@Parameter(category="Por defecto", name="Umbral", minValue=0.1, maxValue=100, defaultValue="2", step=0.1)
@Help("Umbral de detección (k) - los valores más altos hacen que el indicador sea menos sensible")
public double Umbral;

@Parameter(category="Por defecto", name="Deriva", minValue=0, maxValue=10, defaultValue="0.5", step=0.1)
@Help("Deriva esperada en el proceso (mu) - ayuda a detectar cambios persistentes más pequeños")
public double Deriva;

Cálculo de estadísticas móviles

Para cada nueva barra (o punto temporal), el código calcula la media móvil y la desviación típica a lo largo del periodo definido. Estas estadísticas sirven de referencia para normalizar los datos de precios actuales.

double suma = 0;
double sumaCuadrados = 0;

for (int i = 0; i < Periodo; i++) {
double precio = Gráfico.Cerrar(i);
suma += precio;
sumaCuadrados += precio * precio;
}

double media = suma / Periodo;
double varianza = (sumaCuadrados - (suma * suma / Periodo)) / (Periodo - 1);
double stdDev = Math.sqrt(varianza);

// Evitar la división por cero
if (stdDev == 0) {
stdDev = 1;
}

 

Normalización y cálculo CUSUM

El precio actual se estandariza restando la media y dividiendo por la desviación típica. El valor normalizado se utiliza entonces para actualizar los acumuladores CUSUM:

  • CUSUM Positivo: Acumula desviaciones positivas.
  • CUSUM Negativo: Acumula desviaciones negativas.

Cada actualización resta tanto la deriva como el umbral, garantizando que sólo las desviaciones significativas contribuyan a la suma acumulada.

// Obtener el valor normalizado actual
double currentValue = (Chart.Close(0) - mean) / stdDev;

// Calcular valores CUSUM
double prevCusumPos = getCurrentBar() > Period ? CusumPos.get(1) : 0;
double prevCusumNeg = getCurrentBar() > Period ? CusumNeg.get(1) : 0;

// CUSUM superior
CusumPos.set(0, Math.max(0, prevCusumPos + currentValue - Deriva - Umbral));

// CUSUM inferior
CusumNeg.set(0, Math.max(0, prevCusumNeg - currentValue - Drift - Threshold));

 

Casos extremos

Un detalle importante es la comprobación de la desviación típica. Cuando los datos de precios son demasiado coherentes (lo que da lugar a una desviación típica de cero), el código la restablece a 1. Esta salvaguarda evita errores de división y mantiene la solidez del indicador en condiciones de baja volatilidad.

Unirlo todo

Este indicador CUSUM es una potente herramienta para los operadores que buscan captar cambios sutiles pero sostenidos en la acción de los precios. Al ajustarse dinámicamente a los datos recientes del mercado (mediante estadísticas continuas) y tener en cuenta el ruido a través de los parámetros de umbral y deriva, el indicador ofrece un enfoque equilibrado para la generación de señales.

Si está interesado en incorporar este indicador a sus estrategias de negociación, el código está estructurado para que sea adaptable y fácil de integrar en el entorno StrategyQuant.

 

 

0 Comentarios
Más antiguo
Más reciente Más votados