Méthodologie de prévision VAR


19

Je construis un modèle VAR pour prévoir le prix d'un actif et je voudrais savoir si ma méthode est statistiquement solide, si les tests que j'ai inclus sont pertinents et si d'autres sont nécessaires pour assurer une prévision fiable basée sur mes variables d'entrée.

Ci-dessous se trouve mon processus actuel pour vérifier la causalité de Granger et prévoir le modèle VAR sélectionné.

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

Cette méthode est-elle valable?


1
Utilisez-vous des secondes différences? C'est un peu inhabituel et pourrait rendre le modèle plus sensible qu'il ne devrait l'être. Pouvez-vous également vous attendre à une cointégration dans votre système? Et qu'en est-il des tendances temporelles et / ou saisonnalités déterministes, les avez-vous vérifiées?
Richard Hardy

@ Richard, les différences pour atteindre la stationnarité sont, autant que je comprends, déterminées par le test adf, et seraient ajustées en fonction de sa suggestion. Si le test adf détermine qu'il est stationnaire (retourne 0, je ne ferais pas de différence avec la variable). Je n'ai pas pensé à la cointégration et à la saisonnalité, mais j'avais l'impression que la méthode ci-dessus prendrait en charge toute tendance des variables.
youjustreadthis

2
Le test ADF n'est qu'un test, il a ses limites. Le traçage des données brutes, les premières différences et éventuellement les secondes différences peuvent être plus informatifs que l'exécution du test. De plus, le test ADF a des spécifications différentes: (1) pas de constante, pas de tendance; (2) constant, aucune tendance; (3) constante et tendance; la sélection de l'ordre de décalage pour le test peut également être non triviale. Par conséquent, ne vous fiez pas aveuglément aux résultats. Du point de vue du sujet, les prix des actifs sont généralement intégrés de l'ordre un, I (1). Je (2) serait difficile à justifier ...
Richard Hardy

@youjustreadthis J'ai inclus une réponse ci-dessous. Je vous recommande fortement de considérer certaines de ses implications
Jacob H

Réponses:


28

Je pense que vous avez bien compris, mais lors de la construction d'un modèle VAR, je m'assure généralement de suivre ces étapes:

1. Sélectionnez les variables

C'est la partie la plus importante de la construction de votre modèle. Si vous souhaitez prévoir le prix d'un actif, vous devez inclure des variables liées au mécanisme de formation des prix. La meilleure façon d'y parvenir est d'utiliser un modèle théorique. Puisque vous n'avez pas mentionné quel est l'actif et quelles sont les autres variables que vous avez incluses dans votre modèle, je ne peux vraiment pas en dire beaucoup sur cet article, mais vous pouvez trouver un résumé des modèles de tarification des actifs ici .

2. Vérifiez les données et effectuez les réglages appropriés

Une fois que vous avez sélectionné les variables, vous pouvez apporter quelques ajustements aux données qui amélioreront l'estimation et l'interprétation du modèle. Il est utile d'utiliser des statistiques récapitulatives et de voir un tracé de la série pour détecter les valeurs aberrantes, les données manquantes et d'autres comportements étranges. Lorsque vous travaillez avec des données de prix, les gens prennent généralement des journaux naturels, ce qui est une transformation stabilisatrice de la variance et a également une bonne interprétation (la différence de prix dans les journaux devient des rendements composés continus). Je ne sais pas si vous avez pris des journaux avant d'estimer le modèle, mais c'est une bonne idée de le faire si vous travaillez avec les prix des actifs.

3. Vérifiez si les données contiennent des composants non stationnaires

