Перейти к основному контенту

Модели SARIMA: полное руководство по сезонному прогнозированию временных рядов

Узнайте, как SARIMA расширяет ARIMA для учёта сезонности, разберитесь в её семи параметрах и постройте рабочую модель на Python — от сбора данных до прогноза.
Обновлено 31 июл. 2026 г.  · 15 мин читать

Изучить с помощью AI

Открыть в ChatGPTОткрыть в ClaudeОткрыть в Perplexity

Каждый декабрь ритейлеры пополняют складские запасы к праздникам. Каждое лето электросети готовятся к пиковым нагрузкам из‑за кондиционеров. Эти паттерны повторяются из года в год, и если вы строите прогноз временного ряда, игнорируя их, вы теряете точность.

Сезонные модели авторегрессии, интегрирования и скользящего среднего (коротко SARIMA) расширяют широко используемую архитектуру ARIMA, чтобы улавливать повторяющиеся сезонные паттерны наряду с обычными трендами. В этой статье вы узнаете, что такое SARIMA, как работают её компоненты, когда выбирать её вместо ARIMA и как пошагово построить модель на Python.

Что такое SARIMA?

SARIMA — это модель прогнозирования временных рядов, которая обрабатывает как несезонные, так и сезонные паттерны в данных. Она напрямую опирается на ARIMA, так что если вы уже работали с ARIMA, большинство механизмов покажутся знакомыми. Ключевое отличие в том, что SARIMA добавляет второй слой параметров, специально предназначенных для моделирования поведения, повторяющегося через фиксированные интервалы, например месячные, квартальные или недельные циклы.

Формально модель записывается как SARIMA(p, d, q)(P, D, Q)[S]. Первый набор параметров (p, d, q) отвечает за несезонную структуру, аналогично стандартной ARIMA. Второй набор (P, D, Q)[S] учитывает сезонные паттерны, где S — длина сезонного цикла. Для месячных данных с годовой сезонностью S = 12. Для квартальных данных S = 4.

Ключевые компоненты SARIMA

Семь параметров SARIMA поначалу могут показаться избыточными. Удобно мыслить о них как о двух группах: привычная тройка ARIMA (p, d, q) и их сезонные аналоги (P, D, Q, S), которые зеркально отражают первые на сезонном масштабе. Каждый сезонный параметр делает ровно то же, что и его несезонный «близнец», только применяется через сезонные лаги, а не соседние шаги по времени.

Авторегрессионная часть (AR)

Компонент AR использует прошлые значения ряда для прогнозирования будущих. Параметр p задаёт, сколько запаздывающих значений включать. Если p = 2, модель использует два предыдущих шага времени как предикторы текущего значения.

В сезонной части параметр P делает то же самое, но на сезонных лагах. Если P = 1 и S = 12, модель смотрит на значение 12 периодов назад — тот же месяц прошлого года — как на предиктор. Это напрямую улавливает год‑к‑году паттерны.

Интегрирующая часть (I)

Параметр d определяет, сколько раз ряд нужно продифференцировать, чтобы убрать тренд и сделать его стационарным. Дифференцирование означает вычитание предыдущего наблюдения из текущего, что устраняет линейный тренд. Если d = 1 — берутся первые разности; если d = 2 — дифференцируется уже продифференцированный ряд.

Сезонное дифференцирование работает так же, но на сезонных лагах. Параметр D задаёт, сколько сезонных разностей применить. При D = 1 и S = 12 из каждого наблюдения вычитается значение 12 периодов назад. Совместное использование d = 1 и D = 1 — обычная практика, когда у ряда есть и общий восходящий тренд, и повторяющийся сезонный паттерн.

Часть скользящего среднего (MA)

В отличие от компонента AR, который смотрит на прошлые значения, компонент MA моделирует связь между текущим наблюдением и остаточными ошибками прошлых прогнозов. Параметр q задаёт, сколько запаздывающих ошибок включать. Если q = 1, модель использует ошибку прогноза предыдущего шага, чтобы скорректировать текущий прогноз.

Сезонный аналог Q применяет ту же логику на сезонных лагах. При Q = 1 и S = 12 модель учитывает ошибку прогноза 12 периодов назад. Это важно, когда сезонные шоки, например необычно жаркое лето, повышающее спрос на энергию, склонны повторяться в том же периоде следующего года.

Сезонный компонент (S)

Параметр S определяет длину сезонного цикла и связывает три сезонных параметра (P, D, Q) воедино. Верно определить S важно: если ваши данные месячные с годовым паттерном, S = 12. Недельные данные с годовым циклом дают S примерно 52.

