Metodologia di previsione VAR


19

Sto costruendo un modello VAR per prevedere il prezzo di una risorsa e vorrei sapere se il mio metodo è statisticamente valido, se i test che ho incluso sono pertinenti e se ne sono necessari altri per garantire una previsione affidabile basata sulle mie variabili di input.

Di seguito è riportato il mio attuale processo per verificare la causalità di Granger e prevedere il modello VAR selezionato.

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

Questo metodo è valido?


1
Stai usando le seconde differenze? Questo è un po 'insolito e potrebbe rendere il modello più sensibile di quanto debba essere. Inoltre, potresti aspettarti la cointegrazione nel tuo sistema? E per quanto riguarda le tendenze temporali deterministiche e / o le stagionalità, le hai verificate?
Richard Hardy,

@Richard, le differenze per raggiungere la stazionarietà sono per quanto ho capito determinate dal test adf, e sarebbero regolate in base al suo suggerimento. Se il test adf determina che è stazionario (restituire 0 Non differirei la variabile). Non ho pensato alla cointegrazione e alla stagionalità, ma avevo l'impressione che il metodo di cui sopra si sarebbe occupato di qualsiasi tendenza nelle variabili.
tu sei il

2
Il test ADF è solo un test, viene fornito con i suoi limiti. Tracciare i dati grezzi, le prime differenze e infine le seconde differenze possono essere più istruttive rispetto al semplice esecuzione del test. Inoltre, il test ADF ha diverse specifiche: (1) nessuna costante, nessuna tendenza; (2) costante, nessuna tendenza; (3) costante e tendenza; anche la selezione dell'ordine di ritardo per il test potrebbe non essere banale. Quindi, non fare affidamento cieco sui risultati. Dal punto di vista dell'oggetto, i prezzi delle attività sono generalmente integrati nell'ordine 1, I (1). I (2) sarebbe difficile da giustificare ...
Richard Hardy,

@youjustreadthis ho incluso una risposta qui sotto. Consiglio vivamente di prendere in considerazione alcune delle sue implicazioni
Jacob H,

Risposte:


28

Penso che tu abbia capito bene, ma quando costruisco un modello VAR, di solito mi assicuro di seguire questi passaggi:

1. Seleziona le variabili

Questa è la parte più importante della costruzione del tuo modello. Se si desidera prevedere il prezzo di una risorsa, è necessario includere le variabili correlate al meccanismo di formazione del prezzo. Il modo migliore per farlo è attraverso un modello teorico. Dal momento che non hai menzionato qual è l'asset e quali sono le altre variabili che hai incluso nel tuo modello, non posso davvero dire molto su questo articolo, ma puoi trovare un riepilogo dei modelli di prezzi degli asset qui .

2. Controllare i dati e apportare le modifiche appropriate

Dopo aver selezionato le variabili, è possibile apportare alcune modifiche ai dati che miglioreranno la stima e l'interpretazione del modello. È utile utilizzare statistiche riassuntive e visualizzare un grafico della serie per rilevare valori anomali, dati mancanti e altri comportamenti strani. Quando si lavora con i dati sui prezzi, le persone di solito prendono registri naturali, che è una trasformazione stabilizzante la varianza e ha anche una buona interpretazione (la differenza di prezzo nei registri diventa rendimenti composti costantemente). Non sono sicuro se hai preso i registri prima di stimare il modello, ma è una buona idea farlo se stai lavorando con i prezzi degli asset.

3. Controllare se i dati contengono componenti non stazionari

