Modelos ARIMA

Ing. Cesar Lopez

2022-11-03

Modelo Arima

Un Modelo autorregresivo integrado de media móvil (ARIMA), es un modelo estadístico que utiliza variaciones y regresiones de datos estadísticos con el fin de encontrar patrones para una predicción hacia el futuro.

El modelo ARIMA necesita identificar los coeficientes y número de regresiones que se utilizarán. Este modelo es muy sensible a la precisión con que se determinen sus coeficientes.

Se suele expresar como \(ARIMA(p,d,q)\) donde los parámetros p, d y q son números enteros no negativos que indican el orden de las distintas componentes del modelo — respectivamente, las componentes autorregresiva, integrada y de media móvil.

Analicemos la serie de tiempo del par Bitcoin vs Dolar en el marco de 4 horas.

# Limpiamos memoria
rm(list=ls())

# Fijamos semilla
set.seed(198)

# importar base de datos
BTC <- read.csv("BTCUSD240.CSV", header = F)

# Extrayendo mi serie de tiempo 
BTC <- BTC[,c(6)]

# Convierto dataframe a serie de tiempo
BTC <- ts(BTC)

head(BTC)
## Time Series:
## Start = 1 
## End = 6 
## Frequency = 1 
## [1] 61171.4 60709.2 61721.4 61920.3 61433.7 62191.9
# Graficamos la serie de tiempo
plot(BTC)

Es importante confirmar la estacionalidad de la serie de tiempo, puesto que si esta no tiene estacionalidad, el modelo de series de tiempo no se puede aplicar. Gráficamente es posible inferir que puede existir estacionalidad.Se debe comprobar analíticamente esta característica. Comprobar si la serie de tiempo es estacionaria se debe aplicar la Prueba Dickey Fuller, es una prueba de hipótesis que verifica si existe estacionalidad en serie analizada, los criterios son:

-Ho: La serie es estacionaria.

-H1: La seria no es estacionaria.

Si el p-valor de la prueba es < 0.05 , se acepta la hipótesis nula.

# Comprobar si la serie de tiempo es estacionaria. Aplicar Prueba Dickey Fuller.

adf.test(BTC, alternative = "stationary")
## 
##  Augmented Dickey-Fuller Test
## 
## data:  BTC
## Dickey-Fuller = -1.8009, Lag order = 12, p-value = 0.6626
## alternative hypothesis: stationary

El resultado de la prueba es un p-valor superior a 0.05, por lo tanto la serie no es estacionaria.

Una alternativa para convertir la serie a estacionaria, es transformar la variable por medio del logaritmo.

# Comprobar si la serie de tiempo es estacionaria. Aplicar Prueba Dickey Fuller.

BTClog <- log(BTC)

# Graficamos la serie de tiempo transformada
plot(BTClog)

# Probamos estacionalidad nuevamente
adf.test(BTClog, alternative = "stationary")
## 
##  Augmented Dickey-Fuller Test
## 
## data:  BTClog
## Dickey-Fuller = -1.8689, Lag order = 12, p-value = 0.6338
## alternative hypothesis: stationary

Aun con la transformación, no se pudo transformar la serie en estacionaria.

El segundo paso para tratar de transformar la serie a estacionaria, es probar las diferencias.

# Probamos con diferencias 
BTCdiff <- diff(BTC)

plot(BTCdiff)

# Probamos estacionalidad nuevamente
adf.test(BTCdiff, alternative = "stationary")
## Warning in adf.test(BTCdiff, alternative = "stationary"): p-value smaller than
## printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  BTCdiff
## Dickey-Fuller = -13.612, Lag order = 12, p-value = 0.01
## alternative hypothesis: stationary

Se puede comprobar que con una diferencia, la serie se transformó a estacionaria.

Luego, el tercer paso se debe obtener las funciones de auto correlación y de auto correlación parcial, con el fin de saber cuantas medias móviles y cuantos auto regresivos debe tener nuestro modelo final.

# funcion acf. Numero de medias móviles del modelo.
acf(BTCdiff)

# funcion pacf. Numero de auto regresores del modelo.
pacf(BTCdiff)

# se comienza a ajustar el modelo arima, teniendo en cuenta los rezagos y el numero de auto regresores. Primero se prueba 1 media móvil y 1 rezago.

# función acf. Numero de medias móviles del modelo.
acf(ts(BTCdiff, frequency=1))

# función pacf. Numero de auto regresores del modelo.
pacf(ts(BTCdiff, frequency=1))

# Creamos el modelo con 1 diferencia, 1 auto regreso, 1 media móvil
modelo1 <- arima(BTC,order = c(1,1,1))
modelo1
## 
## Call:
## arima(x = BTC, order = c(1, 1, 1))
## 
## Coefficients:
##           ar1     ma1
##       -0.2087  0.1256
## s.e.   0.1734  0.1756
## 
## sigma^2 estimated as 591741:  log likelihood = -16507.73,  aic = 33021.46
# Hacemos diagnostgico
tsdiag(modelo1)