Здесь сезонность иногда становится хитрой. Год — это не ровно 52 недели, а ближе к 52,18. Для большинства практических задач округления до S = 52 достаточно. Но у некоторых наборов данных есть несколько сезонных периодов: суточное потребление электроэнергии часто показывает как недельный цикл (S = 7), так и годовой (S = 365). Стандартная SARIMA обрабатывает один сезонный период, поэтому множественные сезонности требуют более продвинутых методов, таких как TBATS или Facebook Prophet.

Когда S неочевиден, помогает декомпозиция временного ряда. Разложение ряда на тренд, сезонную и остаточную компоненты визуально выявляет доминирующий повторяющийся период. Также можно изучить графики автокорреляции и искать пики через регулярные лаги.

ARIMA vs. SARIMA: в чём разница?

Наверное, вы уже думаете: когда на самом деле использовать SARIMA вместо более простой ARIMA?

Короткий ответ: используйте ARIMA, когда в данных нет существенной сезонности, и SARIMA — когда она есть.

ARIMA моделирует три вещи: автокорреляцию в самом ряду (AR), количество дифференцирований, необходимых для стационарности (I), и сохраняющееся влияние прошлых ошибок прогноза на текущее значение (MA). Она хорошо обрабатывает тренды, циклы и нерегулярный шум. Чего она не умеет — так это моделировать паттерны, повторяющиеся с фиксированной сезонной частотой. Они проходят как необъяснённая дисперсия.

SARIMA добавляет именно эту возможность. Когда в ваших данных явно видны сезонные пики и провалы, подгонка простой ARIMA загоняет эти паттерны в остатки, что ведёт к худшим прогнозам и остаткам, не похожим на белый шум. SARIMA улавливает их напрямую.

Практическое правило: постройте график данных и посмотрите, повторяются ли паттерны через фиксированные интервалы. Если видите их — предновогодние всплески продаж, зимние подъёмы энергопотребления, квартальные особенности отчётности — берите SARIMA. Если ряд нерегулярный или движим трендом без регулярного цикла, ARIMA проще и достаточна.

Наш курс ARIMA Models in Python охватывает обе методики с практическими упражнениями, чтобы вы прочувствовали, когда какую применять.

Как построить модель SARIMA на Python

Построение SARIMA следует логике: собрать данные, проверить стационарность, определить параметры, обучить модель, провести диагностику и спрогнозировать. Вот как каждый шаг работает на практике с библиотекой statsmodels в Python.

Сбор данных

Чтобы уловить сезонность, нужен достаточный исторический горизонт — как минимум два, а лучше несколько циклов. Классические примеры: ежемесячные розничные продажи, температурные ряды, показатели энергопотребления, пассажиропотоки. Хорошие открытые источники: Federal Reserve Economic Data (FRED), Бюро переписи США, Kaggle.

Стандартный учебный набор для этого процесса — количество авиапассажиров: месячные данные с 1949 по 1960 годы с явным восходящим трендом и сильной годовой сезонностью. Он доступен в statsmodels через get_rdataset(), который загружает его из коллекции Rdatasets. Освойте рабочий процесс на этом наборе, а затем применяйте к своим данным.

Предобработка данных

Перед подгонкой любой модели SARIMA нужен стационарный ряд — чтобы среднее и дисперсия не менялись со временем. Тест расширенного Дики–Фуллера (ADF) проверяет это формально: p‑значение ниже 0,05 говорит о стационарности.

Если ряд нестационарен, помогает дифференцирование. Применяйте обычное дифференцирование (d = 1) для тренда, сезонное (D = 1 с лагом S) — для сезонной нестационарности, или оба при необходимости. Пропуски обработайте заранее. Для временных рядов типичны прямое заполнение вперёд или интерполяция, поскольку удаление строк нарушает временную структуру.

Идентификация модели

Имея стационарный ряд, используйте графики автокорреляционной функции (ACF) и частной автокорреляции (PACF), чтобы определить параметры модели. Обращайте внимание на следующее:

  • ACF показывает корреляцию ряда с его лагами. Резкий обрыв после лага q подсказывает порядок MA. Пики на сезонных лагах (12, 24, 36 для месячных данных) информируют о Q.
  • PACF показывает частные корреляции с устранением промежуточных влияний лагов. Резкий обрыв после лага p подсказывает порядок AR. Сезонные пики информируют о P.

На практике графики дают кандидаты значений, а вы сравниваете несколько моделей по информационным критериям (об этом в диагностике). Если хотите автоматизировать поиск, auto_arima() из пакета pmdarima выполняет перебор комбинаций параметров и выбирает наилучшую модель.

Оценивание параметров

