Cada diciembre, los comercios se aprovisionan para la campaña navideña. Cada verano, las redes eléctricas se preparan para los picos del aire acondicionado. Estos patrones se repiten año tras año y, si creas una predicción de series temporales que los ignora, estás renunciando a precisión.
Los modelos de media móvil integrada autorregresiva estacional (SARIMA, por sus siglas en inglés) amplían el marco ARIMA, muy utilizado, para capturar patrones estacionales recurrentes junto con las tendencias habituales. En este artículo verás qué es SARIMA, cómo funcionan sus componentes, cuándo elegirlo frente a ARIMA y cómo construirlo paso a paso en Python.
¿Qué es SARIMA?
SARIMA es un modelo de predicción de series temporales que maneja tanto patrones no estacionales como estacionales. Se basa directamente en ARIMA, así que si ya has trabajado con ARIMA, te resultará familiar. La diferencia clave es que SARIMA añade una segunda capa de parámetros diseñada específicamente para modelar comportamientos que se repiten a intervalos fijos, como ciclos mensuales, trimestrales o semanales.
Formalmente, un modelo SARIMA se escribe como SARIMA(p, d, q)(P, D, Q)[S]. El primer conjunto de parámetros, (p, d, q), gestiona la estructura no estacional, idéntica a ARIMA estándar. El segundo, (P, D, Q)[S], representa los patrones estacionales, donde S es la longitud del ciclo estacional. Para datos mensuales con estacionalidad anual, S = 12. Para datos trimestrales, S = 4.
Componentes clave de SARIMA
Los siete parámetros de SARIMA pueden abrumar al principio. Ayuda pensarlos en dos grupos: el trío ARIMA de siempre (p, d, q) y sus equivalentes estacionales (P, D, Q, S) que los reflejan a escala estacional. Cada parámetro estacional hace lo mismo que su gemelo no estacional, solo que aplicado a saltos estacionales en lugar de pasos de tiempo adyacentes.
Parte autorregresiva (AR)
El componente AR utiliza valores pasados de la serie para predecir los futuros. El parámetro p indica cuántos retardos incluir. Si p = 2, el modelo usa los dos pasos de tiempo previos como predictores del valor actual.
En la parte estacional, P hace lo mismo pero con retardos estacionales. Si P = 1 y S = 12, el modelo mira el valor de hace 12 periodos, el mismo mes del año anterior, como predictor. Así captura directamente los patrones interanuales.
Parte integrada (I)
El parámetro d controla cuántas veces se diferencia la serie para eliminar tendencias y hacerla estacionaria. Diferenciar significa restar a cada observación la anterior, lo que elimina una tendencia lineal. Si d = 1, tomas primeras diferencias; si d = 2, diferencias la serie ya diferenciada.
El diferenciado estacional funciona igual pero con retardos estacionales. El parámetro D especifica cuántas diferencias estacionales aplicar. Con D = 1 y S = 12, restas a cada observación el valor de 12 periodos antes. Usar d = 1 y D = 1 a la vez es habitual cuando una serie presenta tanto una tendencia general ascendente como un patrón estacional recurrente.
Parte de media móvil (MA)
A diferencia del componente AR, que mira a los valores pasados, el componente MA modela la relación entre la observación actual y los errores residuales de predicciones pasadas. El parámetro q indica cuántos términos de error retardados incluir. Si q = 1, el modelo usa el error de predicción del paso anterior para ajustar el pronóstico actual.
Su equivalente estacional, Q, aplica la misma lógica a retardos estacionales. Con Q = 1 y S = 12, el modelo incorpora el error de pronóstico de hace 12 periodos. Esto importa cuando los choques estacionales, como un verano inusualmente caluroso que dispara la demanda energética, tienden a repetirse en el mismo periodo del año siguiente.
Componente estacional (S)
El parámetro S define la longitud del ciclo estacional y vincula los tres parámetros estacionales (P, D, Q). Acertar con S es clave: si tus datos son mensuales con un patrón anual, S = 12. Para datos semanales con ciclo anual, S es aproximadamente 52.
Aquí es donde la estacionalidad a veces se complica. Un año no son exactamente 52 semanas; se acerca más a 52,18. Para la mayoría de usos prácticos, redondear a S = 52 funciona bien. Pero algunos conjuntos de datos tienen múltiples periodos estacionales: la demanda eléctrica diaria suele mostrar un ciclo semanal (S = 7) y otro anual (S = 365). SARIMA estándar maneja un solo periodo estacional, así que múltiples estacionalidades requieren métodos más avanzados como TBATS o Facebook Prophet.
Cuando S no es evidente, la descomposición de series temporales ayuda. Descomponer la serie en sus componentes de tendencia, estacionalidad y residuo te permite ver visualmente el periodo que más se repite. También puedes inspeccionar los gráficos de autocorrelación para detectar picos en retardos regulares.
ARIMA vs. SARIMA: ¿en qué se diferencian?
Probablemente te estés preguntando: ¿cuándo deberías usar SARIMA en lugar del más simple ARIMA?
La respuesta corta: usa ARIMA cuando tus datos no tienen un patrón estacional relevante y SARIMA cuando sí lo tienen.
ARIMA modela tres cosas: la autocorrelación de la serie (AR), el número de diferencias necesarias para la estacionariedad (I) y la influencia persistente de errores de pronóstico pasados en el valor actual (MA). Maneja bien tendencias, ciclos e irregularidades. Lo que no puede hacer es modelar patrones que se repiten con una frecuencia estacional fija. Eso se cuela como varianza no explicada.
SARIMA añade justo esa capacidad. Cuando en tus datos aparecen picos y valles estacionales claros, ajustar un ARIMA simple obliga a que esos patrones queden en los residuos, con peores pronósticos y residuos que no son ruido blanco. Un SARIMA los captura directamente.
Regla práctica: representa tus datos y busca patrones que se repitan a intervalos fijos. Si los ves, picos de ventas en festivos, aumentos de energía en invierno, patrones de resultados trimestrales, recurre a SARIMA. Si la serie es irregular o guiada por tendencia sin ciclo regular, ARIMA es más simple y suficiente.
Nuestro curso ARIMA Models in Python cubre ambos marcos con ejercicios prácticos para afinar tu intuición sobre cuándo aplicar cada uno.
Cómo construir un modelo SARIMA en Python
Construir un modelo SARIMA sigue una secuencia lógica: recopilar datos, comprobar la estacionariedad, identificar parámetros, ajustar el modelo, hacer diagnóstico y predecir. Así funciona cada paso en la práctica, usando la librería statsmodels de Python.
Recopilación de datos
Para un modelo que capture estacionalidad, necesitas suficiente histórico para observar el patrón al menos dos veces, idealmente varios ciclos. Ventas mensuales del retail, registros de temperatura, consumo energético y conteos de pasajeros son ejemplos clásicos. Fuentes públicas como Federal Reserve Economic Data (FRED), la Oficina del Censo de EE. UU. o Kaggle son buenos puntos de partida.
El conjunto de datos didáctico estándar para este flujo es el de pasajeros de aerolíneas: datos mensuales de 1949 a 1960 con una clara tendencia ascendente y fuerte estacionalidad anual. Está disponible en statsmodels vía get_rdataset(), que lo obtiene de Rdatasets. Aprende el flujo con este dataset antes de aplicarlo a tus propios datos.
Preprocesamiento de datos
Antes de ajustar cualquier modelo SARIMA, necesitas una serie estacionaria, donde la media y la varianza no cambian con el tiempo. La prueba de Dickey-Fuller aumentada (ADF) lo comprueba formalmente: un valor p por debajo de 0,05 sugiere que la serie es estacionaria.
Si no lo es, el diferenciado lo soluciona. Aplica diferenciado regular (d = 1) para la tendencia, diferenciado estacional (D = 1 con retardo S) para la no estacionariedad estacional o ambos si hace falta. Trata los valores faltantes antes de este paso. Relleno hacia adelante o interpolación son enfoques habituales en series temporales, ya que eliminar filas rompe la estructura temporal.
Identificación del modelo
Con una serie estacionaria, utiliza los gráficos de la función de autocorrelación (ACF) y la función de autocorrelación parcial (PACF) para identificar los parámetros. Fíjate en lo siguiente:
- ACF muestra la correlación entre la serie y sus retardos. Un corte brusco tras el retardo q sugiere el orden MA. Los picos en retardos estacionales (12, 24, 36 en datos mensuales) informan sobre Q.
- PACF muestra correlaciones parciales con efectos intermedios eliminados. Un corte brusco tras el retardo p sugiere el orden AR. Los picos estacionales informan sobre P.
En la práctica, los gráficos te dan valores candidatos y comparas varios modelos usando criterios de información (más sobre esto en el diagnóstico). Si prefieres automatizar la búsqueda, auto_arima() del paquete pmdarima realiza una búsqueda en rejilla de combinaciones de parámetros y selecciona el modelo con mejor ajuste.
Estimación de parámetros
Una vez identificados los parámetros candidatos, statsmodels los estima mediante máxima verosimilitud (MLE), encontrando los coeficientes que hacen más probables los datos observados bajo el modelo. Estimar SARIMA es más costoso computacionalmente que un ARIMA simple porque el optimizador debe ajustar a la vez los componentes no estacionales y estacionales.
El proceso de ajuste a veces puede converger a un óptimo local en lugar del global, así que merece la pena probar distintos valores iniciales o combinaciones de parámetros cuando los resultados no cuadran.
Ajuste del modelo
Así ajustas un modelo SARIMA en Python usando el dataset de pasajeros de aerolíneas:
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())
El argumento order recibe (p, d, q) para la parte no estacional; seasonal_order recibe (P, D, Q, S). Establecer enforce_stationarity=False y enforce_invertibility=False da más flexibilidad al optimizador, lo que a menudo ayuda a converger con datos reales.
Estadísticas y diagnóstico del modelo
Tras el ajuste, ejecuta los gráficos de diagnóstico con sarima_result.plot_diagnostics(). Busca cuatro cosas:
- Residuos estandarizados: Deberían parecer ruido blanco sin patrones evidentes.
- Histograma de residuos: Debería aproximarse a la normalidad.
- Gráfico Q-Q normal: Los puntos deberían alinearse con la diagonal.
- Correlograma (ACF de residuos): Sin picos significativos, que indicarían autocorrelación no explicada.
Presta especial atención a los retardos estacionales en el correlograma. Picos en los retardos 12, 24, etc., sugieren que el componente estacional no está del todo capturado. Compara especificaciones alternativas usando AIC (criterio de información de Akaike) y BIC (criterio bayesiano de información): valores más bajos indican mejor ajuste, con BIC penalizando más la complejidad.
Predicción
Con el modelo validado, generar predicciones es sencillo. Divide tus datos en conjuntos de entrenamiento y prueba para evaluar con honestidad la precisión del pronóstico:
# 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()
El método get_forecast() devuelve predicciones puntuales junto con intervalos de confianza que se amplían cuanto más lejos proyectas. Esa ampliación no es un fallo; es el modelo reflejando la incertidumbre. Evalúa la precisión con RMSE (raíz del error cuadrático medio) o MAPE (porcentaje medio de error absoluto) en el conjunto de prueba retenido.
Aplicaciones prácticas de SARIMA
Tantas señales del mundo real son estacionales que SARIMA se gana un lugar fijo en cualquier kit de series temporales. Algunos ejemplos por sectores:
- Retail: Pronosticar ventas mensuales para planificar inventario, especialmente en periodos festivos donde los picos de demanda son previsibles pero su magnitud varía año a año.
- Consumo energético: Predecir la demanda de electricidad y gas, que sigue ciclos estacionales diarios y anuales impulsados por temperatura y patrones de actividad.
- Finanzas: Modelar patrones de resultados trimestrales o volúmenes de negociación que se repiten con los calendarios fiscales.
- Predicción meteorológica: Proyectar temperatura, precipitación y otras variables climáticas que siguen ciclos anuales marcados.
En todos los casos, la estructura repetida es la señal, y SARIMA está hecho para capturarla.
Limitaciones de SARIMA
Saber dónde funciona bien una herramienta es solo la mitad del juego. SARIMA es una base sólida para series temporales estacionales, pero conocer sus límites es lo que separa a quien usa bien los modelos de quien los usa a ciegas.
Maneja exactamente un periodo estacional. Si tus datos tienen múltiples estacionalidades, diarias, semanales y anuales superpuestas, SARIMA no puede modelarlas todas a la vez. Métodos como TBATS, Prophet o redes LSTM manejan con más naturalidad múltiples frecuencias estacionales.
SARIMA también asume linealidad. Modela relaciones lineales entre valores pasados, errores pasados y observaciones futuras. Las dinámicas no lineales, comunes en series financieras o sistemas caóticos, requieren otras herramientas. Y como ARIMA, SARIMA se basa solo en el historial de la propia serie. Si tienes factores externos que afectan al pronóstico, promociones, meteorología, indicadores económicos, mira SARIMAX, que añade variables exógenas al marco SARIMA.
Por último, la selección de parámetros puede ser realmente difícil. Con siete parámetros a ajustar, el espacio de búsqueda es grande y el ajuste puede ser lento en series largas. auto_arima() de pmdarima ayuda a automatizarlo. Pero no hay atajo que sustituya entender qué significa cada parámetro, por eso hemos visto los componentes antes de tocar código.
Conclusión
Siempre he pensado que SARIMA está infravalorado en los cursos introductorios de predicción. Se enseña como "ARIMA, pero con lo estacional", lo que suena a una extensión menor. No lo es. Los parámetros estacionales no están pegados sin más; hacen trabajo estructural real, capturando una capa del comportamiento de tus datos a la que ARIMA simplemente no llega.
Lo que hace que SARIMA encaje en la práctica es entender que los componentes no estacionales y estacionales no son modelos separados en paralelo. Interactúan. Los términos AR y MA trabajan junto a sus equivalentes estacionales, cada uno manejando una escala temporal distinta de autocorrelación. Cuando eso encaja, leer los gráficos ACF y PACF deja de ser buscar patrones y pasa a ser comprender de verdad tus datos.
Si trabajas con datos mensuales, trimestrales o con cualquier ciclo regular, SARIMA es el punto de partida adecuado, no porque siempre sea la respuesta final, sino porque te obliga a pensar con claridad en la estructura de tu serie. A partir de ahí, SARIMAX añade predictores externos y métodos como TBATS o Prophet resuelven los casos más complejos con múltiples estacionalidades. Nuestro Time Series Forecasting Tutorial y el curso ARIMA Models in Python son dos buenos siguientes pasos.
Preguntas frecuentes sobre SARIMA
¿Qué significan las siglas SARIMA?
SARIMA significa Seasonal AutoRegressive Integrated Moving Average. Amplía el modelo ARIMA estándar añadiendo parámetros estacionales — (P, D, Q) y el periodo estacional S — que capturan patrones repetitivos en datos de series temporales, como ciclos mensuales o trimestrales.
¿Cuál es la diferencia entre ARIMA y SARIMA?
ARIMA modela patrones no estacionales: tendencia, autocorrelación y efectos de media móvil. SARIMA añade una segunda capa de parámetros (P, D, Q, S) que modelan esos mismos efectos en retardos estacionales. Si tus datos muestran patrones que se repiten a intervalos fijos — como mayores ventas cada diciembre — SARIMA los captura directamente, mientras que ARIMA los deja como varianza residual no explicada.
¿Cómo elijo los parámetros adecuados de SARIMA?
Empieza comprobando si tu serie es estacionaria con la prueba de Dickey-Fuller aumentada. Después, inspecciona los gráficos ACF y PACF: los órdenes AR (p) y MA (q) no estacionales se deducen de los cortes en retardos no estacionales, mientras que los órdenes estacionales P y Q se observan en los picos a retardos estacionales. También puedes usar auto_arima() del paquete pmdarima para buscar automáticamente combinaciones de parámetros, seleccionando el mejor modelo con AIC o BIC.
¿Cómo determino el periodo estacional S para mi modelo SARIMA?
El periodo estacional S refleja cada cuánto se repite el patrón. Para datos mensuales con estacionalidad anual, S = 12. Para datos trimestrales, S = 4. Para datos semanales, S = 52 (o 52,18 redondeado). Si el periodo no es obvio, usa la descomposición de series temporales o inspecciona el ACF en busca de picos espaciados regularmente — esos picos revelan la frecuencia estacional dominante.
¿Puede SARIMA manejar múltiples periodos estacionales?
SARIMA estándar maneja un periodo estacional cada vez. Si tus datos tienen estacionalidades superpuestas — como la demanda eléctrica diaria con ciclos semanales y anuales — necesitarás alternativas como TBATS, Facebook Prophet o redes LSTM, diseñadas para modelar estructuras estacionales múltiples de forma simultánea.
¿Qué librería de Python es mejor para ajustar modelos SARIMA?
La librería statsmodels de Python es la opción estándar y ofrece SARIMAX() (lo bastante flexible como para ajustar modelos SARIMA sin variables exógenas). Para la selección automática de parámetros, la función auto_arima() de la librería pmdarima realiza una búsqueda en rejilla y merece la pena incorporarla a tu flujo cuando no tienes claro por dónde empezar con los valores.
¿Cómo evalúo si mi modelo SARIMA se ajusta bien?
Tras el ajuste, ejecuta plot_diagnostics() sobre el objeto de resultados y comprueba que los residuos se parezcan a ruido blanco sin estructura — en particular sin picos en retardos estacionales en el ACF. Compara especificaciones alternativas con AIC o BIC (más bajo es mejor). Para la precisión de predicción en datos retenidos, RMSE y MAPE son las métricas más comunes.
¿Qué es SARIMAX y cuándo debería usarlo en lugar de SARIMA?
SARIMAX añade variables exógenas — predictores externos — al marco SARIMA. Úsalo cuando tengas factores medibles que influyen en tu serie más allá de su propio historial: inversión en promociones que afecte a ventas retail, temperatura que afecte a la demanda energética o indicadores macroeconómicos que afecten a los ingresos trimestrales. Si solo cuentas con la serie en sí, SARIMA es suficiente; cuando tengas impulsores externos relevantes, SARIMAX te permite incorporarlos directamente.
