5.2 Alcuni semplici metodi di previsione

Alcuni metodi di previsione sono estremamente semplici e sorprendentemente efficaci. In questo libro si farà riferimento a quattro semplici metodi di previsione come metodi benchmark. Per illustrarli, si utilizzerà la produzione trimestrale australiana di mattoni in argilla tra il 1970 e il 2004.

bricks <- aus_production %>%
  filter_index("1970 Q1" ~ "2004 Q4") %>%
  select(Bricks)

La funzione filter_index() è una comoda abbreviazione per estrarre una porzione di una serie temporale.

Metodo della media

In questo caso le previsioni di tutti i valori futuri sono uguali alla media dei dati storici. Indicando i valori osservati con \(y_{1}, \dots, y_{T}\), allora le previsioni si possono scrivere come \(y_{1}, \dots, y_{T}\)s}

\[ \hat{y}_{T+h|T} = \bar{y} = (y_{1}+\dots+y_{T})/T. \]

La notazione \(\hat{y}_{T+h|T}\) indica la stima di \(y_{T+h}\) basata su \(y_1,\dots,y_T\).

bricks %>% model(MEAN(Bricks))
Previsione mediante la media applicata alla produzione di mattoni in argilla  in Australia.

Figura 5.3: Previsione mediante la media applicata alla produzione di mattoni in argilla in Australia.

Metodo Naive

La previsione naive si ottiene assegnando a tutte le previsioni un valore uguale all’ultimo valore osservato. Ovvero,

\[ \hat{y}_{T+h|T} = y_{T}. \]

bricks %>% model(NAIVE(Bricks))
Previsione naive della produzione di mattoni in argilla in Australia.

Figura 5.4: Previsione naive della produzione di mattoni in argilla in Australia.

La previsione naive risulta ottimale quando la serie storica segue un random walk (si veda il paragrafo 9.1) e viene quindi detta anche “previsione random walk”. Si può utilizzare la funzione ‘RW()’ invece di NAIVE.

Metodo naive stagionale

Una variante del metodo naive è utile per dati stagionali. In questo caso, si assegna ad ogni previsione l’ultimo valore osservato della stessa stagione dell’anno (ad esempio, lo stesso mese dell’anno precedente). Formalmente, la previsione per il tempo \(T+h\) è scritta come

\[ \hat{y}_{T+h|T} = y_{T+h-m(k+1)}, \]

dove \(m\) è il periodo stagionale, e \(k\) la parte intera di \((h-1)/m\) (cioè il numero di anni completi nel periodo di previsione prima del tempo \(T+h\)). Per esempio, con i dati mensili, la previsione di tutti i futuri valori di febbraio è uguale all’ultimo valore di febbraio osservato. Con i dati trimestrali, la previsione per tutti i valori futuri del Q2 è uguale all’ultimo valore osservato del Q2 (dove con Q2 si indica il secondo trimestre). Regole simili si applicano per altri mesi e trimestri, e per altri periodi stagionali.

bricks %>% model(SNAIVE(Bricks ~ lag("year")))

La funzione lag() è opzionale in questo caso perché la serie bricks è trimestrale e quindi un metodo naive stagionale avrà bisogno di un ritardo di un anno. Tuttavia, per alcune serie storiche c’è più di un periodo stagionale, e allora il ritardo richiesto deve essere specificato.

 Previsione naive stagionale per la produzione di mattoni in argilla in Australia.

Figura 5.5: Previsione naive stagionale per la produzione di mattoni in argilla in Australia.

Metodo del Drift

Una variazione del metodo naive consiste nel permettere alle previsioni di aumentare o diminuire nel tempo, dove l’ammontare del cambiamento nel tempo (chiamato drift o deriva) è la variazione media osservata nei dati storici. Così la previsione per il tempo \(T+h\) è data da

\[ \hat{y}_{T+h|T} = y_{T} + \frac{h}{T-1}\sum_{t=2}^T (y_{t}-y_{t-1}) = y_{T} + h \left( \frac{y_{T} -y_{1}}{T-1}\right). \]

