Ogni dicembre, i rivenditori fanno scorta per le festività. Ogni estate, le reti elettriche si preparano ai picchi dovuti ai condizionatori. Questi schemi si ripetono anno dopo anno e, se costruisci una previsione di serie temporali che li ignora, stai rinunciando ad accuratezza.
I modelli Seasonal AutoRegressive Integrated Moving Average (in breve, SARIMA) estendono il diffusissimo framework ARIMA per catturare i pattern stagionali ricorrenti insieme alle tendenze ordinarie. In questo articolo scoprirai cos'è SARIMA, come funzionano i suoi componenti, quando preferirlo ad ARIMA e come costruirne uno passo dopo passo in Python.
Che cos'è SARIMA?
SARIMA è un modello di previsione per serie temporali che gestisce sia i pattern non stagionali sia quelli stagionali nei dati. Si basa direttamente su ARIMA, quindi se hai già lavorato con ARIMA ne riconoscerai gran parte della meccanica. La differenza chiave è che SARIMA aggiunge un secondo livello di parametri progettati specificamente per modellare comportamenti che si ripetono a intervalli fissi, come cicli mensili, trimestrali o settimanali.
Formalmente, un modello SARIMA si scrive SARIMA(p, d, q)(P, D, Q)[S]. Il primo insieme di parametri, (p, d, q), gestisce la struttura non stagionale, identica all'ARIMA standard. Il secondo insieme, (P, D, Q)[S], tiene conto dei pattern stagionali, dove S è la lunghezza del ciclo stagionale. Per dati mensili con stagionalità annuale, S = 12. Per dati trimestrali, S = 4.
Componenti chiave di SARIMA
I sette parametri di SARIMA possono sembrare tanti all'inizio. Aiuta pensarli in due gruppi: il trio ARIMA già noto (p, d, q) e le controparti stagionali (P, D, Q, S) che li rispecchiano alla scala stagionale. Ogni parametro stagionale fa esattamente ciò che fa il suo gemello non stagionale, solo che si applica su salti stagionali anziché su passi temporali adiacenti.
Parte AutoRegressiva (AR)
La componente AR usa i valori passati della serie per prevedere quelli futuri. Il parametro p specifica quanti valori ritardati includere. Se p = 2, il modello usa i due passi temporali precedenti come predittori del valore corrente.
Dal lato stagionale, P fa la stessa cosa ma su ritardi stagionali. Se P = 1 e S = 12, il modello guarda al valore di 12 periodi prima, stesso mese, anno precedente, come predittore. Questo cattura direttamente i pattern anno su anno.
Parte Integrata (I)
Il parametro d controlla quante volte la serie viene differenziata per rimuovere i trend e renderla stazionaria. La differenziazione significa sottrarre a ciascuna osservazione la precedente, rimuovendo un trend lineare. Se d = 1, calcoli le prime differenze; se d = 2, differenzi nuovamente la serie già differenziata.
La differenziazione stagionale funziona allo stesso modo ma su ritardi stagionali. Il parametro D specifica quante differenze stagionali applicare. Con D = 1 e S = 12, sottrai da ciascuna osservazione il valore di 12 periodi prima. Usare insieme d = 1 e D = 1 è comune quando una serie presenta sia un trend generale crescente sia un pattern stagionale ricorrente.
Parte a Media Mobile (MA)
Diversamente dalla componente AR, che guarda ai valori passati, la componente MA modella la relazione tra l'osservazione corrente e gli errori residui di previsioni passate. Il parametro q stabilisce quanti termini di errore ritardati includere. Se q = 1, il modello usa l'errore di previsione del passo precedente per correggere la previsione corrente.
La controparte stagionale Q applica la stessa logica su ritardi stagionali. Con Q = 1 e S = 12, il modello incorpora l'errore di previsione di 12 periodi fa. Questo è rilevante quando shock stagionali, come un'estate insolitamente calda che spinge la domanda di energia, tendono a ripresentarsi nello stesso periodo dell'anno successivo.
Componente stagionale (S)
Il parametro S definisce la lunghezza del ciclo stagionale e collega tra loro i tre parametri stagionali (P, D, Q). È importante impostare S correttamente: se i dati sono mensili con un pattern annuale, S = 12. Dati settimanali con ciclo annuale danno S circa 52.
Qui la stagionalità può diventare insidiosa. Un anno non è esattamente 52 settimane; è più vicino a 52,18. Per la maggior parte degli scopi pratici, arrotondare a S = 52 funziona bene. Ma alcuni dataset hanno più periodi stagionali: la domanda di elettricità giornaliera spesso mostra sia un ciclo settimanale (S = 7) sia uno annuale (S = 365). Il SARIMA standard gestisce un solo periodo stagionale, quindi stagionalità multiple richiedono metodi più avanzati come TBATS o Facebook Prophet.
Quando S non è evidente, la decomposizione della serie aiuta. Decomporre la serie in trend, stagionalità e residuo mette in evidenza visivamente il periodo ricorrente dominante. Puoi anche esaminare i grafici di autocorrelazione per picchi a ritardi regolari.
ARIMA vs. SARIMA: qual è la differenza?
Probabilmente ti stai già chiedendo: quando usare davvero SARIMA invece del più semplice ARIMA?
La risposta breve: usa ARIMA quando i tuoi dati non hanno un pattern stagionale significativo, e SARIMA quando invece c'è.
ARIMA modella tre aspetti: l'autocorrelazione della serie stessa (AR), il numero di differenze necessarie per la stazionarietà (I) e l'influenza persistente degli errori di previsione passati sul valore corrente (MA). Gestisce bene trend, cicli e rumore irregolare. Ciò che non può fare è modellare pattern che si ripetono a una frequenza stagionale fissa. Quelli restano come varianza non spiegata.
SARIMA aggiunge proprio questa capacità. Quando nei dati compaiono chiari picchi e flessioni stagionali, adattare un semplice ARIMA costringe tali pattern nei residui, con previsioni peggiori e residui che non sono rumore bianco. Un modello SARIMA li cattura direttamente.
Una regola pratica: traccia i tuoi dati e cerca pattern che si ripetono a intervalli fissi. Se li vedi, picchi di vendite natalizie, aumenti invernali dell'energia, pattern degli utili trimestrali, orientati su SARIMA. Se la serie è irregolare o guidata dal trend senza un ciclo regolare, ARIMA è più semplice e sufficiente.
Il nostro corso ARIMA Models in Python copre entrambi i framework con esercizi pratici per affinare l'intuizione su quando si applica ciascuno.
Come costruire un modello SARIMA in Python
Costruire un modello SARIMA segue una sequenza logica: raccogli i dati, verifica la stazionarietà, identifica i parametri, adatta il modello, esegui la diagnostica e fai le previsioni. Ecco come funziona ogni passaggio in pratica, usando la libreria statsmodels di Python.
Raccolta dati
Per un modello che cattura la stagionalità, ti serve abbastanza storico per osservare il pattern almeno due volte, idealmente più cicli. Vendite mensili al dettaglio, registri di temperatura, consumi energetici e conteggi di passeggeri sono classici esempi. Fonti pubbliche come Federal Reserve Economic Data (FRED), US Census Bureau o Kaggle sono buoni punti di partenza.
Il dataset didattico standard per questo workflow è il conteggio dei passeggeri aerei: dati mensili dal 1949 al 1960 con un chiaro trend al rialzo e una forte stagionalità annuale. È disponibile tramite statsmodels con get_rdataset(), che lo recupera dalla collezione Rdatasets. Impara il workflow su questo dataset prima di applicarlo ai tuoi dati.
Preprocessing dei dati
Prima di adattare qualsiasi modello SARIMA, ti serve una serie stazionaria, in cui media e varianza non cambiano nel tempo. Il test di Dickey-Fuller aumentato (ADF) lo verifica formalmente: un p-value sotto 0,05 suggerisce che la serie è stazionaria.
Se non lo è, la differenziazione risolve. Applica la differenziazione ordinaria (d = 1) per il trend, la differenziazione stagionale (D = 1 al ritardo S) per la non stazionarietà stagionale, o entrambe se necessario. Gestisci i valori mancanti prima di questo passaggio. Forward fill o interpolazione sono approcci standard per dati temporali, perché eliminare righe rompe la struttura temporale.
Identificazione del modello
Con una serie stazionaria in mano, usi i grafici della Funzione di Autocorrelazione (ACF) e della Funzione di Autocorrelazione Parziale (PACF) per identificare i parametri del modello. Ecco cosa cercare:
- ACF mostra la correlazione tra la serie e i suoi ritardi. Un brusco taglio dopo il ritardo q suggerisce l'ordine MA. Picchi ai ritardi stagionali (12, 24, 36 per dati mensili) informano Q.
- PACF mostra correlazioni parziali con gli effetti dei ritardi intermedi rimossi. Un brusco taglio dopo il ritardo p suggerisce l'ordine AR. I picchi stagionali informano P.
In pratica, i grafici ti danno valori candidati e confronti alcune specifiche usando criteri informativi (più avanti nella diagnostica). Se preferisci automatizzare la ricerca, auto_arima() del pacchetto pmdarima esegue una grid search sulle combinazioni di parametri e seleziona il modello con miglior adattamento.
Stima dei parametri
Una volta identificati i parametri candidati, statsmodels li stima con la Massima Verosimiglianza (MLE), trovando i coefficienti che rendono i dati osservati più probabili sotto il modello. La stima SARIMA è più intensiva computazionalmente rispetto all'ARIMA semplice perché l'ottimizzatore deve adattare simultaneamente le componenti non stagionali e stagionali.
Il processo di fitting può occasionalmente convergere su un ottimo locale invece che globale, quindi vale la pena provare alcuni valori iniziali o combinazioni di parametri diversi quando i risultati sembrano strani.
Adattamento del modello
Ecco come adattare un modello SARIMA in Python usando il dataset dei passeggeri aerei:
import pandas as pd
import statsmodels.api as sm
# Load the classic airline dataset
airline_data = sm.datasets.get_rdataset("AirPassengers", "datasets").data
airline_data.index = pd.date_range(start="1949-01", periods=len(airline_data), freq="MS")
passengers = airline_data["value"]
# Fit SARIMA(1,1,1)(1,1,1)[12]
sarima_model = sm.tsa.statespace.SARIMAX(
passengers,
order=(1, 1, 1),
seasonal_order=(1, 1, 1, 12),
enforce_stationarity=False,
enforce_invertibility=False
)
sarima_result = sarima_model.fit(disp=False)
print(sarima_result.summary())
L'argomento order accetta (p, d, q) per la parte non stagionale; seasonal_order accetta (P, D, Q, S). Impostare enforce_stationarity=False ed enforce_invertibility=False dà maggiore flessibilità all'ottimizzatore, cosa che spesso aiuta la convergenza su dati reali.
Statistiche e diagnostica del modello
Dopo il fitting, esegui i grafici diagnostici integrati con sarima_result.plot_diagnostics(). Devi cercare quattro cose:
- Residui standardizzati: dovrebbero sembrare rumore bianco senza pattern evidenti.
- Istogramma dei residui: dovrebbe essere approssimativamente normale.
- Q-Q plot normale: i punti dovrebbero cadere vicino alla diagonale.
- Correlogramma (ACF dei residui): nessun picco significativo, che indicherebbe autocorrelazione non spiegata.
Presta particolare attenzione ai ritardi stagionali nel correlogramma. Picchi ai ritardi 12, 24 e così via suggeriscono che la componente stagionale non è completamente catturata. Confronta specifiche alternative usando AIC (Akaike Information Criterion) e BIC (Bayesian Information Criterion): valori più bassi indicano un adattamento migliore, con il BIC che penalizza maggiormente la complessità.
Forecasting
Con un modello validato, generare previsioni è semplice. Suddividi i dati in training e test per avere una valutazione onesta dell'accuratezza:
# Train on first 11 years, test on final year
train = passengers[:"1959"]
test = passengers["1960":]
# Refit on training data and forecast
sarima_train = sm.tsa.statespace.SARIMAX(
train,
order=(1, 1, 1),
seasonal_order=(1, 1, 1, 12),
enforce_stationarity=False, # add this
enforce_invertibility=False # add this
).fit(disp=False)
forecast = sarima_train.get_forecast(steps=12)
forecast_mean = forecast.predicted_mean
conf_int = forecast.conf_int()
Il metodo get_forecast() restituisce previsioni puntuali insieme a intervalli di confidenza che si allargano man mano che ti spingi più avanti nel tempo. Quell'allargamento non è un difetto; è il modello che è onesto sull'incertezza. Valuta l'accuratezza usando RMSE (Root Mean Squared Error) o MAPE (Mean Absolute Percentage Error) sul set di test tenuto da parte.
Applicazioni pratiche di SARIMA
Così tanti segnali reali sono stagionali che SARIMA merita un posto fisso in qualsiasi cassetta degli attrezzi per serie temporali. Alcuni esempi tra i settori:
- Retail: prevedere i volumi di vendita mensili per la pianificazione dell'inventario, soprattutto nei periodi festivi in cui i picchi di domanda sono prevedibili ma variano in entità di anno in anno.
- Consumo energetico: prevedere la domanda di elettricità e gas, che segue cicli stagionali sia giornalieri sia annuali guidati da temperatura e abitudini.
- Finanza: modellare pattern degli utili trimestrali o dei volumi di scambio che si ripetono con i calendari fiscali.
- Previsioni meteo: proiettare temperatura, precipitazioni e altre variabili climatiche che seguono forti cicli annuali.
In ogni caso, la struttura ricorrente è il segnale, e SARIMA è costruito per catturarlo.
Limitazioni di SARIMA
Sapere dove uno strumento funziona bene è solo metà del quadro. SARIMA è una solida baseline per serie temporali stagionali, ma conoscere i suoi limiti è ciò che distingue chi usa bene i modelli da chi li usa alla cieca.
Gestisce esattamente un periodo stagionale. Se i tuoi dati hanno stagionalità multiple, pattern giornalieri, settimanali e annuali sovrapposti, SARIMA non li modellerà tutti insieme. Metodi come TBATS, Prophet o reti LSTM gestiscono più frequenze stagionali in modo più naturale.
SARIMA inoltre assume linearità. Modella relazioni lineari tra valori passati, errori passati e osservazioni future. Dinamiche non lineari, comuni nelle serie finanziarie o in sistemi caotici, richiedono strumenti diversi. E come ARIMA, SARIMA si basa solo sulla storia della serie stessa. Se hai driver esterni che influenzano le previsioni, promozioni, eventi meteo, indicatori economici, guarda a SARIMAX, che aggiunge variabili esogene al framework SARIMA.
Infine, la selezione dei parametri può essere davvero difficile. Con sette parametri da regolare, lo spazio di ricerca è ampio e il fitting può essere lento su serie lunghe. auto_arima() di pmdarima aiuta ad automatizzare il processo. Ma non c'è scorciatoia alla comprensione di cosa significhino davvero i parametri, motivo per cui abbiamo trattato i componenti prima di scrivere codice.
Conclusione
Ho sempre pensato che SARIMA sia sottovalutato nei corsi introduttivi di forecasting. Viene insegnato come "ARIMA, ma con roba stagionale", il che lo fa sembrare un'estensione minore. Non lo è. I parametri stagionali non sono un'aggiunta posticcia; svolgono un vero lavoro strutturale, catturando un livello del comportamento dei tuoi dati che ARIMA semplicemente non può raggiungere.
Quello che fa scattare SARIMA in pratica è capire che le componenti non stagionale e stagionale non sono modelli separati che girano in parallelo. Interagiscono. I termini AR e MA lavorano insieme ai loro gemelli stagionali, ciascuno gestendo una diversa scala temporale di autocorrelazione. Una volta che questo concetto fa clic, leggere i grafici ACF e PACF smette di sembrare un esercizio di pattern matching e inizia a sembrare una reale comprensione dei dati.
Se lavori con dati mensili, trimestrali o con qualsiasi cadenza regolare, SARIMA è il punto di partenza giusto, non perché sia sempre la risposta finale, ma perché ti costringe a pensare con chiarezza alla struttura della tua serie. Da lì, SARIMAX aggiunge predittori esterni, e metodi come TBATS o Prophet gestiscono i casi più complessi con multi-stagionalità. Il nostro Time Series Forecasting Tutorial e il corso ARIMA Models in Python sono entrambi ottimi prossimi passi.
FAQ su SARIMA
Cosa significa SARIMA?
SARIMA sta per Seasonal AutoRegressive Integrated Moving Average. Estende il modello ARIMA standard aggiungendo parametri stagionali — (P, D, Q) e il periodo stagionale S — che catturano pattern ricorrenti nei dati di serie temporali, come cicli mensili o trimestrali.
Qual è la differenza tra ARIMA e SARIMA?
ARIMA modella pattern non stagionali: trend, autocorrelazione ed effetti a media mobile. SARIMA aggiunge un secondo livello di parametri (P, D, Q, S) che modellano gli stessi effetti ai ritardi stagionali. Se i tuoi dati mostrano pattern che si ripetono a intervalli fissi — come vendite più alte ogni dicembre — SARIMA li cattura direttamente, mentre ARIMA li lascia come varianza residua non spiegata.
Come scelgo i parametri SARIMA giusti?
Inizia verificando se la tua serie è stazionaria usando il test di Dickey-Fuller aumentato. Poi ispeziona i grafici ACF e PACF: gli ordini AR (p) e MA (q) non stagionali derivano dal pattern di tagli netti ai ritardi non stagionali, mentre gli ordini stagionali P e Q derivano dai picchi ai ritardi stagionali. Puoi anche usare auto_arima() del pacchetto pmdarima per cercare automaticamente tra le combinazioni di parametri, usando AIC o BIC per selezionare il modello migliore.
Come determino il periodo stagionale S per il mio modello SARIMA?
Il periodo stagionale S riflette la frequenza con cui il pattern si ripete. Per dati mensili con stagionalità annuale, S = 12. Per dati trimestrali, S = 4. Per dati settimanali, S = 52 (o 52,18 arrotondato). Se il periodo non è ovvio, usa la decomposizione della serie temporale o ispeziona il grafico ACF per picchi regolarmente spaziati — quei picchi rivelano la frequenza stagionale dominante.
SARIMA può gestire più periodi stagionali?
Il SARIMA standard gestisce un periodo stagionale alla volta. Se i tuoi dati hanno stagionalità multiple sovrapposte — come la domanda di elettricità giornaliera con cicli sia settimanali sia annuali — ti serviranno alternative come TBATS, Facebook Prophet o reti LSTM, progettate per modellare simultaneamente più strutture stagionali sovrapposte.
Quale libreria Python è migliore per adattare modelli SARIMA?
La libreria statsmodels di Python è la scelta standard, offrendo SARIMAX() (abbastanza flessibile da adattare modelli SARIMA senza variabili esogene). Per la selezione automatica dei parametri, la funzione auto_arima() della libreria pmdarima esegue una grid search ed è utile da integrare nel workflow quando non sai da dove iniziare con i valori dei parametri.
Come valuto se il mio modello SARIMA è adatto?
Dopo il fitting, esegui plot_diagnostics() sull'oggetto risultato e verifica che i residui sembrino rumore bianco senza struttura — in particolare senza picchi ai ritardi stagionali nell'ACF. Confronta specifiche di modello concorrenti usando AIC o BIC (più basso è meglio). Per l'accuratezza di previsione su dati tenuti da parte, RMSE e MAPE sono le metriche più comuni.
Cos'è SARIMAX e quando dovrei usarlo invece di SARIMA?
SARIMAX aggiunge variabili esogene — predittori esterni — al framework SARIMA. Usalo quando hai fattori misurabili che influenzano la tua serie oltre alla sua storia: spesa promozionale che influisce sulle vendite retail, temperatura che influisce sulla domanda di energia o indicatori macroeconomici che influenzano i ricavi trimestrali. Se i tuoi dati consistono solo nella serie stessa, SARIMA è sufficiente; quando hai driver esterni rilevanti, SARIMAX ti permette di incorporarli direttamente.