Ora puoi usare i test radice dell'unità per verificare se le tue serie sono stazionarie. Se sei interessato solo alla previsione, come notato da @JacobH, puoi eseguire VAR a livelli anche quando le tue serie sono non stazionarie, ma quindi i tuoi errori standard non possono essere considerati attendibili, il che significa che non puoi fare deduzione sul valore di i coefficienti. Hai provato stazionario usando il test ADF, che è molto comunemente usato in queste applicazioni, ma tieni presente che dovresti specificare se vuoi eseguire il test con i) nessuna costante e nessuna tendenza; ii) una tendenza costante e assente; e iii) una costante e una tendenza. Di solito le serie di prezzi hanno tendenze stocastiche, quindi una tendenza lineare non sarà accurata. In questo caso è possibile scegliere la specifica ii. Nel tuo codice hai usato ilndiffsfunzione del pacchetto di previsione. Non sono sicuro di quale di queste tre alternative sia implementata questa funzione per calcolare il numero di differenze (non sono riuscito a trovarlo nella documentazione). Per verificare il risultato, potresti voler utilizzare la ur.dffunzione nel pacchetto "urca":

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

Si noti che questo comando eseguirà il test ADF con una costante e i ritardi selezionati dal comando AIC, con un ritardo massimo di 10. Se si riscontrano problemi nell'interpretazione dei risultati basta guardare questa domanda . Se le serie sono I (1) basta usare la differenza, che sarà uguale ai rendimenti composti continuamente. Se il test indica che le serie sono I (2) e non si è sicuri che è possibile utilizzare altri test, ad esempio il test Phillips-Perron (PP.testfunzione in R). Se tutti i test confermano che le tue serie sono I (2) (ricorda di utilizzare il registro delle serie prima di eseguire i test), prendi la seconda differenza, ma nota che la tua interpretazione dei risultati cambierà, dato che ora stai lavorando con il differenza dei rendimenti costantemente composti. I prezzi delle attività sono generalmente I (1) poiché sono vicini a una camminata casuale, che è un rumore bianco quando si applica la prima differenza.

4. Seleziona l'ordine del modello

Questo può essere fatto con criteri comunemente usati come Akaike, Schwarz (BIC) e Hannan-Quinn. L'hai fatto con la VARselectfunzione ed è giusto, ma ricorda qual è il criterio che hai usato per prendere la tua decisione. Di solito criteri diversi indicano ordini diversi per il VAR.

5. Controllare se ci sono relazioni di cointegrazione

