Wykrywa subtelne, lecz trwałe zmiany w zachowaniu cen przy użyciu analizy sum skumulowanych. Śledzi odchylenia w górę i w dół za pomocą konfigurowalnych progów, generując wiarygodne sygnały transakcyjne.
Wskaźnik CUSUM w StrategyQuant
W dzisiejszym wpisie przyjrzymy się bliżej niestandardowej implementacji wskaźnika CUSUM (skumulowanej sumy). Technika CUSUM, często wykorzystywana w statystycznej kontroli procesów, pomaga wykrywać drobne przesunięcia w średnim poziomie szeregu czasowego. Ta konkretna implementacja została zaprojektowana z myślą o integracji ze StrategyQuant, oferując traderom dynamiczny sposób monitorowania i reagowania na zmiany rynkowe.
Czym jest CUSUM?
CUSUM to sekwencyjna metoda analizy, która akumuluje odchylenia od wartości docelowej w czasie. Porównanie sumy skumulowanej ze zdefiniowanymi progami ułatwia zauważenie nawet subtelnych zmian w zachowaniu ceny. W naszej implementacji dwa oddzielne akumulatory — jeden dla ruchów w górę (CUSUM Positive) i jeden dla ruchów w dół (CUSUM Negative) — sygnalizują, kiedy zmiana w bazowym szeregu cenowym staje się istotna.
Omówienie kodu
Wskaźnik jest zdefiniowany jako klasa Java, która rozszerza
IndicatorBlock
, zapewniając bezproblemową integrację z ekosystemem StrategyQuant. Przeanalizujmy kluczowe elementy:
Parametry i dane wejściowe
- Dane wykresu: Wskaźnik wykorzystuje wykres (zazwyczaj cenę zamknięcia) jako źródło danych.
- Okres: Określa rozmiar okna, dla którego obliczana jest średnia krocząca oraz odchylenie standardowe. Jest to kluczowe, ponieważ definiuje czułość wskaźnika.
- Próg (k): Ustala próg wykrywania. Wyższy próg oznacza mniejszą czułość wskaźnika, co redukuje liczbę fałszywych sygnałów.
- Dryf (μ): Uwzględnia oczekiwany dryf w procesie, umożliwiając wykrywanie mniejszych, lecz trwałych zmian.
@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;
Obliczanie statystyk kroczących
Dla każdego nowego słupka (lub punktu w czasie) kod oblicza średnią kroczącą i odchylenie standardowe w zdefiniowanym okresie. Te statystyki służą jako linia bazowa do standaryzacji bieżących danych cenowych.
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;
}
Standaryzacja i obliczanie CUSUM
Bieżąca cena jest standaryzowana poprzez odjęcie średniej i podzielenie wyniku przez odchylenie standardowe. Zestandaryzowana wartość służy następnie do aktualizacji akumulatorów CUSUM:
- CUSUM Positive: Akumuluje dodatnie odchylenia.
- CUSUM Negative: Akumuluje ujemne odchylenia.
Każda aktualizacja odejmuje zarówno dryf, jak i próg, zapewniając, że do sumy skumulowanej przyczyniają się wyłącznie istotne odchylenia.
// 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));
Obsługa przypadków brzegowych
Ważnym szczegółem jest sprawdzanie odchylenia standardowego. Gdy dane cenowe są zbyt jednostajne (co daje odchylenie standardowe równe zero), kod resetuje je do wartości 1. To zabezpieczenie zapobiega błędom dzielenia przez zero i zapewnia stabilność wskaźnika w warunkach niskiej zmienności.
Podsumowanie
Wskaźnik CUSUM to potężne narzędzie dla traderów chcących wychwycić subtelne, lecz trwałe zmiany w dynamice cen. Dzięki dynamicznemu dostosowywaniu się do ostatnich danych rynkowych (poprzez statystyki kroczące) oraz filtrowaniu szumu za pomocą parametrów progu i dryfu, wskaźnik oferuje zrównoważone podejście do generowania sygnałów.
Jeśli chcesz wdrożyć ten wskaźnik do swoich strategii handlowych, kod został skonstruowany tak, aby był elastyczny i łatwy w integracji w środowisku StrategyQuant.
Znacie mnie jako clonex. Nazywam się Ivan Hudec — stworzyłem darmowe bloki, z których tutaj korzystacie, a o stojących za nimi badaniach piszę na algotrading.space. Potrzebujesz dedykowanego rozwiązania? Nawiąż ze mną współpracę.