# Prueba de ruido blanco
Box.test(residuals(modelo1),type="Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(modelo1)
## X-squared = 0.00090429, df = 1, p-value = 0.976
# error con media cero
error <- residuals(modelo1)
plot(error)

Una vez hecho el diagnostico nos interesa validar la existencia de ruido blanco, esto se analiza gráficamente por la ultima gráfica obtenida anteriormente. Analíticamente, se comprueba con el test Ljung Box, el cual tiene sus hipótesis

-Ho: Hay ruido blanco

-H1: No hay ruido blanco

Si valor p es > 0.05, se acepta la hipotesis nula.

Para nuestro caso, el p-valor obtenido de la prueba es mayor a 0.05, por lo tanto, existe ruido blanco y nuestro modelo se ajusta de la mejor manera.

# Hacemos los pronosticos
pronostico <- forecast::forecast(modelo1,h= 48)
pronostico
##      Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 2049       41463.57 40477.74 42449.40 39955.87 42971.26
## 2050       41460.75 40123.26 42798.25 39415.23 43506.28
## 2051       41461.34 39837.41 43085.27 38977.75 43944.93
## 2052       41461.22 39596.06 43326.38 38608.70 44313.74
## 2053       41461.24 39382.33 43540.16 38281.82 44640.67
## 2054       41461.24 39188.65 43733.83 37985.62 44936.86
## 2055       41461.24 39010.22 43912.26 37712.73 45209.75
## 2056       41461.24 38843.93 44078.55 37458.42 45464.07
## 2057       41461.24 38687.59 44234.89 37219.32 45703.17
## 2058       41461.24 38539.61 44382.87 36992.99 45929.49
## 2059       41461.24 38398.77 44523.71 36777.59 46144.89
## 2060       41461.24 38264.12 44658.36 36571.67 46350.81
## 2061       41461.24 38134.92 44787.56 36374.08 46548.40
## 2062       41461.24 38010.56 44911.92 36183.88 46738.60
## 2063       41461.24 37890.52 45031.96 36000.30 46922.18
## 2064       41461.24 37774.40 45148.08 35822.70 47099.78
## 2065       41461.24 37661.81 45260.67 35650.52 47271.96
## 2066       41461.24 37552.47 45370.01 35483.30 47439.18
## 2067       41461.24 37446.11 45476.37 35320.63 47601.85
## 2068       41461.24 37342.49 45579.99 35162.16 47760.32
## 2069       41461.24 37241.42 45681.06 35007.58 47914.90
## 2070       41461.24 37142.71 45779.77 34856.62 48065.87
## 2071       41461.24 37046.20 45876.28 34709.03 48213.45
## 2072       41461.24 36951.77 45970.71 34564.60 48357.88
## 2073       41461.24 36859.27 46063.21 34423.13 48499.35
## 2074       41461.24 36768.59 46153.89 34284.45 48638.03
## 2075       41461.24 36679.63 46242.85 34148.40 48774.08
## 2076       41461.24 36592.30 46330.18 34014.83 48907.65
## 2077       41461.24 36506.50 46415.98 33883.62 49038.86
## 2078       41461.24 36422.17 46500.31 33754.64 49167.84
## 2079       41461.24 36339.22 46583.26 33627.79 49294.69
## 2080       41461.24 36257.60 46664.88 33502.96 49419.52
## 2081       41461.24 36177.24 46745.24 33380.05 49542.43
## 2082       41461.24 36098.08 46824.40 33258.99 49663.49
## 2083       41461.24 36020.07 46902.41 33139.69 49782.79
## 2084       41461.24 35943.17 46979.31 33022.07 49900.41
## 2085       41461.24 35867.32 47055.16 32906.07 50016.41
## 2086       41461.24 35792.49 47129.99 32791.63 50130.85
## 2087       41461.24 35718.63 47203.85 32678.67 50243.81
## 2088       41461.24 35645.71 47276.77 32567.15 50355.33
## 2089       41461.24 35573.69 47348.79 32457.01 50465.47
## 2090       41461.24 35502.55 47419.93 32348.20 50574.28
## 2091       41461.24 35432.24 47490.24 32240.68 50681.80
## 2092       41461.24 35362.74 47559.74 32134.39 50788.09
## 2093       41461.24 35294.03 47628.45 32029.30 50893.18
## 2094       41461.24 35226.07 47696.41 31925.38 50997.11
## 2095       41461.24 35158.85 47763.63 31822.57 51099.91
## 2096       41461.24 35092.34 47830.14 31720.84 51201.64
plot(pronostico)