Metodologia prognozowania VAR

19

Buduję model VAR do prognozowania ceny aktywów i chciałbym wiedzieć, czy moja metoda jest statystycznie solidna, czy testy, które podałem, są odpowiednie i czy potrzebne są dalsze, aby zapewnić wiarygodną prognozę na podstawie moich zmiennych wejściowych.

Poniżej znajduje się mój bieżący proces sprawdzania przyczynowości Grangera i prognozowania wybranego modelu VAR.

require("forecast")
require("vars")

#Read Data
da=read.table("VARdata.txt", header=T)
dac <- c(2,3) # Select variables
x=da[,dac]

plot.ts(x)
summary(x)

#Run Augmented Dickey-Fuller tests to determine stationarity and differences to achieve stationarity.
ndiffs(x[, "VAR1"], alpha = 0.05, test = c("adf"))
ndiffs(x[, "VAR2"], alpha = 0.05, test = c("adf"))

#Difference to achieve stationarity
d.x1 = diff(x[, "VAR1"], differences = 2)
d.x2 = diff(x[, "VAR2"], differences = 2)

dx = cbind(d.x1, d.x2)
plot.ts(dx)

#Lag optimisation
VARselect(dx, lag.max = 10, type = "both")

#Vector autoregression with lags set according to results of lag optimisation. 
var = VAR(dx, p=2)

#Test for serial autocorrelation using the Portmanteau test
#Rerun var model with other suggested lags if H0 can be rejected at 0.05
serial.test(var, lags.pt = 10, type = "PT.asymptotic")

#ARCH test (Autoregressive conditional heteroscedasdicity)
arch.test(var, lags.multi = 10)

summary(var)

#Granger Causality test
#Does x1 granger cause x2?
grangertest(d.x2 ~ d.x1, order = 2)

#Does x2 granger cause x1?
grangertest(d.x1 ~ d.x2, order = 2)

#Forecasting
prd <- predict(var, n.ahead = 10, ci = 0.95, dumvar = NULL)
print(prd)
plot(prd, "single")

Czy ta metoda brzmi?

właśnie to przeczytałeś
źródło
1
Czy używasz drugich różnic? Jest to trochę niezwykłe i może sprawić, że model będzie bardziej wrażliwy niż powinien. Czy możesz również oczekiwać kointegracji w twoim systemie? A co z jakimś deterministycznym trendem czasowym i / lub sezonowością, sprawdziłeś je?
Richard Hardy
@Richard, różnice w osiąganiu stacjonarności są, o ile rozumiem, określone przez test ADF i zostałyby dostosowane zgodnie z jego sugestią. Jeśli test ADF ustali, że jest stacjonarny (zwróć 0, nie różnicowałbym zmiennej). Nie myślałem o kointegracji i sezonowości, ale miałem wrażenie, że powyższa metoda zajmie się dowolnym trendem w zmiennych.
przeczytałeś
3
Test ADF to tylko test, ma swoje ograniczenia. Wykreślenie surowych danych, pierwszych różnic i ostatecznie drugich różnic może być bardziej pouczające niż samo uruchomienie testu. Ponadto test ADF ma inne specyfikacje: (1) brak stałej, brak trendu; (2) stała, bez trendu; (3) stała i trendowa; Wybór kolejności opóźnień w teście może również nie być łatwy. Dlatego nie polegaj na ślepo na wynikach. Z perspektywy przedmiotowej ceny aktywów są zwykle zintegrowane z zamówieniem pierwszym, I (1). Trudno byłoby mi (2) usprawiedliwić ...
Richard Hardy
@youjustreadthis Poniżej zamieściłem odpowiedź. Zdecydowanie zalecam rozważenie niektórych jego konsekwencji
Jacob H

Odpowiedzi:

28

Myślę, że masz rację, ale budując model VAR, zwykle upewniam się, że wykonuję następujące kroki:

1. Wybierz zmienne

