Erkennt subtile, aber anhaltende Verschiebungen im Kursverhalten mittels kumulativer Summenanalyse. Erfasst Aufwärts- und Abwärtsabweichungen mit konfigurierbaren Schwellenwerten, um verlässliche Handelssignale zu generieren.
CUSUM-Indikator in StrategyQuant
Im heutigen Beitrag werfen wir einen genaueren Blick auf eine benutzerdefinierte Implementierung des CUSUM-Indikators (Cumulative Sum). Die CUSUM-Technik, die häufig in der statistischen Prozessregelung eingesetzt wird, hilft dabei, kleine Verschiebungen des Mittelwerts einer Reihe zu erkennen. Diese spezielle Implementierung wurde für die Integration in StrategyQuant entwickelt und bietet Tradern eine dynamische Möglichkeit, Marktveränderungen zu überwachen und darauf zu reagieren.
Was ist CUSUM?
CUSUM ist ein sequenzielles Analyseverfahren, das Abweichungen von einem Zielwert über die Zeit hinweg aufsummiert. Durch den Vergleich der kumulierten Summe mit definierten Schwellenwerten lassen sich selbst subtile Verschiebungen im Kursverhalten leichter erkennen. In unserer Implementierung signalisieren zwei separate Akkumulatoren – einer für Aufwärtsbewegungen (CUSUM Positiv) und einer für Abwärtsbewegungen (CUSUM Negativ) –, wann die Veränderung in der zugrunde liegenden Kursreihe signifikant wird.
Code-Übersicht
Der Indikator ist als Java-Klasse definiert, die Folgendes erweitert:
IndicatorBlock
, was eine nahtlose Integration in das Ökosystem von StrategyQuant gewährleistet. Lassen Sie uns die wichtigsten Komponenten aufschlüsseln:
Parameter und Eingaben
- Chart-Daten: Der Indikator verwendet einen Chart (üblicherweise den Schlusskurs) als Datenquelle.
- Periode: Bestimmt die Fenstergröße, über die der rollierende Mittelwert und die Standardabweichung berechnet werden. Dies ist entscheidend, da es die Sensitivität des Indikators definiert.
- Schwellenwert (k): Legt den Erkennungsschwellenwert fest. Ein höherer Schwellenwert bedeutet, dass der Indikator weniger empfindlich wird, was Fehlsignale reduziert.
- Drift (μ): Berücksichtigt die erwartete Drift im Prozess und ermöglicht so die Erkennung kleinerer, aber anhaltender Veränderungen.
@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;
Berechnung der rollierenden Statistiken
Für jeden neuen Balken (oder Zeitpunkt) berechnet der Code den rollierenden Mittelwert und die Standardabweichung über den definierten Zeitraum. Diese Statistiken dienen als Basislinie zur Standardisierung der aktuellen Kursdaten.
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;
}
Standardisierung und CUSUM-Berechnung
Der aktuelle Kurs wird standardisiert, indem der Mittelwert subtrahiert und durch die Standardabweichung dividiert wird. Der standardisierte Wert wird dann zur Aktualisierung der CUSUM-Akkumulatoren verwendet:
- CUSUM Positiv: Akkumuliert positive Abweichungen.
- CUSUM Negativ: Akkumuliert negative Abweichungen.
Bei jeder Aktualisierung werden sowohl die Drift als auch der Schwellenwert subtrahiert, sodass nur signifikante Abweichungen zur kumulativen Summe beitragen.
// 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));
Behandlung von Grenzfällen
Ein wichtiges Detail ist die Prüfung der Standardabweichung. Wenn die Kursdaten zu konsistent sind (was zu einer Standardabweichung von null führt), setzt der Code diese auf 1 zurück. Diese Schutzmaßnahme verhindert Divisionsfehler und sorgt dafür, dass der Indikator auch bei geringer Volatilität stabil bleibt.
Alles zusammengefasst
Dieser CUSUM-Indikator ist ein leistungsstarkes Werkzeug für Trader, die subtile, aber anhaltende Veränderungen in der Kursbewegung erfassen möchten. Durch die dynamische Anpassung an aktuelle Marktdaten (mittels rollierender Statistiken) und die Berücksichtigung von Marktrauschen über die Schwellenwert- und Drift-Parameter bietet der Indikator einen ausgewogenen Ansatz zur Signalgenerierung.
Wenn Sie diesen Indikator in Ihre Handelsstrategien integrieren möchten: Der Code ist so aufgebaut, dass er sich flexibel anpassen und problemlos in die StrategyQuant-Umgebung einbinden lässt.
Sie kennen mich als clonex. Ich bin Ivan Hudec – ich habe die kostenlosen Bausteine entwickelt, die Sie hier nutzen, und schreibe auf algotrading.space über die Forschung dahinter. Benötigen Sie eine individuelle Entwicklung? Arbeiten Sie mit mir zusammen.