5.5 Previsione della distribuzione e previsione intervallare

Previsione della distribuzione

Come discusso nel paragrafo 1.7, l’incertezza nelle previsioni si esprime usando una distribuzione di probabilità. Essa descrive la probabilità di osservare possibili valori futuri utilizzando il modello stimato. La previsione puntuale è la media di questa distribuzione. La maggior parte dei modelli per serie storiche produce previsioni normalmente distribuite — cioè, si assume che la distribuzione dei possibili valori futuri segua una distribuzione normale. Si presenteranno nel seguito di questo paragrafo un paio di alternative alle distribuzioni normali.

Intervalli di previsione

Un intervallo di previsione fornisce un intervallo all’interno del quale ci si aspetta che \(y_{t}\) si trovi con una probabilità specificata. Per esempio, assumendo che la distribuzione delle osservazioni future sia normale, un intervallo di predizione del 95% per la previsione di \(h\)-step è

\[ \hat{y}_{T+h|T} \pm 1.96 \, \hat\sigma_h, \] dove \(\hat\sigma_h\) è la deviazione standard stimata della distribuzione della previsione \(h\) passi in avanti.

In generale, un intervallo di previsione può essere scritto come \[ \hat{y}_{T+h|T} \pm c \, \hat\sigma_h \]

dove il moltiplicatore \(c\) dipende dalla probabilità di copertura. In questo libro di solito si utilizzeranno intervalli dell’80% e del 95%, anche se si può usare qualsiasi percentuale. La tabella 5.1 fornisce il valore di \(c\) per un intervallo di probabilità di copertura assumendo una distribuzione delle previsioni normale.

Tabella 5.1: Moltiplicatore per gli intervalli di previsione.
Percentuale Moltiplicatore
50 0.67
55 0.76
60 0.84
65 0.93
70 1.04
75 1.15
80 1.28
85 1.44
90 1.64
95 1.96
96 2.05
97 2.17
98 2.33
99 2.58

Gli intervalli di previsione esprimono l’incertezza nelle previsioni. Se si producono solo previsioni puntuali, non c’è modo di dire quanto queste siano accurate. Tuttavia, se alla previsione puntuale si accompagnano gli intervalli di previsione, allora è chiaro quanta incertezza è associata ad ogni previsione. Per questo motivo, le previsioni puntuali possono essere quasi prive di valore senza gli intervalli di previsione che le accompagnano.

Intervalli di previsione ad un passo (one-step)

Quando si fa una previsione un passo avanti, la deviazione standard della distribuzione della previsione può essere stimata usando la deviazione standard dei residui fornita da

\[\begin{equation} \hat{\sigma} = \sqrt{\frac{1}{T-K}\sum_{t=1}^T e_t^2}, \tag{5.1} \end{equation}\] dove \(k\) è il numero dei parametri stimati nel modello di previsione.

Per esempio, si consideri una previsione naive per i dati del prezzo delle azioni di Google google_2015 (mostrato in figura 5.8). L’ultimo valore della serie osservata è 758.88, quindi la previsione del prossimo valore del prezzo è 758.88. La deviazione standard dei residui del metodo naive, data dall’equazione (5.1), è 11.19. Quindi, un intervallo di previsione del 95% per il valore di SPG un passo avanti è

\[ 758.88 \pm 1.96(11.19) = [736.9, 780.8]. \] Allo stesso modo un intervallo di previsione dell’80% \[ 758.88 \pm 1.28(11.19) = [744.5, 773.2]. \]

Il valore del multiplicatore (1.96 o 1.28) è dalla tabella 5.1.

Intervalli di previsione a più passi (multi-step)

Una caratteristica comune degli intervalli di previsione è che di solito aumentano di lunghezza all’aumentare dell’orizzonte di previsione. Più l’orizzonte temporale della previsione si allunga, più aumenta l’incertezza associata alla previsione comportando intervalli di previsione più ampi. In altri termini, il valore di \(\sigma_h\) di solito aumenta con \(h\) (anche se ci sono alcuni metodi di previsione non lineari che non hanno questa proprietà).

