Deteta alterações subtis, mas contínuas, no comportamento dos preços através da análise de somas cumulativas. Acompanha desvios ascendentes e descendentes com limiares configuráveis para gerar sinais de negociação fiáveis.
Indicador CUSUM no StrategyQuant
No artigo de hoje, vamos analisar mais detalhadamente uma implementação personalizada do indicador CUSUM (Cumulative Sum). Frequentemente utilizada no controlo estatístico de processos, a técnica CUSUM ajuda a detetar pequenas mudanças no nível médio de uma série. Esta implementação em particular foi concebida para integração no StrategyQuant, oferecendo aos traders uma forma dinâmica de monitorizar e reagir às mudanças do mercado.
O que é o CUSUM?
O CUSUM é uma técnica de análise sequencial que acumula desvios em relação a um valor-alvo ao longo do tempo. Ao comparar a soma cumulativa com limites definidos, torna-se mais fácil identificar até mesmo mudanças sutis no comportamento dos preços. Em nossa implementação, dois acumuladores separados — um para movimentos de alta (CUSUM Positivo) e outro para movimentos de baixa (CUSUM Negativo) — 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 utiliza um gráfico (geralmente 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 é fundamental, pois define a sensibilidade do indicador.
- Limite (k): Define o limite de detecção. Um limite mais alto significa que o indicador fica menos sensível, reduzindo sinais falsos.
- Deriva (μ): Considera a deriva esperada no processo, permitindo a detecção de alterações menores, porém 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("Detection threshold (k) - higher values make the indicator less sensitive")
public double Threshold;
@Parameter(category="Default", name="Drift", minValue=0, maxValue=10, defaultValue="0.5", step=0.1)
@Help("Expected drift in the process (mu) - helps detect smaller persistent changes")
public double Drift;
Cálculo de Estatísticas Móveis
Para cada nova barra (ou ponto no tempo), o código calcula a média móvel e o desvio padrão ao longo do período definido. Essas estatísticas servem como base para padronizar os dados atuais de preços.
double sum = 0;
double sumSquares = 0;
for (int i = 0; i < Period; i++) {
double price = Chart.Close(i);
sum += price;
sumSquares += price * price;
}
double mean = sum / Period;
double variance = (sumSquares - (sum * sum / Period)) / (Period - 1);
double stdDev = Math.sqrt(variance);
// Prevent division by zero
if (stdDev == 0) {
stdDev = 1;
}
Padronização e Cálculo do 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 do CUSUM:
- CUSUM Positivo: Acumula desvios positivos.
- CUSUM Negativo: Acumula desvios negativos.
Cada atualização subtrai tanto a deriva quanto o limite, garantindo que apenas desvios significativos contribuam para a soma cumulativa.
// Get current standardized value
double currentValue = (Chart.Close(0) - mean) / stdDev;
// Calculate CUSUM values
double prevCusumPos = getCurrentBar() > Period ? CusumPos.get(1) : 0;
double prevCusumNeg = getCurrentBar() > Period ? CusumNeg.get(1) : 0;
// Upper CUSUM
CusumPos.set(0, Math.max(0, prevCusumPos + currentValue - Drift - Threshold));
// Lower CUSUM
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 excessivamente 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 sob condições de baixa volatilidade.
Juntando Tudo
Este indicador CUSUM é uma ferramenta poderosa para traders que buscam capturar mudanças sutis, porém sustentadas, na ação dos preços. Ao se ajustar dinamicamente aos dados recentes do mercado (por meio de estatísticas móveis) e considerar o ruído através dos parâmetros de limite e deriva, o indicador oferece uma abordagem equilibrada para a geração de sinais.
Se você tem interesse em incorporar este indicador em suas estratégias de negociação, o código foi estruturado para ser tanto adaptável quanto fácil de integrar no ambiente do StrategyQuant.
Você me conhece como clonex. Eu sou Ivan Hudec — criei os blocos gratuitos que você está usando aqui e escrevo sobre a pesquisa por trás deles em algotrading.space. Precisa de algo personalizado? Trabalhe comigo.