VAR-Prognosemethode


19

Ich erstelle ein VAR-Modell, um den Preis eines Vermögenswerts zu prognostizieren, und möchte wissen, ob meine Methode statistisch fundiert ist, ob die von mir eingeschlossenen Tests relevant sind und ob weitere erforderlich sind, um eine zuverlässige Prognose auf Grundlage meiner Eingabevariablen zu gewährleisten.

Nachstehend ist mein aktueller Prozess zur Überprüfung der Granger-Kausalität und zur Vorhersage des ausgewählten VAR-Modells aufgeführt.

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")

Ist diese Methode gut?


1
Verwenden Sie zweite Unterschiede? Dies ist etwas ungewöhnlich und könnte das Modell empfindlicher machen, als es sein muss. Können Sie auch eine Integration in Ihr System erwarten? Und was ist mit deterministischen Zeittrends und / oder Saisonalitäten, haben Sie diese überprüft?
Richard Hardy

@Richard, die Unterschiede zur Erreichung der Stationarität sind meines Wissens nach durch den adf-Test festgelegt und würden entsprechend seinem Vorschlag angepasst. Sollte der ADF-Test feststellen, dass er stationär ist (Rückgabe 0, ich würde die Variable nicht unterscheiden). Ich habe nicht an Kointegration und Saisonalität gedacht, aber ich hatte den Eindruck, dass die obige Methode jeden Trend in den Variablen berücksichtigen würde.
gerade diesen

2
ADF-Test ist nur ein Test, er hat seine Grenzen. Das Zeichnen der Rohdaten, der ersten Unterschiede und eventuell der zweiten Unterschiede ist möglicherweise informativer als nur das Ausführen des Tests. Der ADF-Test hat auch verschiedene Spezifikationen: (1) keine Konstante, kein Trend; (2) konstant, kein Trend; (3) konstant und trend; Die Auswahl der Verzögerungsreihenfolge für den Test kann auch nicht trivial sein. Verlassen Sie sich daher nicht blind auf die Ergebnisse. Aus der Sicht des Gegenstands werden die Vermögenspreise normalerweise in der Reihenfolge eins, I (1), integriert. Ich (2) wäre schwer zu rechtfertigen ...
Richard Hardy

@youjustreadthis habe ich eine Antwort unten eingeschlossen. Ich empfehle Ihnen nachdrücklich, einige seiner Implikationen in Betracht zu ziehen
Jacob H

Antworten:


28

Ich denke, Sie haben es ziemlich richtig verstanden, aber beim Erstellen eines VAR-Modells stelle ich normalerweise sicher, dass ich die folgenden Schritte befolge:

1. Wählen Sie die Variablen aus

Dies ist der wichtigste Teil beim Erstellen Ihres Modells. Wenn Sie den Preis eines Vermögenswerts prognostizieren möchten, müssen Sie Variablen einbeziehen, die mit dem Mechanismus der Preisbildung zusammenhängen. Der beste Weg, dies zu tun, ist ein theoretisches Modell. Da Sie nicht erwähnt haben, was der Vermögenswert ist und welche anderen Variablen Sie in Ihr Modell aufgenommen haben, kann ich zu diesem Artikel nicht viel sagen. Eine Zusammenfassung der Vermögenswert-Preismodelle finden Sie hier .

2. Überprüfen Sie die Daten und nehmen Sie die richtigen Einstellungen vor

Nachdem Sie die Variablen ausgewählt haben, können Sie einige Anpassungen an den Daten vornehmen, um die Schätzung und Interpretation des Modells zu verbessern. Es ist nützlich, zusammenfassende Statistiken zu verwenden und einen Plot der Reihe anzuzeigen, um Ausreißer, fehlende Daten und andere seltsame Verhaltensweisen zu erkennen. Bei der Arbeit mit Preisdaten nehmen die Menschen normalerweise natürliche Protokolle, was eine varianzstabilisierende Transformation darstellt und auch eine gute Interpretation hat (Preisunterschiede in Protokollen werden kontinuierlich zu zusammengesetzten Renditen). Ich bin mir nicht sicher, ob Sie Protokolle erstellt haben, bevor Sie das Modell schätzen, aber es ist eine gute Idee, dies zu tun, wenn Sie mit Asset-Preisen arbeiten.