Vous pouvez maintenant utiliser des tests de racine unitaire pour vérifier si vos séries sont stationnaires. Si vous êtes uniquement intéressé par les prévisions, comme indiqué par @JacobH, vous pouvez exécuter VAR dans les niveaux même lorsque vos séries ne sont pas stationnaires, mais vos erreurs standard ne peuvent pas être fiables, ce qui signifie que vous ne pouvez pas faire d'inférence sur la valeur de les coefficients. Vous avez testé stationnaire à l'aide du test ADF, qui est très couramment utilisé dans ces applications, mais notez que vous devez spécifier si vous souhaitez exécuter le test avec i) aucune constante et aucune tendance; ii) une tendance constante et aucune tendance; et iii) une constante et une tendance. Habituellement, les séries de prix ont des tendances stochastiques, donc une tendance linéaire ne sera pas précise. Dans ce cas, vous pouvez choisir la spécification ii. Dans votre code, vous avez utilisé lendiffsfonction de l'ensemble de prévisions. Je ne sais pas laquelle de ces trois alternatives cette fonction implémente pour calculer le nombre de différences (je ne l'ai pas trouvée dans la documentation). Pour vérifier votre résultat, vous pouvez utiliser la ur.dffonction dans le package "urca":

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

Notez que cette commande exécutera le test ADF avec une constante et les décalages sélectionnés par la commande AIC, avec un décalage maximum de 10. Si vous avez des problèmes d'interprétation des résultats, regardez cette question . Si les séries sont I (1), utilisez simplement la différence, qui sera égale aux rendements composés en continu. Si le test indique que la série est I (2) et que vous avez des doutes sur le fait que vous pouvez utiliser d'autres tests, par exemple le test de Phillips-Perron (PP.testfonction dans R). Si tous les tests confirment que votre série est I (2) (n'oubliez pas d'utiliser le journal de la série avant d'exécuter les tests), prenez la deuxième différence, mais notez que votre interprétation des résultats changera, puisque maintenant vous travaillez avec le différence des rendements composés en continu. Les prix des actifs sont généralement I (1) car ils sont proches d'une marche aléatoire, ce qui est un bruit blanc lors de l'application de la première différence.

4. Sélectionnez l'ordre du modèle

Cela peut être fait avec des critères couramment utilisés tels que Akaike, Schwarz (BIC) et Hannan-Quinn. Vous l'avez fait avec la VARselectfonction et c'est vrai, mais rappelez-vous quel est le critère que vous avez utilisé pour prendre votre décision. Des critères généralement différents indiquent des commandes différentes pour le VAR.

5. Vérifiez s'il existe des relations de cointégration

Si toutes vos séries sont I (1) ou I (2), avant d'exécuter un modèle VAR, c'est généralement une bonne idée de vérifier s'il n'y a pas de relations de cointégration entre les séries, spécialement si vous voulez faire une analyse de réponse impulsionnelle avec le résidus. Vous pouvez le faire en utilisant le test de Johansenn ou Engle-Granger (uniquement pour les modèles bivariés). Dans R, vous pouvez exécuter le test Johansen avec la ca.jofonction du package "urca". Notez que ce test a également des spécifications différentes. Pour les séries de prix, j'utilise généralement le code suivant (où pest la longueur de décalage de l'article 4, effectuée avec la série en niveaux):

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

6. Estimer le modèle

Si vos séries ne sont pas cointégrées, vous pouvez facilement estimer le modèle avec la VARcommande, comme cela se fait dans votre code. Dans le cas où les séries sont cointégrées, vous devez considérer la relation à long terme en estimant un modèle de correction d'erreur vectorielle avec le code suivant (où kest l'ordre de cointégration):

vecm <- cajorls(joeigen, r = k)

7. Exécutez des tests de diagnostic

Pour tester si votre modèle est bien spécifié, vous pouvez exécuter un test de corrélation série sur les résidus. Dans votre code, vous avez utilisé un test Portmanteau avec la serial.testfonction. Je n'ai jamais utilisé cette fonction mais je pense que c'est OK. Il existe également une version multivariée du test Ljung-Box implémentée dans le package MTS que vous pouvez exécuter avec la fonction mq.

8. Faites des prédictions

Une fois que vous êtes sûr que votre modèle est bien spécifié, vous pouvez utiliser la predictfonction comme vous l'avez fait dans votre code. Vous pouvez même tracer des fonctions de réponse impulsionnelle pour vérifier comment les variables répondent à un choc particulier à l'aide de la irffonction.

9. Évaluer les prédictions

Une fois que vous avez fait vos prédictions, vous devez les évaluer et comparer avec d'autres modèles. Certaines méthodes pour évaluer l'exactitude des prévisions peuvent être trouvées ici , mais pour ce faire, il est essentiel de diviser votre série en une formation et un ensemble de tests, comme expliqué dans le lien.


