3. 2. 2025

5 0

CUSUM

Código CUSUM em StrategyQuant

Na postagem de hoje, daremos uma olhada mais de perto em uma implementação personalizada do indicador CUSUM (Cumulative Sum). Frequentemente usada no controle de processos estatísticos, a técnica CUSUM ajuda a detectar pequenas mudanças no nível médio de uma série. Essa implementação específica foi projetada para integração no StrategyQuant, oferecendo aos traders uma maneira dinâmica de monitorar e reagir às mudanças do mercado.

O que é a CUSUM?

A CUSUM é uma técnica de análise sequencial que acumula desvios de um valor-alvo ao longo do tempo. Ao comparar a soma acumulada com os limites definidos, fica mais fácil identificar até mesmo mudanças sutis no comportamento dos preços. Em nossa implementação, dois acumuladores separados - um para movimentos ascendentes (CUSUM Positive) e outro para movimentos descendentes (CUSUM Negative) - sinalizam quando a mudança na série de preços subjacente se torna significativa.

Passo a passo do código

O indicador é definido como uma classe Java que estende

IndicatorBlock

garantindo uma integração perfeita com o ecossistema do StrategyQuant. Vamos detalhar os principais componentes:

Parâmetros e entradas

  • Dados do gráfico: O indicador usa um gráfico (normalmente o preço de fechamento) como fonte de dados.
  • Período: Determina o tamanho da janela sobre a qual a média móvel e o desvio padrão são calculados. Isso é crucial, pois define a sensibilidade do indicador.
  • Limite (k): Define o limite de detecção. Um limite mais alto significa que o indicador se torna menos sensível, reduzindo os sinais falsos.
  • Desvio (μ): Leva em conta o desvio esperado no processo, permitindo a detecção de alterações menores, mas persistentes.

@Parameter(defaultChartIndex=0)
public ChartData Chart;

@Parameter(category="Default", name="Period", minValue=1, maxValue=10000, defaultValue="20", step=1)
public int Period;

@Parameter(category="Default", name="Threshold", minValue=0.1, maxValue=100, defaultValue="2", step=0.1)
@Help("Limite de detecção (k) - valores mais altos tornam o indicador menos sensível")
public double Threshold;

@Parameter(category="Default", name="Drift", minValue=0, maxValue=10, defaultValue="0.5", step=0.1)
@Help("Desvio esperado no processo (mu) - ajuda a detectar alterações persistentes menores")
public double Drift;

Cálculo de estatísticas de rolagem

Para cada nova barra (ou ponto de tempo), o código calcula a média móvel e o desvio padrão durante o período definido. Essas estatísticas servem como linha de base para padronizar os dados de preços atuais.

double sum = 0;
double sumSquares = 0;

for (int i = 0; i < Period; i++) {
double price = Chart.Close(i);
sum += price;
sumSquares += preço * preço;
}

double mean = sum / Period;
double variance = (sumSquares - (sum * sum / Period)) / (Period - 1);
double stdDev = Math.sqrt(variance);

// Evitar a divisão por zero
Se (stdDev == 0) {
stdDev = 1;
}

 

Padronização e cálculo de CUSUM

O preço atual é padronizado subtraindo-se a média e dividindo-se pelo desvio padrão. O valor padronizado é então usado para atualizar os acumuladores CUSUM:

  • CUSUM Positivo: Acumula desvios positivos.
  • CUSUM Negativo: Acumula desvios negativos.

Cada atualização subtrai tanto o desvio quanto o limite, garantindo que apenas os desvios significativos contribuam para a soma cumulativa.

// Obter o valor padronizado atual
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 - Drift - Threshold));

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

 

Tratamento de casos extremos

Um detalhe importante é a verificação do desvio padrão. Quando os dados de preço são muito consistentes (resultando em um desvio padrão de zero), o código o redefine para 1. Essa proteção evita erros de divisão e mantém o indicador robusto em condições de baixa volatilidade.

Reunindo tudo isso

Esse indicador CUSUM é uma ferramenta poderosa para os traders que buscam captar mudanças sutis, mas sustentadas, na ação do preço. Ajustando-se dinamicamente aos dados recentes do mercado (por meio de estatísticas contínuas) e levando em conta o ruído por meio dos parâmetros de limite e desvio, o indicador oferece uma abordagem equilibrada para a geração de sinais.

Se estiver interessado em incorporar esse indicador em suas estratégias de negociação, o código está estruturado para ser adaptável e fácil de integrar no ambiente StrategyQuant.

 

 

0 Comentários
mais antigos
mais recentes Mais votado