Metodologia de previsão VAR

19

Estou construindo um modelo de VAR para prever o preço de um ativo e gostaria de saber se meu método é estatisticamente correto, se os testes que incluí são relevantes e se são necessários mais para garantir uma previsão confiável com base em minhas variáveis ​​de entrada.

Abaixo está o meu processo atual para verificar a causalidade de Granger e prever o modelo VAR selecionado.

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

Este método é correto?

youjustreadthis
fonte
1
Você está usando segundas diferenças? Isso é um pouco incomum e pode tornar o modelo mais sensível do que precisa. Além disso, você pode esperar cointegração em seu sistema? E quanto a tendências de tempo determinísticas e / ou sazonalidades, você já verificou essas?
Richard Hardy
@ Richard, as diferenças para alcançar a estacionariedade são, até onde eu entendi, determinadas pelo teste adf, e seriam ajustadas de acordo com sua sugestão. Se o teste adf determinar que é estacionário (retorno 0, não diferiria a variável). Não pensei em cointegração e sazonalidade, mas tive a impressão de que o método acima trataria de qualquer tendência nas variáveis.
usar o seguinte comando
2
O teste do ADF é apenas um teste, ele vem com suas limitações. Plotar os dados brutos, as primeiras diferenças e, eventualmente, as segundas diferenças pode ser mais informativo do que apenas executar o teste. Além disso, o teste do ADF possui especificações diferentes: (1) sem constante, sem tendência; (2) constante, sem tendência; (3) constante e tendência; a seleção da ordem de atraso para o teste também pode não ser trivial. Portanto, não confie cegamente nos resultados. Do ponto de vista do objeto, os preços dos ativos são geralmente integrados na ordem um, I (1). I (2), seria difícil justificar ...
Richard Hardy
@ youjustreadthis Incluí uma resposta abaixo. Eu recomendo fortemente que você considere algumas de suas implicações
Jacob H

Respostas:

28

Eu acho que você acertou bastante, mas ao criar um modelo VAR, geralmente certifico-me de seguir estas etapas:

1. Selecione as variáveis

Essa é a parte mais importante da construção do seu modelo. Se você deseja prever o preço de um ativo, é necessário incluir variáveis ​​relacionadas ao mecanismo de formação de preço. A melhor maneira de fazer isso é através de um modelo teórico. Como você não mencionou o que é o ativo e quais são as outras variáveis ​​incluídas no seu modelo, eu realmente não posso dizer muito sobre esse item, mas você pode encontrar um resumo dos modelos de preços de ativos aqui .

2. Verifique os dados e faça os ajustes adequados

Depois de selecionar as variáveis, você pode fazer alguns ajustes nos dados que melhorarão a estimativa e a interpretação do modelo. É útil usar estatísticas resumidas e ver um gráfico da série para detectar discrepâncias, dados ausentes e outros comportamentos estranhos. Ao trabalhar com dados de preços, as pessoas geralmente usam logs naturais, o que é uma transformação estabilizadora de variações e também tem uma boa interpretação (a diferença de preço nos logs se torna retornos continuamente compostos). Não tenho certeza se você fez registros antes de estimar o modelo, mas é uma boa ideia fazê-lo se estiver trabalhando com preços de ativos.

3. Verifique se os dados contêm componentes não estacionários

Agora você pode usar testes de raiz unitária para verificar se suas séries são estacionárias. Se você estiver interessado apenas na previsão, conforme observado por @JacobH, poderá executar o VAR em níveis mesmo quando suas séries não forem estacionárias, mas seus erros padrão não serão confiáveis, o que significa que você não pode inferir sobre o valor de os coeficientes. Você testou estacionário usando o teste do ADF, que é muito comum nesses aplicativos, mas observe que você deve especificar se deseja executar o teste com i) sem constante e sem tendência; ii) uma constante e nenhuma tendência; e iii) uma constante e uma tendência. Geralmente, as séries de preços têm tendências estocásticas, portanto, uma tendência linear não será precisa. Nesse caso, você pode escolher a especificação ii. No seu código, você usou ondiffsfunção do pacote de previsão. Não tenho certeza de qual dessas três alternativas essa função implementa para calcular o número de diferenças (não a encontrei na documentação). Para verificar seu resultado, você pode querer usar a ur.dffunção no pacote "urca":

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