Merci beaucoup pour cette réponse détaillée! En ce qui concerne le test de Johansen pour la cointégration, l'implémentation change-t-elle lorsque plus de 2 variables sont incluses? Je crois avoir lu que la multi-intégration comporte ses propres pièges. Désolé si cela convient mieux à une question qui lui est propre.
youjustreadthis

1
Non, vous pouvez le faire avec le même code que ci-dessus, mais vous pouvez trouver plus d'un vecteur de cointégration dans ce cas. La seule limitation de ce type est le test Engle-Granger, qui ne convient que pour les séries bivariées, mais généralement mieux dans ce cas.
Regis A. Ely

1
Ce lien peut aider à exécuter et à interpréter les tests de johansenn.
Regis A. Ely

Bon travail! J'ai cependant modifié certains formats et orthographes. Notez qu'il est agréable d'avoir des morceaux de code (même aussi petits que les noms de fonctions) dans les backticks `, par exemple predict. Les plus gros morceaux de code peuvent être formatés sous forme de code en sélectionnant le texte et en cliquant sur le bouton "guillemets" en haut de la fenêtre de l'éditeur.
Richard Hardy

@RichardHardy, joli aperçu de la procédure d'estimation VAR. Cependant, je pense que vous avez peut-être ignoré le fait que le PO souhaite prévoir. Par conséquent, il / elle voudra probablement estimer en niveaux.
Jacob H

9

J'ai pensé ajouter à Regis A Ely une très belle réponse. Sa réponse n'est pas fausse, mais utiliser un VAR pour prévoir est différent que d'utiliser un VAR pour faire d'autres choses de type VAR (ie IRF, FEVD, Historical Decomp. Etc ...). Par conséquent, certaines des étapes décrites par Regis A Ely affecteront négativement vos prévisions dans certains cas.

Avertissement:

Lorsque je fais référence à des données non stationnaires, je veux dire que la série contient une tendance stochastique. Si les données ont une tendance temporelle / saisonnière, elles doivent être filtrées de manière appropriée.

Premier

D'une manière générale, dans un VAR sans restriction, il n'est pas nécessaire de s'inquiéter d'une relation erronée. Une régression parasite se produit lorsque vous régressez une série non stationnaire (Y) sur une autre série non stationnaire (X) et que les deux séries ne sont pas cointégrées. Cependant, si vous régressez Y sur X ainsi que les décalages de Y, la régression ne sera pas fausse car l'inclusion du décalage Y garantit que les erreurs seront stationnaires. Autrement dit, les décalages de Y reprennent la variation qui a été précédemment attribuée à tort à X. Puisqu'un VAR non restreint est essentiellement un système de régressions ARDL où chaque équation contient le même nombre de décalages et de régresseurs, il doit être clair qu'une régression parasite est donc pas susceptible d'être un problème. Autrement dit, si vos données sont toutes I (1), qu'elles soient ou non co-intégrées, vous pouvez exécuter un VAR. VECM n'est nécessaire que si vous souhaitez à la fois modéliser et identifier la relation à court et à long terme / co-intégration entre les variables. La question est maintenant, si vous exécutez le VAR dans les niveaux ou dans les premières différences.

Seconde

Lors de la prévision, il n'est pas nécessaire de différencier d'abord les données I (1). Vous pouvez si vous le souhaitez, pensa un nombre surprenant de pratiquants. N'oubliez pas que lorsque nous avons une série non stationnaire, nous pouvons toujours obtenir un estimateur cohérent. Pour une régression avec un seul décalage de la variable dépendante, cela est intuitif. Si une série suit une marche aléatoire (c.-à-d. Non stationnaire), nous savons que la meilleure estimation de l'endroit où elle sera la prochaine période est exactement où elle était la dernière période (c.-à-d. Bêta est 1). Les erreurs standard des estimations dérivées de modèles avec des données non stationnaires, cependant, sont différentes parce qu'à proprement parler, la variance de l'estimation s'approche de l'infini comme T approche de l'infini. Ce n'est cependant pas un problème pour les prévisions. La prévision est essentiellement une attente conditionnelle et ne dépend donc que des estimations des paramètres de votre modèle et non des erreurs standard. De plus, les intervalles de prédiction de vos prévisions seront obtenus directement à partir de vos erreurs, en amorçant des erreurs, ou si vous avez beaucoup de données via des intervalles de prédiction empiriques (mon préféré!), Ces trois approches ne sont pas affectées par des données non stationnaires car encore une fois vos erreurs seront stationnaires selon notre discussion de régression parasite ci-dessus.