To najważniejsza część budowania modelu. Jeśli chcesz prognozować cenę środka trwałego, musisz uwzględnić zmienne związane z mechanizmem kształtowania ceny. Najlepszym sposobem na to jest zastosowanie modelu teoretycznego. Ponieważ nie wspomniał, co jest atutem i jakie są inne zmienne zawarte w modelu Naprawdę nie mogę wiele powiedzieć o tej pozycji, ale można znaleźć podsumowanie modeli wyceny aktywów w tutaj .

2. Sprawdź dane i dokonaj odpowiednich korekt

Po wybraniu zmiennych możesz wprowadzić pewne zmiany w danych, które poprawią oszacowanie i interpretację modelu. Przydatne jest użycie statystyk podsumowujących i obejrzenie wykresu serii w celu wykrycia wartości odstających, brakujących danych i innych dziwnych zachowań. Podczas pracy z danymi cenowymi ludzie zwykle biorą dzienniki naturalne, co jest transformacją stabilizującą wariancję, a także ma dobrą interpretację (różnica cen w dziennikach staje się stale złożonymi zwrotami). Nie jestem pewien, czy wziąłeś dzienniki przed oszacowaniem modelu, ale warto to zrobić, jeśli pracujesz z cenami aktywów.

3. Sprawdź, czy dane zawierają składniki niestacjonarne

Teraz możesz użyć testów root root, aby sprawdzić, czy seria jest nieruchoma. Jeśli interesuje Cię tylko prognozowanie, jak zauważył @JacobH, możesz uruchamiać VAR na poziomach, nawet jeśli Twoja seria nie jest stacjonarna, ale wtedy nie można ufać standardowym błędom, co oznacza, że ​​nie można wnioskować o wartości współczynniki. Testowałeś stacjonarnie za pomocą testu ADF, który jest bardzo często stosowany w tych aplikacjach, ale pamiętaj, że powinieneś określić, czy chcesz uruchomić test z i) bez stałej i bez trendu; ii) stały i bez trendu; oraz iii) stała i trend. Zwykle szeregi cen mają tendencje stochastyczne, więc trend liniowy nie będzie dokładny. W takim przypadku możesz wybrać specyfikację ii. W swoim kodzie użyłeśndiffsfunkcja pakietu prognozy. Nie jestem pewien, którą z tych trzech alternatyw stosuje ta funkcja w celu obliczenia liczby różnic (nie mogłem tego znaleźć w dokumentacji). Aby sprawdzić wynik, możesz użyć ur.dffunkcji z pakietu „urca”:

adf <- ur.df(x[, "VAR1"], type = "drift", lags = 10, selectlags = "AIC")

Zauważ, że to polecenie uruchomi test ADF ze stałą, a opóźnienia wybrane przez polecenie AIC, z maksymalnym opóźnieniem wynoszącym 10. Jeśli masz problemy z interpretacją wyników, spójrz na to pytanie . Jeśli szeregami są I (1), po prostu użyj różnicy, która będzie równa ciągłym składanym zwrotom. Jeśli test wykaże, że szereg to I (2) i masz wątpliwości, czy możesz użyć innych testów, np. Testu Phillipsa-Perrona (PP.testfunkcja w R). Jeśli wszystkie testy potwierdzą, że twoja seria to I (2) (pamiętaj, aby użyć dziennika serii przed uruchomieniem testów), weź drugą różnicę, ale pamiętaj, że twoja interpretacja wyników zmieni się, ponieważ teraz pracujesz z różnica stale składanych zwrotów. Ceny aktywów wynoszą zwykle I (1), ponieważ są one zbliżone do przypadkowego spaceru, który jest białym szumem przy zastosowaniu pierwszej różnicy.

4. Wybierz kolejność modelu

Można tego dokonać za pomocą powszechnie stosowanych kryteriów, takich jak Akaike, Schwarz (BIC) i Hannan-Quinn. Zrobiłeś to za pomocą VARselectfunkcji i to prawda, ale pamiętaj, jakie kryterium zastosowałeś przy podejmowaniu decyzji. Zwykle różne kryteria wskazują różne zamówienia na VAR.

5. Sprawdź, czy istnieją relacje kointegrujące

