9.1 Estacionariedad y diferenciación

Una serie temporal estacionaria es aquella cuyas propiedades estadísticas no dependen del momento en el que se observa la serie.16. Por lo tanto, las series temporales con tendencias, o con estacionalidad, no son estacionarias — la tendencia y la estacionalidad afectarán al valor de la serie temporal en diferentes momentos. Por otro lado, una serie de ruido blanco es estacionaria: no importa cuándo se observe, debería tener el mismo aspecto en cualquier momento.

Algunos casos pueden ser confusos: una serie temporal con un comportamiento cíclico (pero sin tendencia ni estacionalidad) es estacionaria. Esto se debe a que los ciclos no tienen una duración fija, por lo que antes de observar la serie no podemos estar seguros de dónde estarán los picos y los valles de los ciclos.

En general, una serie temporal estacionaria no presenta patrones predecibles a largo plazo. Los gráficos temporales mostrarán que la serie es aproximadamente horizontal (aunque es posible cierto comportamiento cíclico), con una varianza constante.

Which of these series are stationary? (a) Google closing stock price in 2015; (b) Daily change in the Google stock price in 2015; (c) Annual number of strikes in the US; (d) Monthly sales of new one-family houses sold in the US; (e) Annual price of a dozen eggs in the US (constant dollars); (f) Monthly total of pigs slaughtered in Victoria, Australia; (g) Annual total of Canadian Lynx furs traded by the Hudson Bay Company; (h) Quarterly Australian beer production; (i) Monthly Australian gas production.

Figure 9.1: Which of these series are stationary? (a) Google closing stock price in 2015; (b) Daily change in the Google stock price in 2015; (c) Annual number of strikes in the US; (d) Monthly sales of new one-family houses sold in the US; (e) Annual price of a dozen eggs in the US (constant dollars); (f) Monthly total of pigs slaughtered in Victoria, Australia; (g) Annual total of Canadian Lynx furs traded by the Hudson Bay Company; (h) Quarterly Australian beer production; (i) Monthly Australian gas production.

Considere las nueve series representadas en la Figura ??. ¿Cuáles cree que son estacionarias?

La estacionalidad evidente descarta las series (d), (h) e (i). Las tendencias y los cambios de nivel descartan las series (a), (c), (e), (f) e (i). El aumento de la varianza también descarta (i). Sólo quedan las series (b) y (g) como estacionarias.

A primera vista, los fuertes ciclos de la serie (g) podrían hacerla no estacionaria. Pero estos ciclos son aperiódicos: se producen cuando la población de linces es demasiado grande para el alimento disponible, por lo que dejan de reproducirse y la población cae a números bajos, entonces la regeneración de sus fuentes de alimento permite que la población vuelva a crecer, y así sucesivamente. A largo plazo, el calendario de estos ciclos no es predecible. Por lo tanto, la serie es estacionaria.

Diferenciación

En la figura 9.1, observe que el precio de las acciones de Google no era estacionario en el panel (a), pero los cambios diarios eran estacionarios en el panel (b). Esto muestra una manera de hacer que una serie de tiempo no estacionaria sea estacionaria: calcular las diferencias entre observaciones consecutivas. Esto se conoce como diferenciación.

Las transformaciones, como los logaritmos, pueden ayudar a estabilizar la varianza de una serie temporal. La diferenciación puede ayudar a estabilizar la media de una serie temporal eliminando los cambios en el nivel de una serie temporal y, por lo tanto, eliminando (o reduciendo) la tendencia y la estacionalidad.

Además del gráfico temporal de los datos, el gráfico ACF también es útil para identificar series temporales no estacionarias. Para una serie temporal estacionaria, el ACF caerá a cero con relativa rapidez, mientras que el ACF de los datos no estacionarios disminuye lentamente. Además, para los datos no estacionarios, el valor de \(r_1\) es a menudo grande y positivo.

google_2015 <- gafa_stock %>%
  filter(Symbol == "GOOG", year(Date) == 2015)
google_2015 %>% ACF(Close) %>%
  autoplot() + labs(subtitle = "Google closing stock price")
google_2015 %>% ACF(difference(Close)) %>%
  autoplot() + labs(subtitle = "Changes in Google closing stock price")
The ACF of the Google closing stock price in 2015 (left) and of the daily changes in Google closing stock price in 2015 (right).

Figure 9.2: The ACF of the Google closing stock price in 2015 (left) and of the daily changes in Google closing stock price in 2015 (right).