Observe que este comando executará o teste do ADF com uma constante e os lags selecionados pelo comando AIC, com atraso máximo de 10. Se você tiver problemas para interpretar os resultados, basta olhar para esta pergunta . Se as séries forem I (1), basta usar a diferença, que será igual aos retornos compostos continuamente. Se o teste indicar que a série é I (2) e você tiver dúvidas sobre o uso de outros testes, por exemplo, teste de Phillips-Perron (PP.testfunção em R). Se todos os testes confirmarem que sua série é I (2) (lembre-se de usar o log da série antes de executar os testes), faça a segunda diferença, mas observe que sua interpretação dos resultados mudará, pois agora você está trabalhando com o diferença dos retornos continuamente compostos. Os preços dos ativos são geralmente I (1), pois estão próximos de uma caminhada aleatória, o que é um ruído branco quando se aplica a primeira diferença.

4. Selecione a ordem do modelo

Isso pode ser feito com critérios comumente usados, como Akaike, Schwarz (BIC) e Hannan-Quinn. Você fez isso com a VARselectfunção e isso está certo, mas lembre-se de qual é o critério usado para tomar sua decisão. Geralmente, critérios diferentes indicam pedidos diferentes para o VAR.

5. Verifique se há relacionamentos cointegrantes

Se todas as suas séries forem I (1) ou I (2), antes de executar um modelo VAR, geralmente é uma boa ideia verificar se não há relações de cointegração entre as séries, especialmente se você deseja fazer uma análise de resposta a impulso com o resíduos. Você pode fazer isso usando o teste de Johansenn ou o Engle-Granger (apenas para modelos bivariados). No R, você pode executar o teste de Johansen com a ca.jofunção do pacote "urca". Observe que este teste também tem especificações diferentes. Para séries de preços, geralmente uso o seguinte código (onde pé o comprimento do atraso do item 4, realizado com a série em níveis):

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

6. Estime o modelo

Se sua série não estiver cointegrada, é possível estimar facilmente o modelo com o VARcomando, conforme feito no seu código. Caso as séries sejam cointegradas, é necessário considerar o relacionamento de longo prazo, estimando um modelo de Correção de erro vetorial com o seguinte código (onde kestá a ordem de cointegração):

vecm <- cajorls(joeigen, r = k)

7. Execute testes de diagnóstico

Para testar se seu modelo está bem especificado, você pode executar um teste de correlação serial nos resíduos. No seu código, você usou um teste do Portmanteau com a serial.testfunção Eu nunca usei essa função, mas acho que está OK. Há também uma versão multivariada do teste de Ljung-Box implementado nos MTS pacote que você pode executar com a função mq.

8. Faça previsões

Depois de ter certeza de que seu modelo está bem especificado, você pode usar a predictfunção como fez no seu código. Você pode até plotar funções de resposta a impulso para verificar como as variáveis ​​respondem a um choque específico usando a irffunção.

9. Avalie previsões

Depois de fazer suas previsões, você deve avaliá-las e comparar com outros modelos. Alguns métodos para avaliar a precisão das previsões podem ser encontrados aqui , mas para isso é crucial que você divida suas séries em um conjunto de treinamento e teste, conforme explicado no link.