Per produrre un intervallo di previsione, è necessario avere una stima di \(\sigma_h\). Come già evidenziato, per le previsioni a un passo (\(h=1\)), l’equazione (5.1) fornisce una buona stima della deviazione standard della previsione \(\sigma_1\). Per le previsioni più passi avanti, è necessario un metodo di calcolo più complicato. Questi calcoli presuppongono che i residui non siano correlati.

5.5.1 Metodi di benchmark (di riferimento)

Per i quattro metodi benchmark, è possibile derivare matematicamente la deviazione standard della previsione sotto l’ipotesi di residui non correlati. Se \(\hat{\sigma}_h\) denota la deviazione standard della distribuzione di previsione in \(h\) passi, e \(\hat{\sigma}\) è la deviazione standard dei residui data dalla (5.1), è possibile usare le espressioni mostrate in tabella 5.2.. Si noti che quando \(h=1\) e \(T\) è grande, tutti questi metodi forniscono lo stesso valore approssimato per \(\hat\sigma\).

Tabella 5.2: Deviazione standard della previsione \(h\) passi avanti per i quattro metodi di riferimento, dove \(sigma\) è la deviazione standard residua, \(m\) è il periodo stagionale e \(k\) è la parte intera di \((h-1) /m\) (cioè il numero di anni completi nel periodo di previsione prima dell’istante \(T+h\)).
Metodo benchmark Deviazione standard di previsione \(h\)-passi in avanti
Mean \(\hat\sigma_h = \hat\sigma\sqrt{1 + 1/T}\)
Naive \(\hat\sigma_h = \hat\sigma\sqrt{h}\)
Seasonal naive \(\hat\sigma_h = \hat\sigma\sqrt{k+1}\)
Drift \(\hat\sigma_h = \hat\sigma\sqrt{h(1+h/T)}\)

Gli intervalli di previsione possono essere facilmente calcolati utilizzando il package fable. Per esempio, di seguito è riportato l’output quando si usa il metodo naive per il prezzo delle azioni Google.

google_2015 %>%
  model(NAIVE(Close)) %>%
  forecast(h = 10) %>%
  hilo()
#> # A tsibble: 10 x 7 [1]
#> # Key:       Symbol, .model [1]
#>    Symbol .model      day        Close .mean            `80%`            `95%`
#>    <chr>  <chr>     <dbl>       <dist> <dbl>           <hilo>           <hilo>
#>  1 GOOG   NAIVE(Cl…   253  N(759, 125)  759. [744.5, 773.2]80 [736.9, 780.8]95
#>  2 GOOG   NAIVE(Cl…   254  N(759, 250)  759. [738.6, 779.2]80 [727.9, 789.9]95
#>  3 GOOG   NAIVE(Cl…   255  N(759, 376)  759. [734.0, 783.7]80 [720.9, 796.9]95
#>  4 GOOG   NAIVE(Cl…   256  N(759, 501)  759. [730.2, 787.6]80 [715.0, 802.7]95
#>  5 GOOG   NAIVE(Cl…   257  N(759, 626)  759. [726.8, 790.9]80 [709.8, 807.9]95
#>  6 GOOG   NAIVE(Cl…   258  N(759, 751)  759. [723.8, 794.0]80 [705.2, 812.6]95
#>  7 GOOG   NAIVE(Cl…   259  N(759, 876)  759. [720.9, 796.8]80 [700.9, 816.9]95
#>  8 GOOG   NAIVE(Cl…   260 N(759, 1002)  759. [718.3, 799.4]80 [696.8, 820.9]95
#>  9 GOOG   NAIVE(Cl…   261 N(759, 1127)  759. [715.9, 801.9]80 [693.1, 824.7]95
#> 10 GOOG   NAIVE(Cl…   262 N(759, 1252)  759. [713.5, 804.2]80 [689.5, 828.2]95

La funzione hilo() converte le distribuzioni di previsione in intervalli. Per default, vengono restituiti gli intervalli di previsione all’80% e al 95%, sebbene siano possibili altre opzioni sfruttando l’argomento level.

Quando vengono disegnati, gli intervalli di previsione sono mostrati come regioni ombreggiate, con l’intensità del colore che indica la probabilità associata all’intervallo. Anche in questo caso, gli intervalli all’80% e al 95% sono mostrati per default. È possibile cambiare le opzioni di default sfruttando l’argomento level.

