9.1 Stazionarietà e differenziazione

Una serie temporale stazionaria è una serie le cui proprietà statistiche non dipendono dal tempo in cui la serie viene osservata.15 Quindi, serie temporali contenenti componenti tendenziali (trend), o stagionali, non sono stazionarie — infatti, il trend e la stagionalità influenzano il valore della serie temporale in tempi diversi. D’altra parte, una serie storica realizzazione di un processo white noise è stazionaria — indipendentemente da quando la si osserva, il suo comportamento dovrebbe rimanere lo stesso.

Alcuni casi possono essere confusi — per esempio, una serie temporale con comportamento ciclico (ma senza trend o stagionalità) è stazionaria. Questo perché i cicli non hanno una lunghezza fissa, quindi prima di osservare la serie non possiamo essere sicuri di dove saranno i picchi e le depressioni dei cicli.

In generale, una serie temporale stazionaria non sarà prevedibile nel lungo periodo. I grafici delle serie storiche mostreranno andamenti approssimativamente costanti (sebbene siano possibili comportamenti ciclici), con varianza costante.

Quali di queste serie sono stazionarie? (a) Prezzo di chiusura del titolo Google nel 2015; (b) Variazioni giornaliere dei prezzi di chiusura del titolo Google nel 2015; (c) Numero annuale di scioperi negli USA; (d) Vendite mensili di nuove case monofamiliari negli USA; (e) Prezzo annuale delle uova (dozzine, prezzi costanti); (f) Numero totale mensile di suini macellati in Victoria, Australia; (g) Numero totale annuale di pellicce di lince canadese commercializzate dalla Hudson Bay Company; (h) Produzione trimestrale di birra australiana; (i) Produzione mensile di gas australiano.

Figura 9.1: Quali di queste serie sono stazionarie? (a) Prezzo di chiusura del titolo Google nel 2015; (b) Variazioni giornaliere dei prezzi di chiusura del titolo Google nel 2015; (c) Numero annuale di scioperi negli USA; (d) Vendite mensili di nuove case monofamiliari negli USA; (e) Prezzo annuale delle uova (dozzine, prezzi costanti); (f) Numero totale mensile di suini macellati in Victoria, Australia; (g) Numero totale annuale di pellicce di lince canadese commercializzate dalla Hudson Bay Company; (h) Produzione trimestrale di birra australiana; (i) Produzione mensile di gas australiano.

Si considerino le nove serie rappresentate in Figura 9.1. Quali fra queste pensi possano essere stazionarie?

L’evidente stagionalità esclude le serie (d), (h) e (i). La presenza di trend e cambiamenti di livello escludono le serie (a), (c), (e), (f) e (i). L’aumento della varianza esclude anche la serie (i). Rimangono solo la (b) e la (g) come serie stazionarie.

A prima vista, la presenza di evidenti cicli nella serie (g) potrebbe far pensare che tale serie sia non stazionaria. Ma questi cicli sono aperiodici — sono causati dal fatto che, quando la popolazione di linci diventa troppo grande per il cibo disponibile, le linci smettono di riprodursi e la popolazione scende a numeri bassi, poi il rinnovamento delle loro fonti di cibo permette alla popolazione di crescere di nuovo, e così via. A lungo termine, la cadenza di questi cicli non è prevedibile. Quindi la serie è stazionaria.

Differenziazione

La figura 9.1, pannello (a), riporta il prezzo delle azioni di Google che è una serie non stazionaria, tuttavia la serie delle variazioni giornaliere, pannello (b), risulta stazionaria. Questo rende evidente come rendere stazionaria una serie temporale non stazionaria - calcolare le differenze tra osservazioni consecutive. Tale operazione è nota come differenziazione.

Trasformazioni come i logaritmi possono aiutare a stabilizzare la varianza di una serie temporale. La differenziazione può aiutare a stabilizzare la media di una serie temporale, rimuovendo i cambiamenti nel livello, e quindi eliminando (o riducendo) trend e stagionalità.

