Вы каждый день прогнозируете. Берёте зонтик — значит, предсказали дождь. Заказываете больше товара перед праздниками — предсказали спрос. Прогнозирование временных рядов — это то же самое, только с данными и математикой.
Что такое временной ряд?
Временной ряд — это любые данные, собранные последовательно во времени. Температура воздуха каждый день. Количество заказов каждый час. Курс валюты каждую минуту.
Главная особенность: порядок имеет значение. Среда всегда идёт после вторника. Нельзя перемешать данные и сохранить смысл.
📦 E-commerce: количество заказов → нужно предсказать пик перед 8 марта
📈 Финансы: выручка по дням → нужно спланировать бюджет на квартал
🌐 IT: нагрузка на серверы → нужно автоматически масштабироваться
🛒 Ритейл: продажи молока → нужно рассчитать закупки, чтобы не было излишков
У временных рядов есть несколько ключевых компонентов, которые важно понимать перед тем, как выбирать метод прогнозирования:
Тренд — долгосрочное направление: выручка растёт год к году. Сезонность — повторяющиеся паттерны: каждый декабрь продажи выше. Шум — случайные колебания, которые невозможно объяснить.
Хороший метод прогнозирования должен уловить тренд и сезонность, и не пытаться объяснить шум — это путь к переобучению.
Не смейтесь над «наивными» методами. Во-первых, они часто работают лучше, чем кажется. Во-вторых, любой сложный метод нужно сравнивать именно с ними — если нейросеть не бьёт наивный прогноз, что-то пошло не так.
Наивный прогноз (Naive Forecast)
Идея: завтра будет то же самое, что сегодня. Звучит глупо, но для многих задач это очень сложно побить.
// Прогноз на следующий период = последнее наблюдение
Вчера продали 342 пиццы. Наивный прогноз на сегодня: 342 пиццы.
Прошлый понедельник продали 412 пицц. Сезонный наивный прогноз на следующий понедельник: 412.
Сезонный вариант (Seasonal Naive) намного умнее — он берёт не вчера, а аналогичный период прошлого года/недели.
- Мгновенно реализуется
- Не требует данных для обучения
- Отличный baseline для сравнения
- Хорошо работает на стабильных рядах
- Не учитывает тренд
- Плохо справляется с резкими изменениями
- Один выброс ломает весь прогноз
Как спросить у вчерашнего себя: «Что будет завтра?» — «Ну, наверное, примерно как сегодня.»
Прогноз по среднему (Mean Forecast)
Идея: завтра будет средним от всего прошлого. Логика простая — если усреднить все исторические данные, случайные выбросы нивелируются.
// Среднее арифметическое всех прошлых значений
За последние 7 дней: 1200, 980, 1150, 1100, 900, 1300, 1050 посетителей.
Прогноз = (1200+980+1150+1100+900+1300+1050) / 7 = 1097 посетителей.
Проблема: если на 8-й день произошло что-то важное и посещаемость выросла до 5000 — наш прогноз на 9-й день всё равно будет около 1000, а не 5000.
- Устойчив к выбросам
- Хорош для стационарных рядов без тренда
- Не улавливает тренд и сезонность
- Медленно адаптируется к изменениям
- Чем больше истории, тем «тупее» прогноз
Скользящее среднее (Moving Average)
Идея: усредняем не всё прошлое, а только последние N периодов. Так прогноз быстрее реагирует на изменения, но при этом сглаживает шум.
«Скользящее» — потому что окно сдвигается вместе с новыми данными. Вчера считали среднее за дни 1-7, сегодня — за дни 2-8.
// N — ширина окна (параметр, который вы выбираете)
Данные: 100, 120, 90, 110, 130, 95, 115
Прогноз на 8-й день (окно 3): (95 + 115 + 130) / 3 = 113
Ключевой вопрос: какое окно N выбрать? Маленькое N — чувствительно к колебаниям. Большое N — медленно реагирует на изменения. Подбирается по данным.
Не смотреть на сегодняшнюю температуру на улице, а посмотреть среднюю за последние 3 дня — так лучше понимаешь, холодает или теплеет.
Экспоненциальное сглаживание (ETS)
Идея: не все прошлые данные одинаково важны. Вчера важнее, чем год назад. Экспоненциальное сглаживание задаёт «память» ряда: чем старее наблюдение, тем меньше его вес — и этот вес убывает по экспоненте.
// α ∈ (0,1) — параметр сглаживания. Большой α = доверяем свежим данным.
Семейство ETS включает несколько моделей под разные ситуации:
Продажи зимней одежды: есть тренд (каждый год растут на 5%) и есть сезонность (декабрь всегда в 3 раза лучше июня). Holt-Winters учтёт оба компонента.
Аддитивная модель подходит, если амплитуда сезонности постоянная. Мультипликативная — если амплитуда растёт вместе с трендом.
- Учитывает тренд и сезонность
- Быстро адаптируется к изменениям
- Хорошо интерпретируется
- Мало данных для обучения
- Только одна переменная (univariate)
- Не учитывает внешние факторы
- Плохо работает с нерегулярной сезонностью
Статистические методы — это математически строгие модели, которые явно описывают структуру временного ряда. Требуют понимания, но дают мощный и интерпретируемый результат.
ARIMA / SARIMA
ARIMA — это аббревиатура: AutoRegressive Integrated Moving Average. Звучит страшно, но логика простая: прогноз строится на основе трёх компонентов.
I(d) — интегрирование: d раз берём разности, чтобы убрать тренд
MA(q) — скользящее среднее: учитываем q прошлых ошибок прогноза
AR: «Если на прошлой неделе было много заказов, скорее всего на этой тоже будет много» — инерция.
I: Прежде чем строить модель, вычитаем вчера из сегодня — убираем тренд, работаем с изменениями, а не абсолютными числами.
MA: «Я ошибся вчера на 50 заказов — скорее всего, и сегодня ошибусь» — коррекция на прошлые ошибки.
SARIMA добавляет к этому сезонные компоненты: SARIMA(p,d,q)(P,D,Q)[m], где m — период сезонности (12 для месячных данных, 7 для дневных).
ARIMA — как опытный трейдер, который смотрит: куда двигалась цена, насколько ошибался его предыдущий прогноз, и корректирует новый прогноз на основе обоих наблюдений.
- Мощная интерпретируемость
- Даёт доверительные интервалы
- Золотой стандарт в финансах
- Работает с маленькими датасетами
- Требует стационарности ряда
- Подбор параметров (p,d,q) — нетривиальная задача
- Только univariate (одна переменная)
- Плохо масштабируется на тысячи рядов
STL-декомпозиция
STL = Seasonal and Trend decomposition using Loess. Идея: разложить ряд на составляющие (тренд + сезонность + остаток), спрогнозировать каждую отдельно, потом сложить обратно.
// Прогнозируем тренд и сезонность отдельно, остаток игнорируем
Возьмём суточный трафик на сайте. STL разложит его на:
📈 Тренд: постепенный рост аудитории за год
📅 Сезонность: спады в выходные, пики в рабочие дни
🎲 Остаток: непредсказуемые скачки (вирусный пост, DDoS)
Прогноз на завтра = тренд через день + ожидаемая сезонность завтрашнего дня.
STL часто используется как препроцессинг: после декомпозиции на «очищенный» ряд (без сезонности) накладывают другую модель — ARIMA или XGBoost.
- Устойчив к выбросам
- Работает с нерегулярными данными
- Хорошая интерпретируемость компонентов
- Только аддитивная декомпозиция
- Не учитывает внешние переменные
ML-подходы к временным рядам принципиально другие. Вместо того, чтобы моделировать структуру ряда математически, мы создаём признаки (features) из прошлого и обучаем стандартную модель предсказывать будущее.
Главная идея: временной ряд → таблица с признаками → обычная задача регрессии.
Линейная регрессия с лаговыми признаками
Идея: создаём «таблицу» из истории и учим модель находить связи. Лаговые признаки — это значения ряда в прошлые моменты времени.
features: lag_1=y(t), lag_2=y(t-1), lag_7=y(t-6), month, weekday, ...
Создаём признаки: выручка вчера, выручка неделю назад, день недели, месяц, праздничный день (True/False), температура на улице.
Линейная регрессия найдёт коэффициенты: например, «суббота добавляет +3000₽, мороз ниже -10°C добавляет +800₽».
Ключевое преимущество: можно добавить любые внешние данные — погоду, праздники, рекламные кампании.
Как составить таблицу «что влияло на продажи» за каждый день и найти закономерности — но математически и для тысяч строк сразу.
Градиентный бустинг (XGBoost / LightGBM / CatBoost)
Идея та же, что у линейной регрессии — признаки из истории — но модель гораздо мощнее. Градиентный бустинг строит сотни маленьких деревьев решений, каждое из которых исправляет ошибки предыдущего.
На практике это один из самых мощных методов для табличных данных. На соревнованиях Kaggle по временным рядам LightGBM / XGBoost стабильно в топ-3.
🛒 Walmart, Ozon, Wildberries — прогнозирование спроса на миллионы SKU одновременно. Одна модель LightGBM обучается на всех товарах сразу (в признаках есть ID товара/магазина).
🔋 Энергетика — прогноз потребления электроэнергии с учётом температуры, дня недели, промышленной нагрузки.
- Легко добавить внешние факторы
- Один на миллионы рядов (global model)
- Работает с пропусками в данных
- Встроенная важность признаков
- Нужен feature engineering (руками)
- Плохо экстраполирует за пределы обучения
- Требует много данных
- Не даёт доверительные интервалы из коробки
Prophet (Meta / Facebook)
Prophet — это библиотека от Meta, которую создавали «для бизнесовых рядов» с праздниками, смысловыми точками и несколькими сезонностями. Цель — сделать прогнозирование доступным для не-статистиков.
// Каждый компонент подбирается независимо
🗓️ Знает праздники: укажи страну — модель сама добавит 8 марта, Новый год, майские. Это критично для ритейла и доставки.
📊 Визуализирует компоненты: одна строка — и видите отдельно тренд, недельную сезонность, годовую сезонность.
🔄 Changepoints: автоматически находит точки, где тренд резко изменился (смена маркетинговой стратегии, кризис, пандемия).
Prophet — это как нанять аналитика, который умеет автоматически учитывать праздники, выходные и смену трендов, и ещё показывает вам все свои расчёты на графике.
- Очень просто в использовании
- Встроенная поддержка праздников
- Хорошие доверительные интервалы
- Отличная визуализация компонентов
- Часто проигрывает ARIMA и XGBoost по точности
- Плохо масштабируется на тысячи рядов
- Устаревает — Meta почти не развивает его
Нейросети пришли в прогнозирование временных рядов позже, чем в компьютерное зрение и NLP. Долгое время бустинг их обгонял. Но с 2020 года нейросетевые подходы стали стабильно выигрывать на больших датасетах.
LSTM / RNN (рекуррентные сети)
LSTM — Long Short-Term Memory. Это специальный тип нейросети, у которой есть «память». Она читает ряд слева направо, накапливает важную информацию и «забывает» неважную.
Обычные нейросети не помнят, что было 100 шагов назад. LSTM помнит — у неё есть специальные ворота: forget gate, input gate, output gate.
x(t) = текущее значение, h(t-1) = прошлый выход, C(t-1) = память ячейки
// Ворота решают: что запомнить, что забыть, что передать дальше
📡 Нелинейные зависимости: когда связь между прошлым и будущим нелинейная — например, погодные паттерны, где важны комбинации условий.
🔗 Multivariate: несколько связанных рядов одновременно — температура, давление, влажность → предсказать потребление газа.
Честно: на практике LSTM часто не лучше LightGBM, зато гораздо сложнее в настройке. Используйте, когда нейросеть действительно нужна.
- Улавливает нелинейные зависимости
- Работает с несколькими рядами сразу
- Хорошо масштабируется на GPU
- Нужно много данных (тысячи точек)
- Долго и сложно обучать
- Плохая интерпретируемость
- Часто проигрывает бустингу на табличных данных
Transformer-модели: TFT, N-BEATS, TimeGPT
Трансформеры пришли из NLP (GPT, BERT) и теперь побеждают на бенчмарках временных рядов. Вместо того чтобы читать ряд последовательно (как LSTM), трансформер смотрит на весь ряд сразу через механизм внимания (attention).
Temporal Fusion Transformer (TFT) — специально спроектирован для временных рядов. Умеет работать с несколькими горизонтами прогноза одновременно, учитывает статические признаки (категория товара) и динамические (цена, реклама).
N-BEATS / N-HiTS — чистые нейросетевые архитектуры без RNN и Attention. Разбивают прогноз на интерпретируемые компоненты (тренд + сезонность), показывая конкурентную точность с простотой структуры.
TimeGPT (Nixtla) — первая «основная модель» (foundation model) для временных рядов. Как GPT для текста: обучена на огромном количестве рядов, делает zero-shot прогноз без дообучения на ваших данных.
🏆 Nixtla / N-HiTS — выигрывали на M5-соревновании (прогноз продаж Walmart для 30 000 SKU).
🤖 TimeGPT — когда данных мало или нужно быстро запустить MVP прогноза без долгого обучения.
🔧 TFT — когда важна интерпретируемость и нужно объяснить, что влияет на прогноз.
- Лучшая точность на больших датасетах
- Foundation models — zero-shot прогноз
- TFT даёт важность признаков
- Сложно в реализации и отладке
- Дорого обучать (нужен GPU)
- Требует огромных датасетов
- Сложно объяснить бизнесу «что происходит»
Как выбрать метод?
Нет универсального «лучшего» метода. Выбор зависит от объёма данных, требований к скорости, интерпретируемости и доступных ресурсов.
| Метод | Данных | Сложность | Внешние факторы | Когда использовать |
|---|---|---|---|---|
| Naive / Mean | Любой | Легко | Нет | Baseline, быстрая проверка |
| Скользящее среднее | От 20 точек | Легко | Нет | Сглаживание, визуализация тренда |
| Holt-Winters (ETS) | От 2 сезонов | Легко | Нет | Один ряд с трендом и сезонностью |
| ARIMA / SARIMA | 50–500+ точек | Средне | Частично | Финансы, точный статистический вывод |
| Prophet | От 100 точек | Легко | Праздники | Бизнес-метрики, быстрый старт, отчёты |
| XGBoost / LightGBM | 1000+ точек | Средне | Да (любые) | Много рядов, много внешних факторов |
| LSTM / RNN | 5000+ точек | Сложно | Да | Нелинейные паттерны, multivariate |
| TFT / N-HiTS | 10 000+ точек | Сложно | Да (структурно) | Большой масштаб, максимальная точность |
| TimeGPT | Любой | Легко (API) | Ограничено | Zero-shot, MVP, мало данных |
🚦 Всегда начинайте с наивного прогноза и ETS. Если сложная модель не бьёт Seasonal Naive — что-то не так.
📊 Одному ряду — Prophet или ARIMA. Тысячам рядов — LightGBM или N-HiTS.
💡 Нейросети нужны редко. На 90% бизнес-задач LightGBM + хороший feature engineering даёт лучший результат при меньших затратах.
Главный вывод
Прогнозирование — это не про «самый умный алгоритм». Это про понимание данных: есть ли тренд, есть ли сезонность, как много внешних факторов влияет на ряд. Выбрав правильный метод под задачу, вы получите 80% результата. Остальные 20% — это тонкая настройка и итерации.
// Naive → ETS → ARIMA → Prophet → LightGBM → LSTM → TFT
Методы проверки качества прогноза (MAE, RMSE, MAPE, SMAPE), кросс-валидация на временных рядах (walk-forward), и подходы к ансамблированию прогнозов — темы для отдельного гайда.