Подбор p, d, q и SARIMA

Учимся выбирать порядки модели по графикам и критериям и расширять ARIMA до сезонной SARIMA.

SARIMA(p,d,q)(P,D,Q)m — это ARIMA с дополнительным сезонным блоком: те же идеи AR/I/MA, но на лагах кратных периоду m.

Зачем системно подбирать порядки

Параметры p, d, q нельзя угадать; их подбирают по данным. Слишком маленькие — модель недоучится и пропустит зависимости. Слишком большие — переобучится и будет ловить шум. Грамотный подбор балансирует точность на истории и простоту модели.

Цена ошибки тут вполне денежная. Недоученная модель прогноза спроса не заметит инерцию продаж и будет систематически промахиваться — склад то переполнен, то пуст. Переобученная модель идеально повторит исторический ряд, включая случайные всплески, которые никогда не повторятся, и развалится на первой же новой неделе. Поэтому подбор p, d, q — это не поиск модели с минимальной ошибкой на истории, а поиск модели, которая обобщается на будущее. Бокс и Дженкинс, придумавшие ARIMA, предложили дисциплинированную процедуру из трёх шагов: сначала привести ряд к стационарности (выбрать d), затем по графикам автокорреляции прочитать p и q, затем сравнить кандидатов по критерию, штрафующему сложность. Ниже мы пройдём ровно эти три шага.

Шаг 1: определить d

d — это число дифференцирований до стационарности. Проверяют ADF-тестом: дифференцируют, пока p-value не станет малым. Обычно d равно 0, 1 или 2; больше почти не встречается.

Важно не передифференцировать. Лишнее дифференцирование не делает ряд «ещё стационарнее» — оно вносит искусственную отрицательную автокорреляцию и раздувает дисперсию, ухудшая модель. Признак передифференцирования виден на графике ACF: после нужного d она быстро гаснет, а вот резкий отрицательный выброс на первом лаге у уже стационарного ряда сигналит, что одну разность стоит убрать. Практическое правило: берите минимальное d, при котором ADF-тест уже отвергает гипотезу о нестационарности, и не больше. Для большинства бизнес-рядов это d=1; d=2 нужно лишь там, где ускоряется сам темп роста.

Шаг 2: p и q по ACF/PACF

На уже стационарном (продифференцированном) ряде смотрят графики: обрыв PACF после лага p подсказывает порядок AR, обрыв ACF после лага q — порядок MA. Это связывает раздел про автокорреляцию с подбором ARIMA.

Почему именно так распределены роли между двумя графиками? PACF показывает «чистую» связь точки с лагом, очищенную от влияния промежуточных лагов, — и для AR-процесса она резко обрывается ровно на порядке p, потому что глубже прямой связи нет. ACF же для AR гаснет плавным хвостом, а вот для MA-процесса, наоборот, обрывается на порядке q. Отсюда зеркальное правило: ищете AR — смотрите, где обрывается PACF; ищете MA — где обрывается ACF. На реальных шумных данных обрывы редко идеально чёткие, поэтому эти графики дают не точный ответ, а короткий список кандидатов (например, «p около 1–2, q около 0–1»), которые дальше сравнивают численно.

НаблюдениеПараметр
PACF обрывается на лаге pAR-порядок = p
ACF обрывается на лаге qMA-порядок = q
ADF стал значим после d разностейI-порядок = d

Шаг 3: сравнить по AIC

Несколько кандидатов сравнивают по информационному критерию AIC: он штрафует за число параметров, поэтому выбирает модель, которая хорошо описывает данные, но не раздута. Меньший AIC — лучше. Сравним два кандидата по упрощённой формуле AIC = n·ln(SSE/n) + 2k.

Разберём формулу по слагаемым. Первая часть, n·ln(SSE/n), вознаграждает точность: чем меньше суммарная ошибка SSE, тем меньше слагаемое. Вторая часть, 2k, — это штраф ровно за число параметров k. В этом весь смысл AIC: добавить параметр стоит «налога» в 2 единицы, и если новый параметр снижает ошибку слабее, чем на этот налог, критерий его отвергает. Так формула формализует здравый смысл «не усложняй без нужды» в одно сравнимое число.

import math

def aic(sse, n, k):
    return round(n * math.log(sse / n) + 2 * k, 2)

# два кандидата: модель A проще, B сложнее но точнее
print("ARIMA(1,1,0): AIC =", aic(sse=50.0, n=40, k=2))
print("ARIMA(2,1,2): AIC =", aic(sse=44.0, n=40, k=5))

Вывод:

ARIMA(1,1,0): AIC = 12.93
ARIMA(2,1,2): AIC = 13.81

Хотя сложная модель чуть точнее (SSE 44 против 50), её AIC выше (13.81 против 12.93): три лишних параметра не окупились. AIC выбирает экономную ARIMA(1,1,0). Так критерий защищает от переобучения.