Oltre al grafico della serie storica, anche il grafico dell’ACF è utile per identificare le serie temporali non stazionarie. Infatti, per una serie stazionaria, l’ACF scenderà a zero abbastanza rapidamente, mentre l’ACF di una serie di dati non stazionari decresce verso lo zero molto lentamente. Inoltre, per i dati non stazionari, il valore di \(r_1\) è spesso elevato e positivo.

ACF dei prezzi giornalieri di chiusura del titolo Google nel 2015 (sinistra) e delle sue variazioni giornaliere  (destra).

Figura 9.2: ACF dei prezzi giornalieri di chiusura del titolo Google nel 2015 (sinistra) e delle sue variazioni giornaliere (destra).

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

L’ACF della serie differenziata dei prezzi di Google sembra essere quella di una serie white noise. Solamente un coefficiente di autocorrelazione (al ritardo 17) risulta esterno alle bande di confidenza al 95%, e la statistica Ljung-Box \(Q^*\) ha un p-value di 0.637 (per \(h=10\)). Questo suggerisce che la variazione giornaliera del prezzo delle azioni di Google è essenzialmente una quantità casuale che non è correlata con quella dei giorni precedenti.

Modello Random walk

La serie differenziata è la variazione fra osservazioni consecutive della serie originale, e può essere scritta come \[ y'_t = y_t - y_{t-1}. \] La serie differenziata conterrà solo \(T-1\) valori, dal momento che non è possibile calcolare la differenza, \(y_1'\), per la prima osservazione.

Quando la serie differenziata risulta essere white noise, il modello per la serie originale può essere scritto come \[ y_t - y_{t-1} = \varepsilon_t, \] dove \(\varepsilon_t\) è white noise. Riarrangiando i termini questo porta al modello “random walk” \[ y_t = y_{t-1} + \varepsilon_t. \] I modelli random walk sono molto utilizzati per serie di dati non stazionari, in particolare dati economici e finanziari. I random walk generalmente presentano:

  • componenti tendenziali (crescenti o decrescenti) molto lunghe
  • cambiamenti di direzione improvvisi e non prevedibili.

Le previsioni di un modello random walk sono uguali all’ultima osservazione, poiché i movimenti futuri sono imprevedibili e hanno la stessa probabilità di crescere o decrescere. Pertanto, il modello random walk è alla base delle previsioni del cosidetto metodo naïve, introdotto per la prima volta nella sezione 5.2.

Un modello strettamente collegato al random walk permette alle differenze di avere una media diversa da zero. In tal caso \[ y_t - y_{t-1} = c + \varepsilon_t\quad\text{or}\quad {y_t = c + y_{t-1} + \varepsilon_t}\: . \] Il valore di \(c\) rappresenta la media dei cambiamenti tra osservazioni consecutive. Se \(c\) è positivo, allora il cambiamento medio è un aumento del valore di \(y_t\), in tal caso, \(y_t\) tenderà a salire. Tuttavia, se \(c\) è negativo, \(y_t\) tenderà a spostarsi verso il basso.

Questo modello è sottostante al metodo del drift, già discusso nella Sezione 5.2.

Differenziazione del secondo ordine

In alcuni casi, i dati differenziati possono non risultare stazionari, e può essere necessario dover differenziare i dati una seconda volta per ottenere una serie stazionaria: \[\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*}\] In questo caso, stiamo modellando la “variazione della variazione” dei dati originali e \(y_t''\) presenterà \(T-2\) valori. In pratica, non è quasi mai necessario differenziare più di due volte.

Differenziazione stagionale