Jeśli wszystkie serie to I (1) lub I (2), przed uruchomieniem modelu VAR zwykle dobrze jest sprawdzić, czy nie ma żadnych relacji kointegracji między seriami, szczególnie jeśli chcesz przeprowadzić analizę odpowiedzi impulsowej za pomocą pozostałości. Możesz to zrobić za pomocą testu Johansenna lub Engle-Granger (tylko dla modeli dwuwymiarowych). W R możesz uruchomić test Johansena z ca.jofunkcją pakietu „urca”. Pamiętaj, że ten test ma również inne specyfikacje. W przypadku serii cen zwykle używam następującego kodu (gdzie pjest opóźnieniem dla pozycji 4, wykonywanym z serią w poziomach):

jo_eigen <- ca.jo(x, type = "eigen", ecdet = "const", K = p)
jo_trace <- ca.jo(x, type = "trace", ecdet = "const", K = p)

6. Oszacuj model

Jeśli twoje serie nie są zintegrowane, możesz łatwo oszacować model za pomocą VARpolecenia, tak jak w kodzie. W przypadku, gdy serie są zintegrowane, należy wziąć pod uwagę relację długoterminową, szacując model wektorowej korekcji błędów za pomocą następującego kodu (gdzie kjest kolejność kointegracji):

vecm <- cajorls(joeigen, r = k)

7. Uruchom testy diagnostyczne

Aby sprawdzić, czy Twój model jest dobrze określony, możesz uruchomić test szeregowej korelacji reszt. W swoim kodzie użyłeś testu Portmanteau z serial.testfunkcją. Nigdy nie korzystałem z tej funkcji, ale myślę, że jest OK. Istnieje również wielowymiarowa wersja testu Ljung-Box zaimplementowana w pakiecie MTS, którą można uruchomić za pomocą tej funkcji mq.

8. Dokonuj prognoz

Po upewnieniu się, że Twój model jest dobrze określony, możesz użyć predictfunkcji tak, jak w kodzie. Możesz nawet wykreślić funkcje odpowiedzi impulsowej, aby sprawdzić, jak zmienne reagują na określony wstrząs za pomocą tej irffunkcji.

9. Oceń prognozy

Po dokonaniu prognoz musisz je ocenić i porównać z innymi modelami. Niektóre metody oceny dokładności prognoz można znaleźć tutaj , ale w tym celu kluczowe jest podzielenie serii na zestaw szkoleniowy i testowy, jak wyjaśniono w linku.