google_2015 %>%
  mutate(diff_close = difference(Close)) %>%
  features(diff_close, ljung_box, lag = 10)
#> # A tibble: 1 × 3
#>   Symbol lb_stat lb_pvalue
#>   <chr>    <dbl>     <dbl>
#> 1 GOOG      7.91     0.637

La ACF del precio diferenciado de las acciones de Google se parece a la de una serie de ruido blanco. Sólo una autocorrelación está fuera de los límites del 95%, y el estadístico \(Q^*\) de Ljung-Box tiene un valor p de 0.637 (para \(h=10\)). Esto sugiere que el cambio diario en el precio de las acciones de Google es esencialmente una cantidad aleatoria que no está correlacionada con la de los días anteriores.

Modelo de paseo aleatorio

La serie diferenciada es el cambio entre observaciones consecutivas de la serie original, y puede escribirse como \[ y'_t = y_t - y_{t-1}. \] La serie diferenciada tendrá sólo \(T-1\) valores, ya que no es posible calcular una diferencia \(y_1'\) para la primera observación.

Cuando la serie diferenciada es ruido blanco, el modelo para la serie original se puede escribir como \[ y_t - y_{t-1} = \varepsilon_t, \] donde \(\varepsilon_t\) denota ruido blanco. Reordenando esto nos lleva al modelo de «paseo aleatorio» \[ y_t = y_{t-1} + \varepsilon_t. \] Los modelos de paseo aleatorio se utilizan ampliamente para los datos no estacionarios, en particular los datos financieros y económicos. Los paseos aleatorios suelen tener

  • largos periodos de tendencias aparentes al alza o a la baja
  • cambios de dirección repentinos e impredecibles.

Las predicciones de un modelo de paseo aleatorio son iguales a la última observación, ya que los movimientos futuros son impredecibles y tienen la misma probabilidad de ser al alza o a la baja. Así pues, el modelo de paseo aleatorio sustenta las predicciones del método ingenuo, introducido por primera vez en la sección 5.2.

Un modelo estrechamente relacionado permite que las diferencias tengan una media distinta de cero. Entonces \[ y_t - y_{t-1} = c + \varepsilon_t\quad\text{or}\quad {y_t = c + y_{t-1} + \varepsilon_t}\: . \] El valor de \(c\) es la media de los cambios entre observaciones consecutivas. Si \(c\) es positivo, entonces el cambio medio es un aumento en el valor de \(y_t\). Por lo tanto, \(y_t\) tenderá a subir. Sin embargo, si \(c\) es negativo, \(y_t\) tenderá a bajar.

Este es el modelo detrás del método de deriva, también discutido en la Sección 5.2..

Diferenciación de segundo orden

Ocasionalmente los datos diferenciados no parecerán estacionarios y puede ser necesario diferenciar los datos una segunda vez para obtener una serie estacionaria: \[\begin{align*} y''_{t} &= y'_{t} - y'_{t - 1} \\ &= (y_t - y_{t-1}) - (y_{t-1}-y_{t-2})\\ &= y_t - 2y_{t-1} +y_{t-2}. \end{align*}\] En este caso, \(y_t''\) tendrá valores \(T-2\). Entonces, modelaríamos el «cambio en los cambios» de los datos originales. En la práctica, casi nunca es necesario ir más allá de las diferencias de segundo orden.

Diferenciación estacional