La differenziazione stagionale è la differenza fra un’osservazione al tempo \(t\) e l’osservazione rilevata nella stessa stagione (periodo) dell’anno precedente. Quindi \[ y'_t = y_t - y_{t-m}, \] dove \(m=\) è il numero di stagioni (periodi). Tali differenze sono anche chiamate “differenze al ritardo \(m\)”, poiché all’osservazione al tempo \(t\) viene sottratta l’osservazione ritardata \(m\) periodi.

Se una serie di dati stagionalmente differenziati sembra una serie white noise, allora un modello appropriato per i dati originali è \[ y_t = y_{t-m}+\varepsilon_t. \] Le previsioni di questo modello sono uguali all’ultima osservazione della stagione in questione. Cioè, questo modello dà previsioni stagionali naïve, introdotte nella Sezione 5.2.

Il pannello inferiore della figura 9.3 mostra le differenze stagionali del logaritmo delle vendite mensili dei farmaci A10 (antidiabetici) in Australia. La trasformazione e la differenziazione hanno reso la serie stazionaria.

Logaritmo e differenza stagionale della serie delle vendite di A10 (antidiabetic). Il logaritmo stabilizza la varianza, mentre la differenza stagionale rimuove stagionalità e trend.

Figura 9.3: Logaritmo e differenza stagionale della serie delle vendite di A10 (antidiabetic). Il logaritmo stabilizza la varianza, mentre la differenza stagionale rimuove stagionalità e trend.

Per distinguere le differenze stagionali dalle differenze ordinarie, a volte ci riferiamo alle differenze ordinarie come “differenze prime”, vale a dire differenze al ritardo 1.

A volte è necessario prendere sia una differenza stagionale che una differenza prima per ottenere dati stazionari. La figura 9.4 riporta le vendite di farmaci corticosteroidi in Australia ($AUD) (pannello superiore). In questo caso, i dati vengono prima trasformati usando i logaritmi (secondo pannello), poi vengono calcolate le differenze stagionali (terzo pannello). Poiché i dati sembrano ancora non stazionari, vengono calcolate anche le differenze prime (pannello inferiore).

PBS %>%
  filter(ATC2 == "H02") %>%
  summarise(Cost = sum(Cost)/1e6) %>%
  transmute(
    `Vendite ($milioni)` = Cost,
    `Log vendite` = log(Cost),
    `Differenza stagionale delle log vendite` = difference(log(Cost), 12),
    `Doppia differenziazione delle log vendite` =
                     difference(difference(log(Cost), 12), 1)
  ) %>%
  pivot_longer(-Month, names_to="Type", values_to="Sales") %>%
  mutate(
    Type = factor(Type, levels = c(
      "Vendite ($milioni)",
      "Log vendite",
      "Differenza stagionale delle log vendite",
      "Doppia differenziazione delle log vendite"))
  ) %>%
  ggplot(aes(x = Month, y = Sales)) +
  geom_line() +
  facet_grid(vars(Type), scales = "free_y") +
  labs(title = "Vendite di corticosteroidi", y = NULL)
Primo grafico: Vendite di farmaci corticosteroidi ($AUD). Gli altri grafici mostrano gli stessi dati dopo averli trasformati e differenziati.

Figura 9.4: Primo grafico: Vendite di farmaci corticosteroidi ($AUD). Gli altri grafici mostrano gli stessi dati dopo averli trasformati e differenziati.

C’è un certo grado di soggettività nel selezionare quali differenze applicare. I dati destagionalizzati nella figura 9.3 non mostrano un comportamento sostanzialmente diverso dai dati destagionalizzati nella figura 9.4. In quest’ultimo caso, avremmo potuto decidere di fermarci con i dati destagionalizzati e non differenziare ulteriormente i dati. Nel primo caso, avremmo potuto decidere che i dati non erano sufficientemente stazionari e differenziare ulteriormente i dati. Alcuni test formali per la differenziazione verranno discussi più avanti, tuttavia, è importante sottolineare che ci sono sempre alcune scelte da fare nel processo di modellazione, e analisti diversi possono fare scelte diverse.

Se \(y'_t = y_t - y_{t-m}\) denota la serie stagionalmente differenziata, allora la serie differenziata due volte è \[\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*}\] Quando si calcola sia la differenza stagionale sia la differenza prima, non è importante quale viene fatta per prima - il risultato sarà lo stesso. Tuttavia, se i dati presentano una forte stagionalità, si consiglia di calcolare prima la differenza stagionale, perché la serie risultante sarà, talvolta, già stazionaria e non ci sarà bisogno di un’ulteriore differenza prima. Se la differenza prima viene effettuata per prima, potrebbe esserci ancora stagionalità presente.

Attenzione che applicare più differenze del necessario indurrà false dinamiche, o autocorrelazioni che non esistono realmente nella serie temporale. Pertanto, è importante calcolare solo le differenze necessarie per ottenere una serie stazionaria.

È importante quando si differenzia una serie, che le differenze siano interpretabili. Le differenze prime esprimono la variazione tra un’osservazione e la successiva. Le differenze stagionali sono la variazione tra un anno e l’altro. È improbabile che differenziare ad altri ritardi abbia un senso interpretativo e, pertanto, differenziazioni a ritardi diversi dal primo o da quelli stagionali dovrebbero essere evitati.

Test per radici unitarie

Una tecnica per determinare in modo più obiettivo se la differenziazione è necessaria, è quella di usare test di radice unitaria. I test di radice unitaria sono test statistici per verificare l’ipotesi di (non) stazionarietà, sviluppati per determinare se sia necessario differenziare la serie.

Sono disponibili diversi test di radice unitaria, che si basano su ipotesi diverse e possono portare a risposte contrastanti. Nella nostra analisi, useremo il test Kwiatkowski-Phillips-Schmidt-Shin (KPSS) (Kwiatkowski et al., 1992). L’ipotesi nulla di questo test è che i dati siano stazionari, e noi cerchiamo evidenza contro l’ipotesi nulla. Di conseguenza, valori piccoli del p-value (ad esempio, inferiori 0,05) suggeriscono che la differenziazione è necessaria. Il test può essere calcolato usando la funzione unitroot_kpss().

Applichiamo tale test ai dati relativi ai prezzi di chiusura del titolo 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

Il p-value viene riportato come 0.01 se risulta inferiore a 0.01, e come 0.1 se risulta superiore a 0.1. In questo caso, la statistica test (3.56) è maggiore del valore critico al livello del 1%, quindi il p-value è inferiore a 0.01, indicando evidenza contraria all’ipotesi nulla che, pertanto, va rifiutata. In altre parole, i dati sono non stazionari. Possiamo differenziare i dati e applicare ancora il test.

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

Questa volta la statistica test assume un valore piccolo e ben all’interno dell’intervallo che ci aspetteremmo per i dati stazionari, quindi il p-value è maggiore di 0,1. Possiamo concludere che i dati differenziati appaiono stazionari.

Questo processo di utilizzare una sequenza di test KPSS per determinare il numero appropriato di differenze da applicare ad una serie di dati, viene eseguito utilizzando il comando unitroot_ndiffs().

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

Come abbiamo visto, il test KPSS ci suggerisce che per rendere stazionari i dati google_2015, dobbiamo usare una differenza prima.

Un test statistico simile per determinare se è necessaria la differenziazione stagionale è unitroot_nsdiffs(), che usa `index{unitroot_nsdiffs@} la misura della forza della componente stagionale introdotta nella Sezione 4.3 per determinare il numero appropriato di differenze stagionali richieste. Nessuna differenza stagionale viene suggerita se \(F_S<0.64\), altrimenti dovrebbe essere utilizzata una differenza stagionale.

Applichiamo unitroot_nsdiffs() alla serie del fatturato totale mensile della vendita al dettaglio in Australia.

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

Poiché l’applicazione del test unitroot_nsdiffs() restituisce 1 (indicando che è richiesta una differenza stagionale), applichiamo il test unitroot_ndiffs() ai dati differenziati stagionalmente. I risultati dei test suggeriscono che dovremmo calcolare sia una differenza stagionale che una differenza prima.

Bibliografia

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. [DOI]

  1. Più precisamente, se \({y_t\}\) è una serie temporale stazionaria, allora per ogni \(s\), la distribuzione di \((y_t,\dots,y_{t+s})\) non dipende da \(t\).↩︎