3. Überprüfen Sie, ob die Daten instationäre Komponenten enthalten

Jetzt können Sie mithilfe von Unit-Root-Tests prüfen, ob Ihre Serien stationär sind. Wenn Sie nur an Prognosen interessiert sind, wie von @JacobH angegeben, können Sie VAR in Ebenen ausführen, auch wenn Ihre Serien nicht stationär sind. Dann können Sie Ihren Standardfehlern jedoch nicht vertrauen, was bedeutet, dass Sie keine Rückschlüsse auf den Wert von ziehen können die Koeffizienten. Sie haben stationär mit dem ADF-Test getestet, der in diesen Anwendungen sehr häufig verwendet wird. Beachten Sie jedoch, dass Sie angeben sollten, ob Sie den Test ohne i) Konstante und ohne Trend ausführen möchten. ii) ein konstanter und kein Trend; und iii) eine Konstante und ein Trend. Normalerweise weisen Preisreihen stochastische Trends auf, sodass ein linearer Trend nicht genau ist. In diesem Fall können Sie die Spezifikation wählen. Ii. In Ihrem Code haben Sie diendiffsFunktion des Prognosepakets. Ich bin nicht sicher, welche dieser drei Alternativen diese Funktion implementiert, um die Anzahl der Unterschiede zu berechnen (ich konnte sie in der Dokumentation nicht finden). Um Ihr Ergebnis zu überprüfen, können Sie die ur.dfFunktion im Paket "urca" verwenden:

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

Beachten Sie, dass dieser Befehl den ADF-Test mit einer Konstanten und den vom AIC-Befehl ausgewählten Verzögerungen mit einer maximalen Verzögerung von 10 ausführt. Wenn Sie Probleme bei der Interpretation der Ergebnisse haben, sehen Sie sich diese Frage an . Wenn es sich bei der Reihe um I (1) handelt, verwenden Sie einfach die Differenz, die der fortlaufenden Verzinsung entspricht. Wenn der Test anzeigt, dass die Serien I (2) sind und Sie Zweifel haben, dass Sie andere Tests verwenden können, z. B. Phillips-Perron-Test (PP.testFunktion in R). Wenn alle Tests bestätigen, dass Ihre Serie I (2) ist (denken Sie daran, das Protokoll der Serie zu verwenden, bevor Sie die Tests ausführen), nehmen Sie den zweiten Unterschied, aber beachten Sie, dass sich Ihre Interpretation der Ergebnisse ändern wird, da Sie jetzt mit dem arbeiten Differenz der fortlaufenden Verzinsung. Die Preise von Vermögenswerten sind normalerweise I (1), da sie sich einem zufälligen Spaziergang nähern, was ein weißes Rauschen ist, wenn die erste Differenz angewendet wird.

4. Wählen Sie die Reihenfolge des Modells

Dies kann mit gängigen Kriterien wie Akaike, Schwarz (BIC) und Hannan-Quinn erfolgen. Sie haben das mit der VARselectFunktion gemacht und das ist richtig, aber denken Sie daran, welches Kriterium Sie für Ihre Entscheidung verwendet haben. In der Regel weisen unterschiedliche Kriterien auf unterschiedliche Aufträge für den VAR hin.

5. Überprüfen Sie, ob es integrierende Beziehungen gibt

Wenn alle Serien I (1) oder I (2) sind, sollten Sie vor dem Ausführen eines VAR-Modells in der Regel prüfen, ob es keine Kointegrationsbeziehungen zwischen den Serien gibt, insbesondere, wenn Sie eine Impulsantwortanalyse mit dem durchführen möchten Residuen. Dies können Sie mit dem Johansenn-Test oder dem Engle-Granger (nur für bivariate Modelle) durchführen. In R können Sie den Johansen-Test mit der ca.joFunktion des Pakets "urca" ausführen. Beachten Sie, dass dieser Test auch andere Spezifikationen hat. Für Preisreihen verwende ich normalerweise den folgenden Code (wobei pdie Verzögerungslänge von Punkt 4 ist, ausgeführt mit den Reihen in Stufen):

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

