Curso
Imagina que pronosticas la demanda mensual de electricidad. Tienes un buen modelo ARIMA que capta la autocorrelación y la tendencia de la serie. Llega una ola de calor y tu previsión se desvía un 15%. La serie no cambió; lo que cambió fue el clima. Justo para eso sirve ARIMAX: para pronosticar series temporales cuando factores externos explican buena parte de la variación además del propio historial de la serie.
Veremos qué es ARIMAX, en qué se diferencia de ARIMA y SARIMAX, y cuándo conviene usar uno u otro. También recorreremos una implementación completa en Python con preparación de datos, ajuste del modelo, diagnóstico y evaluación del pronóstico, para que puedas ponerlo en práctica.
¿Qué es ARIMAX?
ARIMAX significa AutoRegressive Integrated Moving Average with eXogenous variables. Es un modelo ARIMA que además acepta entradas externas: predictores ajenos a la propia serie objetivo. Ejemplos típicos: inversión publicitaria, temperatura, indicadores de promoción, tipos de interés.
La notación general es ARIMAX(p, d, q) con uno o más regresores exógenos. Los parámetros p, d y q tienen el mismo significado que en ARIMA: orden autorregresivo, grado de diferenciación y orden de media móvil. La "X" indica que puedes pasar columnas adicionales que creas que influyen en el objetivo. Un aviso importante: algunos paquetes implementan ARIMAX como una regresión con errores ARIMA en lugar de tratar las variables externas como entradas AR directas. La diferencia es sutil matemáticamente, pero afecta a cómo interpretas los coeficientes. Volveremos sobre esto al ver la salida de statsmodels.
Cómo funciona ARIMAX
ARIMAX combina dos cosas: la memoria de la propia serie y la capacidad explicativa de variables externas.
Los componentes AR, I y MA
El componente AR (autorregresivo) usa valores rezagados de la serie objetivo para predecir el valor actual. Si las ventas del mes pasado fueron altas, eso importa.
El componente I (integrado) diferencia la serie para eliminar tendencias o raíces unitarias y hacerla estacionaria.
El componente MA (media móvil) utiliza errores de pronóstico pasados para corregir errores sistemáticos que el modelo viene cometiendo.
En conjunto, estos tres elementos capturan gran parte de lo que impulsa una serie típica: tendencias, ciclos y autocorrelación en los residuales.
Dónde entran las variables exógenas
Las variables exógenas aportan información que el propio historial de la serie no puede proporcionar. Si pronostras ventas, las ventas pasadas informan sobre patrones típicos. Pero una bajada de precio o la entrada de un competidor es información nueva. El modelo estima un coeficiente para cada predictor externo al tiempo que tiene en cuenta la autocorrelación en los errores.
En la práctica: si tu serie se explica bien por sus propios valores pasados y no tienes predictores externos fiables, un ARIMA sencillo suele bastar. Pero cuando sabes que hay factores externos en juego y, además, dispondrás de sus valores futuros, ARIMAX tiende a ofrecer pronósticos más precisos.
ARIMA vs. ARIMAX vs. SARIMAX
SARIMAX se basa en SARIMA añadiendo variables exógenas. En la práctica, la mayoría de implementaciones de ARIMAX en Python utilizan SARIMAX() de statsmodels, con el orden estacional fijado a cero.
No es un apaño: es el enfoque estándar. SARIMAX es una buena primera opción cuando tu serie tiene un patrón estacional claro o cuando necesitas regresores externos; maneja ambas cosas con soltura. Un matiz: "ARIMAX" y "SARIMAX" no son intercambiables en todas las librerías. En algunos paquetes, SARIMAX sin términos estacionales y ARIMAX son idénticos en la práctica. En otros, difieren en cómo entran las variables exógenas en la verosimilitud. Consulta la documentación de la herramienta que uses.
Cuándo usar ARIMAX
Suele reducirse a una pregunta: ¿tienes predictores externos que razonablemente influyen en el objetivo y tendrás sus valores futuros cuando toque pronosticar?
Situaciones en las que ARIMAX aporta valor
Buenos candidatos: previsión de ventas con indicadores de promoción o cambios de precio, demanda energética con temperatura, tráfico web con inversión en campañas e indicadores económicos junto con tipos de interés. En todos los casos, la variable externa aporta información que la serie no puede generar por sí sola.
Un ARIMA simple puede ser suficiente cuando los predictores externos no están disponibles, no son fiables o no mejoran la precisión fuera de muestra. Añadir predictores que introducen ruido sin señal no ayuda. Más entradas no garantizan mejores pronósticos. Evalúa cualquier predictor propuesto en datos reservados antes de comprometerte.
Una nota sobre causalidad
Que exista relación entre un predictor y el objetivo no implica causalidad. ARIMAX es un marco de pronóstico; estima asociaciones. Si el gasto publicitario se correlaciona con las ventas porque ambos suben en diciembre, el modelo puede captarlo, pero no te dirá que la publicidad causó el aumento. Esta distinción importa si usas los pronósticos para tomar decisiones y no solo para predecir. Conviene explicitarlo al presentar resultados.
Cómo construir un modelo ARIMAX en Python
Vamos con la implementación.
Usaremos un ejemplo reproducible: ventas mensuales de helado (unidades vendidas) con temperatura (°C) y un indicador de promoción como predictores exógenos. El conjunto abarca 48 meses, con 36 para entrenamiento y 12 para evaluación.
Prepara los datos
Empieza cargando o construyendo un DataFrame con un índice de fechas mensual consistente. Identifica tu variable objetivo y tus columnas exógenas, y alinea todo por fecha. Trata los valores faltantes antes de dividir. No imputes a través de la frontera entre train y test: introduce fuga de información.
Regla clave desde el principio: cualquier valor exógeno que uses en el entrenamiento deberá tener su equivalente futuro en el momento de pronosticar. Si no puedes obtener previsiones de temperatura futuras, no puedes usar la temperatura como predictor. No es un detalle menor; descarta muchas opciones.
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:]
Normalmente no hace falta escalar para estimar con statsmodels, pero ayuda a la estabilidad numérica cuando los predictores están en escalas muy distintas. Escalar o no es cuestión de criterio.
Revisa la serie y los predictores
Antes de elegir parámetros, inspecciona visualmente la serie objetivo y ejecuta una prueba de estacionariedad. La prueba ADF (Augmented Dickey-Fuller) es el estándar. Un p-valor por debajo de 0,05 sugiere que la serie es estacionaria y probablemente no necesita diferenciación (d=0). Si la serie muestra una tendencia clara, lo habitual es fijar d=1. Las pruebas son una guía; el conocimiento del dominio y la inspección visual también cuentan.
Revisa también tus predictores: ¿están alineados con el objetivo? ¿Existe la posibilidad de que un predictor se mida después de la fecha de pronóstico? Un indicador de promoción fijado antes de comenzar el mes está bien. Los ingresos de ese mes, no.
Elige parámetros candidatos y ajusta el modelo
Los gráficos ACF y PACF ayudan a sugerir valores para p y q. Un pico significativo en el rezago 1 de la PACF con una ACF que se atenúa suele sugerir AR(1); el patrón inverso sugiere MA(1). Compara un conjunto pequeño de candidatos usando AIC o BIC en los datos de entrenamiento, y reserva el set de test solo para la evaluación final.
# 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())
La salida de summary() muestra los coeficientes ARIMA junto con los de las variables exógenas. Ese coeficiente de temperatura te indica cuánto se asocia un aumento de un grado con un cambio en el nivel de ventas, una vez que la estructura autorregresiva recoge la inercia de la serie. Un punto importante: statsmodels usa la formulación de regresión con errores ARIMA, lo que significa que la diferenciación (d=1) se aplica al proceso de error, no a la ecuación de regresión en sí. El coeficiente representa el efecto sobre el nivel de ventas con independencia de d. En una formulación ARIMAX de función de transferencia (que usan otros paquetes), d=1 implicaría que los coeficientes reflejan efectos sobre cambios y no sobre niveles. Esta diferencia suele confundir, así que conviene revisar la documentación de la herramienta que utilices.
Revisa los residuales y evalúa los pronósticos
Los residuales deben parecer ruido blanco. Revisa el ACF de residuales por si queda autocorrelación. Picos significativos indican que el modelo se deja estructura sin capturar. Si ves patrones sistemáticos en rezagos estacionales, cambia a SARIMAX con orden estacional.
# 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}")
Compara el MAE de ARIMAX con un baseline ingenuo (usar el valor del periodo anterior como pronóstico). Si ARIMAX no supera al modelo ingenuo en tu test, es un resultado significativo: la complejidad extra no se justifica. Esto ocurre más a menudo de lo que parece, especialmente cuando los predictores exógenos son más ruidosos de lo que aparentan en la muestra de entrenamiento.
Pronostica valores futuros
Pronosticar más allá del periodo de entrenamiento funciona igual que la evaluación fuera de muestra: aporta los valores exógenos futuros junto con la llamada a forecast(). Para indicadores de promoción suele ser sencillo porque conoces el calendario con antelación. Para temperatura, usarías una previsión meteorológica o promedios estacionales históricos.
Ten esto claro: los intervalos de confianza que devuelve statsmodels son condicionales a los valores de los predictores que aportas. No contemplan la incertidumbre de esos predictores. Si tu previsión de temperatura es incierta, la incertidumbre real del pronóstico es mayor de lo que sugieren los intervalos. Conviene comunicarlo si presentas resultados a quien vaya a tomar decisiones.
Retos y limitaciones frecuentes
Lo anterior cubre el escenario ideal. Aquí es donde suelen aparecer problemas.
- Puede que no conozcas los predictores futuros: es la barrera práctica más común. Si no puedes obtener valores futuros de tus variables exógenas de forma fiable, no puedes usarlas. Pronosticar demanda energética con la temperatura de mañana exige una previsión de temperatura, no la de ayer.
- Los predictores pueden filtrar información: una variable medida después de la fecha de pronóstico puede hacer que tu evaluación en muestra parezca mucho mejor de lo que es. Vigila a qué timestamp corresponden realmente tus predictores.
- Las relaciones pueden cambiar: los coeficientes estimados con datos históricos pueden no mantenerse. Una elasticidad precio estable dos años puede variar tras un shock de mercado, y 2024 y 2025 han dado motivos para no verlo como algo teórico. Reestimar el modelo periódicamente es buena práctica.
- Predictores correlacionados complican la interpretación: entradas muy colineales vuelven inestables los coeficientes individuales. No siempre perjudica la precisión del pronóstico, pero dificulta saber qué predictor aporta valor.
- Más entradas no garantizan mejores pronósticos: evalúa cada predictor propuesto frente a un baseline en datos reservados. Algunas características que parecen informativas en muestra añaden ruido fuera de muestra.
- La estacionalidad requiere términos estacionales: si tu serie tiene un patrón estacional consistente, como ventas mensuales con pico en diciembre, SARIMAX con orden estacional es la opción correcta. ARIMAX por sí solo no lo captará.
- No establece causalidad: insistimos: ARIMAX es un marco de pronóstico, no un método de inferencia causal. No utilices signos de coeficientes para afirmar causalidad sin análisis adicional.
Conclusión
ARIMAX se gana su sitio cuando tienes factores externos que realmente influyen en el objetivo y puedes aportar sus valores futuros al pronosticar. Es una extensión natural de ARIMA, no un sustituto. Si tu serie es estable y no tienes predictores fiables, ARIMA sencillo suele ser el mejor punto de partida. Añadir variables da sensación de progreso. A veces no lo es.
El flujo de trabajo se reduce a cuatro cosas bien hechas:
- alinea correctamente tus predictores,
- comprueba que no haya fuga de información antes de evaluar,
- valida en datos realmente reservados y
- compáralo siempre con un baseline sencillo.
Un ARIMAX que apenas mejora a un pronóstico ingenuo no es mejor que un pronóstico ingenuo. Solo es más caro.
Si quieres profundizar en los fundamentos de series temporales, nuestro curso Time Series Analysis in Python cubre ARIMA, estacionariedad y diagnósticos en detalle. Para la parte de statsmodels, nuestro curso Introduction to Regression with statsmodels in Python te dará la intuición estadística que necesitas para interpretar resúmenes de modelos y revisar residuales.
Vinod Chugani comenzó su carrera en Tokio como el jefe más joven del equipo de ventas para hedge funds de JPMorgan y más tarde batió un récord individual de ventas en Lehman Brothers, para después crear un negocio de distribución de electrónica en 30 países que superó los 100 millones de SG$ en ingresos antes de dar el salto a los datos. Graduado en Economía por Duke y antiguo alumno de NYC Data Science Academy, fue uno de los tres becados entre más de 100 solicitantes para el curso Building AI Applications de Hugo Bowne-Anderson en Maven. Hoy escribe en DataCamp, KDnuggets, Machine Learning Mastery y Statology sobre temas que van desde estadística hasta IA agentiva, y mentoriza a profesionales de datos en NYC Data Science Academy con más de 1.000 sesiones uno a uno a sus espaldas.
FAQs
¿Cuál es la diferencia entre ARIMAX y ARIMA?
ARIMA pronostica una serie objetivo usando solo sus valores pasados y errores de pronóstico pasados. ARIMAX amplía esto incorporando variables exógenas —entradas externas como temperatura, promociones o tipos de interés— que se cree que influyen en el objetivo. Si esos factores externos realmente impulsan la variación en tu serie y puedes aportar sus valores futuros, ARIMAX suele producir mejores pronósticos que ARIMA por sí solo.
¿En qué se diferencia ARIMAX de SARIMAX?
ARIMAX maneja variables externas pero no patrones estacionales. SARIMAX añade términos estacionales AR, de diferenciación y MA sobre ARIMAX, por lo que es la elección adecuada cuando tu serie presenta estacionalidad recurrente. En statsmodels de Python, ARIMAX suele implementarse mediante SARIMAX() con el orden estacional (0, 0, 0, 0). Funcionalmente, son el mismo modelo en esa configuración.
¿Necesito proporcionar valores futuros de las variables exógenas para pronosticar con ARIMAX?
Sí —y es una de las restricciones más importantes en la práctica—. Al generar pronósticos más allá del periodo de entrenamiento, debes aportar valores para cada variable exógena en cada instante futuro. Para indicadores de promoción o festivos, suele ser sencillo. Para variables como temperatura o precios de materias primas, necesitarás valores pronosticados o supuestos razonables, lo que introduce incertidumbre adicional.
¿Cómo elijo p, d y q para un modelo ARIMAX?
Empieza con los gráficos ACF y PACF de la serie (diferenciada). Un pico significativo en el rezago 1 de la PACF y una ACF decreciente suele sugerir AR(1); el patrón inverso sugiere MA(1). Usa el conocimiento del dominio y la prueba ADF para determinar d. Luego compara un conjunto pequeño de combinaciones (p, d, q) con AIC o BIC en los datos de entrenamiento. Evita usar el set de test durante esta selección: resérvalo para la evaluación final.
¿Qué significa el coeficiente de una variable exógena en un modelo ARIMAX?
El coeficiente representa el cambio estimado en el nivel de la serie objetivo asociado a un aumento de una unidad en ese predictor, teniendo en cuenta la estructura autorregresiva. En statsmodels esto se mantiene incluso con d=1, porque la diferenciación se aplica al proceso de error y no a la ecuación de regresión (formulación de regresión con errores ARIMA). Otros paquetes usan una formulación de función de transferencia en la que d=1 hace que los coeficientes reflejen efectos sobre cambios en lugar de niveles; revisa la documentación de tu herramienta. La interpretación también se complica cuando los predictores están en escalas distintas o correlacionados entre sí, por lo que merece la pena estandarizar entradas si te interesa comparar coeficientes.
¿Cómo detecto y gestiono la multicolinealidad en predictores exógenos?
Calcula el VIF (Variance Inflation Factor) para cada predictor antes de ajustar. Valores por encima de 10 sugieren colinealidad problemática. Si la detectas, prueba a eliminar el predictor con menor justificación teórica o combina variables correlacionadas en un único compuesto. Una colinealidad alta no tiene por qué perjudicar la precisión del pronóstico, pero vuelve poco fiables e interpretables los coeficientes individuales.
¿Cómo evalúo si ARIMAX realmente aporta valor?
Compáralo siempre con un baseline sencillo: un pronóstico ingenuo (usar el valor del periodo anterior) es un buen inicio. Si ARIMAX no lo supera en datos de test reservados, el modelo no justifica su complejidad. MAE y RMSE son métricas razonables; MAE es más fácil de explicar a las partes interesadas. Haz la comparación en un conjunto de prueba que no se haya usado para seleccionar parámetros.
¿Cuándo debo usar SARIMAX en lugar de ARIMAX?
Usa SARIMAX cuando tu serie muestre un patrón estacional consistente —ventas mensuales con pico en diciembre, tráfico web semanal con pico en lunes, etc.—. SARIMAX añade componentes estacionales AR, de diferenciación y MA que ARIMAX no tiene. Dado que statsmodels en Python implementa ARIMAX mediante SARIMAX(), la cuestión práctica es si debes definir un orden estacional distinto de cero. Si, tras ajustar ARIMAX, los residuales muestran autocorrelación significativa en rezagos estacionales, es señal de añadir términos estacionales.