google_2015 %>%
  model(NAIVE(Close)) %>%
  forecast(h = 10) %>%
  autoplot(google_2015) +
  labs(title="Prezzo giornaliero di chiusura delle azioni Google", y="$US" )
Intervalli di previsione all’80% e al 95% per il prezzo di chiusura delle azioni Google basati sul metodo naive.

Figura 5.14: Intervalli di previsione all’80% e al 95% per il prezzo di chiusura delle azioni Google basati sul metodo naive.

Intervallo di previsione da residui

Quando è irragionevole assumere una distribuzione normale per i residui, un’alternativa è usare il metodo bootstrap, dove la sola assunzione chiave è che i residui siano non correlati con varianza costante.

Un errore di previsione a un passo è definito come \(e_t = y_t - \hat{y}_{t|t-1}\). Questo si può riscrivere come

\[ y_t = \hat{y}_{t|t-1} + e_t. \] Un’osservazione di una serie storica può essere simulata come

\[ y_{T+1} = \hat{y}_{T+1|T} + e_{T+1} \]

dove \(\hat{y}_{T+1|T}\) è la previsione a un passo ed \(e_{T+1}\) è un errore futuro non noto. Supponendo che gli errori futuri siano simili a quelli del passato, si può sostituire \(e_{T+1}\) campionando dall’insieme degli errori passati (cioè i residui). Aggiungendo la nuova osservazione simulata al dataset, si può ripetere il processo per ottenere

\[ y_{T+2} = \hat{y}_{T+2|T+1} + e_{T+2} \]

dove \(e_{T+2}\) è un’altra estrazione dall’insieme dei residui. Continuando in questo modo, è possibile simulare un intero insieme di valori futuri per la serie storica.

Ripetendo questo processo si possono ottenere molti possibili scenari. Per vederne alcuni, si può usare la funzione generate().

fit <- google_2015 %>%
  model(NAIVE(Close))
sim <- fit %>% generate(h = 30, times = 5, bootstrap = TRUE)
sim
#> # A tsibble: 150 x 6 [1]
#> # Key:       Symbol, .model, .rep [5]
#>    Symbol .model       .rep    day  .innov  .sim
#>    <chr>  <chr>        <chr> <dbl>   <dbl> <dbl>
#>  1 GOOG   NAIVE(Close) 1       253  -2.45   756.
#>  2 GOOG   NAIVE(Close) 1       254  -7.05   749.
#>  3 GOOG   NAIVE(Close) 1       255   1.17   751.
#>  4 GOOG   NAIVE(Close) 1       256  -0.204  750.
#>  5 GOOG   NAIVE(Close) 1       257   3.48   754.
#>  6 GOOG   NAIVE(Close) 1       258   0.386  754.
#>  7 GOOG   NAIVE(Close) 1       259   3.62   758.
#>  8 GOOG   NAIVE(Close) 1       260   5.01   763.
#>  9 GOOG   NAIVE(Close) 1       261  -4.14   759.
#> 10 GOOG   NAIVE(Close) 1       262 -11.1    748.
#> # ℹ 140 more rows

Qui sono state generate cinque possibili traiettorie per i prossimi 30 giorni di trading. La variabile .rep fornisce una nuova chiave per il tsibble. Il grafico riprodotto sotto mostra le cinque traiettorie insieme ai dati osservati.

google_2015 %>%
  ggplot(aes(x = day)) +
  geom_line(aes(y = Close)) +
  geom_line(aes(y = .sim, colour = as.factor(.rep)),
    data = sim) +
  labs(title="Prezzo giornalierio di chiusura delle azioniGoogle", y="$US" ) +
  guides(colour = "none")
Cinque traiettorie future del prezzo di chiusura delle azioni di Google basati su un metodo naive con residui bootstrap.

Figura 5.15: Cinque traiettorie future del prezzo di chiusura delle azioni di Google basati su un metodo naive con residui bootstrap.

Si possono quindi ottenere gli intervalli di previsione calcolando i percentili dei percorsi futuri del campione per ogni orizzonte di previsione. Il risultato è chiamato un intervallo di previsione bootstrap. Il nome “bootstrap” si ispira all’idea di tirarsi su con le proprie forze, perché il processo ci permette di misurare l’incertezza futura usando solo i dati osservati.

