Что такое стационарность и зачем она нужна

Разбираемся, почему модели любят ряды, чьи свойства не меняются во времени, и как это распознать.

Стационарный ряд — это ряд, у которого среднее, дисперсия и структура зависимостей не меняются со временем: статистически «вчера» неотличимо от «сегодня».

Зачем моделям стационарность

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

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

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

Как выглядит нестационарность

Тренд делает среднее зависящим от времени. Растущая амплитуда делает дисперсию зависящей от времени. Сезонность делает среднее периодически колеблющимся. Любая из этих черт — нарушение стационарности.

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

stationary = [10, 9, 11, 10, 12, 9, 10, 11, 9, 10]   # без тренда
trending   = [10, 13, 17, 22, 28, 35, 43, 52, 62, 73] # с трендом

def half_means(x):
    h = len(x)//2
    return round(sum(x[:h])/h, 1), round(sum(x[h:])/h, 1)

print("Стационарный: средние половин", half_means(stationary))
print("С трендом:    средние половин", half_means(trending))

Вывод:

Стационарный: средние половин (10.4, 9.8)
С трендом:    средние половин (18.0, 53.0)

У стационарного ряда среднее первой и второй половин почти совпадает (10.4 против 9.8). У ряда с трендом оно скачет с 18 до 53 — явный признак нестационарности. Сравнение статистик по кускам ряда — простейшая ручная проверка.

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

Слабая стационарность

На практике требуют не полной, а слабой стационарности: постоянны среднее, дисперсия и автоковариация (зависящая только от лага, а не от момента времени). Этого достаточно для большинства моделей.

Различие тонкое, но важное. Строгая стационарность требует, чтобы вообще всё совместное распределение любых наблюдений не менялось при сдвиге во времени — условие почти недостижимое и непроверяемое на практике. Слабая же стационарность говорит лишь о первых двух моментах: уровень держится, разброс держится, а сила связи между точками зависит только от того, насколько они далеки друг от друга по времени, а не от того, в каком месте ряда мы находимся. Именно на эту, ослабленную, версию опираются AR, MA и ARIMA, поэтому в анализе временных рядов под словом «стационарный» почти всегда подразумевают слабую стационарность.

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

Стационарность позволяет оценивать параметры по всему ряду как по одной «генеральной совокупности»: раз свойства постоянны, любая часть ряда репрезентативна. Если же среднее ползёт, оценка по всему ряду усредняет несравнимые куски и теряет смысл. Поэтому привести ряд к стационарному — значит сделать его пригодным для статистической оценки.

Глубже причина в том, что у нас есть лишь одна реализация процесса — единственная история, прожитая один раз. Мы не можем «перезапустить» прошлый год тысячу раз и усреднить результаты по реализациям. Вместо этого мы вынуждены усреднять по времени — вдоль того единственного ряда, что наблюдали. Подмена усреднения по ансамблю усреднением по времени законна только тогда, когда процесс стационарен (и обладает свойством, которое называют эргодичностью). Стационарность — это и есть пропуск, разрешающий учиться на одной траектории так, будто мы видели множество.

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

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

  • Подавать в ARIMA ряд с явным трендом без дифференцирования — оценки будут смещены.
  • Считать ряд стационарным «на глаз» по короткому отрезку.
  • Забывать про сезонность: ряд может быть без тренда, но всё равно нестационарным из-за периодики.
  • Путать стабильный уровень со стабильным разбросом: ряд может держать среднее, но раздувать дисперсию — это тоже нестационарность.
  • Проверять только начало ряда и не смотреть, не меняется ли поведение ближе к концу истории.

Итоги

  • Стационарный ряд имеет постоянные во времени среднее, дисперсию и структуру зависимостей.
  • Тренд, растущая амплитуда и сезонность нарушают стационарность.
  • Классические модели требуют (слабой) стационарности для корректной оценки параметров.
  • На практике достаточно слабой стационарности — постоянства первых двух моментов и автоковариации.
  • Грубую диагностику дают сравнение статистик по половинам ряда и скользящее окно.
Проверьте себя
1. Что характеризует стационарный временной ряд?
AПостоянно растущее среднее
BПостоянные во времени среднее, дисперсию и структуру зависимостей
CОтсутствие любых колебаний
DНаличие сильного тренда
2. Почему классические модели (ARIMA) требуют стационарности?
AТак быстрее считается
BЧтобы прошлое было статистически похоже на будущее и оценки параметров были корректны
CЭто требование Python
DЧтобы убрать пропуски