6. Schätzen Sie das Modell

Wenn Ihre Reihen nicht integriert sind, können Sie das Modell mit dem VARBefehl wie in Ihrem Code beschrieben leicht abschätzen . Wenn die Reihen kointegriert sind, müssen Sie die langfristige Beziehung berücksichtigen, indem Sie ein Vektorfehlerkorrekturmodell mit dem folgenden Code schätzen (wobei kdie Reihenfolge der Kointegration gilt):

vecm <- cajorls(joeigen, r = k)

7. Führen Sie Diagnosetests durch

Um zu testen, ob Ihr Modell gut spezifiziert ist, können Sie einen Test der seriellen Korrelation für die Residuen durchführen. In Ihrem Code haben Sie einen Portmanteau-Test mit der serial.testFunktion verwendet. Ich habe diese Funktion noch nie benutzt, finde sie aber in Ordnung. Im Paket MTS ist auch eine multivariate Version des Ljung-Box-Tests implementiert, die Sie mit der Funktion ausführen können mq.

8. Machen Sie Vorhersagen

Wenn Sie sicher sind, dass Ihr Modell gut spezifiziert ist, können Sie die predictFunktion wie in Ihrem Code verwenden. Sie können sogar Impulsantwortfunktionen zeichnen, um zu überprüfen, wie die Variablen mit der irfFunktion auf einen bestimmten Schock reagieren .

9. Vorhersagen auswerten

Sobald Sie Ihre Vorhersagen getroffen haben, müssen Sie diese auswerten und mit anderen Modellen vergleichen. Einige Methoden zur Bewertung der Genauigkeit von Vorhersagen finden Sie hier. Hierzu ist es jedoch entscheidend, dass Sie Ihre Serie in ein Training und ein Testset unterteilen, wie im Link erläutert.


Vielen Dank für diese ausführliche Antwort! Ändert sich in Bezug auf den Johansen-Test für die Kointegration die Implementierung, wenn mehr als 2 Variablen enthalten sind? Glauben Sie mir, ich habe gelesen, dass die Integration von Mulit mit eigenen Fallstricken verbunden ist. Entschuldigung, wenn dies für eine eigene Frage besser geeignet ist.
gerade diesen

1
Nein, Sie können es mit dem gleichen Code wie oben tun, aber in diesem Fall finden Sie möglicherweise mehr als einen Kointegrationsvektor. Die einzige Einschränkung dieser Art ist der Engle-Granger-Test, der nur für bivariate Serien geeignet ist, in diesem Fall aber in der Regel besser.
Regis A. Ely

1
Dieser Link kann dazu beitragen, Johansenn-Tests auszuführen und zu interpretieren.
Regis A. Ely

Gut gemacht! Ich habe zwar einige Formatierungen und Rechtschreibung bearbeitet. Beachten Sie, dass es schön ist, Codestücke (auch so klein wie Funktionsnamen) in Backticks zu haben, z predict. Größere Codeteile können als Code formatiert werden, indem Sie den Text auswählen und oben im Editorfenster auf die Schaltfläche "Anführungszeichen" klicken.
Richard Hardy

@RichardHardy, netter Überblick über das VAR-Schätzverfahren. Ich denke jedoch, dass Sie die Tatsache, die das OP vorhersagen möchte, möglicherweise ignoriert haben. Infolgedessen möchte er / sie wahrscheinlich in Stufen schätzen.
Jacob H

9

Ich dachte, ich würde Regis A Ely eine sehr nette Antwort hinzufügen. Seine Antwort ist nicht falsch, aber die Verwendung einer VAR für die Vorhersage unterscheidet sich von der Verwendung einer VAR für andere VAR-Typen (z. B. IRF, FEVD, Historical Decomp. Usw.). Infolgedessen wirken sich einige der von Regis A Ely beschriebenen Schritte in einigen Fällen negativ auf Ihre Prognose aus.

