Una serie de tiempo es una lista de fechas, cada una de las cuales se asocia a un valor (un número). Las series de tiempo son un modo estructurado de representar datos. Visualmente, es una curva que evoluciona a lo largo del tiempo. Por ejemplo, las ventas diarias de un producto pueden representarse como una serie de tiempo.
En el sector minorista o en el de manufactura, las series de tiempo son importantes porque son las representaciones más canónicas del flujo de artículos vendido o producido. La representación de datos comerciales como series de tiempo generalmente ayuda a los encargados a visualizar la actividad de sus comercios. https://www.lokad.com/es/que-es-el-pronostico-de-series-de-tiempo
En estadística y econometría, en particular en series temporales, un modelo autorregresivo integrado de promedio móvil o ARIMA (acrónimo del inglés autoregressive integrated moving average) 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. Se trata de un modelo dinámico de series temporales, es decir, las estimaciones futuras vienen explicadas por los datos del pasado y no por variables independientes.
Fue desarrollado a finales de los sesenta del siglo XX. Box y Jenkins (1976) lo sistematizaron.
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. Cuando alguno de los tres parámetros es cero, es común omitir las letras correspondientes del acrónimo — AR para la componente autorregresiva, I para la integrada y MA para la media móvil. Por ejemplo, ARIMA(0,1,0) se puede expresar como I(1) y ARIMA(0,0,1) como MA(1).
El modelo ARIMA puede generalizarse aún más para considerar el efecto de la estacionalidad. En ese caso, se habla de un modelo SARIMA (seasonal autoregressive integrated moving average).
El modelo ARIMA (p,d,q) se puede representar como:
\[{\displaystyle Y_{t}=-(\Delta ^{d}Y_{t}-Y_{t})+\phi _{0}+\sum _{i=1}^{p}\phi _{i}\Delta ^{d}Y_{t-i}-\sum _{i=1}^{q}\theta _{i}\varepsilon _{t-i}+\varepsilon _{t}}\]
library(ggfortify)
## Warning: package 'ggplot2' was built under R version 3.4.3
## Warning: namespace 'DBI' is not available and has been replaced
## by .GlobalEnv when processing object 'call.'
## Warning: namespace 'DBI' is not available and has been replaced
## by .GlobalEnv when processing object 'call.'
library(tseries)
library(forecast)
library(lmtest)
serie <- read.csv("D:/datasets/AMZN.csv", header = TRUE, sep = ",")
head(serie, 15)
Date Open High Low Close Adj.Close Volume
1 2001-01-02 15.8125 16.0000 13.6250 13.8750 13.8750 9203500
2 2001-01-03 13.6250 17.8750 13.5625 17.5625 17.5625 14680400
3 2001-01-04 17.0000 17.5625 15.4375 15.5000 15.5000 10620500
4 2001-01-05 15.5000 15.8750 13.5625 14.5625 14.5625 8798800
5 2001-01-08 14.4375 15.5625 13.7500 14.9375 14.9375 10444700
6 2001-01-09 14.5625 16.6250 14.5625 16.3750 16.3750 23455200
7 2001-01-10 15.8437 17.0000 15.5625 16.5000 16.5000 11002500
8 2001-01-11 15.7500 17.3125 15.6250 17.0000 17.0000 12756600
9 2001-01-12 17.3437 18.5000 17.1250 17.6875 17.6875 8434200
10 2001-01-16 18.3125 18.3750 17.2500 18.0625 18.0625 6017000
11 2001-01-17 18.8750 19.5625 17.7500 18.3750 18.3750 9166000
12 2001-01-18 18.3750 19.5000 17.9375 19.5000 19.5000 4115800
13 2001-01-19 20.3750 20.3750 18.6875 19.9375 19.9375 6177500
14 2001-01-22 19.5000 19.9375 18.5000 18.5000 18.5000 4398600
15 2001-01-23 18.3750 19.3125 18.2500 18.9531 18.9531 4744300
str(serie)
## 'data.frame': 4025 obs. of 7 variables:
## $ Date : Factor w/ 4025 levels "2001-01-02","2001-01-03",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ Open : num 15.8 13.6 17 15.5 14.4 ...
## $ High : num 16 17.9 17.6 15.9 15.6 ...
## $ Low : num 13.6 13.6 15.4 13.6 13.8 ...
## $ Close : num 13.9 17.6 15.5 14.6 14.9 ...
## $ Adj.Close: num 13.9 17.6 15.5 14.6 14.9 ...
## $ Volume : int 9203500 14680400 10620500 8798800 10444700 23455200 11002500 12756600 8434200 6017000 ...
Adj,Closeserie1 <- ts(serie[,6], frequency = 365,start = c(2001,1))
head(serie1, 15)
Time Series:
Start = c(2001, 1)
End = c(2001, 15)
Frequency = 365
[1] 13.8750 17.5625 15.5000 14.5625 14.9375 16.3750 16.5000 17.0000
[9] 17.6875 18.0625 18.3750 19.5000 19.9375 18.5000 18.9531
Adj.Closeautoplot(serie1, xlabel = "Tiempo", ylab = "Adj.Close")
Trazada la serie Adj.Close. Se puede determinar que presenta un tendencia ascendente de forma exponencial(la serie no es estacionaria en media). Con esto se puede afirmar que la serie no es estacionaria. Tambien se puede observar que la serie es estacionaria en cuando a la varianza, ya que no se aprecia gran variabiliad. Para confirmar lo dicho vamos a trazar la gráfica de su función de autocorrelación.
autoplot(acf(serie1, plot = FALSE))
Se puede apreciar en esta gráfica como la serie no es estacionaria ya que el valor de la función de autocorrelación no decae de manera exponencial a medida que aumentan los rezagos en el tiempo.
autoplot(stl(serie1, s.window = "periodic"))
El análisis previo nos revela que tenemos que eliminar la tendencia y la estacionalidad de la serie para que pueda ser estacionaria. El modelo que vamos a utilizar es un modelo ARIMA, diferenciando la serie lograremos que sea convertida a estacionaria, por lo tanto vamos a ver que nos dice las funciones ndiffs y nsdiffs, que calculan cada una el número de diferenciaciones regulares y estacionales respectivamente que se necesita llevar a cabo para que la serie sea estacionaria.
ndiffs(serie1)
## [1] 2
nsdiffs(serie1)
## [1] 0
diff.serie1 <- diff(log(serie1))
autoplot(diff.serie1)
Como podemos ver ahora en la serie ya se ha eliminado la componente de tendencia, una ves eliminada esta componente volvemos a gráficar la función de autocorrelación.
autoplot(acf(diff.serie1, plot = FALSE))
autoplot(pacf(diff.serie1, plot = FALSE))
Una vez eliminado tanto la componente de tendencia y la estacional, observemos que esta serie se parece bastante a una serie estacionaria, ya que parece ser constante en media y varianza, para asegurarnos aplicamos un test de estacionariedad como el test ADF (Dickey-Fuller).
\(H_{0}\) : La serie es no estacionaria: tiene raíz unitaria \(H_{1}\) : La serie es estacionaria: no tiene raíz unitaria
df <- adf.test(diff.serie1)
## Warning in adf.test(diff.serie1): p-value smaller than printed p-value
print(df)
##
## Augmented Dickey-Fuller Test
##
## data: diff.serie1
## Dickey-Fuller = -16.158, Lag order = 15, p-value = 0.01
## alternative hypothesis: stationary
El valor 0.01 del test indica que se puede rechazar la hipótesis nula \(H_{0}\) indicando que la serie es estacionaria.
Vistas la gráficas acf y pacf pueden plantear varios modelos tentativos para el análisis
arima1 <- Arima(diff.serie1, order = c(0,2,1))
arima2 <- Arima(diff.serie1, order = c(0,2,2))
arima3 <- Arima(diff.serie1, order = c(1,2,0))
arima4 <- Arima(diff.serie1, order = c(2,2,0))
Cálculamos los criterios AIC y BIC
AIC(arima1, arima2, arima3, arima4)
## df AIC
## arima1 2 -13540.24
## arima2 3 -16236.42
## arima3 2 -11490.73
## arima4 3 -12538.14
BIC(arima1, arima2, arima3, arima4)
## df BIC
## arima1 2 -13527.64
## arima2 3 -16217.52
## arima3 2 -11478.14
## arima4 3 -12519.24
Aquí se puede apreciar que los ajustes que mejor AIC y BIC presentan son aquellas que solo tienen componente de médias móviles y no tienen componente autorregresiva, siendo ARIMA(0,2,2)
coeftest(arima2)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -1.9736950 0.0042953 -459.50 < 2.2e-16 ***
## ma2 0.9739008 0.0042346 229.98 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggtsdiag(arima2)
## Warning: package 'bindrcpp' was built under R version 3.4.3
autoplot(acf(arima2$residuals, plot = FALSE))
sht <- shapiro.test(arima2$residuals)
sht
##
## Shapiro-Wilk normality test
##
## data: arima2$residuals
## W = 0.85655, p-value < 2.2e-16