Tutto questo è incorporato nella funzione forecast() in modo da non dover chiamare direttamente la funzione generate().

fc <- fit %>% forecast(h = 30, bootstrap = TRUE)
fc
#> # A fable: 30 x 5 [1]
#> # Key:     Symbol, .model [1]
#>    Symbol .model         day        Close .mean
#>    <chr>  <chr>        <dbl>       <dist> <dbl>
#>  1 GOOG   NAIVE(Close)   253 sample[5000]  759.
#>  2 GOOG   NAIVE(Close)   254 sample[5000]  759.
#>  3 GOOG   NAIVE(Close)   255 sample[5000]  758.
#>  4 GOOG   NAIVE(Close)   256 sample[5000]  759.
#>  5 GOOG   NAIVE(Close)   257 sample[5000]  759.
#>  6 GOOG   NAIVE(Close)   258 sample[5000]  759.
#>  7 GOOG   NAIVE(Close)   259 sample[5000]  759.
#>  8 GOOG   NAIVE(Close)   260 sample[5000]  759.
#>  9 GOOG   NAIVE(Close)   261 sample[5000]  759.
#> 10 GOOG   NAIVE(Close)   262 sample[5000]  759.
#> # ℹ 20 more rows

La distribuzione della previsione è ottenuta da una simulazione con 5000 pseudo-campioni. Poiché non c’è l’assunzione di normalità, gli intervalli di previsione non sono simmetrici. La colonna .mean è la media dei campioni bootstrap, quindi può essere leggermente diversa dai risultati ottenuti senza bootstrap.

autoplot(fc, google_2015) +
  labs(title="Prezzo giornaliero di chiusura delle azioni Google", y="$US" )
Previsioni del prezzo giornaliero di chiusura delle azioni Google basate su un metodo naive con residui bootstrap.

Figura 5.16: Previsioni del prezzo giornaliero di chiusura delle azioni Google basate su un metodo naive con residui bootstrap.

Il numero di campioni può essere controllato usando l’argomento times di forecast(). Per esempio, gli intervalli basati su 1000 campioni bootstrap possono essere ottenuti con:

google_2015 %>%
  model(NAIVE(Close)) %>%
  forecast(h = 10, bootstrap = TRUE, times = 1000) %>%
  hilo()
#> # A tsibble: 10 x 7 [1]
#> # Key:       Symbol, .model [1]
#>    Symbol .model      day        Close .mean            `80%`            `95%`
#>    <chr>  <chr>     <dbl>       <dist> <dbl>           <hilo>           <hilo>
#>  1 GOOG   NAIVE(Cl…   253 sample[1000]  760. [748.2, 770.8]80 [743.9, 777.6]95
#>  2 GOOG   NAIVE(Cl…   254 sample[1000]  760. [743.9, 776.1]80 [734.1, 801.6]95
#>  3 GOOG   NAIVE(Cl…   255 sample[1000]  760. [739.5, 781.7]80 [728.6, 809.0]95
#>  4 GOOG   NAIVE(Cl…   256 sample[1000]  760. [736.7, 784.7]80 [723.4, 813.1]95
#>  5 GOOG   NAIVE(Cl…   257 sample[1000]  760. [734.4, 787.2]80 [719.4, 819.7]95
#>  6 GOOG   NAIVE(Cl…   258 sample[1000]  760. [731.5, 790.2]80 [717.8, 820.3]95
#>  7 GOOG   NAIVE(Cl…   259 sample[1000]  761. [730.4, 793.0]80 [713.0, 826.3]95
#>  8 GOOG   NAIVE(Cl…   260 sample[1000]  761. [726.2, 796.2]80 [706.3, 830.7]95
#>  9 GOOG   NAIVE(Cl…   261 sample[1000]  761. [723.5, 800.2]80 [707.5, 841.0]95
#> 10 GOOG   NAIVE(Cl…   262 sample[1000]  760. [719.2, 801.8]80 [701.9, 841.4]95

In questo caso, gli intervalli sono simili (ma non identici) agli intervalli di previsione basati sulla distribuzione normale.

Muovendo il cursore in basso è possibile vedere l’effetto che la variazione del numero dei campioni boostrap (times) genera sulla distribuzione della previsione: