środa, 9 marca 2022

GARCH zamiast wstęgi Bollingera

A więc prognoza ropy za pomocą AT nie sprawdziła się. Wygrała ekonomia - blokada podaży rosyjskiej ropy wywołała eksplozję cenową ropy na całym świecie. Można mówić o odwróconym czarnym łabędziu, którego też brałem pod uwagę dwa tygodnie temu. Gdy Rosja rozpoczęła inwazję na Ukrainę, cena oscylowała wokół 100$, teraz jest to 125, tygodniowo wstęga Bollingera mocno przekroczona, RSI(14) także



W krótkim okresie na statystyce nie można nigdy polegać, ale w długim już tak. Dlatego nie ma wątpliwości, że nastąpi powrót. Zazwyczaj pada teraz pytanie: kiedy? Ale to złe pytanie, bo wiadomo, że to nastąpi prędzej niż później. Ważniejsze, jak mocny będzie powrót? Bo zamiast oczekiwanego powrotu do średniej, możemy dostać prawie poziomy kierunek w kolejnych tygodniach. Gdyby tak było, to znaczyłoby, że wariancja stóp zwrotu spadła niemal do zera.

Zamiast Bollingera, którego zresztą nie jestem zwolennikiem, znacznie lepiej używać modelu klasy ARCH. Oprócz nieporównywalnej mocy statystycznej, pozwala on także prognozować odchylenia w kolejnym okresie.

Najprostszym sposobem, nie wymagającym żadnej wiedzy programistycznej, jest używanie Gretla. Program ten, jak na darmowy, całkiem nieźle się rozwija, obecna wersja pochodzi z lutego 2022. Przy instalacji możemy zaznaczyć język polski, choć musimy się nastawić przeskakiwanie z polskiego na angielski, bo program tutaj ma pewne braki.

Wstępne ustawienia: Tygodniowe notowania cen (na zamknięcia) ropy pochodzą z https://stooq.pl/q/d/?s=cl.f . Dane od 07.01.2018 do 6.03.2022. W gretlu otwieramy plik z danymi, np. .csv. Problem zazwyczaj dotyczy ustawienia dat, które trzeba ręcznie ustawić, bo program często nie potrafi czytać prawidłowo dat. Jeśli pyta o typ danych, wybieramy szeregi czasowe. Kiedy dane są gotowe, zaznaczamy zmienną - cenę ropy. Wybieramy Dodawanie zmiennych -> procentowe zmiany dla wybranych zmiennych -> wpisujemy nazwę dla stopy zwrotu, np. 'ropa_zwrot'. 

Model GARCH: Wybieramy Model -> Modele jednowymiarowych szeregów czasowych -> GARCH variants. Upewniamy się, że zmienna zależna to ropa_zwrot. Resztę ustawień na razie zostawiamy. Dajemy OK. Dostałem model


Wszystkie współczynniki istotne stat., czyli jesteśmy na dobrej drodze. Jednak to początek. W otrzymanym oknie klikamy na ikonę wykresu, wybieramy Density:


Jedna uwaga: dlaczego podpisano residuals (reszty), a nie returns (stopy zwrotu)? Zauważmy, że rozkład teoretyczny i empiryczny mają średnią zero. Różnica między resztami / błędami a stopami zwrotu jest taka, że te pierwsze mają średnią zawsze równą zero, a te drugie niekoniecznie. Ich wariancje są już sobie równe (dowód - ostatni wzór tutaj). Zazwyczaj tam gdzie są modele klasy ARCH, określenie residuals / errors, czytamy to jako zmienna (tu stopa zwrotu) pomniejszona o swoją średnią. Trzeba jednak dodać, że w tym modelu pojawiają się też standaryzowane reszty - wtedy dodatkowo taka reszta dzielona jest przez odchylenie standardowe, aby sprowadzić do porównywalności ze standardowym rozkładem normalnym. To jest właśnie ten przypadek (opis brzmi std residuals vs std normal). 

Rozkład empiryczny jest leptokurtyczny, czyli stopy zwrotu nie mają rozkładu normalnego. Dla pewności można zrobić test normalności. Zmienna -> Testy normalności:

