Rileva variazioni impercettibili ma prolungate nel comportamento dei prezzi utilizzando l'analisi a somme cumulative. Traccia le deviazioni al rialzo e al ribasso con soglie configurabili per generare segnali di trading affidabili.
Indicatore CUSUM in StrategyQuant
Nel post di oggi esamineremo più da vicino un'implementazione personalizzata dell'indicatore CUSUM (Cumulative Sum). Spesso utilizzata nel controllo statistico dei processi, la tecnica CUSUM aiuta a rilevare piccoli scostamenti nel livello medio di una serie. Questa particolare implementazione è progettata per l'integrazione in StrategyQuant, offrendo ai trader un modo dinamico per monitorare e reagire alle variazioni del mercato.
Che cos'è il CUSUM?
Il CUSUM è una tecnica di analisi sequenziale che accumula le deviazioni rispetto a un valore target nel corso del tempo. Confrontando la somma cumulativa con soglie definite, diventa più facile individuare anche i cambiamenti più sottili nell'andamento del prezzo. Nella nostra implementazione, due accumulatori separati — uno per i movimenti verso l'alto (CUSUM Positivo) e uno per i movimenti verso il basso (CUSUM Negativo) — segnalano quando la variazione nella serie di prezzi sottostante diventa significativa.
Panoramica del codice
L'indicatore è definito come una classe Java che estende
IndicatorBlock
, garantendo una perfetta integrazione con l'ecosistema di StrategyQuant. Analizziamo i componenti chiave:
Parametri e input
- Dati del grafico: L'indicatore utilizza un grafico (tipicamente il prezzo di chiusura) come fonte di dati.
- Periodo: Determina la dimensione della finestra su cui vengono calcolate la media mobile e la deviazione standard. Questo aspetto è fondamentale poiché definisce la sensibilità dell'indicatore.
- Soglia (k): Imposta la soglia di rilevamento. Una soglia più alta rende l'indicatore meno sensibile, riducendo i falsi segnali.
- Deriva (μ): Tiene conto della deriva attesa nel processo, consentendo il rilevamento di variazioni più piccole ma persistenti.
@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;
Calcolo delle statistiche mobili
Per ogni nuova barra (o punto temporale), il codice calcola la media mobile e la deviazione standard lungo il periodo definito. Queste statistiche fungono da base di riferimento per standardizzare i dati correnti del prezzo.
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;
}
Standardizzazione e calcolo del CUSUM
Il prezzo corrente viene standardizzato sottraendo la media e dividendo per la deviazione standard. Il valore standardizzato viene quindi utilizzato per aggiornare gli accumulatori CUSUM:
- CUSUM Positivo: Accumula le deviazioni positive.
- CUSUM Negativo: Accumula le deviazioni negative.
Ogni aggiornamento sottrae sia la deriva che la soglia, garantendo che solo le deviazioni significative contribuiscano alla somma 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));
Gestione dei casi limite
Un dettaglio importante è il controllo della deviazione standard. Quando i dati sui prezzi sono troppo costanti (generando una deviazione standard pari a zero), il codice la reimposta a 1. Questa protezione previene errori di divisione e mantiene l'indicatore solido anche in condizioni di bassa volatilità.
Tirando le somme
Questo indicatore CUSUM è un potente strumento per i trader che cercano di cogliere cambiamenti sottili ma prolungati nell'azione dei prezzi. Adattandosi dinamicamente ai dati di mercato recenti (tramite statistiche mobili) e filtrando il rumore attraverso i parametri di soglia e deriva, l'indicatore offre un approccio equilibrato alla generazione di segnali.
Se desideri integrare questo indicatore nelle tue strategie di trading, il codice è strutturato per essere sia flessibile che semplice da implementare all'interno dell'ambiente StrategyQuant.
Mi conoscete come clonex. Sono Ivan Hudec: ho creato i blocchi gratuiti che utilizzate qui e condivido la ricerca che c'è dietro su algotrading.space. Avete bisogno di uno sviluppo personalizzato? Lavora con me.