Serie temporali, autocorrelazione, forecasting
Una serie temporale è un segnale dove l’ordine è tutto: il passato condiziona il futuro, e mescolare le osservazioni distrugge l’informazione. Da questo vincolo discende ogni cosa — la stazionarietà che rende il passato confrontabile col futuro, l’autocorrelazione che misura la memoria, i modelli che predicono il prossimo valore dato ciò che è venuto prima. Lo stesso schema “predici il prossimo dato il passato” che, sotto travestimenti diversi, regge sia un modello ARIMA degli anni ‘70 sia un LLM che genera testo token dopo token.
Perché questo capitolo
Sezione intitolata “Perché questo capitolo”Prendi una qualsiasi dashboard di un sistema in produzione. Latenza p99, richieste al secondo, spesa giornaliera in token, error rate. Tutte queste curve hanno una cosa in comune: sono numeri ordinati nel tempo, e il valore di adesso non è indipendente da quello di un minuto fa. Se la latenza era alta nell’ultimo quarto d’ora, probabilmente lo è anche adesso. Questa dipendenza temporale è esattamente ciò che rende le serie temporali un oggetto a sé, diverso dai dati su cui è costruita gran parte della statistica classica.
La differenza non è un dettaglio accademico. La statistica “da urna” — quella dei campioni di altezze, sondaggi, esperimenti — assume che le osservazioni siano scambiabili: posso mescolare le righe della tabella senza perdere niente.
Su una serie temporale questa assunzione è falsa, e violarla in silenzio è la fonte numero uno di disastri pratici: backtest che sembrano perfetti e poi crollano in produzione, modelli che “predicono” usando di nascosto informazione del futuro, R-quadrato altissimi tra due grandezze che salgono entrambe solo perché il tempo passa.
C’è poi un motivo che riguarda chi costruisce sistemi AI oggi, e che dà a questo capitolo un peso che va oltre l’ingegneria classica. Il modo in cui un LLM genera testo — un token alla volta, ciascuno condizionato da tutti i precedenti — è lo stesso schema dei modelli autoregressivi che gli statistici usano per le serie temporali da quasi un secolo.
Capire bene quello schema nella sua forma più semplice e lineare è il modo migliore per capire cosa fa, e cosa non fa, la sua incarnazione moderna e non lineare. E la disciplina con cui si valutano i modelli di forecasting — mai usare il futuro per predire il passato — è una lezione che si trasferisce, parola per parola, alla valutazione di qualsiasi modello.
Contesto
Sezione intitolata “Contesto”L’idea che il futuro di una serie si possa stimare dal suo passato è più vecchia dei computer. Nel 1927 lo statistico britannico George Udny Yule (1871-1951), studiando il ciclo delle macchie solari, introduce l’idea di autoregressione: descrivere un valore come combinazione dei valori precedenti più una scossa casuale. Dieci anni dopo, nel 1937, l’economista e statistico russo Eugen Slutsky (1880-1948) mostra il rovescio della medaglia: sommando shock puramente casuali si ottengono curve che sembrano avere cicli regolari. Sono i due mattoni — valori passati e shock passati — su cui poggia tutto il resto.
Il momento in cui questi mattoni diventano un metodo è il 1970, con Time Series Analysis: Forecasting and Control (Holden-Day, San Francisco), di George Box (statistico britannico, 1919-2013, noto anche per l’aforisma “all models are wrong, but some are useful”) e Gwilym Jenkins (statistico britannico, 1932-1982). Il libro unifica autoregressione e media mobile in un’unica famiglia, aggiunge un terzo ingrediente per gestire le serie con tendenza, e codifica una procedura iterativa — identifica il modello, stimane i parametri, controlla i residui, ripeti — che da allora porta i loro nomi: la metodologia Box-Jenkins.
Vale la pena essere precisi sulla storia, perché è facile raccontarla male. Box e Jenkins non hanno inventato l’autoregressione: l’hanno ereditata da Yule e Slutsky e dalla scomposizione di Wold del 1938.
Il loro contributo è l’unificazione e, soprattutto, la trasformazione di idee teoriche in una procedura pratica e ripetibile. È filiazione, non creazione dal nulla.
In parallelo, lungo tutti gli anni ‘70 e ‘80, gli econometrici sviluppano la propria cassetta degli attrezzi per le serie macroeconomiche e finanziarie: il test per le radici unitarie di Dickey e Fuller (1979), i modelli di volatilità di Robert Engle e la cointegrazione di Clive Granger (lavoro che vale loro il Nobel per l’economia nel 2003).
È da questo filone che arriva gran parte del vocabolario sulla stazionarietà che useremo qui.
Nella mappa di questa Parte, questo capitolo poggia su tutto ciò che viene prima. Una serie temporale è un segnale già campionato: la sua granularità e i suoi limiti vengono dal campionamento. La sua componente irregolare è rumore, con tutto ciò che il rapporto segnale-rumore comporta. La sua stagionalità è periodicità, e la periodicità si legge meglio nel dominio della frequenza visto con Fourier. E lo stimare uno stato che evolve nel tempo da misure rumorose è il problema della sensor fusion e del filtro di Kalman.
L’intuizione
Sezione intitolata “L’intuizione”Primo angolo: una serie è un sistema con memoria
Sezione intitolata “Primo angolo: una serie è un sistema con memoria”Immagina di misurare la temperatura di una stanza ogni minuto. Il valore di adesso non è un’estrazione casuale: è quasi uguale a quello di un minuto fa, simile a quello di dieci minuti fa, e ha ormai poco a che vedere con quello di tre ore fa. La serie ha una memoria, e quella memoria ha una durata.
Questa è l’intuizione centrale. Una serie temporale è una grandezza in cui il passato risuona nel presente, e la domanda interessante è quanto a lungo risuona.
Una serie senza memoria — dove ogni valore è scorrelato dal precedente — è rumore puro: non c’è niente da prevedere. Una serie con memoria lunga, dove anche valori distanti restano correlati, è molto più prevedibile, ma anche più difficile da modellare.
I modelli classici si dividono in base a dove sta la memoria. In un modello autoregressivo la memoria sta nei valori: il prossimo valore è una media pesata di quelli appena visti. In un modello a media mobile la memoria sta negli shock: il prossimo valore reagisce alle sorprese recenti, agli scostamenti imprevisti dal previsto. Sono due modi diversi di dire la stessa cosa — il passato conta — con due meccanismi diversi.
Secondo angolo: una serie è un processo stocastico osservato
Sezione intitolata “Secondo angolo: una serie è un processo stocastico osservato”C’è un modo più astratto, e più potente, di guardare la stessa cosa. Ogni valore non è un numero fisso: è la realizzazione di una variabile aleatoria , una specie di lancio di dado truccato il cui esito dipende da quanto è successo prima. L’intera serie che osservi è una traiettoria possibile di un processo stocastico — uno tra i tanti mondi che avrebbero potuto verificarsi (il concetto di processo stocastico vive in processi stocastici).
Da questa lente, fare forecasting non significa indovinare un numero. Significa stimare la distribuzione del futuro condizionata al passato: dato tutto ciò che ho visto, qual è la distribuzione di probabilità di ?
La risposta naturale non è “domani saranno 23 gradi”, ma “domani sarà 23 gradi, più o meno 2, con questa forma di incertezza”. Il forecast onesto è una distribuzione, non un punto, e l’incertezza cresce man mano che guardi più lontano nel futuro.
Questa visione collega le serie temporali direttamente a Bayes e ai processi markoviani, e rende naturale una cosa che il primo angolo nasconde: ogni previsione dovrebbe arrivare con la sua barra di errore.
La meccanica
Sezione intitolata “La meccanica”Le componenti e la decomposizione
Sezione intitolata “Le componenti e la decomposizione”Il primo gesto su una serie è scomporla. La visione classica dice che una serie è la sovrapposizione di poche componenti latenti:
- il trend (): l’andamento di lungo periodo, la crescita o il calo persistente;
- la stagionalità (): un pattern che si ripete a periodo fisso e noto — il giorno della settimana, l’ora del giorno, il mese dell’anno;
- il ciclo (): oscillazioni di lungo periodo a periodo non fisso, come i cicli economici (spesso accorpato al trend in un’unica componente trend-ciclo);
- il residuo o componente irregolare (): ciò che resta una volta tolto il resto, idealmente rumore senza struttura.
Ci sono due modi di rimettere insieme i pezzi. Il modello additivo somma le componenti:
In parole povere: questo dice che l’oscillazione stagionale ha sempre la stessa ampiezza, qualunque sia il livello della serie. Va bene se le vendite oscillano di circa 50 unità sia quando il livello è 100 sia quando è 1000.
Il modello moltiplicativo li moltiplica:
Questo dice invece che l’oscillazione stagionale è proporzionale al livello: oscilla del 10%, che il livello sia 100 (quindi ) o 1000 (quindi ). È il caso tipico di molte serie economiche. C’è un trucco utile: applicando il logaritmo, il moltiplicativo ridiventa additivo, perché . Trasformare in scala logaritmica e poi trattare la serie come additiva è una mossa standard.
Tra i metodi di decomposizione moderni, il più usato è STL (Seasonal-Trend decomposition using Loess, Cleveland et al., Journal of Official Statistics 1990), che separa trend e stagionalità in modo robusto agli outlier e permette alla stagionalità di cambiare lentamente nel tempo.
Stazionarietà: il concetto che regge tutto
Sezione intitolata “Stazionarietà: il concetto che regge tutto”Quasi tutta la teoria classica chiede che la serie sia stazionaria. Una serie è stazionaria (in senso debole) quando le sue proprietà statistiche non cambiano nel tempo: media costante, varianza costante, e autocovarianza che dipende solo dalla distanza tra due istanti, non dalla loro posizione assoluta.
Detto a parole: una serie stazionaria “ha lo stesso aspetto statistico” che tu la guardi a gennaio o a luglio. Attenzione a un equivoco frequente: stazionario non vuol dire piatto o costante. Una serie stazionaria oscilla eccome — semplicemente le sue oscillazioni hanno statistiche stabili nel tempo.
Il rumore bianco è stazionario; una serie con trend crescente non lo è (la media sale); una serie con stagionalità non lo è (la media dipende dal mese).
Perché tutto questo conta? Perché se la media cambia nel tempo, parlare de “la media della serie” non ha senso, e stimarla dal passato per proiettarla nel futuro è un autoinganno. La stazionarietà è precisamente la condizione che rende il futuro statisticamente confrontabile col passato — ed è ciò che dà senso all’idea stessa di “imparare dai dati storici”. C’è qui un’eco diretta delle catene di Markov, dove una catena ergodica converge a una distribuzione stazionaria: lo spirito è lo stesso, le statistiche non vanno alla deriva. Si tratta di un’analogia di concetto, non della stessa costruzione matematica.
Come si verifica la stazionarietà? Tre livelli, dal più informale al più formale:
- A occhio: si plotta la serie. Trend visibile o varianza che si allarga sono segnali di non stazionarietà.
- Con l’autocorrelazione: se l’ACF (che vediamo tra poco) decade lentissimamente verso zero, è un sintomo classico di non stazionarietà.
- Con un test formale: il più comune è il test ADF (Augmented Dickey-Fuller, dal lavoro di Dickey e Fuller del 1979). La sua logica è contro-intuitiva e va capita bene. L’ipotesi nulla è “la serie ha una radice unitaria”, cioè è non stazionaria. La statistica del test è un numero negativo: più è negativo, più forte è l’evidenza contro la radice unitaria. Quindi un p-value piccolo (sotto 0.05) porta a rifiutare il null e a concludere che la serie è probabilmente stazionaria.
Su quest’ultimo punto serve la disciplina di test ipotesi: l’ADF è un test statistico con tutti i suoi limiti.
Un p-value alto non prova che la serie sia non stazionaria — significa solo che non hai abbastanza evidenza per dire il contrario, e questi test hanno notoriamente poca potenza. Non confondere “non ho rifiutato” con “ho dimostrato il null”.
E quando la serie non è stazionaria? La si rende stazionaria. Lo strumento principe è la differenziazione: invece di modellare i valori, si modellano le variazioni.
In parole: una serie con trend lineare ha variazioni più o meno costanti, quindi differenziandola si ottiene una serie senza trend. Se una differenziazione non basta, se ne fa una seconda. Esiste anche la differenziazione stagionale, con il periodo (12 per dati mensili annuali, 7 per dati giornalieri settimanali), che rimuove la stagionalità. Le alternative sono il detrending esplicito (stimare il trend con una regressione su e sottrarlo) e le trasformazioni che stabilizzano la varianza (logaritmo, radice, Box-Cox).
ACF e PACF: leggere la memoria della serie
Sezione intitolata “ACF e PACF: leggere la memoria della serie”Per scegliere un modello serve uno strumento diagnostico che mostri com’è fatta la memoria della serie. Sono due funzioni.
L’autocorrelazione (ACF) è la correlazione della serie con se stessa, ritardata di passi:
È il ritratto della memoria: dice quanto assomiglia al valore di un passo fa, quanto assomiglia a dodici passi fa. Su dati mensili, un picco netto a lag 12 grida “stagionalità annuale”. L’ACF decade verso zero man mano che il lag cresce, e la velocità con cui decade dice quanto è lunga la memoria.
L’autocorrelazione parziale (PACF) è più sottile: misura la correlazione tra e al netto dei passi intermedi. Risponde alla domanda “quanta correlazione diretta c’è tra oggi e passi fa, una volta tolto ciò che passa attraverso i passi in mezzo?”.
Se oggi è correlato a ieri, e ieri a l’altroieri, allora oggi e l’altroieri appariranno correlati nell’ACF anche senza un legame diretto; la PACF rimuove questo effetto a catena ed espone solo la dipendenza diretta.
La combinazione delle due è la “firma” che permette di riconoscere il modello, ed è il cuore della fase di identificazione di Box-Jenkins:
| La serie è | ACF | PACF |
|---|---|---|
| AR(p) | decade gradualmente | si taglia di netto dopo lag |
| MA(q) | si taglia di netto dopo lag | decade gradualmente |
| ARMA(p,q) | decade gradualmente | decade gradualmente |
I modelli classici
Sezione intitolata “I modelli classici”Tutti i modelli che seguono assumono stazionarietà — eventualmente raggiunta dopo differenziazione. Sono lineari, e questo li rende trasparenti.
Il modello autoregressivo di ordine , scritto AR(p):
Qui è una costante, i sono i coefficienti che pesano i valori passati, e è lo shock casuale del momento (rumore bianco). In parole povere: il valore di oggi è una media pesata dei valori precedenti, più una sorpresa. La memoria sta nei valori.
Il modello a media mobile di ordine , MA(q):
Qui il valore di oggi dipende dagli shock recenti, non dai valori. Se ieri c’è stata una sorpresa positiva, oggi ne porta ancora una traccia. La memoria sta negli errori.
Va detto subito, perché è una delle confusioni più comuni: questa “media mobile” non è la rolling mean che usi per lisciare un grafico. Stesso nome, concetto diverso.
L’ARMA(p,q) mette insieme i due meccanismi: valori passati più shock passati. Funziona su serie stazionarie.
L’ARIMA(p,d,q) aggiunge la “I” di Integrated: invece di applicare l’ARMA ai valori, lo applica alla serie differenziata volte. È il modo in cui Box-Jenkins gestisce le serie non stazionarie con trend — si differenzia fino a ottenere stazionarietà, si modella, poi si “integra” di nuovo per tornare alla scala originale.
Il SARIMA(p,d,q)(P,D,Q) aggiunge una componente stagionale con periodo : gli stessi tre ingredienti (AR, differenziazione, MA) replicati sui lag stagionali. È lo strumento standard per serie con stagionalità marcata.
L’intuizione unificante è una sola, e conviene fissarla: tutti questi modelli dicono che il prossimo valore è una funzione lineare del passato — dei valori, degli errori, o di entrambi. Tieni a mente questa frase: torna nell’ultima sezione, dove diventa il ponte verso gli LLM.
La ricetta Box-Jenkins, passo per passo
Sezione intitolata “La ricetta Box-Jenkins, passo per passo”Tutti questi pezzi si compongono in una procedura che è il vero lascito di Box e Jenkins. Non è un algoritmo automatico: è un ciclo che alterna decisioni e controlli, e conviene vederlo come una checklist concreta.
- Stabilizza la varianza. Se l’ampiezza delle oscillazioni cresce col livello (stagionalità moltiplicativa), applica un logaritmo o una Box-Cox prima di tutto. Una varianza che esplode rovina ogni stima successiva.
- Rendi stazionaria la media. Plotta la serie, guarda l’ACF, lancia un ADF. Se c’è trend, differenzia una volta e ricontrolla; se c’è stagionalità, applica la differenziazione stagionale. Il numero di differenziazioni è il (e il stagionale) di ARIMA. Fermati appena la serie è stazionaria: differenziare oltre è un errore.
- Identifica gli ordini. Sulla serie ormai stazionaria, leggi ACF e PACF con la tabella delle firme: un taglio netto nella PACF a lag suggerisce un AR(p), un taglio nell’ACF a lag suggerisce un MA(q), un decadimento graduale in entrambe un ARMA.
- Stima i parametri. Fitta il modello candidato (la stima massimizza la verosimiglianza dei coefficienti e ; il dettaglio del calcolo non serve qui).
- Diagnostica i residui. Questo è il controllo che separa un modello buono da uno illusorio: se il modello ha catturato la struttura, i residui devono essere rumore bianco — nessuna autocorrelazione residua nell’ACF dei residui (lo verifica il test di Ljung-Box). Se i residui hanno ancora struttura, il modello ha lasciato fuori qualcosa: torna al passo 3.
- Confronta e scegli. Tra modelli che superano la diagnostica, scegli col criterio di parsimonia: AIC e BIC penalizzano i parametri in eccesso, evitando di sovra-adattare. E comunque valida sul futuro, mai solo sullo storico.
Oggi gran parte di questo è automatizzato — la funzione auto.arima (e i suoi equivalenti in Python) prova molte combinazioni di ordini e sceglie per AIC. Ma l’automazione non sostituisce il passo 5: un modello scelto dalla macchina con residui ancora autocorrelati resta un modello sbagliato, e solo l’occhio sui residui lo rivela.
Exponential smoothing e Holt-Winters
Sezione intitolata “Exponential smoothing e Holt-Winters”Esiste una famiglia parallela, che non passa dall’autocorrelazione ma da un’idea diversa: pesare il passato con pesi che decrescono esponenzialmente, così i valori recenti contano più di quelli vecchi.
Il caso base, simple exponential smoothing, prevede solo il livello:
dove è il parametro di smoothing. In parole: la previsione di domani è una media tra il valore osservato oggi e la previsione che avevi fatto per oggi. Un alto rende il modello reattivo (segue da vicino i dati recenti), uno basso lo rende inerziale (liscia di più). Va bene per serie senza trend né stagionalità.
Da qui si sale. Il metodo di Holt (Charles Holt, 1957) aggiunge un’equazione per il trend. Il metodo di Holt-Winters (completato da Peter Winters, studente di Holt, nel 1960) aggiunge una terza equazione per la stagionalità, con tre parametri — uno per il livello, uno per il trend, uno per la stagionalità — ed esiste in versione additiva e moltiplicativa, esattamente come la decomposizione vista sopra. Questa famiglia, oggi inquadrata sotto la sigla ETS (Error-Trend-Seasonality), ha una formulazione elegante come modello a spazio di stato: un livello, un trend e una stagionalità latenti che evolvono nel tempo e che si stimano osservando la serie — lo stesso impianto concettuale del filtro di Kalman, applicato a una serie scalare.
Forecasting e come valutarlo
Sezione intitolata “Forecasting e come valutarlo”Fare una previsione significa, dato il passato , stimare dove è l’orizzonte. Come abbiamo visto, la previsione onesta non è un punto ma una distribuzione, e l’incertezza cresce con : prevedere domani è facile, prevedere tra un anno quasi impossibile.
C’è una distinzione che conviene fissare. Il point forecast è il singolo valore atteso, . Il forecast probabilistico aggiunge un intervallo di predizione: la fascia entro cui ci si aspetta che cada il valore vero, con una certa probabilità (un intervallo all’80% o al 95%, per dire).
Per i modelli classici questa fascia si ricava dalla varianza degli errori, e si allarga con l’orizzonte perché gli errori si accumulano: a un passo dipende solo dal rumore di un periodo, a dieci passi dalla somma delle incertezze lungo il cammino. Per modelli come Chronos l’intervallo si ottiene invece campionando molte traiettorie future e guardando come si disperdono.
In entrambi i casi la morale è la stessa: il numero senza la fascia è un’informazione monca, e la fascia spesso conta più del numero.
Ma il punto più importante di tutto il capitolo non è come si fa una previsione: è come si valuta. E qui c’è una regola d’oro che non ammette eccezioni.
Non si può usare il futuro per predire il passato. Il train/test split di una serie temporale deve rispettare l’ordine del tempo: si addestra sul passato, si valuta sul futuro. Sempre.
Questo esclude di netto il random split che si usa in machine learning ordinario. Mescolare le righe e poi dividere a caso in train e test è lecito su dati i.i.d., ma su una serie temporale è un errore grave: significa mettere nel set di addestramento punti che vengono dopo punti del set di test, e quindi permettere al modello di “sbirciare” il futuro. Lo schema corretto è:
- Hold-out temporale: gli ultimi punti diventano il test, tutto ciò che viene prima è il train.
- Walk-forward validation (o rolling origin, o time series cross-validation): si addestra fino a un certo istante, si prevede passi avanti, si confronta con ciò che è realmente successo, poi si avanza l’origine e si ripete. Si chiama anche backtesting. La finestra di training può crescere a ogni passo (expanding window) o restare di dimensione fissa scorrendo in avanti (sliding window).
Il fallimento subdolo qui ha un nome: leakage temporale. È il caso in cui informazione del futuro entra di nascosto nel processo di addestramento o valutazione, gonfiando le metriche in modo che il modello sembra ottimo in test e poi delude in produzione.
Il leakage non arriva quasi mai da un errore grossolano: si insinua attraverso una normalizzazione calcolata su tutto il dataset (inclusi i punti futuri), una feature derivata dal target che incorpora valori a venire, o appunto un cross-validation che mescola l’ordine. Studi sperimentali recenti quantificano l’effetto: un cross-validation mal configurato può produrre un errore apparente sensibilmente più basso del reale, mentre gli split che rispettano l’ordine restano onesti.
Questa è la stessa disciplina causale di correlazione e causalità: la causa precede l’effetto, e un modello che usa il futuro per spiegare il passato non sta scoprendo una relazione, sta barando.
Le metriche con cui si misura l’errore di previsione sono tre, e ognuna ha un carattere:
- MAE (Mean Absolute Error): la media degli errori in valore assoluto. Sta nella stessa unità della serie, è facile da interpretare (“sbaglio in media di 12 richieste al secondo”) e robusta agli outlier.
- RMSE (Root Mean Squared Error): la radice della media degli errori al quadrato. Anch’essa nell’unità della serie, ma penalizza di più gli errori grandi — un singolo sbaglio enorme pesa molto.
- MAPE (Mean Absolute Percentage Error): l’errore percentuale medio. È scale-independent, quindi permette di confrontare serie di grandezze diverse, ma ha due difetti seri: esplode quando i valori reali sono vicini a zero (si divide per qualcosa di minuscolo) ed è asimmetrico (penalizza diversamente sovrastima e sottostima). Le varianti sMAPE e soprattutto MASE (scaled, che normalizza rispetto a una baseline) risolvono parte di questi problemi.
Una nota che vale più di tutte le metriche: prima di celebrare un modello, confrontalo con una baseline naive. “Domani uguale a oggi” (random walk) o “stesso giorno della settimana scorsa” (seasonal naive) sono previsioni a costo zero. Se il tuo ARIMA elaborato non batte il seasonal naive, non hai un modello: hai un dispendio di tempo. La metrica MASE è costruita esattamente per fare questo confronto in modo trasparente.
Esempio numerico: decomporre quattro trimestri
Sezione intitolata “Esempio numerico: decomporre quattro trimestri”Prima dei modelli, il gesto più elementare: la decomposizione. Prendi le vendite trimestrali di due anni, con un picco regolare nel quarto trimestre:
| Trim. | Vendite |
|---|---|
| 2023-Q1 | 100 |
| 2023-Q2 | 110 |
| 2023-Q3 | 105 |
| 2023-Q4 | 145 |
| 2024-Q1 | 120 |
| 2024-Q2 | 130 |
| 2024-Q3 | 125 |
| 2024-Q4 | 165 |
Il trend si stima con una media mobile su quattro trimestri (un anno intero, per annullare la stagionalità): la media del primo anno è , quella del secondo . Il livello sale di circa 20 in un anno. La stagionalità si legge negli scarti dal trend: ogni Q4 sta circa 30 sopra la media annuale, ogni Q1 circa 15 sotto. Quello che resta dopo aver tolto trend e stagionalità — pochi punti qua e là — è il residuo. In modello additivo: . Questa scomposizione “a mano” è esattamente ciò che STL fa in modo robusto e automatico, e già da sola permette una previsione naive ragionevole: proietta il trend, riaggiungi lo scarto stagionale del trimestre.
Esempio numerico: un AR(1) e la sua memoria
Sezione intitolata “Esempio numerico: un AR(1) e la sua memoria”Prendi il modello AR(1) più semplice, con coefficiente e nessuna costante:
Supponi che a un certo punto la serie valga e che gli shock successivi siano piccoli. Il valore atteso dei passi successivi, ignorando per un attimo il rumore, è:
La spinta iniziale si smorza geometricamente, moltiplicandosi per 0.7 a ogni passo. Questo si riflette nell’autocorrelazione: per un AR(1), . Quindi , , , e così via. L’ACF decade in modo geometrico, gradualmente — esattamente la “firma AR” della tabella di prima. La PACF, invece, ha un solo picco a lag 1 e poi crolla a zero, perché tutta la dipendenza diretta sta nel passo precedente. Se avessi messo , la serie persisterebbe molto più a lungo (memoria lunga); con , dimenticherebbe quasi subito.
Esempio in codice: una pipeline di forecasting (e il bug del leakage)
Sezione intitolata “Esempio in codice: una pipeline di forecasting (e il bug del leakage)”Una pipeline tipica in Python, con pandas e statsmodels, segue passo passo la metodologia Box-Jenkins:
import pandas as pdfrom statsmodels.tsa.stattools import adfullerfrom statsmodels.tsa.arima.model import ARIMAfrom sklearn.metrics import mean_absolute_error
serie = pd.read_csv("richieste.csv", index_col="ts", parse_dates=True)["rps"]
# La serie è stazionaria? Null ADF = "ha una radice unitaria" (non staz.)stat, pvalue, *_ = adfuller(serie)# pvalue < 0.05 -> rifiuto il null -> stazionaria
# Se non lo è, differenzioserie_diff = serie.diff().dropna()
# ACF/PACF guidano la scelta di (p, q); qui un ARIMA(2,1,2) di esempio# walk-forward: addestro sul passato, prevedo il prossimo, avanzotrain_fino = int(len(serie) * 0.8)previsioni, reali = [], []for t in range(train_fino, len(serie)): storia = serie.iloc[:t] # SOLO il passato modello = ARIMA(storia, order=(2, 1, 2)).fit() previsioni.append(modello.forecast(1).iloc[0]) reali.append(serie.iloc[t])
print("MAE:", mean_absolute_error(reali, previsioni))Il dettaglio che conta è la riga serie.iloc[:t]: a ogni passo il modello vede solo ciò che è venuto prima dell’istante che sta prevedendo. Non c’è nessun modo, in questo loop, che un valore futuro finisca nel training.
Confronta ora con l’errore tipico, quello che sembra innocuo e invece rovina tutto:
# SBAGLIATO: mescola passato e futurofrom sklearn.model_selection import train_test_splitX_train, X_test = train_test_split(serie, shuffle=True) # leakage!Questo shuffle=True mette punti futuri nel training. Il MAE che ne esce sarà splendido in test e bugiardo in produzione. È il leakage temporale al lavoro, ed è difficile da vedere proprio perché il codice “funziona” e i numeri sembrano buoni.
Scenario reale: capacity planning e anomaly detection in observability
Sezione intitolata “Scenario reale: capacity planning e anomaly detection in observability”Un servizio riceve richieste con una struttura ricca: un trend di crescita lento (l’utenza aumenta), una stagionalità giornaliera (picco a mezzogiorno e di sera, valle di notte) e una stagionalità settimanale (lunedì diverso da domenica), più spike occasionali per eventi.
Per il capacity planning, si modella la serie del carico — magari con un SARIMA che cattura le due stagionalità, o con Holt-Winters — e si prevede il picco delle prossime settimane, con un intervallo di confidenza.
Si dimensiona la capacità sul margine superiore dell’intervallo, non sulla previsione puntuale: l’incertezza è parte della decisione.
Per l’anomaly detection, si gira la logica al contrario. Si prevede il valore atteso del prossimo istante e lo si confronta con quello reale. Un residuo molto più grande del solito — fuori dall’intervallo di predizione — segnala un’anomalia: un picco di traffico imprevisto, un degrado, un attacco. Qui il forecasting non serve a predire il futuro ma a definire cosa sia “normale” istante per istante, in modo che l’anomalo si stacchi dal fondo. È il pane quotidiano dei sistemi di osservabilità: una metrica monitorata è una serie temporale, e l’allarme che scatta su uno scostamento dal previsto è più robusto di una soglia fissa.
Scenario al confine: vendite mensili con stagionalità che cresce
Sezione intitolata “Scenario al confine: vendite mensili con stagionalità che cresce”Un quarto caso illustra perché additivo e moltiplicativo non sono dettagli. Immagina le vendite mensili di un prodotto in crescita: ogni dicembre c’è un picco, ma il picco di dicembre del terzo anno è molto più alto di quello del primo, perché il livello base è cresciuto. La stagionalità non è un’oscillazione fissa di unità: è un’oscillazione di circa il attorno al livello, e quel livello sale.
Trattarla come additiva produrrebbe intervalli di predizione troppo stretti negli anni recenti e troppo larghi in quelli iniziali. La mossa giusta è applicare il logaritmo: in scala logaritmica un’oscillazione proporzionale diventa un’oscillazione costante, additiva, e a quel punto un SARIMA o un Holt-Winters additivo lavorano bene.
Alla fine si torna alla scala originale con l’esponenziale, ricordando che la trasformazione inversa rende l’intervallo di predizione asimmetrico — più lungo verso l’alto. È un esempio piccolo ma rivela quanto la scelta della scala, fatta all’inizio, condizioni tutto ciò che viene dopo.
Applicazioni pratiche
Sezione intitolata “Applicazioni pratiche”Le serie temporali sono ovunque ci sia un numero che varia nel tempo, e per chi costruisce sistemi compaiono soprattutto in tre forme.
La prima è il monitoraggio dei sistemi. Ogni metrica di osservabilità — latenza, throughput, error rate, spesa in token, occupazione di memoria — è una serie temporale. Forecast e anomaly detection sui dati di monitoring sono il modo in cui si fa capacity planning, si imposta l’alerting (un allarme che scatta non su una soglia fissa ma su uno scostamento dal previsto è molto più robusto) e si tiene sotto controllo il costo di un sistema AI in produzione.
Il concetto di drift dei modelli è esso stesso un fenomeno di serie temporale: la qualità di un modello che degrada lentamente è una tendenza nel tempo da rilevare, e rilevarla è un problema di forecasting sui residui.
La seconda è la feature engineering temporale per modelli di machine learning. Quando si costruiscono feature da dati storici — medie mobili, valori ritardati (lag features), differenze — bisogna farlo con la stessa disciplina causale del backtesting: ogni feature al tempo può usare solo dati fino a , mai successivi. È qui che il leakage temporale fa più danni nei progetti reali, e la consapevolezza guadagnata in questo capitolo è la migliore difesa.
La terza, più trasversale, è un modello mentale per la valutazione. La regola “addestra sul passato, valuta sul futuro” e la diffidenza verso i risultati troppo belli si trasferiscono direttamente alla valutazione di qualunque modello che operi su dati con struttura temporale: dai benchmark con un cutoff di addestramento, dove un dato visto in pretraining può “trapelare” in test, fino agli A/B test e alla valutazione degli agenti.
Chi ha interiorizzato il leakage temporale legge i benchmark con più sospetto, ed è un bene.
Dove si rompe
Sezione intitolata “Dove si rompe”Le serie temporali sono un terreno fertile di errori, e diversi sono insidiosi proprio perché i numeri continuano a sembrare sensati.
Stazionarietà data per scontata. Applicare AR, MA o ARMA a una serie non stazionaria produce stime senza senso e previsioni che divergono. Il sintomo classico è un modello che fitta benissimo lo storico e poi parte per la tangente appena prevede in avanti.
La cura è differenziare o detrendare prima, ma anche qui c’è una trappola: over-differencing, differenziare più del necessario, introduce autocorrelazione spuria e gonfia la varianza. Una differenziazione di troppo è un errore quanto una di meno.
Correlazione temporale scambiata per causalità. Due serie che hanno entrambe un trend crescente — il numero di film con Nicolas Cage e gli annegamenti in piscina, per citare un esempio celebre — appaiono fortemente correlate solo perché il tempo passa per entrambe. È la spurious regression: un R-quadrato altissimo tra serie non stazionarie è quasi sempre un artefatto.
La cosiddetta “Granger causality”, peraltro, non è causalità nel senso pieno: dice solo che una serie aiuta a predire l’altra, il che è una proprietà predittiva, non un legame causale (vedi correlazione e causalità).
Il backtest perfetto. Quando un backtest dà risultati straordinari, la prima ipotesi da considerare non è il genio del modello ma il leakage. Normalizzazione fatta sull’intero dataset, feature che incorporano il target futuro, validazione che mescola l’ordine: sono tutti modi in cui il futuro filtra nel passato senza che ce ne si accorga.
MAPE vicino allo zero. Se la serie passa per valori prossimi a zero, il MAPE esplode e diventa inutilizzabile, perché divide per quasi-zero. Su serie intermittenti (vendite di prodotti rari, eventi sporadici) è inadatto: meglio MAE o MASE.
Modelli complessi che non battono il naive. È la lezione più umiliante del campo. Per anni le competizioni di forecasting di Makridakis (le M-competitions, una serie di gare aperte di previsione iniziate negli anni ‘80) hanno mostrato che metodi statistici semplici battevano modelli sofisticati.
E anche nell’era del deep learning il monito resta: il paper “Are Transformers Effective for Time Series Forecasting?” (Zeng et al., AAAI 2023) ha mostrato che una baseline lineare elementare batteva molti transformer specializzati su benchmark a lungo orizzonte. La complessità non è merito; battere il seasonal naive lo è.
Cambiamenti di regime. Tutti questi modelli assumono che il futuro somigli al passato — è l’altra faccia della stazionarietà. Quando arriva un cambiamento strutturale — una pandemia, un cambio di prodotto, un rilascio che altera il comportamento del sistema — il modello continua a prevedere come se nulla fosse, e sbaglia per un periodo. Nessun modello addestrato sul passato può prevedere una rottura che nel passato non c’era. Per questo, in produzione, il forecasting va sempre accompagnato dal monitoraggio dell’errore: quando l’errore di previsione cresce in modo persistente, è il segnale che il regime è cambiato e il modello va riaddestrato.
Il point forecast scambiato per certezza. Un modello restituisce un numero, e quel numero ha un’aria di precisione che inganna. Ma l’incertezza di una previsione cresce con l’orizzonte, spesso in fretta: prevedere il prossimo passo è una cosa, prevedere a venti passi è quasi sempre dominato dal rumore. Usare il valore puntuale per decidere — dimensionare un sistema, fissare una soglia — senza guardare l’intervallo di predizione è uno degli errori più costosi, perché trasforma una stima onestamente incerta in una falsa garanzia. Il forecast utile è la coppia (valore, intervallo), e a orizzonti lunghi l’intervallo conta più del valore.
Serie intermittenti e granularità sbagliata. Le serie con molti zeri (domanda di prodotti rari, eventi sporadici) rompono diversi assunti: la differenziazione non aiuta, il MAPE è inutilizzabile, e i modelli pensati per serie regolari producono previsioni frazionarie senza senso (“venderemo 0.3 unità”). Esistono metodi dedicati (il metodo di Croston e derivati). Più in generale, scegliere la granularità sbagliata — aggregare al giorno una serie che ha struttura oraria, o viceversa — può nascondere la stagionalità o iniettare rumore: è la stessa lezione del campionamento, applicata a monte dell’intera analisi.
Il ponte verso l’AI: la parentela autoregressiva
Sezione intitolata “Il ponte verso l’AI: la parentela autoregressiva”C’è una frase che abbiamo fissato nella meccanica e che ora possiamo ritirare fuori: tutti questi modelli dicono che il prossimo valore è una funzione del passato. Tieni questa frase accanto a una descrizione di come un LLM genera testo: predice il prossimo token, condizionato da tutti i token precedenti. La forma è la stessa.
Lo schema “predici il prossimo dato il passato” è identico, e il termine autoregressivo è usato consapevolmente nella letteratura sugli LLM proprio per questo.
Ma è fondamentale dichiarare la classe di questa affermazione, perché è facile scivolare: si tratta di un’analogia forte, di una parentela di schema, non di un’equivalenza né di una filiazione storica. Le differenze sono profonde:
- l’AR classico è lineare su valori continui; l’LLM è non lineare (una rete profonda) su token discreti, con una softmax su un vocabolario enorme;
- l’AR(p) guarda un numero fisso di passi indietro; il transformer guarda tutto il contesto via attention;
- l’AR predice il valore; l’LLM predice una distribuzione sul prossimo simbolo.
Dire “un LLM è un ARIMA” sarebbe falso (un’equivalenza indifendibile), e dire che l’attention “discende” dall’autoregressione lineare sarebbe una filiazione storica inventata. Quello che è vero, e che vale la pena capire, è che condividono lo scheletro: una macchina che srotola il futuro un passo alla volta, condizionando ogni passo su ciò che ha già prodotto.
Tra i modelli lineari classici e i foundation model di oggi c’è un ventennio di deep learning applicato alle serie, e vale la pena nominarne i passaggi perché ricompaiono altrove nella wiki. Le reti ricorrenti (RNN) e in particolare le LSTM (Long Short-Term Memory, Hochreiter e Schmidhuber 1997) sostituiscono la funzione lineare dell’AR con una rete che mantiene uno stato interno e lo aggiorna a ogni passo: la stessa idea di “uno stato che riassume il passato”, ma appresa e non lineare (il dettaglio vive in lstm-gru, in preparazione). Le Temporal Convolutional Network (TCN) applicano invece convoluzioni causali — che guardano solo all’indietro — con dilatazioni crescenti per coprire orizzonti lunghi, ed è letteralmente la convoluzione di questa Parte usata come predittore. Infine i transformer per serie temporali, da Informer (Zhou et al., AAAI 2021) a PatchTST, portano l’attention sul forecasting a lungo orizzonte. È un filone di parentela tecnica reale con l’anatomia degli LLM, non solo di analogia: gli stessi blocchi, applicati a una sequenza di numeri invece che di token.
C’è un punto in cui questa parentela smette di essere solo concettuale e diventa una scelta progettuale esplicita. Il modello Chronos (Ansari et al., “Chronos: Learning the Language of Time Series”, arXiv:2403.07815, 2024, sviluppato da Amazon) prende una serie temporale di valori reali, la tokenizza — scalandola e quantizzandola in un vocabolario fisso di “parole” che sono intervalli di valori — e poi addestra un’architettura di language model (la famiglia T5) sulla serie tokenizzata, con la stessa cross-entropy usata per il testo.
La previsione probabilistica si ottiene campionando più traiettorie future, esattamente come un LLM campiona più continuazioni di una frase. Qui l’analogia diventa operativa: è letteralmente un language model addestrato su una lingua i cui simboli sono bin di valori numerici. Questo non rende un LLM un modello di serie temporali, ma mostra che lo stesso macchinario architetturale serve entrambi.
Sulla stessa frontiera, e da marcare come stato dell’arte in evoluzione, ci sono i Time Series Foundation Models: modelli pre-addestrati su enormi collezioni di serie eterogenee, capaci di previsione zero-shot su serie mai viste. Oltre a Chronos, TimesFM (Das et al., “A decoder-only foundation model for time-series forecasting”, ICML 2024, arXiv:2310.10688, Google Research) è un modello decoder-only da circa 200 milioni di parametri, pre-addestrato su un corpus dell’ordine di cento miliardi di punti temporali, con prestazioni zero-shot vicine ai modelli supervisionati addestrati su misura. Moirai (Salesforce) batte un’altra strada, con un encoder mascherato per il forecasting universale. È un campo che si muove in fretta: i numeri e i nomi qui sono uno snapshot, non una mappa stabile.
Resta un terzo filo, più sottile. ETS e ARIMA hanno una formulazione a spazio di stato, dove uno stato latente evolve nel tempo e viene stimato dalle osservazioni col filtro di Kalman. Gli state space models moderni come Mamba e S4 — ssm-mamba (in preparazione) — condividono questa intuizione di fondo: uno stato compresso che porta avanti l’informazione utile del passato.
La parentela è concettuale (uno stato che riassume la storia), il lineage tecnico è diverso: gli SSM moderni nascono da preoccupazioni di efficienza sul lungo contesto, non dall’econometria. Anche qui, analogia di idea, non discendenza diretta.
Collegamenti
Sezione intitolata “Collegamenti”- Campionamento, aliasing, teorema di Nyquist — una serie temporale è un segnale già campionato; la frequenza di campionamento decide cosa si può e cosa non si può vedere nella serie.
- Fourier: vedere frequenze invece di tempo — la stagionalità è periodicità, e la periodicità si legge come picchi nello spettro; ACF e analisi spettrale sono due viste della stessa struttura.
- Rumore, signal-to-noise ratio, filtraggio — la componente irregolare di una serie è rumore, e separare segnale da rumore è il problema sottostante alla decomposizione.
- Fondere misure imperfette da sensori diversi — il filtro di Kalman è stima ricorsiva di uno stato che evolve nel tempo, lo stesso impianto a spazio di stato dietro ETS e ARIMA.
- Processi stocastici e dinamiche casuali — una serie temporale è una traiettoria osservata di un processo stocastico; è la lente formale di tutto il capitolo.
- Catene di Markov, stazionarietà, mixing — la stazionarietà di una serie è parente concettuale della distribuzione stazionaria di una catena: statistiche che non vanno alla deriva.
- Stato, transizione, traiettoria — la formulazione a spazio di stato di ETS e ARIMA, e il ponte verso gli state space model moderni.
- Stimare stato nascosto con modello e misure rumorose — il Kalman come motore di stima per i modelli a spazio di stato delle serie.
- Correlazione, confondenti, causalità — la spurious regression tra serie con trend e la regola che la causa precede l’effetto, fondamento della validazione temporale.
- p-value, potenza, errori di tipo I/II — il test ADF per la stazionarietà è un test statistico, con tutti i caveat su null, potenza e interpretazione del p-value.
Per andare oltre
Sezione intitolata “Per andare oltre”- Hyndman, R.J. & Athanasopoulos, G., Forecasting: Principles and Practice (3rd ed., 2021) — disponibile gratis online su otexts.com/fpp3. Il riferimento moderno e accessibile: decomposizione STL, stazionarietà, ETS, ARIMA, valutazione con time series cross-validation. Il punto di partenza ideale.
- Box, G.E.P. & Jenkins, G.M., Time Series Analysis: Forecasting and Control (Holden-Day, 1970) — il testo fondativo che ha dato il nome alla metodologia. Storico e tecnico; da leggere per capire la procedura identify-estimate-diagnose alla fonte.
- Ansari, A.F. et al., “Chronos: Learning the Language of Time Series” (arXiv:2403.07815, 2024) — il foundation model che tokenizza i valori e li tratta come un linguaggio: la lettura migliore per vedere l’analogia LLM-serie resa architettura.
- Das, A. et al., “A decoder-only foundation model for time-series forecasting” (ICML 2024, arXiv:2310.10688) — TimesFM di Google Research; il forecasting zero-shot su serie mai viste, decoder-only.
- Zeng, A. et al., “Are Transformers Effective for Time Series Forecasting?” (AAAI 2023) — il contrappeso necessario: quando le baseline lineari semplici battono i modelli complessi, e perché.