Haftungsausschluss:

Wenn ich mich auf instationäre Daten beziehe, meine ich, dass die Serie einen stochastischen Trend enthält. Wenn die Daten einen zeitlichen / saisonalen Trend aufweisen, müssen sie entsprechend gefiltert werden.

Zuerst

Im Allgemeinen besteht in einem uneingeschränkten VAR keine Notwendigkeit, sich über eine falsche Beziehung Gedanken zu machen. Eine falsche Regression tritt auf, wenn Sie eine instationäre Reihe (Y) auf eine andere instationäre Reihe (X) zurückführen und beide Reihen nicht zusammengeführt werden. Wenn Sie jedoch Y auf X sowie Verzögerungen von Y zurückführen, ist die Regression nicht störend, da die Einbeziehung der Verzögerung Y sicherstellt, dass die Fehler stationär sind. Mit anderen Worten, Verzögerungen von Y nehmen die Variation auf, die zuvor fälschlicherweise X zugewiesen wurde. Da eine uneingeschränkte VAR im Wesentlichen ein System von ARDL-Regressionen ist, bei denen jede Gleichung die gleiche Anzahl von Verzögerungen und Regressoren enthält, sollte klar sein, dass es sich um eine falsche Regression handelt daher dürfte das kein problem sein. Anders gesagt, wenn Ihre Daten alle I (1) sind, können Sie eine VAR ausführen, unabhängig davon, ob sie mitintegriert sind oder nicht. VECM ist nur erforderlich, wenn Sie die Beziehung zwischen Variablen für kurze und lange Zeiträume sowie für die Ko-Integration modellieren und identifizieren möchten. Die Frage ist nun, ob Sie die VAR in Ebenen oder in ersten Unterschieden ausführen.

Zweite

Bei der Vorhersage ist es nicht erforderlich, zuerst I (1) -Daten zu differenzieren. Sie können, wenn Sie möchten, dachte eine überraschend große Anzahl von Praktizierenden, dies nicht tun. Denken Sie daran, dass wir bei instationären Reihen immer noch einen konsistenten Schätzer erhalten können. Für eine Regression mit einer einzelnen Verzögerung der abhängigen Variablen ist dies intuitiv. Wenn eine Serie einer zufälligen Wanderung folgt (dh nicht stationär ist), wissen wir, dass die beste Schätzung, wo sie sich in der nächsten Periode befindet, genau dort ist, wo sie die letzte Periode war (dh Beta ist 1). Die Standardfehler von Schätzungen, die aus Modellen mit instationären Daten abgeleitet wurden, sind jedoch unterschiedlich, da sich die Varianz der Schätzung genau genommen der Unendlichkeit nähert, wenn sich T der Unendlichkeit nähert. Dies ist jedoch kein Problem für die Prognose. Die Vorhersage ist im Wesentlichen eine bedingte Erwartung und stützt sich daher nur auf die Parameterschätzungen Ihres Modells und nicht auf Standardfehler. Darüber hinaus werden Vorhersageintervalle Ihrer Vorhersage entweder direkt aus Ihren Fehlern, durch Bootstrapping-Fehler oder, wenn Sie über empirische Vorhersageintervalle (mein Favorit!) Über viele Daten verfügen, durch instationäre Daten nicht beeinflusst weil wieder Ihre Fehler stationär sein werden, wie in unserer obigen Diskussion über falsche Regression beschrieben.

Warum kümmert es mich?

Der ADF-Test hat eine geringe Leistung, insbesondere wenn die Serie nahe an der Einheitswurzel liegt, dies jedoch nicht ist. In einem anderen Fall wird der ADF-Test fälschlicherweise behaupten, dass eine Serie nicht stationär ist, obwohl dies tatsächlich nicht der Fall ist.