Regis A. Ely
fonte
Muito obrigado por esta resposta detalhada! No que diz respeito ao teste de Johansen para cointegração, a implementação muda quando mais de 2 variáveis ​​são incluídas? Acredito que li que a integração múltipla traz armadilhas próprias. Desculpe se isso é mais adequado para uma pergunta própria.
precisa saber é o seguinte
1
Não, você pode fazê-lo com o mesmo código acima, mas pode encontrar mais de um vetor cointegrante neste caso. A única limitação desse tipo é com o teste de Engle-Granger, que é adequado apenas para séries bivariadas, mas geralmente melhor nesse caso.
Regis A. Ely
1
Esse link pode ajudar a executar e interpretar testes johansenn.
Regis A. Ely
Bom trabalho! Eu editei algumas formatações e ortografia. Note que é bom ter partes de código (mesmo que pequenas como nomes de funções) nos backticks `, por exemplo predict. Partes maiores de código podem ser formatadas como código, selecionando o texto e clicando no botão "aspas" na parte superior da janela do editor.
Richard Hardy
@RichardHardy, resumo geral do procedimento de estimativa de VAR. No entanto, acho que você pode ter ignorado o fato de que o OP deseja prever. Consequentemente, ele / ela provavelmente gostaria de estimar em níveis.
27716 Jacob J
9

Pensei em acrescentar ao Regis A Ely uma resposta muito agradável. Sua resposta não está errada, mas usar um VAR para prever é diferente de usar um VAR para fazer outras coisas do tipo VAR (por exemplo, IRF, FEVD, Historical Decomp. Etc ...). Consequentemente, algumas das etapas descritas pela Regis A Ely afetarão negativamente sua previsão em alguns casos.

Aviso Legal:

Quando me refiro a dados não estacionários, quero dizer que a série contém uma tendência estocástica. Se os dados tiverem uma tendência temporal / sazonal, deverão ser filtrados adequadamente.

Primeiro

De um modo geral, em um VAR irrestrito, não há necessidade de se preocupar com um relacionamento falso. Uma regressão espúria ocorre quando você regride uma série não estacionária (Y) em outra série não estacionária (X) e ambas as séries não são cointegradas. No entanto, se você regredir Y em X, bem como atrasos em Y, a regressão não será espúria, pois a inclusão do atraso Y garante que os erros serão estacionários. Dito de outra maneira, os atrasos de Y captam a variação anteriormente atribuída incorretamente a X. Como um VAR irrestrito é essencialmente um sistema de regressões ARDL em que cada equação contém o mesmo número de atrasos e regressores, deve ficar claro que a regressão espúria é portanto, provavelmente não será um problema. Dito de outra maneira, se seus dados forem todos I (1), independentemente de não estarem co-integrados, você poderá executar um VAR. O VECM é necessário apenas quando você deseja modelar e identificar o relacionamento de curto e longo prazo / co-integração entre variáveis. A questão agora é: você deve executar o VAR em níveis ou nas primeiras diferenças.

Segundo

Na previsão, não é necessário obter a primeira diferença I (1) dos dados. Você pode, se quiser, pensou que surpreendentemente uma quantidade de praticantes não. Lembre-se de que quando temos uma série não estacionária, ainda podemos obter um estimador consistente. Para uma regressão com um único atraso da variável dependente, isso é intuitivo. Se uma série está seguindo uma caminhada aleatória (ou seja, não estacionária), sabemos que a melhor estimativa de onde será o próximo período é exatamente onde foi o último período (ou seja, beta é 1). Os erros padrão das estimativas derivadas de modelos com dados não estacionários, no entanto, são diferentes porque, estritamente falando, a variação da estimativa se aproxima do infinito, como T se aproxima do infinito. Isso, no entanto, não é um problema para a previsão. A previsão é essencialmente uma expectativa condicional e, portanto, depende apenas das estimativas de parâmetros do seu modelo e não de erros padrão. Além disso, os intervalos de previsão de sua previsão serão obtidos diretamente de seus erros, por erros de inicialização ou, se você tiver muitos dados através de intervalos de previsão empíricos (meu favorito!), Todas essas três abordagens não serão afetadas por dados não estacionários porque, novamente, seus erros serão estacionários conforme nossa discussão de regressão espúria acima.

Por que eu me importo?

O teste do ADF tem baixa potência, especialmente quando a série está próxima de ser raiz unitária, mas não é. Dito outro, o teste do ADF tenderá a afirmar erroneamente que uma série não é estacionária quando na verdade não é.

Suponha que seu teste do ADF garanta erroneamente que a série não seja estacionária. Se você fizer toda a transformação necessária e estimar um VECM, sua previsão ficará errada, porque seu modelo está errado. É por isso que as pessoas fazem previsões em níveis.

E quanto à causalidade de Granger ???

Você pode até testar o GC com um VAR em níveis quando os dados são I (1). Eu sei que isso parece loucura. Sabemos que a inferência geralmente não é possível com dados não estacionários. No entanto, é possível testar hipóteses conjuntas, por exemplo, GC. Isso é mostrado em Toda e Yamamoto (1995), que se baseia em Sims, Stock e Watson (1990). Para um aplicativo, consulte http://davegiles.blogspot.com/2011/04/testing-for-granger-causality.html .

Última coisa

Se, no entanto, você quiser usar seu VAR para outras coisas que não a previsão, tenha cuidado. Um VAR em níveis com séries não estacionárias e co-integradas pode produzir alguns resultados estranhos. Por exemplo, estritamente falando, a representação da Média Móvel do VAR não existe, pois a matriz do parâmetro não será invertível. Apesar disso, o IRF ainda pode ser obtido. A inferência também não é viável (as hipóteses conjuntas podem ser testadas conforme discutido acima).

Também se preocupe com pequenas amostras. Tudo o que discuti funciona bem em grandes amostras, mas as coisas podem ficar malucas em pequenas amostras. Isto é especialmente verdade para o GC com dados I (1).

Jacob H
fonte
1
Em relação à First , você poderia fazer backup de sua reivindicação por uma referência? Não estou convencido de sua argumentação. Se e x t são passeios aleatórios independentes, um modelo y t = β 0ytxtyt=β0 0+β1yt-1+...+βpyt-p+γxtγ^OeuSse aproxima de zero (onde? onde está a prova?), o problema desaparece gradualmente. Mas qual o tamanho de uma amostra é necessária para isso? Até que uma prova seja apresentada, eu continuaria evitando relacionamentos espúrios.
Richard Hardy
1
Em relação a Por que eu me importo? , se o processo tiver uma raiz muito próxima a uma raiz de unidade, ele se comportará da mesma maneira que um processo de raiz de unidade. Na previsão, há, portanto, pouca diferença entre assumir que os choques são permanentes e manter que desaparecem muito lentamente. A menos que você esteja prevendo muito longe no futuro, o resultado será praticamente o mesmo. É por isso que não estou muito preocupado com o teste de raiz unitária com pouca energia para alternativas locais.
Richard Hardy
1
Outra pequena observação sobre o First : ao falar sobre o teste do ADF em Por que eu me importo? , você diz que "sua previsão está errada, porque seu modelo está errado". Bem, isso se aplica ao primeiro também, não é? A previsão usando um modelo no qual o lado esquerdo diverge do lado direito é de fato caracterizada pela citação acima.
Richard Hardy
1
@ Richardharddy Para obter uma prova da minha primeira afirmação, consulte o capítulo 18 em Hamilton 1994. Em particular, a seção 18.2, Curas para regressão espúria. Vale a pena notar que os estimadores OLS também é eficiente como eles convergem a uma taxa a sqrt de T.
Jacob H
1
@RichardHardy seu segundo comentário é um ponto justo. Pensei que minha resposta é por que gastar tempo pré-testando e depois filtrando os dados apenas para potencialmente estimar o modelo errado. Para a previsão, a especificação níveis será geralmente correcta
Jacob H