Se tutte le tue serie sono I (1) o I (2), prima di eseguire un modello VAR, di solito è una buona idea verificare se non vi sono relazioni di cointegrazione tra le serie, specialmente se si desidera effettuare un'analisi della risposta all'impulso con residui. Puoi farlo usando il test Johansenn o Engle-Granger (solo per i modelli bivariati). In R puoi eseguire il test Johansen con la ca.jofunzione del pacchetto "urca". Si noti che questo test ha anche diverse specifiche. Per le serie di prezzi di solito uso il seguente codice (dove pè la lunghezza di ritardo dell'articolo 4, eseguita con la serie in livelli):

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

6. Stimare il modello

Se le tue serie non sono cointegrate, puoi facilmente stimare il modello con il VARcomando, come fatto nel tuo codice. Nel caso in cui le serie siano cointegrate, è necessario considerare la relazione a lungo termine stimando un modello di correzione errori vettoriale con il seguente codice (dove si ktrova l'ordine di cointegrazione):

vecm <- cajorls(joeigen, r = k)

7. Eseguire test diagnostici

Per verificare se il modello è ben specificato, è possibile eseguire un test di correlazione seriale sui residui. Nel tuo codice hai usato un test Portmanteau con la serial.testfunzione. Non ho mai usato questa funzione ma penso che sia OK. Esiste anche una versione multivariata del test Ljung-Box implementata nel pacchetto MTS che è possibile eseguire con la funzionemq .

8. Fai previsioni

Dopo aver verificato che il modello è ben specificato, è possibile utilizzare la predictfunzione come nel codice. È anche possibile tracciare le funzioni di risposta all'impulso per verificare come le variabili rispondono a un determinato shock utilizzando la irffunzione.

9. Valuta le previsioni

Una volta effettuate le previsioni, è necessario valutarle e confrontarle con altri modelli. Alcuni metodi per valutare l'accuratezza delle previsioni sono disponibili qui , ma per fare ciò è fondamentale dividere le serie in una formazione e un set di test, come spiegato nel collegamento.


Grazie mille per questa risposta dettagliata! Per quanto riguarda il test Johansen per la cointegrazione, l'implementazione cambia quando sono incluse più di 2 variabili? Credo di aver letto che l'integrazione con il mulit comporta insidie. Scusate se questo è più adatto a una domanda a parte.
tu sei il

1
No, puoi farlo con lo stesso codice sopra, ma in questo caso potresti trovare più di un vettore cointegrante. L'unica limitazione di questo tipo è con il test Engle-Granger, che è adatto solo per le serie bivariate, ma di solito meglio in questo caso.
Regis A. Ely,

1
Questo collegamento può aiutare a eseguire e interpretare i test johansenn.
Regis A. Ely,

Ottimo lavoro! Ho modificato un po 'di formattazione e ortografia. Nota che è bello avere dei pezzi di codice (anche piccoli come i nomi delle funzioni) nei backtick `, ad es predict. Parti di codice più grandi possono essere formattate come codice selezionando il testo e facendo clic sul pulsante "virgolette" nella parte superiore della finestra dell'editor.
Richard Hardy,

@RichardHardy, bel profilo della procedura di stima VAR. Tuttavia, penso che potresti aver ignorato il fatto che l'OP vuole prevedere. Di conseguenza, vorrebbe probabilmente stimare in livelli.
Jacob H,

9

Ho pensato di aggiungere alla risposta molto bella di Regis A Ely. La sua risposta non è sbagliata, ma l'uso di un VAR per la previsione è diverso dall'uso di un VAR per fare altre cose di tipo VAR (cioè IRF, FEVD, Decomp. Storico ecc ...). Di conseguenza, alcuni dei passaggi indicati da Regis A Ely influenzeranno negativamente la tua previsione in alcuni casi.

Disclaimer:

Quando mi riferisco a dati non stazionari, intendo che la serie contiene una tendenza stocastica. Se i dati hanno un andamento temporale / stagionale, devono essere filtrati in modo appropriato.

Primo

In generale, in un VAR senza restrizioni non è necessario preoccuparsi di una relazione spuria. Una regressione spuria si verifica quando si regredisce una serie non stazionaria (Y) su un'altra serie non stazionaria (X) ed entrambe le serie non sono cointegrate. Tuttavia, se si regredisce Y su X così come i ritardi di Y, la regressione non sarà spuria poiché l'inclusione del ritardo Y assicura che gli errori saranno stazionari. Detto in altro modo, i ritardi di Y rilevano la variazione precedentemente erroneamente assegnata a X. Poiché un VAR senza restrizioni è essenzialmente un sistema di regressioni ARDL in cui ogni equazione contiene lo stesso numero di ritardi e regressori, dovrebbe essere chiaro che le regressioni spurie sono quindi non è probabile che sia un problema. Detto in altro modo se i tuoi dati sono tutti I (1), indipendentemente dal fatto che siano o meno integrati, puoi eseguire un VAR. I VECM sono necessari solo quando si desidera sia il modello che l'identificazione della relazione di breve / lungo periodo / co-integrazione tra le variabili. La domanda ora è: dovresti eseguire il VAR in livelli o nelle prime differenze.

Secondo

Durante la previsione, non è necessario prima differenza i dati I (1). Puoi, se vuoi, pensare che una quantità sorprendentemente di praticante non lo faccia. Ricorda che quando abbiamo una serie non stazionaria, possiamo ancora ottenere uno stimatore coerente. Per una regressione con un singolo ritardo della variabile dipendente questo è intuitivo. Se una serie sta seguendo una camminata casuale (cioè non stazionaria), sappiamo che la migliore stima di dove sarà il prossimo periodo è esattamente se fosse l'ultimo periodo (cioè beta è 1). Gli errori standard delle stime derivate da modelli con dati non stazionari, tuttavia, sono diversi perché, a rigor di termini, la varianza della stima si avvicina all'infinito mentre T si avvicina all'infinito. Questo, tuttavia, non è un problema per le previsioni. La previsione è essenzialmente un'aspettativa condizionale e pertanto si basa solo sulle stime dei parametri del modello e non su errori standard. Inoltre, gli intervalli di previsione della tua previsione saranno ottenuti direttamente dai tuoi errori, mediante errori di bootstrap o se hai molti dati tramite intervalli di previsione empirici (il mio preferito!), Tutti e tre questi approcci non sono influenzati da dati non stazionari perché di nuovo i tuoi errori saranno stazionari secondo la nostra spuria discussione di regressione sopra.

Perché me ne importa?

Il test ADF ha una bassa potenza, specialmente quando la serie è vicina all'unità root, ma non lo è. Detto un altro, il test ADF tenderà ad affermare erroneamente che una serie non è stazionaria quando in realtà non lo è.

Supponiamo che il test ADF assicuri erroneamente che la serie non sia fissa. Se si esegue tutta la trasformazione necessaria e si stima un VECM, la previsione sarà errata, poiché il modello è errato. Questo è il motivo per cui le persone prevedono livelli.

Che dire di Granger Causality ???

Puoi persino testare GC con un VAR in livelli quando i dati sono I (1). So che sembra folle. Sappiamo che l'inferenza di solito non è possibile con dati non stazionari. È comunque possibile verificare ipotesi congiunte, ad esempio GC. Questo è mostrato in Toda e Yamamoto (1995) che attinge da Sims, Stock e Watson (1990). Per un'applicazione consultare http://davegiles.blogspot.com/2011/04/testing-for-granger-causality.html .

Ultima cosa

Se tuttavia, si desidera utilizzare il VAR per cose diverse dalla previsione, fare attenzione. Un VAR in livelli con serie non stazionarie e co-integrate può dare risultati strani. Ad esempio, a rigor di termini, la rappresentazione della media mobile del VAR non esiste in quanto la matrice dei parametri non sarà invertibile. Nonostante ciò IRF può ancora essere ottenuto. Anche l'inferenza non è fattibile (ipotesi congiunte di pensiero possono essere verificate come discusso sopra).

Inoltre, preoccupati di piccoli campioni. Tutto ciò di cui ho discusso funziona bene in grandi campioni, ma le cose possono diventare bizzarre in piccoli campioni. Ciò è particolarmente vero per GC con dati I (1).


1
ytXtyt=β0+β1yt-1+...+βpyt-p+γXtγ^OLSsi avvicina allo zero (vero? dov'è la prova?), il problema svanisce gradualmente. Ma quanto è necessario un campione per questo? Fino a quando non viene fornita una prova, continuerei a evitare relazioni spurie.
Richard Hardy,

1
Per quanto riguarda Perché mi interessa? , se il processo ha una radice molto vicina a una radice unitaria, si comporta in modo molto simile a un processo radice unitaria. Durante la previsione, vi è quindi poca differenza tra l'assunzione che gli shock siano permanenti e il fatto che svaniscano molto lentamente. A meno che non si preveda una previsione molto lontana nel futuro, il risultato sarà praticamente lo stesso. Questo è il motivo per cui non sono troppo preoccupato per il test di root dell'unità con bassa potenza per le alternative locali.
Richard Hardy,

1
Un'altra piccola nota relativa a First : quando parlo del test ADF in Perché mi interessa? , dici "la tua previsione sarà sbagliata, perché il tuo modello è sbagliato". Bene, questo vale anche per First , vero? La previsione usando un modello in cui il lato sinistro differisce dal lato destro è infatti caratterizzata dalla citazione sopra.
Richard Hardy,

1
@Richardhardy Per una prova della mia prima affermazione, vedi il capitolo 18 di Hamilton 1994. In particolare, la sezione 18.2, Cure for Spurious Regression. Vale la pena notare che anche gli stimatori OLS sono efficienti in quanto convergono ad un ritmo di circa 1 metro quadrato
Jacob H,

1
@RichardHardy il tuo secondo commento è un punto giusto. Ho pensato che la mia replica sia quella per cui spendere tempo pre-test e quindi filtrare i dati solo per stimare potenzialmente il modello sbagliato. Per le previsioni, le specifiche dei livelli saranno generalmente corrette
Jacob H,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.