Corso
Mettiamo che tu stia prevedendo la domanda mensile di elettricità. Hai un solido modello ARIMA che cattura l’autocorrelazione e il trend della serie. Poi arriva un’ondata di caldo e la tua previsione sgarra del 15%. La serie non è cambiata; è cambiato il meteo. È esattamente per questa situazione che ARIMAX è stato creato: previsione di serie temporali quando fattori esterni spiegano gran parte della variazione quanto la storia stessa della serie.
Vedremo cos’è ARIMAX, come differisce da ARIMA e SARIMAX e quando ha senso usare l’uno o l’altro. Passeremo anche a un’implementazione completa in Python che copre preparazione dei dati, stima del modello, diagnostica e valutazione delle previsioni, così potrai applicare ciò che hai imparato.
Che cos’è ARIMAX?
ARIMAX sta per AutoRegressive Integrated Moving Average with eXogenous variables. È un modello ARIMA che accetta anche input esterni, cioè predittori al di fuori della serie target. Esempi tipici: spesa pubblicitaria, temperatura, flag promozionali, tassi d’interesse.
La notazione generale è ARIMAX(p, d, q) con uno o più regressori esogeni. I parametri p, d e q hanno lo stesso significato che in ARIMA: ordine autoregressivo, grado di differenziazione e ordine della media mobile. La "X" indica che puoi fornire colonne aggiuntive che ritieni influenzino il target. Una cosa da segnalare: alcuni software implementano ARIMAX come una regressione con errori ARIMA invece di trattare le variabili esterne come input AR diretti. La distinzione è sottile dal punto di vista matematico, ma conta per l’interpretazione dei coefficienti. Torneremo su questo quando guarderemo l’output di statsmodels.
Come funziona ARIMAX
ARIMAX combina due aspetti: la memoria della serie stessa e il potere esplicativo delle variabili esterne.
Le componenti AR, I e MA
La componente AR (autoregressiva) usa i valori ritardati della serie target per prevedere il valore corrente. Se le vendite del mese scorso erano alte, conta.
La componente I (integrata) differenzia la serie per rimuovere trend o radici unitarie, rendendola stazionaria.
La componente MA (media mobile) usa gli errori di previsione passati per correggere errori sistematici che il modello sta commettendo.
Insieme, questi tre elementi gestiscono gran parte di ciò che guida una tipica serie temporale: trend, ciclicità e autocorrelazione nei residui.
Dove entrano le variabili esogene
Le variabili esogene apportano informazioni che la storia della serie non può fornire. Se stai prevedendo le vendite, le vendite passate ti raccontano gli andamenti tipici. Ma un taglio di prezzo o l’ingresso di un concorrente sono informazioni nuove. Il modello stima un coefficiente per ogni predittore esterno tenendo contemporaneamente conto dell’autocorrelazione negli errori.
In pratica: se la tua serie target è ben spiegata dai suoi valori passati e non hai predittori esterni affidabili, un ARIMA semplice probabilmente basta. Ma quando sai che fattori esterni sono in gioco, e quando avrai effettivamente disponibili i valori futuri di quei predittori, ARIMAX tende a fornire previsioni più accurate.
ARIMA vs. ARIMAX vs. SARIMAX
SARIMAX si basa su SARIMA aggiungendo variabili esogene. In pratica, la maggior parte delle implementazioni Python di ARIMAX passano da SARIMAX() di statsmodels, con l’ordine stagionale impostato a zero.
Non è un workaround. È l’approccio standard. SARIMAX è una buona prima scelta quando la tua serie ha un chiaro schema stagionale o quando ti servono regressori esterni; gestisce bene entrambi. Una nota: "ARIMAX" e "SARIMAX" non sono intercambiabili in ogni libreria. In alcuni pacchetti, SARIMAX senza termini stagionali e ARIMAX sono funzionalmente identici. In altri, differiscono per come le variabili esogene entrano nella verosimiglianza. Controlla la documentazione dello strumento che stai usando.
Quando usare ARIMAX
Di solito si riduce a una cosa: hai predittori esterni che plausibilmente influenzano il target, e avrai i loro valori futuri quando sarà il momento di prevedere?
Situazioni in cui ARIMAX aggiunge valore
Buoni candidati includono previsioni di vendite con flag promozionali o variazioni di prezzo, domanda energetica con input di temperatura, traffico web con spesa di campagna e indicatori economici insieme a dati sui tassi d’interesse. In ogni caso, la variabile esterna fornisce informazioni che la serie non può generare da sola.
Un ARIMA semplice può bastare quando i predittori esterni non sono disponibili, non sono affidabili o semplicemente non migliorano l’accuratezza out-of-sample. Aggiungere predittori che introducono rumore senza segnale non aiuta. Più input non garantiscono previsioni migliori. Valuta ogni predittore proposto su dati tenuti da parte prima di adottarlo.
Una parola sulla causalità
Una relazione tra un predittore e il target non stabilisce causalità. ARIMAX è un framework di previsione; stima associazioni. Se la spesa pubblicitaria correla con le vendite perché entrambe aumentano a dicembre, il modello può coglierlo, ma non ti dirà che la pubblicità ha causato l’aumento. Questa distinzione conta se usi le previsioni per prendere decisioni e non solo per predire risultati. Vale la pena essere espliciti su questo quando presenti i risultati.
Come costruire un modello ARIMAX in Python
Passiamo all’implementazione.
Useremo un esempio riproducibile: vendite mensili di gelati (unità vendute) con temperatura (°C) e un flag promozionale come predittori esogeni. Il dataset copre 48 mesi, suddivisi in 36 mesi per il training e 12 per la valutazione.
Prepara i dati
Inizia caricando o costruendo un DataFrame con un indice di date mensile coerente. Identifica la variabile target e le colonne esogene, quindi allinea tutto per data. Gestisci i valori mancanti prima dello split. Non imputare attraverso il confine train/test, perché introduce leakage.
La regola da interiorizzare subito: qualunque valori esogeni passi in training, ti serviranno valori futuri equivalenti al momento della previsione. Se non puoi ottenere previsioni di temperatura future, non puoi usare la temperatura come predittore. Non è un dettaglio: esclude molte opzioni.
import pandas as pd
import numpy as np
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.stattools import adfuller
from sklearn.metrics import mean_absolute_error
# Construct a sample monthly dataset
np.random.seed(42)
dates = pd.date_range(start="2020-01", periods=48, freq="MS")
temperature = 15 + 10 * np.sin(np.linspace(0, 4 * np.pi, 48)) + np.random.normal(0, 1, 48)
promotion = np.where((np.arange(48) % 6 == 0), 1, 0)
sales = (
500
+ 8 * temperature
+ 150 * promotion
+ np.cumsum(np.random.normal(0, 10, 48))
)
df = pd.DataFrame({"sales": sales, "temperature": temperature, "promotion": promotion}, index=dates)
# Train/test split
train = df.iloc[:36]
test = df.iloc[36:]
Di solito il ridimensionamento non è necessario per la stima in statsmodels, ma aiuta la stabilità numerica quando i predittori sono su scale molto diverse. Se scalare o meno è una scelta discrezionale.
Controlla la serie e i predittori
Prima di selezionare i parametri del modello, ispeziona visivamente la serie target ed esegui un test di stazionarietà. L’Augmented Dickey-Fuller (ADF) è lo standard. Un p-value inferiore a 0,05 suggerisce che la serie è stazionaria e probabilmente non necessita di differenziazione (d=0). Se la serie ha un trend evidente, tipicamente imposteresti d=1. I test sono un input; contano anche conoscenza del dominio e ispezione visiva.
Controlla anche i predittori: sono allineati con il target? C’è il rischio che un predittore sia misurato dopo la data di previsione? Un flag promozionale impostato prima dell’inizio del mese va bene. Il fatturato di quel mese no.
Scegli i parametri candidati e adatta il modello
I grafici ACF e PACF aiutano a suggerire valori candidati per p e q. Un picco significativo al lag 1 nel PACF con ACF decrescente suggerisce spesso AR(1); il contrario suggerisce MA(1). Confronta un piccolo set di candidati usando AIC o BIC sui dati di training e conserva il test set solo per la valutazione finale.
# Fit ARIMAX(1,1,1) via SARIMAX with no seasonal order
exog_train = train[["temperature", "promotion"]]
exog_test = test[["temperature", "promotion"]]
model = SARIMAX(
train["sales"],
exog=exog_train,
order=(1, 1, 1),
seasonal_order=(0, 0, 0, 0),
trend="n"
)
result = model.fit(disp=False)
print(result.summary())
L’output di summary() mostra i coefficienti ARIMA insieme ai coefficienti delle variabili esogene. Quel coefficiente della temperatura ti dice di quanto un aumento di un grado è associato a una variazione del livello delle vendite, dopo che la struttura autoregressiva ha tenuto conto della dinamica interna della serie. Una cosa utile da sapere: statsmodels usa una formulazione di regressione con errori ARIMA, il che significa che la differenziazione (d=1) è applicata al processo d’errore, non all’equazione di regressione. Il coefficiente rappresenta l’effetto sul livello delle vendite indipendentemente da d. In una formulazione ARIMAX a funzione di trasferimento (usata da alcuni altri pacchetti), d=1 implicherebbe che i coefficienti riflettano effetti sulle variazioni piuttosto che sui livelli. Questa distinzione trae in inganno molti, quindi vale la pena controllare la documentazione dello strumento che stai usando.
Controlla i residui e valuta le previsioni
I residui dovrebbero sembrare rumore bianco. Controlla il grafico ACF dei residui per eventuale autocorrelazione residua. Picchi significativi indicano che il modello sta mancando struttura. Se vedi pattern sistematici ai lag stagionali, passa a SARIMAX con un ordine stagionale.
# Generate out-of-sample predictions
predictions = result.forecast(steps=12, exog=exog_test)
# Evaluate
mae = mean_absolute_error(test["sales"], predictions)
# Naive baseline: forecast each period using the previous period's actual value
naive_forecast = np.concatenate([[train["sales"].iloc[-1]], test["sales"].values[:-1]])
naive_mae = mean_absolute_error(test["sales"], naive_forecast)
print(f"ARIMAX MAE: {mae:.1f}")
print(f"Naive MAE: {naive_mae:.1f}")
Confronta la MAE di ARIMAX con una baseline ingenua (usando il valore del periodo precedente come previsione). Se ARIMAX non batte il modello ingenuo sul tuo test set, è un risultato significativo. La complessità aggiuntiva non è giustificata. Mi è capitato più spesso di quanto penseresti, soprattutto quando i predittori esogeni sono più rumorosi di quanto sembrino in-sample.
Prevedi valori futuri
Prevedere oltre il periodo di training funziona come la valutazione out-of-sample: fornisci i valori esogeni futuri insieme alla chiamata forecast(). Per i flag promozionali, di solito è semplice perché conosci in anticipo il calendario promozionale. Per la temperatura, useresti in genere una previsione meteo o medie stagionali storiche.
Tieni a mente questo: gli intervalli di confidenza restituiti da statsmodels sono condizionati ai valori dei predittori che fornisci. Non tengono conto dell’incertezza in quei predittori. Se la tua previsione di temperatura è incerta, l’incertezza reale della previsione è più ampia di quanto suggeriscano gli intervalli. Vale la pena comunicarlo se presenti i risultati a chi potrebbe agire di conseguenza.
Sfide comuni e limitazioni
L’implementazione sopra copre il caso ideale. Ecco dove in genere si inceppa.
- I predittori futuri potrebbero essere sconosciuti: è l’ostacolo pratico più comune. Se non puoi ottenere in modo affidabile i valori futuri delle variabili esogene, non puoi usarle. Prevedere la domanda di energia con la temperatura di domani richiede una previsione della temperatura, non quella di ieri.
- I predittori possono far trapelare informazioni: Una variabile misurata dopo la data di previsione può far sembrare la valutazione in-sample molto migliore di quanto sia in realtà. Fai attenzione a quali timestamp corrispondono realmente i tuoi predittori.
- Le relazioni possono cambiare: i coefficienti stimati su dati storici potrebbero non valere in futuro. Un’elasticità al prezzo stabile per due anni può cambiare dopo uno shock di mercato, e il 2024 e il 2025 ne hanno prodotti abbastanza da rendere la cosa meno teorica di un tempo. Ri-stimare periodicamente il modello è una buona pratica.
- Predittori correlati complicano l’interpretazione: input altamente collineari possono rendere instabili le stime dei singoli coefficienti. Non sempre peggiora l’accuratezza delle previsioni, ma rende più difficile dire quale predittore sta facendo il lavoro.
- Più input non garantiscono previsioni migliori: valuta ogni predittore proposto rispetto a una baseline su dati tenuti da parte. Alcune feature che sembrano informative in-sample aggiungono rumore out-of-sample.
- La stagionalità richiede termini stagionali: se la tua serie ha un pattern stagionale coerente, come vendite mensili con un picco a dicembre, SARIMAX con un ordine stagionale è la scelta giusta. Il solo ARIMAX non lo catturerà.
- La causalità non è stabilita: vale la pena ripeterlo: ARIMAX è un framework di previsione, non un metodo di inferenza causale. Non usare i segni dei coefficienti per fare affermazioni causali senza analisi aggiuntive.
Conclusione
ARIMAX si guadagna il posto quando hai fattori esterni che influenzano davvero il target e puoi fornire i loro valori futuri al momento della previsione. È un’estensione naturale di ARIMA, non un sostituto. Se la tua serie è ben comportata e non hai predittori affidabili, ARIMA semplice è di solito il punto di partenza migliore. Aggiungere variabili dà l’idea di progresso. A volte non lo è.
Il flusso di lavoro si riduce a quattro cose fatte bene:
- allinea correttamente i tuoi predittori,
- controlla il leakage prima di valutare,
- valida su dati davvero tenuti da parte, e
- confronta sempre con una baseline semplice.
Un modello ARIMAX che batte di poco una previsione ingenua non è meglio di una previsione ingenua. È solo più costoso.
Se vuoi approfondire le basi delle serie temporali, il nostro corso Time Series Analysis in Python copre in dettaglio ARIMA, stazionarietà e diagnostica. Per la parte statsmodels, il nostro corso Introduction to Regression with statsmodels in Python costruisce l’intuizione statistica che ti servirà quando interpreti i sommari dei modelli e controlli i residui.
Vinod Chugani ha iniziato la sua carriera a Tokyo come il più giovane Head dell'Hedge Fund Sales Desk di JPMorgan e in seguito ha stabilito un record personale di vendite a Lehman Brothers, poi ha costruito un'attività di distribuzione di elettronica in 30 paesi superando i 100 milioni di SG$ di fatturato prima di passare ai dati. Laureato in Economia alla Duke e diplomato alla NYC Data Science Academy, è stato uno dei tre beneficiari di borsa di studio su oltre 100 candidati per il corso Building AI Applications di Hugo Bowne-Anderson su Maven. Oggi scrive per DataCamp, KDnuggets, Machine Learning Mastery e Statology su argomenti che vanno dalla statistica all'AI agentica, e fa da mentor a professionisti dei dati alla NYC Data Science Academy con oltre 1.000 sessioni one-to-one all'attivo.
FAQs
Qual è la differenza tra ARIMAX e ARIMA?
ARIMA prevede una serie target usando solo i suoi valori passati e gli errori di previsione passati. ARIMAX estende questo incorporando variabili esogene—input esterni come temperatura, promozioni o tassi d’interesse—che si ritiene influenzino il target. Se quei fattori esterni guidano davvero la variazione nella tua serie e puoi fornire i loro valori futuri, ARIMAX in genere produrrà previsioni migliori del solo ARIMA.
In cosa ARIMAX differisce da SARIMAX?
ARIMAX gestisce variabili esterne ma non pattern stagionali. SARIMAX aggiunge termini stagionali AR, differenziazione e MA sopra ARIMAX, rendendolo la scelta giusta quando la tua serie ha una struttura stagionale ricorrente. In statsmodels per Python, ARIMAX è tipicamente implementato tramite SARIMAX() con l’ordine stagionale impostato a (0, 0, 0, 0). In tale configurazione, a livello funzionale sono lo stesso modello.
Devo fornire i valori futuri delle variabili esogene per prevedere con ARIMAX?
Sì—ed è uno dei vincoli pratici più importanti. Quando generi previsioni oltre il periodo di training, devi fornire valori per ogni variabile esogena a ogni passo temporale futuro. Per flag promozionali o indicatori di festività, di solito è semplice. Per variabili come temperatura o prezzi delle commodity, ti serviranno valori previsti o assunzioni ragionevoli, il che introduce ulteriore incertezza.
Come scelgo p, d e q per un modello ARIMAX?
Inizia con i grafici ACF e PACF della serie (differenziata). Un picco significativo al lag 1 nel PACF e un ACF decrescente suggeriscono spesso AR(1); il pattern inverso suggerisce MA(1). Usa la conoscenza del dominio e il test ADF per determinare d. Poi confronta un piccolo set di combinazioni (p, d, q) candidate usando AIC o BIC sui dati di training. Evita di usare il test set durante questa selezione—va usato solo per la valutazione finale.
Cosa significa il coefficiente su una variabile esogena in un modello ARIMAX?
Il coefficiente rappresenta la variazione stimata nel livello della serie target associata a un aumento di una unità in quel predittore, dopo aver tenuto conto della struttura autoregressiva. In statsmodels, questo vale anche quando d=1, perché la differenziazione è applicata al processo d’errore e non all’equazione di regressione (formulazione di regressione con errori ARIMA). Alcuni altri pacchetti usano una formulazione a funzione di trasferimento in cui d=1 fa sì che i coefficienti riflettano effetti sulle variazioni invece che sui livelli, quindi controlla la documentazione del tuo strumento. L’interpretazione può complicarsi quando i predittori sono su scale diverse o correlati tra loro: vale la pena standardizzare gli input quando ti interessa confrontare i coefficienti.
Come rilevo e gestisco la multicollinearità nei predittori esogeni?
Calcola il Variance Inflation Factor (VIF) per ogni predittore prima di adattare il modello. Valori sopra 10 suggeriscono collinearità problematica. Se la trovi, prova a rimuovere il predittore meno giustificato teoricamente o combina variabili correlate in un unico composito. Un’alta collinearità non compromette necessariamente l’accuratezza delle previsioni, ma rende i singoli coefficienti inaffidabili e difficili da interpretare.
Come dovrei valutare se ARIMAX sta davvero aggiungendo valore?
Confronta sempre con una baseline semplice—una previsione ingenua (usare il valore del periodo precedente) è un buon punto di partenza. Se ARIMAX non la batte su dati di test tenuti da parte, il modello non si merita la sua complessità. MAE e RMSE sono entrambe metriche ragionevoli; la MAE è più facile da spiegare agli stakeholder. Esegui il confronto su un vero test set mai usato per la selezione dei parametri.
Quando dovrei usare SARIMAX invece di ARIMAX?
Usa SARIMAX quando la tua serie mostra un pattern stagionale coerente—vendite mensili con un picco a dicembre, traffico web settimanale con un picco il lunedì, e così via. SARIMAX aggiunge componenti stagionali AR, differenziazione e MA che ARIMAX non ha. Dato che in Python statsmodels implementa ARIMAX tramite SARIMAX() comunque, la domanda pratica è solo se impostare un ordine stagionale diverso da zero. Se, dopo aver adattato ARIMAX, i residui mostrano autocorrelazione significativa ai lag stagionali, è un segnale per aggiungere termini stagionali.


