Kurs
Säg att du ska förutsäga månadsvis efterfrågan på el. Du har en stabil ARIMA-modell som fångar seriens autokorrelation och trend. Sedan kommer en värmebölja, och din prognos missar med 15 %. Serien ändrades inte; vädret gjorde det. Det är precis den situation ARIMAX är byggt för: tidsserieprognoser när yttre faktorer driver lika mycket av variationen som seriens egen historik.
Vi går igenom vad ARIMAX är, hur det skiljer sig från ARIMA och SARIMAX, och när det är rimligt att välja det ena framför det andra. Vi går också igenom en fullständig Python-implementering som täcker dataprepp, modellanpassning, diagnostik och prognosutvärdering, så att du kan tillämpa det du lär dig.
Vad är ARIMAX?
ARIMAX står för AutoRegressive Integrated Moving Average with eXogenous variables. Det är en ARIMA-modell som också tar externa indata, det vill säga prediktorer utanför själva målserien. Exempel som ligger nära till hands: annonsutgifter, temperatur, kampanjflaggor, räntor.
Den allmänna beteckningen är ARIMAX(p, d, q) med en eller flera exogena regressorer. Parametrarna p, d och q har samma innebörd som i ARIMA: den autoregressiva ordningen, graden av differensering och glidande medelvärdets ordning. ”X” betyder att du kan skicka in ytterligare kolumner som du tror påverkar målet. En sak att flagga redan nu: vissa mjukvarupaket implementerar ARIMAX som en regressionsmodell med ARIMA-fel i stället för att behandla externa variabler som direkta AR-indata. Skillnaden är subtil matematiskt, men den spelar roll för hur du tolkar koefficienterna. Vi återkommer till detta när vi tittar på statsmodels-utdata.
Hur ARIMAX fungerar
ARIMAX kombinerar två saker: seriens eget minne och förklaringskraften i yttre variabler.
AR-, I- och MA-komponenterna
AR-komponenten (autoregressiv) använder fördröjda värden av målserien för att förutsäga det aktuella värdet. Om förra månadens försäljning var hög spelar det roll.
I-komponenten (integrerad) differensierar serien för att ta bort trender eller enhetsrötter och göra den stationär.
MA-komponenten (glidande medelvärde) använder tidigare prognosfel för att korrigera systematiska misstag modellen gjort.
Tillsammans hanterar dessa tre element mycket av det som driver en typisk tidsserie: trender, cykler och autokorrelation i residualerna.
Var exogena variabler kommer in
Exogena variabler bidrar med information som seriens egen historik inte kan ge. Om du förutsäger försäljning berättar tidigare försäljning om typiska mönster. Men en prissänkning eller en konkurrent som går in på marknaden är ny information. Modellen skattar en koefficient för varje extern prediktor samtidigt som den tar hänsyn till autokorrelation i felen.
Här är den praktiska tolkningen: om din målserie förklaras väl av sina egna tidigare värden och du inte har några tillförlitliga yttre prediktorer, räcker sannolikt vanlig ARIMA. Men när du vet att externa faktorer spelar in, och när du faktiskt kommer att ha framtida värden för dessa prediktorer tillgängliga, tenderar ARIMAX att ge mer träffsäkra prognoser.
ARIMA vs. ARIMAX vs. SARIMAX
SARIMAX bygger vidare på SARIMA genom att lägga till exogena variabler. I praktiken går de flesta Python-implementationer av ARIMAX via SARIMAX() från statsmodels, med säsongsordningen satt till noll.
Det är inte en nödlösning. Det är standardmetoden. SARIMAX är ett bra förstahandsval när din serie har ett tydligt säsongsmönster eller när du behöver externa regressorer; den hanterar båda snyggt. En brasklapp: ”ARIMAX” och ”SARIMAX” är inte utbytbara i alla bibliotek. I vissa paket är SARIMAX utan säsongstermer och ARIMAX funktionellt identiska. I andra skiljer de sig åt i hur de exogena variablerna går in i likelihood-funktionen. Kolla dokumentationen för det verktyg du använder.
När du ska använda ARIMAX
Ofta kokar det ned till en sak: har du externa prediktorer som rimligen påverkar målet, och kommer du att ha deras framtida värden när det är dags att prognostisera?
Situationer där ARIMAX tillför värde
Bra kandidater inkluderar försäljningsprognoser med kampanjflaggor eller prisändringar, energiefterfrågan med temperaturindata, webbtrafik med kampanjutgifter och ekonomiska indikatorer tillsammans med ränte-data. I varje fall ger den externa variabeln information som serien inte kan generera på egen hand.
Ren ARIMA kan räcka när externa prediktorer saknas, är otillförlitliga eller helt enkelt inte förbättrar träffsäkerheten utanför urvalet. Att lägga till prediktorer som för in brus utan signal hjälper inte. Fler indata garanterar inte bättre prognoser. Utvärdera varje föreslagen prediktor på hållen testdata innan du bestämmer dig.
Ett ord om kausalitet
Ett samband mellan en prediktor och målet etablerar inte kausalitet. ARIMAX är ett prognosramverk; det skattar associationer. Om annonsutgifter korrelerar med försäljning för att båda går upp i december, kan modellen fånga det, men den berättar inte att annonseringen orsakade ökningen. Den skillnaden spelar roll om du använder prognoser för att informera beslut snarare än bara för att förutsäga utfall. Det är värt att vara tydlig med detta när du presenterar resultat.
Hur du bygger en ARIMAX-modell i Python
Nu till implementeringen.
Vi använder ett reproducerbart exempel: månadsvis glassförsäljning (antal sålda enheter) med temperatur (°C) och en kampanjflagga som exogena prediktorer. Datasetet spänner över 48 månader, uppdelat i 36 månader för träning och 12 för utvärdering.
Förbered data
Börja med att läsa in eller bygga upp en DataFrame med ett konsekvent månadsindex. Identifiera din målvariabel och dina exogena kolumner, och linjera sedan allt efter datum. Hantera saknade värden innan du delar upp datan. Imputera inte över gränsen mellan träning och test, eftersom det introducerar läckage.
Regeln att ta till sig tidigt: vilka exogena värden du än matar in under träningen behöver du motsvarande framtida värden vid prognostillfället. Om du inte kan få framtida temperaturprognoser kan du inte använda temperatur som prediktor. Det är inte en liten fotnot; det utesluter många kandidater.
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:]
Skalning krävs vanligtvis inte för skattning i statsmodels, men det kan hjälpa numerisk stabilitet när prediktorer ligger på väldigt olika skalor. Huruvida du ska skala är en bedömningsfråga.
Kontrollera serien och prediktorerna
Innan du väljer modellparametrar, inspektera målserien visuellt och kör ett stationaritetstest. Augmented Dickey-Fuller-testet (ADF) är standard. Ett p-värde under 0,05 tyder på att serien är stationär och troligen inte behöver differensering (d=0). Om serien har en tydlig trend sätter du vanligtvis d=1. Tester är ett underlag; domänkunskap och visuell inspektion spelar också roll.
Kontrollera också dina prediktorer: är de linjerade med målet? Finns det någon risk att en prediktor mäts efter prognosdatumet? En kampanjflagga som sätts innan månaden börjar är okej. Intäkter från den månaden är det inte.
Välj kandidatparametrar och anpassa modellen
ACF- och PACF-diagram hjälper till att föreslå kandidatvärden för p och q. En tydlig topp vid lagg 1 i PACF med avtagande ACF antyder ofta AR(1); det omvända antyder MA(1). Jämför en liten uppsättning kandidater med AIC eller BIC på träningsdatan, och spara testmängden för den slutliga utvärderingen.
# 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())
Utdata från summary() visar ARIMA-koefficienterna tillsammans med koefficienterna för de exogena variablerna. Den där temperaturkoefficienten berättar hur mycket en grads ökning i temperatur är förknippad med en förändring i försäljningsnivån, efter att den autoregressiva strukturen tagit hänsyn till seriens egen momentum. En sak att känna till: statsmodels använder en formulering med regression-med-ARIMA-fel, vilket innebär att differenseringen (d=1) tillämpas på felprocessen, inte på själva regressionsekvationen. Koefficienten representerar effekten på försäljningsnivån oavsett d. I en transferfunktionsformulering av ARIMAX (som används i vissa andra paket) skulle d=1 innebära att koefficienter återspeglar effekter på förändringar snarare än nivåer. Den skillnaden snubblar många på, så det är värt att kolla dokumentationen för det verktyg du använder.
Kontrollera residualer och utvärdera prognoser
Residualer bör se ut som vitt brus. Kontrollera residualernas ACF-diagram för kvarvarande autokorrelation. Signifikanta toppar betyder att modellen missar struktur. Om du ser systematiska mönster vid säsongslagg, byt till SARIMAX med en säsongsordning.
# 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}")
Jämför ARIMAX MAE mot en naiv baslinje (använd föregående periods värde som prognos). Om ARIMAX inte slår den naiva modellen på din testmängd är det ett meningsfullt resultat. Den extra komplexiteten är inte motiverad. Jag har sett detta hända oftare än du skulle tro, särskilt när de exogena prediktorerna är brusigare än de ser ut inom urvalet.
Prognostisera framtida värden
Prognoser bortom träningsperioden fungerar på samma sätt som utvärdering utanför urvalet: skicka med framtida exogena värden tillsammans med forecast()-anropet. För kampanjflaggor är detta vanligtvis enkelt eftersom du känner till kampanjkalendern i förväg. För temperatur använder du typiskt en väderprognos eller historiska säsongsmedelvärden.
Kom ihåg: konfidensintervallen som statsmodels returnerar är villkorade på de prediktorvärden du tillhandahåller. De tar inte hänsyn till osäkerhet i dessa prediktorer. Om din temperaturprognos är osäker är den faktiska prognososäkerheten större än vad intervallen antyder. Värt att kommunicera om du presenterar resultat för någon som kan agera på dem.
Vanliga utmaningar och begränsningar
Implementeringen ovan täcker lyckoscenariot. Här är var det ofta skär sig.
- Framtida prediktorer kan vara okända: Detta är det vanligaste praktiska hindret. Om du inte pålitligt kan få framtida värden för dina exogena variabler kan du inte använda dem. Att prognostisera energiefterfrågan med morgondagens temperatur kräver en temperaturprognos, inte gårdagens.
- Prediktorer kan läcka information: En variabel som mäts efter prognosdatum kan få din utvärdering inom urvalet att se mycket bättre ut än den egentligen är. Var noga med vilka tidsstämplar dina prediktorer faktiskt motsvarar.
- Samband kan förändras: Koefficienter skattade på historisk data kanske inte håller framåt. En priseleasticitet som var stabil i två år kan skifta efter en marknadschock, och 2024 och 2025 bjöd på tillräckligt många sådana för att detta ska kännas mindre teoretiskt än tidigare. Att reestimera modellen regelbundet är god praxis.
- Korrelerade prediktorer försvårar tolkning: Kraftigt kollineära indata kan göra enskilda koefficientskattningar instabila. Detta skadar inte alltid prognosnoggrannheten, men det gör det svårare att säga vilken prediktor som står för effekten.
- Fler indata garanterar inte bättre prognoser: Utvärdera varje föreslagen prediktor mot en baslinje på hållen testdata. Vissa egenskaper som ser informativa ut inom urvalet tillför brus utanför urvalet.
- Säsongsmönster kräver säsongstermer: Om din serie har ett konsekvent säsongsmönster, som månadsförsäljning med en decembertopp, är SARIMAX med säsongsordning rätt val. ARIMAX ensam fångar det inte.
- Kausalitet fastställs inte: Värt att upprepa: ARIMAX är ett prognosramverk, inte en metod för kausal inferens. Använd inte koefficienttecken för att hävda orsakssamband utan ytterligare analys.
Slutsats
ARIMAX förtjänar sin plats när du har yttre faktorer som verkligen påverkar målet, och du kan tillhandahålla deras framtida värden vid prognostillfället. Det är en naturlig utökning av ARIMA, inte en ersättare. Om din serie är väluppförd och du inte har tillförlitliga prediktorer är vanlig ARIMA oftast en bättre startpunkt. Att lägga till variabler kan kännas som framsteg. Ibland är det inte det.
Arbetsflödet kokar ned till fyra saker som görs väl:
- linjera dina prediktorer korrekt,
- kontrollera läckage innan utvärdering,
- validera på genuint hållen data, och
- jämför alltid mot en enkel baslinje.
En ARIMAX-modell som nätt och jämnt slår en naiv prognos är inte bättre än en naiv prognos. Den är bara dyrare.
Om du vill fördjupa dig i grunderna för tidsserier rekommenderar vi vår kurs Time Series Analysis in Python som täcker ARIMA, stationaritet och diagnostik i detalj. För statsmodels-delen bygger vår kurs Introduction to Regression with statsmodels in Python den statistiska intuition du vill ha när du tolkar modellsammanfattningar och kontrollerar residualer.
Vinod Chugani inledde sin karriär i Tokyo som JPMorgans yngsta chef för Hedge Fund Sales Desk och satte senare ett individuellt försäljningsrekord på Lehman Brothers, för att därefter bygga upp en elektronikdistributionsverksamhet i 30 länder som passerade 100 miljoner SG$ i intäkter innan han svängde om till data. Med en examen i ekonomi från Duke och som alumn från NYC Data Science Academy var han en av tre stipendiemottagare av över 100 sökande till Hugo Bowne-Andersons kurs Building AI Applications på Maven. Idag skriver han för DataCamp, KDnuggets, Machine Learning Mastery och Statology om ämnen från statistik till agentisk AI, och handleder dataexperter på NYC Data Science Academy med över 1 000 enskilda mentorsessioner bakom sig.
FAQs
Vad är skillnaden mellan ARIMAX och ARIMA?
ARIMA prognostiserar en målserie enbart med dess egna tidigare värden och tidigare prognosfel. ARIMAX utökar detta genom att införliva exogena variabler — externa indata som temperatur, kampanjer eller räntor — som tros påverka målet. Om dessa yttre faktorer verkligen driver variationen i din serie och du kan tillhandahålla deras framtida värden, kommer ARIMAX vanligtvis att ge bättre prognoser än enbart ARIMA.
Hur skiljer sig ARIMAX från SARIMAX?
ARIMAX hanterar externa variabler men inte säsongsmönster. SARIMAX lägger till säsongs-AR, differensering och MA-termer ovanpå ARIMAX, vilket gör det till rätt val när din serie har en återkommande säsongsstruktur. I Pythons statsmodels implementeras ARIMAX vanligtvis via SARIMAX() med säsongsordningen satt till (0, 0, 0, 0). Funktionellt är de samma modell i den konfigurationen.
Behöver jag tillhandahålla framtida värden för exogena variabler för att prognostisera med ARIMAX?
Ja — detta är en av de viktigaste praktiska begränsningarna. När du genererar prognoser bortom träningsperioden måste du tillhandahålla värden för varje exogen variabel vid varje framtida tidpunkt. För kampanjflaggor eller helgindikatorer är detta vanligtvis enkelt. För variabler som temperatur eller råvarupriser behöver du prognostiserade värden eller rimliga antaganden, vilket för in ytterligare osäkerhet.
Hur väljer jag p, d och q för en ARIMAX-modell?
Börja med ACF- och PACF-diagram för den (differensierade) målserien. En tydlig topp vid lagg 1 i PACF och en avtagande ACF antyder ofta AR(1); det omvända mönstret antyder MA(1). Använd domänkunskap och ADF-testet för att bestämma d. Jämför sedan en liten uppsättning kandidatkombinationer av (p, d, q) med AIC eller BIC på träningsdatan. Undvik att använda testmängden under detta urvalssteg — den ska bara användas för slutlig utvärdering.
Vad betyder koefficienten på en exogen variabel i en ARIMAX-modell?
Koefficienten representerar den skattade förändringen i målseriens nivå som är förknippad med en enhets ökning i den prediktorn, efter att den autoregressiva strukturen beaktats. I statsmodels gäller detta även när d=1, eftersom differenseringen tillämpas på felprocessen snarare än på regressionsekvationen (detta är formuleringen regression-med-ARIMA-fel). Vissa andra paket använder en transferfunktionsformulering där d=1 skulle göra att koefficienterna återspeglar effekter på förändringar i stället för nivåer, så kontrollera dokumentationen för ditt verktyg. Tolkningen kan också bli knepig när prediktorer ligger på olika skalor eller är korrelerade med varandra, så det kan vara värt att standardisera indata när du vill jämföra koefficienter.
Hur upptäcker och hanterar jag multikollinearitet i exogena prediktorer?
Beräkna Variance Inflation Factor (VIF) för varje prediktor innan anpassning. Värden över 10 tyder på problematisk kollinearitet. Om du hittar det, prova att ta bort den prediktor som är minst teoretiskt motiverad, eller kombinera korrelerade variabler till en sammansatt. Hög kollinearitet behöver inte nödvändigtvis skada prognosnoggrannheten, men den gör enskilda koefficienter opålitliga och svårtolkade.
Hur bör jag utvärdera om ARIMAX faktiskt tillför värde?
Jämför alltid mot en enkel baslinje — en naiv prognos (som använder föregående periods värde) är en bra startpunkt. Om ARIMAX inte slår den på hållen testdata förtjänar modellen inte sin komplexitet. MAE och RMSE är båda rimliga mått; MAE är lättare att förklara för intressenter. Kör jämförelsen på en riktig testmängd som aldrig användes för parameterurval.
När ska jag använda SARIMAX i stället för ARIMAX?
Använd SARIMAX när din serie visar ett konsekvent säsongsmönster — månadsförsäljning med en decembertopp, veckovis webbtrafik med en måndagsspik och så vidare. SARIMAX lägger till säsongs-AR, differensering och MA-komponenter som ARIMAX saknar. Eftersom Pythons statsmodels ändå implementerar ARIMAX via SARIMAX() är den praktiska frågan bara om du ska sätta en icke-noll säsongsordning. Om dina residualer visar signifikant autokorrelation vid säsongslagg efter att du anpassat ARIMAX är det en signal att lägga till säsongstermer.