Когда вы выбрали кандидаты параметров, statsmodels оценивает их методом максимального правдоподобия (MLE), подбирая коэффициенты, при которых наблюдаемые данные наиболее вероятны при данной модели. Оценивание SARIMA вычислительно тяжелее, чем обычной ARIMA, поскольку оптимизатор одновременно подгоняет и несезонные, и сезонные компоненты.

Иногда процесс подгонки сходится к локальному, а не глобальному оптимуму, поэтому имеет смысл попробовать другие начальные значения или комбинации параметров, если результаты выглядят странно.

Подгонка модели

Вот как обучить модель SARIMA в Python на наборе авиапассажиров:

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())	

Аргумент order принимает (p, d, q) для несезонной части; seasonal_order — (P, D, Q, S). Установка enforce_stationarity=False и enforce_invertibility=False даёт оптимизатору больше свободы, что часто помогает сходимости на реальных данных.

Статистика и диагностика модели

После подгонки запустите встроенные диагностические графики с помощью sarima_result.plot_diagnostics(). Ищите четыре вещи:

  • Стандартизованные остатки: должны выглядеть как белый шум без явных паттернов.
  • Гистограмма остатков: должна быть примерно нормальной.
  • Нормальный Q–Q график: точки должны располагаться близко к диагонали.
  • Коррелограмма (ACF остатков): отсутствуют значимые пики, указывающие на необъяснённую автокорреляцию.

Особо обратите внимание на сезонные лаги в коррелограмме. Пики на лагах 12, 24 и далее подсказывают, что сезонный компонент учтён не полностью. Сравнивайте альтернативные спецификации по AIC (критерий Акаике) и BIC (байесовский информационный критерий): чем ниже, тем лучше, причём BIC сильнее штрафует сложность.

Прогнозирование

Имея валидированную модель, генерировать прогнозы просто. Разделите данные на обучающую и тестовую выборки, чтобы честно оценить точность прогноза:

# 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()

Метод get_forecast() возвращает точечные прогнозы вместе с доверительными интервалами, которые расширяются по мере увеличения горизонта. Это не недостаток — модель честно отражает неопределённость. Оценивайте точность по RMSE (корень из средней квадратичной ошибки) или MAPE (средняя абсолютная процентная ошибка) на отложенной выборке.

Практические применения SARIMA

Столько реальных сигналов сезонны, что SARIMA по праву занимает постоянное место в любом наборе инструментов для временных рядов. Несколько примеров по отраслям:

  • Ритейл: прогнозирование ежемесячных объёмов продаж для планирования запасов, особенно в праздничные периоды, где всплески спроса предсказуемы, но меняются по величине из года в год.
  • Энергопотребление: прогнозирование спроса на электроэнергию и газ, который следует как суточным, так и годовым сезонным циклам, обусловленным температурой и образами деятельности.
  • Финансы: моделирование квартальной отчётности или паттернов объёма торгов, повторяющихся в соответствии с фискальными календарями.
  • Прогноз погоды: проецирование температуры, осадков и других климатических величин с ярко выраженными годовыми циклами.

Во всех этих случаях повторяющаяся структура — это сигнал, и SARIMA как раз его улавливает.

Ограничения SARIMA

Знать, где инструмент работает хорошо, — лишь половина дела. SARIMA — надёжная базовая модель для сезонных рядов, но понимание её ограничений отличает тех, кто применяет модели осознанно, от тех, кто делает это вслепую.

Она обрабатывает ровно один сезонный период. Если в данных несколько сезонностей — суточные, недельные и годовые паттерны, наложенные друг на друга, SARIMA не сможет смоделировать их все одновременно. Такие методы, как TBATS, Prophet или сети LSTM, естественнее работают с несколькими сезонными частотами.

SARIMA также предполагает линейность. Она моделирует линейные связи между прошлыми значениями, прошлыми ошибками и будущими наблюдениями. Нелинейная динамика, типичная для финансовых рядов или хаотических систем, требует других инструментов. И, как ARIMA, SARIMA опирается только на историю самого ряда. Если на прогноз влияют внешние факторы — промоакции, погодные события, экономические индикаторы — рассмотрите SARIMAX, который добавляет экзогенные переменные к SARIMA.

Наконец, выбор параметров может быть по‑настоящему сложным. Семь настраиваемых параметров образуют большую область поиска, а подгонка может быть медленной на длинных рядах. auto_arima() из pmdarima помогает автоматизировать это. Но обойтись без понимания смысла параметров нельзя — поэтому мы разобрали компоненты прежде, чем переходить к коду.

Заключение

Мне всегда казалось, что в вводных курсах по прогнозированию SARIMA недооценивают. Её преподносят как «ARIMA, но с сезонностью», что звучит как незначительное расширение. Это не так. Сезонные параметры — не довесок; они выполняют реальную структурную работу, фиксируя слой поведения ваших данных, до которого ARIMA просто не дотягивается.