................................................................

Test na normalność rozkładu ropa_zwrot:

 Test Doornika-Hansena = 121,681, z wartością p 3,77906e-027

 Test Shapiro-Wilka = 0,901681, z wartością p 9,5057e-011

 Test Lillieforsa = 0,0966947, z wartością p ~= 0

 Test Jarque'a-Bera = 277,187, z wartością p 6,45201e-061

................................................................

Wszędzie p < 0,01 , co daje pewność, że to nie jest rozkład Gaussa.

Trzeba zmienić w opcjach GARCH variants -> Rozkład -> zmieniamy na t (czyli t-Studenta).  

 


Parametry są istotne stat - efekt ARCH i GARCH ewidentnie występuje.

Sprawdzamy znów Density:


Wygląda to dużo lepiej - rozkład t pozwala imitować efekty leptokurtozy.

Ok, mamy model, to możemy teraz zobaczyć graficznie, jak zmienia się warunkowe odchylenie standardowe w porównaniu z resztami. Klikamy ikonę wykresu -> Time series:


To co tu dostaliśmy, to nie są wartości otoczone przedziałem ufności - ten zresztą ma zakres ok. 2 odchyleń standardowych. A tutaj mamy jedno odchylenie - warunkowe. Interesujące jest, że niemal zawsze dane mieszczą się w tym zakresie. Z 2-3 razy było duże wychylenie poza ten obszar (rok 2020), ale tak wielkiego jak teraz jeszcze nie było.

Powiedzmy, że chcemy porównać dodatkowo warunkowe odchylenie z niewarunkowym - na jednym wykresie. Tego już tak łatwo nie dostaniemy. Wg opisu wykresu mamy tu reszty - już niestandaryzowane - otoczone niestandaryzowanymi odchyleniami warunkowymi. Klikamy na oknie modelu "Zapisz bundle jako" -> wybieramy uhat (series), zapisujemy zmienną, a następnie to samo dla h (series). W głównym oknie gretl dostaliśmy dwie nowe zmienne w postaci niestandaryzowanych reszt (uhat) oraz warunkowej wariancji (h). Teraz klikamy Dodawanie zmiennych -> Definiowanie nowej zmiennej. Wpisujemy csd_plus = h^0.5. Następnie Dodawanie zmiennych -> Definiowanie nowej zmiennej -> wpisujemy csd_minus = -h^0.5. Otrzymaliśmy warunkowe odchylenia std na plus i minus. I w końcu Dodawanie zmiennych -> Definiowanie nowej zmiennej -> wpisujemy: 

series usd_plus = sd(uhat). 

Analogicznie Dodawanie zmiennych -> Definiowanie nowej zmiennej:

series usd_minus = -sd(uhat). 

Uzyskaliśmy niewarunkowe odchylenia std (na plus i minus).

Wybieramy Widok -> Wykres szeregów czasowych. Zaznaczamy 5 zmiennych: uhat, csd_plus, csd_minus, usd_plus i usd_minus. Dostaniemy wykres:


Co warto zauważyć, niewarunkowe odchylenie std jest stosunkowo wysoko umiejscowione - jest to efekt roku 2020, który zaburzył ogólne statystyki. Jest to dobry przykład dowodzący, że błędnym podejściem jest klasyczne opieranie się na zwykłym odchyleniu standardowym. 

Niemniej w ostatnim tygodniu tempo cen przekroczyło znacznie powyżej 3 odchyleń std.  Zdarzenie tego rodzaju w ciągu 2 lat jest mało prawdopodobne. To znaczy, że musi teraz nastąpić powrót do średniej.

W sumie powstają 2 wnioski:
(1) nie powinniśmy się sugerować statycznym odchyleniem std, tylko warunkowym, dynamicznym;
(2) nie tylko ceny, ale też wariancje warunkowe są nieprzewidywalne. Można pobawić się w prognozy, ale lepiej posłużyć się GARCH do oceny powrotu ceny do średniej. Czyli otrzymujemy ulepszoną wersję wstęgi Bollingera. 

1 komentarz: