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?
r
forecasting
modeling
var
youjustreadthis
fonte
fonte
Respostas:
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 o
ndiffs
funçã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 aur.df
funçã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.test
funçã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
VARselect
funçã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.jo
funçã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 (ondep
é o comprimento do atraso do item 4, realizado com a série em níveis):6. Estime o modelo
Se sua série não estiver cointegrada, é possível estimar facilmente o modelo com o
VAR
comando, 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 (ondek
está a ordem de cointegração):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.test
funçã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çãomq
.8. Faça previsões
Depois de ter certeza de que seu modelo está bem especificado, você pode usar a
predict
funçã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 airf
funçã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.
fonte
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.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).
fonte