Angenommen, Ihr ADF-Test stellt fälschlicherweise sicher, dass die Serie nicht stationär ist. Wenn Sie alle notwendigen Transformationen vornehmen und ein VECM schätzen, wird Ihre Prognose falsch sein, da Ihr Modell falsch ist. Dies ist der Grund, warum Menschen in Ebenen prognostizieren.

Was ist mit Granger-Kausalität ???

Sie können den GC sogar mit einem VAR in Stufen testen, wenn die Daten I (1) sind. Ich weiß, das hört sich verrückt an. Wir wissen, dass Inferenz mit instationären Daten normalerweise nicht möglich ist. Es ist jedoch möglich, gemeinsame Hypothesen, z. B. GC, zu testen. Dies wird in Toda und Yamamoto (1995) gezeigt, die sich auf Sims, Stock und Watson (1990) stützen. Eine Anwendung finden Sie unter http://davegiles.blogspot.com/2011/04/testing-for-granger-causality.html .

Letztes Ding

Wenn Sie Ihre VAR jedoch nicht für Prognosen verwenden möchten, seien Sie vorsichtig. Ein VAR in Ebenen mit instationären und co-integrierten Reihen kann zu seltsamen Ergebnissen führen. Streng genommen ist die Darstellung des gleitenden Durchschnitts der VAR beispielsweise nicht vorhanden, da die Parametermatrix nicht invertierbar ist. Trotz dieser Tatsache kann immer noch eine IRF erhalten werden. Inferenz ist auch nicht möglich (gemeinsame Hypothesen können wie oben diskutiert getestet werden).

Sorgen Sie sich auch um kleine Proben. Alles, was ich besprochen habe, funktioniert in großen Samples gut, aber in kleinen Samples kann es verrückt werden. Dies gilt insbesondere für GC mit I (1) -Daten.


1
In Bezug auf Ersteytxtyt=β0+β1yt-1++βpyt-p+γxtγ^OLSnähert sich Null (ist das der Beweis? Wo ist der Beweis?), verschwindet das Problem allmählich. Aber wie groß ist die Stichprobe dafür? Bis ein Beweis erbracht ist, würde ich weiterhin falsche Beziehungen vermeiden.
Richard Hardy

1
In Bezug auf Warum kümmern kann ich? Wenn der Prozess eine Wurzel hat, die einer Unit-Wurzel sehr nahe kommt, verhält er sich ähnlich wie ein Unit-Wurzel-Prozess. Bei der Vorhersage besteht daher kaum ein Unterschied zwischen der Annahme, dass die Stöße dauerhaft sind und der Annahme, dass sie extrem langsam verschwinden. Wenn Sie nicht sehr weit in die Zukunft prognostizieren, wird das Ergebnis praktisch dasselbe sein. Aus diesem Grund mache ich mir keine Sorgen darüber, dass der Unit-Root-Test nur eine geringe Leistung für lokale Alternativen bietet.
Richard Hardy

1
Noch ein kleiner Hinweis zu First : Wenn ich über den ADF-Test spreche in Warum interessiert es mich? Sie sagen, "Ihre Prognose wird falsch sein, weil Ihr Modell falsch ist". Nun, das gilt auch für First , nicht wahr? Die Vorhersage unter Verwendung eines Modells, bei dem die linke Seite von der rechten Seite abweicht, ist in der Tat durch das obige Zitat gekennzeichnet.
Richard Hardy

1
@Richardhardy Ein Beweis für meine erste Behauptung ist in Kapitel 18 in Hamilton 1994 zu finden. Es ist erwähnenswert, dass die OLS-Schätzer auch effizient sind, da sie mit einer Geschwindigkeit von T.
Jacob H.

1
@RichardHardy dein zweiter Kommentar ist ein fairer Punkt. Dachte, meine Antwort ist, warum verbringen Sie Zeit vor dem Testen und dann Filtern von Daten, um möglicherweise das falsche Modell zu schätzen. Für die Vorhersage wird die Level-Spezifikation im Allgemeinen korrekt sein
Jacob H
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.