Понимание SARIMA на практике приходит, когда осознаёшь, что несезонные и сезонные компоненты — не две параллельные модели. Они взаимодействуют. Термы AR и MA работают вместе со своими сезонными «двойниками», каждый отвечает за свой масштаб автокорреляции. Как только это проясняется, чтение графиков ACF и PACF перестаёт быть угадыванием паттернов и становится настоящим пониманием ваших данных.

Если вы работаете с месячными, квартальными или любыми регулярно циклическими данными, SARIMA — правильная отправная точка. Не потому, что это всегда финальное решение, а потому, что она заставляет ясно мыслить о структуре ряда. Дальше SARIMAX добавляет внешние предикторы, а методы вроде TBATS или Prophet берут на себя более «грязные» случаи с многосезонностью. Наши руководство по прогнозированию временных рядов и курс ARIMA Models in Python — хорошие следующие шаги.

Вопросы и ответы по SARIMA

Что означает аббревиатура SARIMA?

SARIMA расшифровывается как Seasonal AutoRegressive Integrated Moving Average — сезонная авторегрессионная модель со скользящим средним и интегрированием. Она расширяет стандартную ARIMA, добавляя сезонные параметры — (P, D, Q) и сезонный период S — которые улавливают повторяющиеся паттерны во временных рядах, например месячные или квартальные циклы.

В чём разница между ARIMA и SARIMA?

ARIMA моделирует несезонные паттерны: тренд, автокорреляцию и эффекты скользящего среднего. SARIMA добавляет второй слой параметров (P, D, Q, S), которые моделируют те же эффекты на сезонных лагах. Если в данных есть повторяющиеся паттерны через фиксированные интервалы — например более высокие продажи каждый декабрь — SARIMA улавливает их напрямую, тогда как ARIMA оставляет их как необъяснённую остаточную дисперсию.

Как выбрать правильные параметры SARIMA?

Начните с проверки стационарности ряда с помощью теста расширенного Дики–Фуллера. Затем изучите графики ACF и PACF: порядки несезонных AR (p) и MA (q) следуют из характера «обрыва» на несезонных лагах, а сезонные порядки P и Q — из пиков на сезонных лагах. Можно также использовать auto_arima() из пакета pmdarima для автоматического поиска комбинаций параметров с выбором лучшей модели по AIC или BIC.

Как определить сезонный период S для модели SARIMA?

Сезонный период S отражает частоту повторения паттерна. Для месячных данных с годовой сезонностью S = 12. Для квартальных — S = 4. Для недельных — S = 52 (или округлённое 52,18). Если период неочевиден, выполните декомпозицию временного ряда или изучите график ACF на предмет регулярно повторяющихся пиков — они и указывают доминирующую сезонную частоту.

Может ли SARIMA обрабатывать несколько сезонных периодов?

Стандартная SARIMA обрабатывает один сезонный период. Если в данных несколько наложенных сезонностей — например, суточное энергопотребление с недельными и годовыми циклами — потребуются альтернативы: TBATS, Facebook Prophet или сети LSTM, которые спроектированы для одновременного моделирования нескольких перекрывающихся сезонных структур.

Какая библиотека Python лучше подходит для подгонки моделей SARIMA?

Стандартный выбор в Python — библиотека statsmodels, предлагающая SARIMAX() (достаточно гибкую, чтобы подгонять и SARIMA без экзогенных переменных). Для автоматического подбора параметров используйте auto_arima() из библиотеки pmdarima, которая выполняет перебор и стоит того, чтобы включить её в рабочий процесс, когда вы не уверены с чего начать.

Как оценить, насколько хорошо подходит моя модель SARIMA?

После подгонки вызовите plot_diagnostics() у объекта результата и проверьте, что остатки похожи на белый шум без структуры — особенно без пиков на сезонных лагах в ACF. Сравнивайте конкурирующие спецификации по AIC или BIC (ниже — лучше). Для точности прогноза на отложенных данных чаще всего используют RMSE и MAPE.

Что такое SARIMAX и когда стоит использовать его вместо SARIMA?

SARIMAX добавляет к SARIMA экзогенные переменные — внешние предикторы. Используйте его, когда есть измеримые факторы, влияющие на ряд помимо собственной истории: рекламные расходы — на розничные продажи, температура — на энергопотребление, макроэкономические индикаторы — на квартальную выручку. Если у вас есть только сам ряд, достаточно SARIMA; когда появляются релевантные внешние драйверы, SARIMAX позволяет включить их напрямую.

Темы