3. 2. 2025

5 0

CUSUM

CUSUM-Kennzeichen in StrategyQuant

Im heutigen Beitrag werfen wir einen genaueren Blick auf eine benutzerdefinierte Implementierung des CUSUM-Indikators (Cumulative Sum). Die CUSUM-Technik wird häufig in der statistischen Prozesskontrolle eingesetzt und hilft dabei, kleine Verschiebungen im Mittelwert einer Serie zu erkennen. Diese spezielle Implementierung ist für die Integration in StrategyQuant konzipiert und bietet Händlern eine dynamische Möglichkeit, Marktveränderungen zu überwachen und darauf zu reagieren.

Was ist CUSUM?

CUSUM ist ein sequentielles Analyseverfahren, das die Abweichungen von einem Zielwert im Laufe der Zeit kumuliert. Durch den Vergleich der kumulierten Summe mit definierten Schwellenwerten lassen sich selbst subtile Verschiebungen im Kursverhalten leichter erkennen. In unserer Implementierung signalisieren zwei getrennte Akkumulatoren - einer für Aufwärtsbewegungen (CUSUM Positiv) und einer für Abwärtsbewegungen (CUSUM Negativ) -, wenn die Veränderung der zugrunde liegenden Preisreihe signifikant wird.

Code-Durchgang

Der Indikator ist als eine Java-Klasse definiert, die die

IndicatorBlock

die eine nahtlose Integration in das Ökosystem von StrategyQuant gewährleisten. Schauen wir uns die wichtigsten Komponenten an:

Parameter und Eingaben

  • Chart-Daten: Der Indikator verwendet einen Chart (normalerweise den Schlusskurs) als Datenquelle.
  • Zeitraum: Bestimmt die Fenstergröße, über die der gleitende Mittelwert und die Standardabweichung berechnet werden. Dies ist entscheidend, da es die Empfindlichkeit des Indikators definiert.
  • Schwellenwert (k): Legt die Erkennungsschwelle fest. Ein höherer Schwellenwert bedeutet, dass der Indikator weniger empfindlich ist, wodurch falsche Signale reduziert werden.
  • Drift (μ): Berücksichtigt die erwartete Drift im Prozess und ermöglicht 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 Zeitraum;

@Parameter(category="Default", name="Schwellenwert", minValue=0.1, maxValue=100, defaultValue="2", step=0.1)
@Help("Erkennungsschwelle (k) - höhere Werte machen den Indikator unempfindlicher")
public double Schwellenwert;

@Parameter(category="Default", name="Drift", minValue=0, maxValue=10, defaultValue="0.5", step=0.1)
@Help("Erwartete Drift im Prozess (mu) - hilft, kleinere anhaltende Änderungen zu erkennen")
public double Drift;

Berechnung der rollenden Statistik

Für jeden neuen Balken (oder Zeitpunkt) berechnet der Code den gleitenden Mittelwert und die Standardabweichung über den festgelegten Zeitraum. Diese Statistiken dienen als Basis für die Standardisierung der aktuellen Kursdaten.

double sum = 0;
double sumSquares = 0;

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

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

// Verhinderung der Division durch Null
wenn (stdDev == 0) {
stdDev = 1;
}

 

Standardisierung und CUSUM-Berechnung

Der aktuelle Preis wird standardisiert, indem der Mittelwert subtrahiert und durch die Standardabweichung geteilt wird. Der standardisierte Wert wird dann zur Aktualisierung der CUSUM-Akkumulatoren verwendet:

  • CUSUM positiv: Kumuliert positive Abweichungen.
  • CUSUM Negativ: Kumuliert negative Abweichungen.

Bei jeder Aktualisierung werden sowohl die Drift als auch der Schwellenwert abgezogen, um sicherzustellen, dass nur signifikante Abweichungen zur kumulativen Summe beitragen.

// Aktuellen standardisierten Wert ermitteln
double currentValue = (Chart.Close(0) - mean) / stdDev;

// CUSUM-Werte berechnen
double prevCusumPos = getCurrentBar() > Period ? CusumPos.get(1) : 0;
double prevCusumNeg = getCurrentBar() > Period ? CusumNeg.get(1) : 0;

// Oberer CUSUM
CusumPos.set(0, Math.max(0, prevCusumPos + currentValue - Drift - Threshold));

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

 

Umgang mit Grenzfällen

Ein wichtiges Detail ist die Überprüfung der Standardabweichung. Wenn die Preisdaten zu konsistent sind (was zu einer Standardabweichung von Null führt), setzt der Code die Standardabweichung auf 1 zurück. Diese Sicherheitsvorkehrung verhindert Teilungsfehler und sorgt dafür, dass der Indikator auch unter Bedingungen mit geringer Volatilität robust bleibt.

Alles unter einen Hut bringen

Dieser CUSUM-Indikator ist ein leistungsfähiges Instrument für Händler, die subtile, aber nachhaltige Veränderungen im Kursgeschehen erkennen möchten. Durch die dynamische Anpassung an die jüngsten Marktdaten (über rollierende Statistiken) und die Berücksichtigung von Rauschen über die Schwellenwert- und Driftparameter bietet der Indikator einen ausgewogenen Ansatz für die Signalerzeugung.

Wenn Sie daran interessiert sind, diesen Indikator in Ihre Handelsstrategien einzubinden, ist der Code so strukturiert, dass er sowohl anpassbar als auch leicht in die StrategyQuant-Umgebung zu integrieren ist.

 

 

Abonnieren
Benachrichtigen Sie mich bei
0 Kommentare
Älteste
Neuestes Meistgewählt
Inline-Rückmeldungen
Alle Kommentare anzeigen