Questo metodo di fatto equivale a tracciare una linea tra la prima e l’ultima osservazione, e ad estrapolarla nel futuro.

bricks %>% model(RW(Bricks ~ drift()))
Previsione con Drift per la produzione di mattoni in argilla in Australia.

Figura 5.6: Previsione con Drift per la produzione di mattoni in argilla in Australia.

Esempio: produzione trimestrale di birra in Australia

La figura 5.7 compara i risultati dell’applicazione dei primi tre metodi discussi per la previsione con i valori osservati per i prossimi 3.5 anni con riferimento alla produzione trimestrale di birra in Australia dal 1992 al 2006.

# Imposta i dati di addestramento dal 1992 al 2006
train <- aus_production %>%
  filter_index("1992 Q1" ~ "2006 Q4")
# Stima i modelli
beer_fit <- train %>%
  model(
    Mean = MEAN(Beer),
    `Naive` = NAIVE(Beer),
    `Seasonal naive` = SNAIVE(Beer)
  )
# Genera le previsioni per 14 trimestri
beer_fc <- beer_fit %>% forecast(h = 14)
# Visualizza le previsioni contro i valori effettivi
beer_fc %>%
  autoplot(train, level = NULL) +
  autolayer(
    filter_index(aus_production, "2007 Q1" ~ .),
    colour = "black"
  ) +
  labs(
    y = "Miglialia di litri",
    title = "Previsione della produzione trimestrale di birra"
  ) +
  guides(colour = guide_legend(title = "Previsione"))
Previsione della produzione trimestrale di birra in Australia.

Figura 5.7: Previsione della produzione trimestrale di birra in Australia.

In questo caso, la previsone naive stagionale è vicina ai valori osservati dal 2007 in poi.

Esempio: Prezzo giornaliero delle azioni Google

In figura 5.8 vengono riportate le previsioni ottenute con metodi non stagionali per la previsione un mese in avanti del prezzo di chiusura giornaliero delle azioni di Google nel 2015. Poiché i prezzi delle azioni non sono osservati ogni giorno (la settimana di contrattazione è di 5 gioni), viene prima creato un nuovo indice temporale basato sui giorni di negoziazione piuttosto che sui giorni di calendario.

# Re-indicizza sui giorni di contrattazione
google_stock <- gafa_stock %>%
  filter(Symbol == "GOOG", year(Date) >= 2015) %>%
  mutate(day = row_number()) %>%
  update_tsibble(index = day, regular = TRUE)
# Filtra l'anno di interesse
google_2015 <- google_stock %>% filter(year(Date) == 2015)
# Stima i modelli
google_fit <- google_2015 %>%
  model(
    Mean = MEAN(Close),
    `Naive` = NAIVE(Close),
    Drift = NAIVE(Close ~ drift())
  )
# Produci le previsioni per i giorni di contrattazione nel gennaio 2016
google_jan_2016 <- google_stock %>%
  filter(yearmonth(Date) == yearmonth("2016 Jan"))
google_fc <- google_fit %>%
  forecast(new_data = google_jan_2016)
# Rappresenta le previsioni
google_fc %>%
  autoplot(google_2015, level = NULL) +
  autolayer(google_jan_2016, Close, colour = "black") +
  labs(y = "$US",
       title = "Prezzo di chiusura azioni Google",
       subtitle = "(Gen 2015 - Gen 2016)") +
  guides(colour = guide_legend(title = "Previsioni"))
Previsione del prezzo di chiusura giornaliero delle azioni Google nel 2015.

Figura 5.8: Previsione del prezzo di chiusura giornaliero delle azioni Google nel 2015.

A volte uno di questi semplici metodi risulterà il miglior strumento di previsione disponibile; ma in molti casi, questi metodi serviranno come benchmark per la scelta di metodi di previsione più complessi. In altre parole, qualsiasi metodo di previsione che verrà sviluppato potrà essere confrontato con questi semplici metodi per verificare che il nuovo metodo sia migliore delle alternative più semplici. In caso contrario, non vale la pena considerare metodi più complessi.