Una diferencia estacional es la diferencia entre una observación y la observación anterior de la misma estación. Así, \[ y'_t = y_t - y_{t-m}, \] donde \(m=\) el número de estaciones. También se denominan «diferencias de \(m\) retardos», ya que restamos la observación después de un retardo de \(m\) periodos.

Si los datos diferenciados estacionalmente parecen ser ruido blanco, entonces un modelo apropiado para los datos originales es \[ y_t = y_{t-m}+\varepsilon_t. \] Las predicciones de este modelo son iguales a la última observación de la temporada correspondiente. Es decir, este modelo proporciona predicciones estacionales ingenuas, presentado en la sección 5.2.

El panel inferior de la figura 9.3 muestra las diferencias estacionales del logaritmo de los prescripciones mensuales de los medicamentos A10 (antidiabéticos) vendidos en Australia. La transformación y la diferenciación han hecho que las series parezcan relativamente estacionarias.

#> Warning: Removed 12 rows containing missing values or values outside the scale range
#> (`geom_line()`).
Logs and seasonal differences of the A10 (antidiabetic) sales data. The logarithms stabilise the variance, while the seasonal differences remove the seasonality and trend.

Figure 9.3: Logs and seasonal differences of the A10 (antidiabetic) sales data. The logarithms stabilise the variance, while the seasonal differences remove the seasonality and trend.

Para distinguir las diferencias estacionales de las diferencias ordinarias, a veces nos referimos a las diferencias ordinarias como «primeras diferencias», es decir, diferencias en el retardo 1.

A veces es necesario hacer tanto una diferencia estacional como una primera diferencia para obtener datos estacionarios. La figura 9.4 muestra las ventas de corticosteroides en Australia ($AUD) (panel superior). Aquí, los datos se transforman primero utilizando logaritmos (segundo panel) y, a continuación, se calculan las diferencias estacionales (tercer panel). Los datos siguen pareciendo algo no estacionarios, por lo que se calcula otro lote de primeras diferencias (panel inferior).

PBS %>%
  filter(ATC2 == "H02") %>%
  summarise(Cost = sum(Cost)/1e6) %>%
  transmute(
    `Sales ($million)` = Cost,
    `Log sales` = log(Cost),
    `Annual change in log sales` = difference(log(Cost), 12),
    `Doubly differenced log sales` =
                     difference(difference(log(Cost), 12), 1)
  ) %>%
  pivot_longer(-Month, names_to="Type", values_to="Sales") %>%
  mutate(
    Type = factor(Type, levels = c(
      "Sales ($million)",
      "Log sales",
      "Annual change in log sales",
      "Doubly differenced log sales"))
  ) %>%
  ggplot(aes(x = Month, y = Sales)) +
  geom_line() +
  facet_grid(vars(Type), scales = "free_y") +
  labs(title = "Corticosteroid drug sales", y = NULL)
#> Warning: Removed 25 rows containing missing values or values outside the scale range
#> (`geom_line()`).
Panel superior: Ventas de medicamentos corticosteroides ($AUD). Otros paneles muestran los mismos datos después de transformar y diferenciar.

Figure 9.4: Panel superior: Ventas de medicamentos corticosteroides ($AUD). Otros paneles muestran los mismos datos después de transformar y diferenciar.

Existe cierto grado de subjetividad a la hora de seleccionar qué diferencias aplicar. Los datos con diferencias estacionales de la figura 9.3 no muestran un comportamiento sustancialmente diferente de los datos con diferencias estacionales de la figura 9.4. En este último caso, podríamos haber decidido detenernos en los datos diferenciados estacionalmente y no realizar una ronda adicional de diferenciación. En el primer caso, podríamos haber decidido que los datos no eran suficientemente estacionarios y haber realizado una ronda adicional de diferenciación. A continuación se analizan algunas pruebas formales de diferenciación, pero siempre hay que tomar algunas decisiones en el proceso de modelización, y analistas distintos pueden tomar decisiones diferentes.

Si \(y'_t = y_t - y_{t-m}\) denota una serie diferenciada estacionalmente, entonces la serie diferenciada dos veces es \[\begin{align*} y''_t &= y'_t - y'_{t-1} \\ &= (y_t - y_{t-m}) - (y_{t-1} - y_{t-m-1}) \\ &= y_t -y_{t-1} - y_{t-m} + y_{t-m-1}\: \end{align*}\] Cuando se aplican tanto diferencias estacionales como primeras diferencias, da igual cuál se haga primero: el resultado será el mismo. Sin embargo, si los datos tienen un fuerte patrón estacional, se recomienda que la diferenciación estacional se haga primero, porque la serie resultante a veces será estacionaria y no habrá necesidad de una primera diferencia adicional. Si se realiza primero la primera diferenciación, seguirá habiendo estacionalidad.

Tenga en cuenta que aplicar más diferencias de las necesarias inducirá una dinámica falsa o autocorrelaciones que no existen realmente en la serie temporal. Por lo tanto, haga el número mínimo necesario de diferencias para obtener una serie estacionaria.

Es importante que si se utiliza la diferenciación, las diferencias sean interpretables. Las primeras diferencias son el cambio entre una observación y la siguiente. Las diferencias estacionales son el cambio entre un año y el siguiente. Es poco probable que otros retardos tengan mucho sentido interpretable y deben evitarse.

Pruebas de raíz unitaria

Una forma de determinar de forma más objetiva si es necesaria la diferenciación es utilizar una prueba de raíz unitaria. Se trata de pruebas estadísticas de hipótesis (test de hipótesis) de estacionariedad diseñadas para determinar si es necesaria la diferenciación.

Existen varias pruebas de raíz unitaria, que se basan en distintos supuestos y pueden dar lugar a respuestas contradictorias. En nuestro análisis, utilizamos la prueba Kwiatkowski-Phillips-Schmidt-Shin (KPSS) (Kwiatkowski et al., 1992). En esta prueba, la hipótesis nula es que los datos son estacionarios, y buscamos pruebas de que la hipótesis nula es falsa. En consecuencia, los valores p pequeños (por ejemplo, menos de 0,05) sugieren que es necesaria la diferenciación. La prueba puede calcularse utilizando la función unitroot_kpss().

Por ejemplo, apliquémosla a los datos de cotización de las acciones de Google.

google_2015 %>%
  features(Close, unitroot_kpss)
#> # A tibble: 1 × 3
#>   Symbol kpss_stat kpss_pvalue
#>   <chr>      <dbl>       <dbl>
#> 1 GOOG        3.56        0.01

El valor p se indica como \(0.01\) si es inferior a \(0.01\), y como \(0.1\) si es superior a \(0.1\). En este caso, el estadístico de prueba (3.56) es mayor que el valor crítico del 1%, por lo que el valor p es inferior a \(0.01\), lo que indica que se rechaza la hipótesis nula. Es decir, los datos no son estacionarios. Podemos diferenciar los datos, y aplicar la prueba de nuevo.

google_2015 %>%
  mutate(diff_close = difference(Close)) %>%
  features(diff_close, unitroot_kpss)
#> # A tibble: 1 × 3
#>   Symbol kpss_stat kpss_pvalue
#>   <chr>      <dbl>       <dbl>
#> 1 GOOG      0.0989         0.1

Esta vez, el estadístico de prueba es pequeño y se encuentra dentro del rango que cabría esperar para datos estacionarios, por lo que el valor p es superior a \(0.1\). Podemos concluir que los datos diferenciados parecen estacionarios.

Este proceso de utilizar una secuencia de pruebas KPSS para determinar el número apropiado de primeras diferencias se lleva a cabo utilizando la función unitroot_ndiffs().

google_2015 %>%
  features(Close, unitroot_ndiffs)
#> # A tibble: 1 × 2
#>   Symbol ndiffs
#>   <chr>   <int>
#> 1 GOOG        1

Como hemos visto en las pruebas KPSS anteriores, se necesita una diferencia para que los datos de google_2015 sean estacionarios.

Una función similar para determinar si es necesaria la diferenciación estacional es unitroot_nsdiffs(), que utiliza `unitroot_nsdiffs()}} la medida de la fuerza estacional introducida en la sección 4.3 para determinar el número apropiado de diferencias estacionales necesarias. No se sugieren diferencias estacionales si \(F_S<0.64\); de lo contrario, se sugiere una diferencia estacional.

Podemos aplicar unitroot_nsdiffs() a la facturación total mensual del comercio minorista australiano.

aus_total_retail <- aus_retail %>%
  summarise(Turnover = sum(Turnover))
aus_total_retail %>%
  mutate(log_turnover = log(Turnover)) %>%
  features(log_turnover, unitroot_nsdiffs)
#> # A tibble: 1 × 1
#>   nsdiffs
#>     <int>
#> 1       1

aus_total_retail %>%
  mutate(log_turnover = difference(log(Turnover), 12)) %>%
  features(log_turnover, unitroot_ndiffs)
#> # A tibble: 1 × 1
#>   ndiffs
#>    <int>
#> 1      1

Como unitroot_nsdiffs() devuelve 1 (lo que indica que se requiere una diferencia estacional), aplicamos la función unitroot_ndiffs() a los datos diferenciados estacionalmente. Estas funciones sugieren que deberíamos hacer tanto una diferencia estacional como una primera diferencia.

Bibliografía

Kwiatkowski, D., Phillips, P. C. B., Schmidt, P., & Shin, Y. (1992). Testing the null hypothesis of stationarity against the alternative of a unit root: How sure are we that economic time series have a unit root? Journal of Econometrics, 54(1-3), 159–178.

  1. Más concretamente, si \(\{y_t\}\) es una serie temporal estacionaria, entonces para todo \(s\), la distribución de \((y_t,\dots,y_{t+s})\) no depende de \(t\)↩︎