Стоит подчеркнуть: абсолютное значение AIC само по себе ничего не означает — оно зависит от шкалы данных и числа точек. Осмысленна только разница между моделями на одном и том же ряде. Поэтому AIC всегда используют для сравнения кандидатов, а не как «оценку качества» в вакууме. Рядом с ним часто приводят BIC — родственный критерий с более жёстким штрафом (ln(n) вместо 2 на параметр), который на длинных рядах ещё сильнее тянет к простым моделям. Если AIC и BIC указывают на одного и того же кандидата — выбор уверенный; если расходятся, AIC склонен к чуть более богатой модели, BIC — к более скупой, и решает уже здравый смысл и проверка остатков.

SARIMA: сезонный блок

Когда в ряде есть сезонность (продажи каждый декабрь, трафик каждое воскресенье), к ARIMA добавляют сезонные порядки (P, D, Q) на лагах, кратных периоду m. Например, SARIMA(1,1,1)(1,1,1)12 для месячного ряда с годовым циклом. Сезонное дифференцирование D убирает повторяющийся паттерн, а сезонные AR/MA ловят зависимость «год к году».

Ключевая идея: обычные порядки (p,d,q) работают на соседних лагах (вчера, позавчера), а сезонные (P,D,Q) — на лагах, отстоящих на целый период. Сезонное дифференцирование с D=1 для месячных данных вычитает значение год назад: декабрь сравнивается с прошлым декабрём, а не с ноябрём. Это снимает годовой узор так же, как обычное дифференцирование снимает тренд. Сезонные AR и MA затем ловят остаточную связь между одноимёнными месяцами разных лет — например, что сильный декабрь обычно следует за сильным прошлым декабрём. Период m задаёт масштаб: 12 для месячных данных с годовым циклом, 7 для дневных с недельным, 24 для часовых с суточным. Указать m правильно критично — ошибка в периоде сводит весь сезонный блок на нет.

Как работает под капотом

На практике порядки часто подбирают автоматически: auto_arima перебирает сетку (p,d,q)(P,D,Q) и выбирает минимум AIC, отбраковывая неустойчивые модели. Это удобно, но не отменяет понимания: автоподбор может выбрать переусложнённую модель на шумных данных, и проверка остатков (их ACF должна быть «пустой») остаётся обязательной.

Стоит понимать, что именно делает автоподбор, чтобы доверять ему с оглядкой. Перебор сетки из семи порядков (p,d,q,P,D,Q,m) — это потенциально сотни моделей, и чтобы не считать их все, auto_arima применяет умный пошаговый поиск: стартует с разумной модели и двигается по сетке туда, где AIC падает, как при спуске с горы. Это быстро, но может застрять в локальном минимуме и пропустить лучшую модель чуть в стороне. Кроме того, инструмент сам определяет d и D статистическими тестами, и здесь он иногда ошибается на зашумлённых или коротких рядах. Поэтому финальное слово всегда за диагностикой остатков: если в их ACF остались значимые лаги, значит модель что-то не уловила, какой бы низкий AIC ни показал автоподбор. Хороший остаток должен выглядеть как белый шум — без структуры, которую ещё можно было бы смоделировать.

Частые ошибки

  • Подбирать p и q на нестационарном ряде — сначала определите d.
  • Гнаться за минимальной ошибкой на истории без штрафа за сложность (отсюда AIC).
  • Игнорировать сезонность и пытаться поймать её большим p вместо сезонного блока SARIMA.
  • Сравнивать AIC моделей с разным d — после дифференцирования меняется сам ряд и его SSE, поэтому такие AIC несопоставимы.

Последний пункт ловит даже опытных. AIC корректно сравнивает только модели, обученные на одном и том же ряде. Как только вы меняете d, вы фактически меняете данные (ряд приращений вместо уровней), и числа AIC становятся из разных миров. Поэтому d фиксируют отдельным шагом (тестами на стационарность), а уже при выбранном d перебирают и сравнивают по AIC только p, q и сезонные порядки. Нарушение этого правила — типичная причина, по которой автоподбор без присмотра выдаёт странную модель.

Итоги

  • Сначала определяют d (по ADF), затем p и q (по PACF/ACF), затем сравнивают по AIC.
  • AIC штрафует сложность и защищает от переобучения; меньше — лучше.
  • SARIMA добавляет сезонные (P,D,Q)m для рядов с периодическим циклом.
  • Финальная проверка — диагностика остатков: их ACF должна быть пустой, иначе модель что-то упустила.
Проверьте себя
1. Зачем при выборе ARIMA сравнивать кандидатов по AIC, а не только по ошибке на истории?
AAIC считается быстрее
BAIC штрафует за число параметров и защищает от переобучения
CAIC не зависит от данных
DОшибку нельзя посчитать
2. Что добавляет SARIMA к обычной ARIMA?
AЛогарифмирование
BСезонные порядки (P,D,Q) на лагах, кратных периоду m
CПроверку пропусков
DИнтервалы прогноза