Détecte les changements subtils mais durables dans le comportement des prix grâce à l'analyse de sommes cumulées. Suit les déviations haussières et baissières à l'aide de seuils configurables pour générer des signaux de trading fiables.
Indicateur CUSUM dans StrategyQuant
Dans l'article d'aujourd'hui, nous allons examiner de plus près une implémentation personnalisée de l'indicateur CUSUM (Cumulative Sum). Souvent utilisée dans la maîtrise statistique des procédés, la technique CUSUM permet de détecter de faibles variations du niveau moyen d'une série. Cette implémentation spécifique est conçue pour s'intégrer à StrategyQuant, offrant aux traders un moyen dynamique de surveiller les évolutions du marché et d'y réagir.
Qu'est-ce que le CUSUM ?
Le CUSUM est une méthode d'analyse séquentielle qui cumule les écarts par rapport à une valeur cible au fil du temps. En comparant la somme cumulée à des seuils définis, il devient plus facile de repérer les décalages, même subtils, dans le comportement des prix. Dans notre implémentation, deux accumulateurs distincts — l'un pour les mouvements haussiers (CUSUM Positif) et l'autre pour les mouvements baissiers (CUSUM Négatif) — signalent quand l'évolution de la série de prix sous-jacente devient significative.
Présentation du code
L'indicateur est défini sous forme de classe Java qui étend
IndicatorBlock
, garantissant une intégration transparente avec l'écosystème StrategyQuant. Découvrons ensemble ses principaux composants :
Paramètres et entrées
- Données du graphique : L'indicateur utilise un graphique (généralement le cours de clôture) comme source de données.
- Période : Détermine la taille de la fenêtre sur laquelle sont calculées la moyenne mobile et l'écart-type. Ce paramètre est essentiel car il définit la sensibilité de l'indicateur.
- Seuil (k) : Définit le seuil de détection. Un seuil plus élevé rend l'indicateur moins sensible, ce qui réduit les faux signaux.
- Dérive (μ) : Prend en compte la dérive attendue dans le processus, permettant la détection de changements plus faibles mais persistants.
@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;
Calcul des statistiques glissantes
Pour chaque nouvelle barre (ou point dans le temps), le code calcule la moyenne mobile et l'écart-type sur la période définie. Ces statistiques servent de base de référence pour standardiser les données de prix actuelles.
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;
}
Standardisation et calcul du CUSUM
Le prix actuel est standardisé en soustrayant la moyenne et en divisant par l'écart-type. La valeur standardisée est ensuite utilisée pour mettre à jour les accumulateurs CUSUM :
- CUSUM positif : accumule les déviations positives.
- CUSUM négatif : accumule les déviations négatives.
Chaque mise à jour soustrait à la fois la dérive (drift) et le seuil (threshold), garantissant que seules les déviations significatives contribuent à la somme cumulative.
// 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));
Gestion des cas limites
Un détail important concerne la vérification de l'écart-type. Lorsque les données de prix sont trop constantes (ce qui donne un écart-type de zéro), le code le réinitialise à 1. Cette sécurité évite les erreurs de division et préserve la robustesse de l'indicateur dans des conditions de faible volatilité.
En résumé
Cet indicateur CUSUM est un outil puissant pour les traders cherchant à détecter des changements subtils mais durables dans l'action des prix. En s'adaptant dynamiquement aux données de marché récentes (via des statistiques glissantes) et en filtrant le bruit grâce aux paramètres de seuil et de dérive, l'indicateur offre une approche équilibrée pour la génération de signaux.
Si vous souhaitez intégrer cet indicateur dans vos stratégies de trading, le code est structuré pour être à la fois adaptable et facile à intégrer dans l'environnement StrategyQuant.
Vous me connaissez sous le nom de clonex. Je m'appelle Ivan Hudec — j'ai conçu les blocs gratuits que vous utilisez ici, et j'écris sur les recherches qui les sous-tendent sur algotrading.space. Vous avez un projet à développer ? Collaborons ensemble.