Regis A. Ely
źródło
Dziękuję bardzo za tę szczegółową odpowiedź! Co się tyczy testu kointegracji Johansena, czy implementacja zmienia się, gdy uwzględniono więcej niż 2 zmienne? Uwierz mi, że czytałem, że integracja wielopłaszczyznowa niesie ze sobą własne pułapki. Przepraszam, jeśli to lepiej nadaje się do samodzielnego pytania.
przeczytałeś
1
Nie, możesz to zrobić przy użyciu tego samego kodu, co powyżej, ale w tym przypadku możesz znaleźć więcej niż jeden wektor kointegrujący. Jedynym ograniczeniem tego rodzaju jest test Engle-Granger, który jest odpowiedni tylko dla serii dwuwymiarowych, ale zwykle lepszy w tym przypadku.
Regis A. Ely,
1
Ten link może pomóc w uruchomieniu i interpretacji testów johansenna.
Regis A. Ely,
Dobra robota! Zredagowałem jednak formatowanie i pisownię. Zauważ, że miło jest mieć fragmenty kodu (nawet tak małe jak nazwy funkcji) w backticks `, np predict. Większe fragmenty kodu można sformatować jako kod, zaznaczając tekst i klikając przycisk „cudzysłowy” u góry okna edytora.
Richard Hardy
@RichardHardy, ładny zarys procedury szacowania VAR. Myślę jednak, że mogłeś zignorować fakt, że PO chce prognozować. W związku z tym prawdopodobnie będzie chciał oszacować poziomy.
Jacob H
10

Pomyślałem, że dodam do Regis A Ely bardzo ładną odpowiedź. Jego odpowiedź nie jest zła, ale używanie VAR do prognozowania różni się od używania VAR do robienia innych rzeczy typu VAR (tj. IRF, FEVD, rozkład historyczny itp.). W związku z tym niektóre kroki przedstawione przez Regis A Ely w niektórych przypadkach negatywnie wpłyną na twoją prognozę.

Zrzeczenie się:

Kiedy mówię o danych niestacjonarnych, mam na myśli, że seria zawiera trend stochastyczny. Jeśli dane mają trend czasowy / sezonowy, należy je odpowiednio filtrować.

Pierwszy

Ogólnie rzecz biorąc, w nieograniczonej VAR nie trzeba się martwić o fałszywy związek. Fałszywa regresja występuje, gdy regresujesz niestacjonarną serię (Y) na innej niestacjonarnej serii (X) i obie serie nie są zintegrowane. Jeśli jednak regresujesz Y na X, a także na opóźnienia Y, regresja nie będzie fałszywa, ponieważ włączenie opóźnienia Y gwarantuje, że błędy będą nieruchome. Innymi słowy, opóźnienia Y wychwytują odmianę, która poprzednio została błędnie przypisana do X. Ponieważ nieograniczony VAR jest zasadniczo systemem regresji ARDL, w którym każde równanie zawiera tę samą liczbę opóźnień i regresorów, powinno być jasne, że fałszywa regresja jest dlatego raczej nie będzie stanowić problemu. Mówiąc inaczej, jeśli twoje dane to wszystko I (1), niezależnie od tego, czy nie są one zintegrowane, możesz uruchomić VAR. VECM są niezbędne tylko wtedy, gdy chcesz zarówno modelować, jak i identyfikować relacje między zmiennymi w krótkim i długim okresie / kointegracji. Pytanie brzmi teraz, czy należy uruchamiać VAR na poziomach, czy na pierwszych różnicach.

druga

Podczas prognozowania nie trzeba najpierw różnicować danych I (1). Możesz, jeśli chcesz, pomyślał zaskakująco wielu praktykujących. Pamiętaj, że kiedy mamy serie niestacjonarne, nadal możemy uzyskać spójny estymator. Dla regresji z pojedynczym opóźnieniem zmiennej zależnej jest to intuicyjne. Jeśli seria podąża losowym spacerem (tj. Niestacjonarnym), wiemy, że najlepszym oszacowaniem tego, gdzie będzie następny okres, jest dokładnie to, gdzie był ostatni okres (tj. Beta wynosi 1). Standardowe błędy oszacowań pochodzących z modeli z danymi niestacjonarnymi są jednak różne, ponieważ ściśle mówiąc, wariancja oszacowania zbliża się do nieskończoności, gdy T zbliża się do nieskończoności. Nie stanowi to jednak problemu przy prognozowaniu. Prognozowanie jest zasadniczo warunkowym oczekiwaniem i dlatego opiera się tylko na szacunkach parametrów twojego modelu, a nie na standardowych błędach. Co więcej, przedziały prognozowania Twojej prognozy będą albo uzyskiwane bezpośrednio z twoich błędów, przez błędy ładowania początkowego, lub jeśli masz dużo danych za pomocą empirycznych przedziałów prognoz (mój ulubiony!), Na wszystkie te podejścia nie mają wpływu dane niestacjonarne ponieważ znowu Twoje błędy będą nieruchome, zgodnie z powyższą dyskusją o fałszywej regresji.

Dlaczego mnie to obchodzi?

Test ADF ma niską moc, szczególnie gdy seria jest bliska zrootowania jednostkowego, ale nie jest. Mówiąc inaczej, test ADF będzie miał tendencję do błędnego stwierdzania, że ​​seria nie jest stacjonarna, podczas gdy w rzeczywistości tak nie jest.

Załóżmy, że test ADF nieprawidłowo zapewnia, że ​​seria nie jest stacjonarna. Jeśli dokonasz wszystkich niezbędnych transformacji i oszacujesz VECM, twoja prognoza będzie błędna, ponieważ twój model jest zły. Dlatego ludzie prognozują poziomy.

Co z przyczynami Granger?

Możesz nawet przetestować GC z VAR na poziomach, gdy dane to I (1). Wiem, że to brzmi szalenie. Wiemy, że wnioskowanie zwykle nie jest możliwe w przypadku danych niestacjonarnych. Można jednak przetestować wspólne hipotezy, np. GC. Pokazano to w Toda i Yamamoto (1995), które czerpie z Simów, Stocka i Watsona (1990). Aplikację można znaleźć na stronie http://davegiles.blogspot.com/2011/04/testing-for-granger-causality.html .

Ostatnia rzecz

Jeśli jednak chcesz używać VAR do celów innych niż prognozowanie, bądź ostrożny. VAR poziomów z niestacjonarnymi i zintegrowanymi seriami może przynieść dziwne wyniki. Na przykład, ściśle mówiąc, reprezentacja średniej ruchomej VAR nie istnieje, ponieważ macierz parametrów nie będzie odwracalna. Mimo tego IRF nadal można uzyskać. Wnioskowanie jest również niewykonalne (hipotezy stawów myślowych można przetestować, jak omówiono powyżej).

Również martw się o małe próbki. Wszystko, co omówiłem, działa dobrze w dużej próbce, ale w małych próbkach rzeczy mogą się zwariować. Jest to szczególnie prawdziwe w przypadku GC z danymi I (1).

Jacob H.
źródło
1
Jeśli chodzi o po pierwsze , czy możesz poprzeć swoje roszczenie referencją? Nie przekonuje mnie twoja argumentacja. Jeśli i x t są niezależnymi przypadkowymi spacerami, model y t = β 0 + β 1 y t - 1 + +ytxtyt=β0+β1yt-1++βpyt-p+γxtγ^OL.S.zbliża się do zera (czy to? gdzie jest dowód?), problem stopniowo znika. Ale jak duża próbka jest do tego potrzebna? Dopóki nie otrzymam dowodu, nadal unikałbym fałszywych związków.
Richard Hardy
1
Odnośnie dlaczego mnie to obchodzi? , jeśli proces ma katalog główny bardzo zbliżony do katalogu głównego, zachowuje się bardzo podobnie jak proces rootowania. Podczas prognozowania różnica między zakładaniem trwałości szoków a utrzymywaniem, że zanikają one bardzo powoli, jest więc niewielka. O ile nie prognozujesz bardzo daleko w przyszłość, wynik będzie praktycznie taki sam. Dlatego nie martwię się zbytnio o to, że test korzeniowy jednostki ma niską moc dla lokalnych alternatyw.
Richard Hardy
1
Kolejna mała uwaga dotycząca po pierwsze : kiedy mówimy o teście ADF w Dlaczego to mnie obchodzi? , mówisz: „Twoja prognoza będzie błędna, ponieważ twój model jest zły”. Cóż, dotyczy to również First , prawda? Prognozowanie przy użyciu modelu, w którym lewa strona odchyla się od prawej, rzeczywiście charakteryzuje się powyższym cytatem.
Richard Hardy
1
@Richardhardy Aby uzyskać dowód na moje pierwsze stwierdzenie, patrz rozdział 18 w Hamilton 1994. W szczególności rozdział 18.2, Lekarstwa na fałszywą regresję. Warto zauważyć, że estymatory OLS są również wydajne, ponieważ zbiegają się w tempie sqrt T.
Jacob H
2
@erdogancevher link Giles dyskutuje o wiele więcej niż stronniczość przed testem, w szczególności przeczytaj artykuł Tody i Yamamoto, co wyraźnie dowodzi, że GC jest wykonalne w ramach VAR CI. Co więcej, myślę, że nie rozumiesz problemu z testem wstępnym. Problem z testem dla rootowania jednostek polega na tym, że wszystkie mają niską moc w stosunku do procesu rootowania w pobliżu jednostki. Mówiąc inaczej, gdy masz root blisko jednostki, twój test prawdopodobnie znajdzie root root. Doprowadzi Cię to do niepotrzebnego filtrowania danych, które poważnie wpłyną na twoje wyniki. Dlatego lepiej jest, aby IMO używało VAR
Jacob H