Pourquoi je m'inquiète?

Le test ADF a une faible puissance, surtout lorsque la série est proche de la racine unitaire, mais ne l'est pas. Selon un autre, le test ADF aura tendance à affirmer à tort qu'une série n'est pas stationnaire alors qu'elle ne l'est pas.

Supposons que votre test ADF garantit à tort que la série n'est pas stationnaire. Si vous effectuez toutes les transformations nécessaires et estimez un VECM, vos prévisions seront fausses, car votre modèle est faux. C'est pourquoi les gens prévoient en niveaux.

Qu'en est-il de la causalité de Granger ???

Vous pouvez même tester GC avec un VAR en niveaux lorsque les données sont I (1). Je sais que ça semble fou. Nous savons que l'inférence n'est généralement pas possible avec des données non stationnaires. Il est cependant possible de tester des hypothèses conjointes, par exemple GC. C'est ce que montrent Toda et Yamamoto (1995) qui s'inspire de Sims, Stock et Watson (1990). Pour une application, voir http://davegiles.blogspot.com/2011/04/testing-for-granger-causality.html .

Dernière chose

Si toutefois vous souhaitez utiliser votre VAR pour autre chose que des prévisions, soyez prudent. Un VAR dans les niveaux avec des séries non stationnaires et co-intégrées peut donner des résultats étranges. Par exemple, à proprement parler, la représentation de la moyenne mobile du VAR n'existe pas car la matrice des paramètres ne sera pas inversible. Malgré cela, l'IRF peut toujours être obtenu. L'inférence n'est pas non plus réalisable (des hypothèses conjointes peuvent être testées comme discuté ci-dessus).

Soyez également préoccupé par les petits échantillons. Tout ce dont j'ai discuté fonctionne bien dans un grand échantillon, mais les choses peuvent devenir loufoques dans de petits échantillons. Cela est particulièrement vrai pour GC avec des données I (1).


1
ytxtyt=β0+β1yt-1++βpyt-p+γXtγ^OLSse rapproche de zéro (est-ce? où est la preuve?), le problème disparaît progressivement. Mais quelle taille d'échantillon est nécessaire pour cela? Jusqu'à ce qu'une preuve soit donnée, je continuerais à éviter les relations fallacieuses.
Richard Hardy

1
Concernant Pourquoi je m'en soucie? , si le processus a une racine très proche d'une racine unitaire, il se comporte de la même manière qu'un processus racine unitaire. Lors de la prévision, il y a donc peu de différence entre supposer que les chocs sont permanents et maintenir qu'ils disparaissent extrêmement lentement. À moins que vous ne prévoyiez très loin dans le futur, le résultat sera pratiquement le même. C'est pourquoi je ne suis pas trop inquiet du fait que le test de racine unitaire ait une faible puissance pour les alternatives locales.
Richard Hardy

1
Une autre petite note concernant First : lorsque vous parlez du test ADF dans Why do I care? , vous dites "vos prévisions vont être fausses, car votre modèle est faux". Eh bien, cela s'applique également à First , non? La prévision à l'aide d'un modèle dans lequel le côté gauche diverge du côté droit est en effet caractérisée par la citation ci-dessus.
Richard Hardy

1
@ Richardhardy Pour une preuve de ma première affirmation, voir le chapitre 18 dans Hamilton 1994. En particulier, la section 18.2, Cures for Spurious Regression. Il est à noter que les estimateurs OLS sont également efficaces car ils convergent à un rythme le carré de T.
Jacob H

1
@RichardHardy votre deuxième commentaire est un bon point. Je pensais que ma réplique est la raison pour laquelle passer du temps à pré-tester puis filtrer les données uniquement pour estimer potentiellement le mauvais modèle. Pour la prévision, la spécification des niveaux sera généralement correcte
Jacob H
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.