Detekuje jemné, ale trvalé posuny v chování cen pomocí analýzy kumulativního součtu. Sleduje odchylky směrem nahoru i dolů s konfigurovatelnými prahovými hodnotami a generuje spolehlivé obchodní signály.
Indikátor CUSUM ve StrategyQuant
V dnešním příspěvku se podrobněji podíváme na vlastní implementaci indikátoru CUSUM (kumulativní součet). Metoda CUSUM, která se často používá ve statistické kontrole procesů, pomáhá detekovat malé posuny v průměrné úrovni časové řady. Tato konkrétní implementace je navržena pro integraci do StrategyQuant a nabízí obchodníkům dynamický způsob, jak sledovat změny na trhu a reagovat na ně.
Co je CUSUM?
CUSUM je sekvenční analytická technika, která v čase kumuluje odchylky od cílové hodnoty. Porovnáním kumulativního součtu s definovanými prahovými hodnotami je snazší rozpoznat i jemné posuny v chování cen. V naší implementaci dva samostatné akumulátory – jeden pro vzestupné pohyby (CUSUM Positive) a jeden pro sestupné pohyby (CUSUM Negative) – signalizují, kdy se změna v podkladové cenové řadě stane významnou.
Rozbor kódu
Indikátor je definován jako Java třída, která rozšiřuje
IndicatorBlock
, což zajišťuje bezproblémovou integraci do ekosystému StrategyQuant. Pojďme si rozebrat klíčové komponenty:
Parametry a vstupy
- Chart Data: Indikátor používá jako zdroj dat graf (obvykle uzavírací cenu).
- Period: Určuje velikost okna, přes které se počítá klouzavý průměr a směrodatná odchylka. To je zásadní, protože to definuje citlivost indikátoru.
- Threshold (k): Nastavuje detekční práh. Vyšší práh znamená, že se indikátor stává méně citlivým, což snižuje výskyt falešných signálů.
- Drift (μ): Zohledňuje očekávaný posun v procesu, což umožňuje detekci menších, ale trvalých změn.
@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;
Výpočet klouzavých statistik
Pro každou novou svíčku (nebo časový bod) kód vypočítá klouzavý průměr a směrodatnou odchylku za definovanou periodu. Tyto statistiky slouží jako základ pro standardizaci aktuálních cenových dat.
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;
}
Standardizace a výpočet CUSUM
Aktuální cena je standardizována odečtením průměru a vydělením směrodatnou odchylkou. Standardizovaná hodnota se pak použije k aktualizaci akumulátorů CUSUM:
- CUSUM Positive: Akumuluje kladné odchylky.
- CUSUM Negative: Akumuluje záporné odchylky.
Při každé aktualizaci se odečte jak drift, tak prahová hodnota, což zajišťuje, že ke kumulativnímu součtu přispívají pouze významné odchylky.
// 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));
Řešení mezních případů
Důležitým detailem je kontrola směrodatné odchylky. Když jsou cenová data příliš konzistentní (což vede ke směrodatné odchylce rovné nule), kód ji resetuje na hodnotu 1. Tato pojistka zabraňuje chybám dělení nulou a udržuje robustnost indikátoru i v podmínkách nízké volatility.
Shrnutí
Tento indikátor CUSUM je mocným nástrojem pro obchodníky, kteří chtějí zachytit jemné, ale trvalé změny v cenovém vývoji. Díky dynamickému přizpůsobování se nedávným tržním datům (prostřednictvím klouzavých statistik) a zohlednění šumu pomocí parametrů prahu a driftu nabízí indikátor vyvážený přístup ke generování signálů.
Pokud máte zájem o začlenění tohoto indikátoru do svých obchodních strategií, kód je strukturován tak, aby byl snadno přizpůsobitelný a jednoduše integrovatelný v prostředí StrategyQuant.
Znáte mě jako clonex. Jsem Ivan Hudec – vytvořil jsem bezplatné bloky, které zde používáte, a o výzkumu za nimi píšu na algotrading.space. Potřebujete něco vytvořit? Spolupracujte se mnou.