Pronósticos con modelos ARMA
Contents
import bccr
import matplotlib.pyplot as plt
plt.style.use('seaborn')
import numpy as np
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
isi = bccr.SW(isi=25725)
res = ARIMA(isi, order=[3,0,0]).fit()
3.6. Pronósticos con modelos ARMA#
Pronósticos con modelos ARMA#
Sea \(y^*_{t+j|t}\) un pronóstico de \(y_{t+j}\) pasado en datos observados hasta \(t\).
Definimos el “mejor” pronóstico de este tipo como aquel que minimiza el error cuadrático medio
Aunque no lo probamos aquí, resulta que el pronóstico con el menor error cuadrático medio es la esperanza de \(y_{t+j}\) condicional en los datos hasta \(t\):
Pronosticando valores puntuales de la serie#
Es muy sencillo obtener de manera recursiva estos pronósticos para los modelos ARMA, siguiendo estos 3 pasos:
Se escribe la ecuación ARMA de manera que \(y_t\) quede a la izquierda y todos los otros términos a la derecha.
Se sustituye el índice \(t\) por \(T+h\).
En el lado derecho de la ecuación, se sustituyen:
observaciones futuras con sus pronósticos,
errores futuros con cero,
errores pasados con sus respectivos residuos.
Empezando con \(h=1\), se repiten los pasos 2 y 3 para valores \(h=2,3,\dots\) hasta que todos los pronósticos hayan sido calculados.
Para ilustrar el procedimiento, consideremos este proceso ARMA(1,2)
Paso 1: \(\tilde{y}_t = \phi\tilde{y}_{t-1} + \epsilon_t + \theta_1\epsilon_{t-1} + \theta_2\epsilon_{t-2}\)
Para \(h=1\):
Para \(h=2\):
Para \(h=3\):
Es fácil comprobar que, siguiendo este procedimiento, una vez que \(h>p\), \(h>q\) la ecuación de pronóstico será
Esto es una ecuación en diferencia de orden \(p\), de la cual sabemos que sus raíces están dentro del círculo unitario. Por ello
Esto nos dice que, para valores grandes de \(h\), el pronóstico es simplemente la media del proceso.
Cuantificando la incertidumbre de los pronósticos puntuales#
Para saber qué tan precisos esperamos que sean estos pronósticos, necesitamos cuantificar su error cuadrático medio
Es decir, necesitamos cuantificar la varianza de \(y_{t+j}\) condicional en los datos disponibles en \(t\).
Por razones de tiempo, no vamos a desarrollar estas fórmulas durante este curso.
from scipy.stats import norm
plt.style.use('seaborn-dark')
horizon = 36
fcast =res.get_forecast(steps=horizon, alpha=0.05)
fig, ax =plt.subplots(figsize=[12,4])
isi.plot(ax=ax)
fcast.predicted_mean.plot(ax=ax)
ax.axhline(isi.values.mean(), color='C2')
ax.fill_between(fcast.row_labels, *fcast.conf_int().values.T,
facecolor='C1', alpha=0.25, interpolate=True);
Podemos hacer intervalos de distintos niveles de significancia:
fig, ax =plt.subplots(figsize=[12,4])
isi['2018':].plot(ax=ax)
fcast.predicted_mean.plot(ax=ax)
ax.axhline(isi.values.mean(), color='C2')
for alpha in np.arange(1,6)/10:
ax.fill_between(fcast.row_labels, *fcast.conf_int(alpha=alpha).values.T,
facecolor='C1', alpha=0.1, interpolate=True);
¿Qué podría salir mal?#
En todas las fórmulas que hemos elaborado para los pronósticos hasta ahora, está implícito que conocemos los verdaderos valores de los parámetros.
En la práctica, esos parámetros son estimados a partir de los datos.
Tomemos por ejemplo un proceso AR(1):