25 votos

Metodología de previsión VAR

Estoy construyendo un modelo VAR para predecir el precio de un activo y me gustaría saber si mi método es estadísticamente sólido, si las pruebas que he incluido son pertinentes y si se necesitan más para garantizar una previsión fiable basada en mis variables de entrada.

A continuación se muestra mi proceso actual para comprobar la causalidad de Granger y pronosticar el modelo VAR seleccionado.

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

¿Es acertado este método?

31voto

Fabrizio Puntos 73

Creo que lo has hecho bastante bien, pero cuando construyo un modelo VAR, suelo asegurarme de seguir estos pasos:

1. Seleccione las variables

Esta es la parte más importante de la construcción de su modelo. Si quiere predecir el precio de un activo, debe incluir variables relacionadas con el mecanismo de formación de precios. La mejor forma de hacerlo es mediante un modelo teórico. Como no ha mencionado cuál es el activo y cuáles son las demás variables que ha incluido en su modelo, realmente no puedo decir mucho sobre este punto, pero puede encontrar un resumen de los modelos de valoración de activos en aquí .

2. Compruebe los datos y realice los ajustes adecuados

Una vez seleccionadas las variables, puede realizar algunos ajustes en los datos que mejorarán la estimación y la interpretación del modelo. Es útil utilizar estadísticos de resumen y ver un gráfico de las series para detectar valores atípicos, datos que faltan y otros comportamientos extraños. Cuando se trabaja con datos de precios, la gente suele tomar logaritmos naturales, que es una transformación estabilizadora de la varianza y también tiene una buena interpretación (la diferencia de precios en logaritmos se convierte en rendimientos compuestos continuos). No estoy seguro de si has tomado los logaritmos antes de estimar el modelo, pero es una buena idea hacerlo si trabajas con precios de activos.

3. Comprobar si los datos contienen componentes no estacionarios

Ahora puede utilizar las pruebas de raíz unitaria para comprobar si sus series son estacionarias. Si sólo te interesa la previsión, como señala @JacobH, puedes ejecutar el VAR en niveles incluso cuando tus series sean no estacionarias, pero entonces tus errores estándar no son fiables, lo que significa que no puedes hacer inferencia sobre el valor de los coeficientes. Ha realizado la prueba de estacionariedad utilizando la prueba ADF, que se utiliza muy comúnmente en estas aplicaciones, pero tenga en cuenta que debe especificar si desea realizar la prueba con i) ninguna constante y ninguna tendencia; ii) una constante y ninguna tendencia; y iii) una constante y una tendencia. Normalmente, las series de precios tienen tendencias estocásticas, por lo que una tendencia lineal no será precisa. En este caso puede elegir la especificación ii. En su código ha utilizado la especificación ndiffs del paquete de previsión. No estoy seguro de cuál de las tres alternativas implementa esta función para calcular el número de diferencias (no he podido encontrarlo en la documentación). Para comprobar el resultado puede utilizar la función ur.df del paquete "urca":

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

Tenga en cuenta que este comando ejecutará la prueba ADF con una constante y los rezagos seleccionados por el comando AIC, con un rezago máximo de 10. Si tiene problemas para interpretar los resultados, consulte esta pregunta . Si las series son I(1) basta con utilizar la diferencia, que será igual a los rendimientos compuestos de forma continua. Si la prueba indica que las series son I(2) y tiene dudas al respecto, puede utilizar otras pruebas, por ejemplo, la prueba de Phillips-Perron ( PP.test en R). Si todas las pruebas confirman que su serie es I(2) (recuerde utilizar el logaritmo de la serie antes de ejecutar las pruebas), entonces tome la segunda diferencia, pero tenga en cuenta que su interpretación de los resultados cambiará, ya que ahora está trabajando con la diferencia de los rendimientos compuestos continuamente. Los precios de los activos suelen ser I(1), ya que se aproximan a un paseo aleatorio, que es un ruido blanco al aplicar la primera diferencia.

4. Seleccione el orden del modelo

Esto puede hacerse con criterios comúnmente utilizados como Akaike, Schwarz (BIC) y Hannan-Quinn. Ya lo ha hecho con el VARselect función y eso es correcto, pero recuerde cuál es el criterio que ha utilizado para tomar su decisión. Por lo general, diferentes criterios indican diferentes órdenes para el VAR.

5. Comprobar si existen relaciones de cointegración

Si todas sus series son I(1) o I(2), antes de ejecutar un modelo VAR, suele ser una buena idea comprobar si no existen relaciones de cointegración entre las series, especialmente si desea realizar análisis de respuesta al impulso con los residuos. Puede hacerlo utilizando la prueba de Johansenn o la de Engle-Granger (sólo para modelos bivariantes). En R puedes ejecutar el test de Johansen con el comando ca.jo del paquete "urca". Tenga en cuenta que esta prueba también tiene diferentes especificaciones. Para las series de precios suelo utilizar el siguiente código (donde p es la longitud del retardo del elemento 4, realizado con la serie en niveles):

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

6. Estimación del modelo

Si sus series no están cointegradas, puede estimar fácilmente el modelo con la función VAR como se hace en su código. En caso de que las series estén cointegradas, debe considerar la relación a largo plazo estimando un modelo de corrección vectorial de errores con el siguiente código (donde k es el orden de cointegración):

vecm <- cajorls(joeigen, r = k)

7. Ejecutar pruebas de diagnóstico

Para comprobar si el modelo está bien especificado, puede realizar una prueba de correlación serial en los residuos. En su código ha utilizado una prueba de Portmanteau con la variable serial.test función. Nunca he utilizado esta función, pero creo que está bien. También hay una versión multivariante de la prueba de Ljung-Box implementada en el paquete MTS que puedes ejecutar con la función mq .

8. Hacer predicciones

Cuando esté seguro de que su modelo está bien especificado, puede utilizar la función predict como ha hecho en su código. Incluso puede trazar funciones de respuesta al impulso para comprobar cómo responden las variables a un determinado impacto utilizando la función irf función.

9. Evaluar las predicciones

Una vez hechas las predicciones, hay que evaluarlas y compararlas con otros modelos. Puede encontrar algunos métodos para evaluar la precisión de las predicciones aquí pero para ello es crucial que dividas tus series en un conjunto de entrenamiento y otro de prueba, como se explica en el enlace.

11voto

user69821 Puntos 16

Pensé que podría añadir a Regis A Ely muy buena respuesta. Su respuesta no es incorrecta, pero el uso de un VAR para pronosticar es diferente al uso de un VAR para hacer otras cosas de tipo VAR (es decir, IRF, FEVD, Historical Decomp. etc...). En consecuencia, algunos de los pasos descritos por Regis A Ely afectará negativamente a su pronóstico en algunos casos.

Descargo de responsabilidad:

Cuando me refiero a datos no estacionarios, quiero decir que la serie contiene una tendencia estocástica. Si los datos tienen una tendencia temporal/estacional, debe filtrarse adecuadamente.

En primer lugar

En general, en un VAR sin restricciones no hay que preocuparse por una relación espuria. Una regresión espuria se produce cuando se realiza una regresión de una serie no estacionaria (Y) sobre otra serie no estacionaria (X) y ambas series no están cointegradas. Sin embargo, si se realiza una regresión de Y sobre X, así como de los retardos de Y, la regresión no será espuria, ya que la inclusión del retardo de Y garantiza que los errores sean estacionarios. Dicho de otro modo, los retardos de Y recogen la variación que anteriormente se había asignado erróneamente a X. Dado que un VAR no restringido es esencialmente un sistema de regresiones ARDL en el que cada ecuación contiene el mismo número de retardos y regresores, debería quedar claro que no es probable que la regresión espuria sea un problema. Dicho de otro modo, si todos sus datos son I(1), independientemente de si están cointegrados o no, puede ejecutar un VAR. Los VECM sólo son necesarios cuando se desea modelizar e identificar la relación de cointegración a corto y largo plazo entre las variables. La pregunta ahora es, ¿debe ejecutar el VAR en niveles o en primeras diferencias.

Segundo

A la hora de hacer previsiones, no es necesario diferenciar primero los datos I(1). Puede hacerlo si lo desea, pero una cantidad sorprendente de profesionales no lo hacen. Recuerde que cuando tenemos una serie no estacionaria, aún podemos obtener un estimador consistente. Para una regresión con un solo retardo de la variable dependiente, esto es intuitivo. Si una serie sigue un camino aleatorio (es decir, no es estacionaria), sabemos que la mejor estimación de dónde estará el próximo periodo es exactamente dónde estuvo el último periodo (es decir, beta es 1). Sin embargo, los errores estándar de las estimaciones derivadas de modelos con datos no estacionarios son diferentes porque, en sentido estricto, la varianza de la estimación se aproxima a infinito a medida que T se aproxima a infinito. Sin embargo, esto no es un problema para la previsión. La previsión es esencialmente una expectativa condicional y, por lo tanto, sólo se basa en las estimaciones de los parámetros de su modelo y no en los errores estándar. Además, los intervalos de predicción de su previsión se obtendrán directamente a partir de sus errores, mediante errores de bootstrapping o, si dispone de muchos datos, mediante intervalos de predicción empíricos (¡mi favorito!); estos tres enfoques no se ven afectados por datos no estacionarios porque, de nuevo, sus errores serán estacionarios, tal y como se ha explicado anteriormente en nuestra regresión espuria.

¿Por qué me importa?

La prueba ADF tiene poca potencia, especialmente cuando la serie está cerca de ser raíz unitaria, pero no lo es. Dicho de otro modo, la prueba ADF tenderá a afirmar erróneamente que una serie es no estacionaria cuando en realidad no lo es.

Suponga que su prueba ADF asegura erróneamente que la serie es no estacionaria. Si realiza todas las transformaciones necesarias y estima un VECM, su previsión será errónea, porque su modelo es incorrecto. Esta es la razón por la que la gente pronostica en niveles.

¿Y la causalidad de Granger?

Incluso puede probar GC con un VAR en niveles cuando los datos son I(1). Sé que parece una locura. Sabemos que la inferencia no suele ser posible con datos no estacionarios. Sin embargo, es posible probar hipótesis conjuntas, por ejemplo, GC. Esto se muestra en Toda y Yamamoto (1995) que se basa en Sims, Stock y Watson (1990). Para una aplicación, véase http://davegiles.blogspot.com/2011/04/testing-for-granger-causality.html .

Lo último

Sin embargo, si desea utilizar su VAR para fines distintos de la previsión, tenga cuidado. Un VAR en niveles con series no estacionarias y cointegradas puede arrojar algunos resultados extraños. Por ejemplo, estrictamente hablando, la representación de la media móvil del VAR no existe, ya que la matriz de parámetros no será invertible. A pesar de ello, se puede obtener el IRF. La inferencia tampoco es factible (aunque se pueden probar hipótesis conjuntas como se ha comentado anteriormente).

Preocúpese también de las muestras pequeñas. Todo lo que he comentado funciona bien en muestras grandes, pero las cosas pueden volverse locas en muestras pequeñas. Esto es especialmente cierto para GC con datos I(1).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X