// Временные ряды — от простого к сложному

Прогнозирование:
как предсказывать
будущее по данным

Полный разбор методов — от «завтра будет как сегодня» до нейросетей, которые видят скрытые паттерны в данных. Читается без математики за 15 минут.

Уровень Начальный → Продвинутый
Методов разобрано 12 методов
Для кого Аналитики, DS, PM
Содержание
00 Что такое временной ряд 01 Наивные методы 01.1 Наивный прогноз 01.2 Прогноз по среднему 01.3 Скользящее среднее 01.4 Экспоненциальное сглаживание 02 Статистические методы 02.1 ARIMA / SARIMA 02.2 STL-декомпозиция 03 Машинное обучение 03.1 Регрессия с лагами 03.2 Градиентный бустинг 03.3 Prophet 04 Нейросети 04.1 LSTM / RNN 04.2 Transformer-модели 05 Как выбрать метод

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

Что такое временной ряд?

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

Главная особенность: порядок имеет значение. Среда всегда идёт после вторника. Нельзя перемешать данные и сохранить смысл.

// Примеры временных рядов в бизнесе

📦 E-commerce: количество заказов → нужно предсказать пик перед 8 марта

📈 Финансы: выручка по дням → нужно спланировать бюджет на квартал

🌐 IT: нагрузка на серверы → нужно автоматически масштабироваться

🛒 Ритейл: продажи молока → нужно рассчитать закупки, чтобы не было излишков

У временных рядов есть несколько ключевых компонентов, которые важно понимать перед тем, как выбирать метод прогнозирования:

Тренд Сезонность Шум Янв Апр Июл Окт Дек
Три компонента временного ряда: тренд, сезонность, случайный шум

Тренд — долгосрочное направление: выручка растёт год к году. Сезонность — повторяющиеся паттерны: каждый декабрь продажи выше. Шум — случайные колебания, которые невозможно объяснить.

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

01
// Уровень — начальный
Наивные методы
Просты как молоток. Surprisingly useful.

Не смейтесь над «наивными» методами. Во-первых, они часто работают лучше, чем кажется. Во-вторых, любой сложный метод нужно сравнивать именно с ними — если нейросеть не бьёт наивный прогноз, что-то пошло не так.

1
Наивный метод

Наивный прогноз (Naive Forecast)

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

Формула
ŷ(t+1) = y(t)
// Прогноз на следующий период = последнее наблюдение
// Пример: прогноз продаж

Вчера продали 342 пиццы. Наивный прогноз на сегодня: 342 пиццы.

Прошлый понедельник продали 412 пицц. Сезонный наивный прогноз на следующий понедельник: 412.

Сезонный вариант (Seasonal Naive) намного умнее — он берёт не вчера, а аналогичный период прошлого года/недели.

# Наивный прогноз на Python import pandas as pd sales = [342, 380, 355, 410, 398, 421, 390] # Простой наивный — берём последнее значение naive_forecast = sales[-1] # = 390 # Сезонный наивный — берём то же значение прошлой недели season = 7 seasonal_naive = sales[-season] # = 342
Плюсы
  • Мгновенно реализуется
  • Не требует данных для обучения
  • Отличный baseline для сравнения
  • Хорошо работает на стабильных рядах
Минусы
  • Не учитывает тренд
  • Плохо справляется с резкими изменениями
  • Один выброс ломает весь прогноз
// Аналогия

Как спросить у вчерашнего себя: «Что будет завтра?» — «Ну, наверное, примерно как сегодня.»

2
Наивный метод

Прогноз по среднему (Mean Forecast)

Идея: завтра будет средним от всего прошлого. Логика простая — если усреднить все исторические данные, случайные выбросы нивелируются.

Формула
ŷ(t+1) = (y(1) + y(2) + ... + y(t)) / t
// Среднее арифметическое всех прошлых значений
// Пример: посещаемость сайта

За последние 7 дней: 1200, 980, 1150, 1100, 900, 1300, 1050 посетителей.

Прогноз = (1200+980+1150+1100+900+1300+1050) / 7 = 1097 посетителей.

Проблема: если на 8-й день произошло что-то важное и посещаемость выросла до 5000 — наш прогноз на 9-й день всё равно будет около 1000, а не 5000.

Плюсы
  • Устойчив к выбросам
  • Хорош для стационарных рядов без тренда
Минусы
  • Не улавливает тренд и сезонность
  • Медленно адаптируется к изменениям
  • Чем больше истории, тем «тупее» прогноз
3
Наивный метод

Скользящее среднее (Moving Average)

Идея: усредняем не всё прошлое, а только последние N периодов. Так прогноз быстрее реагирует на изменения, но при этом сглаживает шум.

«Скользящее» — потому что окно сдвигается вместе с новыми данными. Вчера считали среднее за дни 1-7, сегодня — за дни 2-8.

Формула
ŷ(t+1) = (y(t) + y(t-1) + ... + y(t-N+1)) / N
// N — ширина окна (параметр, который вы выбираете)
— Скользящее среднее (MA-3) — Исходные данные
Скользящее среднее сглаживает шум, оставляя тренд видимым
// Пример: продажи с окном N=3

Данные: 100, 120, 90, 110, 130, 95, 115

Прогноз на 8-й день (окно 3): (95 + 115 + 130) / 3 = 113

Ключевой вопрос: какое окно N выбрать? Маленькое N — чувствительно к колебаниям. Большое N — медленно реагирует на изменения. Подбирается по данным.

// Аналогия

Не смотреть на сегодняшнюю температуру на улице, а посмотреть среднюю за последние 3 дня — так лучше понимаешь, холодает или теплеет.

4
Сглаживание

Экспоненциальное сглаживание (ETS)

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

Простое сглаживание (SES)
ŷ(t+1) = α · y(t) + (1-α) · ŷ(t)
// α ∈ (0,1) — параметр сглаживания. Большой α = доверяем свежим данным.

Семейство ETS включает несколько моделей под разные ситуации:

# Три модели семейства ETS SES = "Только сглаживание" # нет тренда, нет сезонности Holt = "Двойное сглаживание" # есть тренд, нет сезонности HW = "Holt-Winters" # есть тренд И сезонность # Пример на statsmodels from statsmodels.tsa.holtwinters import ExponentialSmoothing model = ExponentialSmoothing( data, trend='add', # аддитивный тренд seasonal='add', # аддитивная сезонность seasonal_periods=12 # 12 месяцев в году ).fit() forecast = model.forecast(12) # прогноз на год вперёд
// Holt-Winters на практике

Продажи зимней одежды: есть тренд (каждый год растут на 5%) и есть сезонность (декабрь всегда в 3 раза лучше июня). Holt-Winters учтёт оба компонента.

Аддитивная модель подходит, если амплитуда сезонности постоянная. Мультипликативная — если амплитуда растёт вместе с трендом.

Плюсы
  • Учитывает тренд и сезонность
  • Быстро адаптируется к изменениям
  • Хорошо интерпретируется
  • Мало данных для обучения
Минусы
  • Только одна переменная (univariate)
  • Не учитывает внешние факторы
  • Плохо работает с нерегулярной сезонностью
02
// Уровень — средний
Статистические методы
Классика, которая до сих пор рулит в финансах и экономике

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

5
Статистика

ARIMA / SARIMA

ARIMA — это аббревиатура: AutoRegressive Integrated Moving Average. Звучит страшно, но логика простая: прогноз строится на основе трёх компонентов.

Что означает ARIMA(p, d, q)
AR(p) — авторегрессия: прогноз зависит от p прошлых значений
I(d) — интегрирование: d раз берём разности, чтобы убрать тренд
MA(q) — скользящее среднее: учитываем q прошлых ошибок прогноза
// Интуиция за каждым компонентом

AR: «Если на прошлой неделе было много заказов, скорее всего на этой тоже будет много» — инерция.

I: Прежде чем строить модель, вычитаем вчера из сегодня — убираем тренд, работаем с изменениями, а не абсолютными числами.

MA: «Я ошибся вчера на 50 заказов — скорее всего, и сегодня ошибусь» — коррекция на прошлые ошибки.

SARIMA добавляет к этому сезонные компоненты: SARIMA(p,d,q)(P,D,Q)[m], где m — период сезонности (12 для месячных данных, 7 для дневных).

# ARIMA на Python — пример для недельных данных from statsmodels.tsa.statespace.sarimax import SARIMAX import pandas as pd # Автоподбор параметров — используем pmdarima import pmdarima as pm model = pm.auto_arima( train_data, seasonal=True, m=52, # 52 недели в году stepwise=True, suppress_warnings=True ) forecast, conf_int = model.predict( n_periods=12, return_conf_int=True # доверительный интервал )
// Аналогия

ARIMA — как опытный трейдер, который смотрит: куда двигалась цена, насколько ошибался его предыдущий прогноз, и корректирует новый прогноз на основе обоих наблюдений.

Плюсы
  • Мощная интерпретируемость
  • Даёт доверительные интервалы
  • Золотой стандарт в финансах
  • Работает с маленькими датасетами
Минусы
  • Требует стационарности ряда
  • Подбор параметров (p,d,q) — нетривиальная задача
  • Только univariate (одна переменная)
  • Плохо масштабируется на тысячи рядов
6
Статистика

STL-декомпозиция

STL = Seasonal and Trend decomposition using Loess. Идея: разложить ряд на составляющие (тренд + сезонность + остаток), спрогнозировать каждую отдельно, потом сложить обратно.

Декомпозиция
y(t) = Тренд(t) + Сезонность(t) + Остаток(t)
// Прогнозируем тренд и сезонность отдельно, остаток игнорируем
// Пример: интернет-трафик

Возьмём суточный трафик на сайте. STL разложит его на:

📈 Тренд: постепенный рост аудитории за год

📅 Сезонность: спады в выходные, пики в рабочие дни

🎲 Остаток: непредсказуемые скачки (вирусный пост, DDoS)

Прогноз на завтра = тренд через день + ожидаемая сезонность завтрашнего дня.

STL часто используется как препроцессинг: после декомпозиции на «очищенный» ряд (без сезонности) накладывают другую модель — ARIMA или XGBoost.

Плюсы
  • Устойчив к выбросам
  • Работает с нерегулярными данными
  • Хорошая интерпретируемость компонентов
Минусы
  • Только аддитивная декомпозиция
  • Не учитывает внешние переменные
03
// Уровень — продвинутый
Машинное обучение
Когда есть много данных и внешних факторов

ML-подходы к временным рядам принципиально другие. Вместо того, чтобы моделировать структуру ряда математически, мы создаём признаки (features) из прошлого и обучаем стандартную модель предсказывать будущее.

Главная идея: временной ряд → таблица с признаками → обычная задача регрессии.

7
ML-метод

Линейная регрессия с лаговыми признаками

Идея: создаём «таблицу» из истории и учим модель находить связи. Лаговые признаки — это значения ряда в прошлые моменты времени.

Как выглядит таблица признаков
target: y(t+1)
features: lag_1=y(t), lag_2=y(t-1), lag_7=y(t-6), month, weekday, ...
# Создаём лаговые признаки import pandas as pd from sklearn.linear_model import LinearRegression df['lag_1'] = df['sales'].shift(1) # вчера df['lag_7'] = df['sales'].shift(7) # неделю назад df['lag_28'] = df['sales'].shift(28) # месяц назад # Добавляем календарные признаки df['month'] = df.index.month df['weekday'] = df.index.dayofweek df['is_holiday'] = df.index.isin(holidays) # Обучаем обычную линейную регрессию X = df[['lag_1', 'lag_7', 'lag_28', 'month', 'weekday', 'is_holiday']] y = df['sales'] model = LinearRegression().fit(X_train, y_train)
// Пример: прогноз выручки кофейни

Создаём признаки: выручка вчера, выручка неделю назад, день недели, месяц, праздничный день (True/False), температура на улице.

Линейная регрессия найдёт коэффициенты: например, «суббота добавляет +3000₽, мороз ниже -10°C добавляет +800₽».

Ключевое преимущество: можно добавить любые внешние данные — погоду, праздники, рекламные кампании.

// Аналогия

Как составить таблицу «что влияло на продажи» за каждый день и найти закономерности — но математически и для тысяч строк сразу.

8
ML-метод

Градиентный бустинг (XGBoost / LightGBM / CatBoost)

Идея та же, что у линейной регрессии — признаки из истории — но модель гораздо мощнее. Градиентный бустинг строит сотни маленьких деревьев решений, каждое из которых исправляет ошибки предыдущего.

На практике это один из самых мощных методов для табличных данных. На соревнованиях Kaggle по временным рядам LightGBM / XGBoost стабильно в топ-3.

# Пример с LightGBM import lightgbm as lgb import numpy as np # Расширенный feature engineering def create_features(df): df['lag_1'] = df['y'].shift(1) df['lag_7'] = df['y'].shift(7) df['rolling_mean_7'] = df['y'].shift(1).rolling(7).mean() df['rolling_std_7'] = df['y'].shift(1).rolling(7).std() df['weekday'] = df.index.dayofweek df['month'] = df.index.month df['quarter'] = df.index.quarter return df model = lgb.LGBMRegressor( n_estimators=500, learning_rate=0.05, num_leaves=31 ) model.fit(X_train, y_train, eval_set=[(X_val, y_val)], callbacks=[lgb.early_stopping(50)] )
// Где это применяется

🛒 Walmart, Ozon, Wildberries — прогнозирование спроса на миллионы SKU одновременно. Одна модель LightGBM обучается на всех товарах сразу (в признаках есть ID товара/магазина).

🔋 Энергетика — прогноз потребления электроэнергии с учётом температуры, дня недели, промышленной нагрузки.

Плюсы
  • Легко добавить внешние факторы
  • Один на миллионы рядов (global model)
  • Работает с пропусками в данных
  • Встроенная важность признаков
Минусы
  • Нужен feature engineering (руками)
  • Плохо экстраполирует за пределы обучения
  • Требует много данных
  • Не даёт доверительные интервалы из коробки
9
ML-метод

Prophet (Meta / Facebook)

Prophet — это библиотека от Meta, которую создавали «для бизнесовых рядов» с праздниками, смысловыми точками и несколькими сезонностями. Цель — сделать прогнозирование доступным для не-статистиков.

Модель Prophet
y(t) = trend(t) + seasonality(t) + holidays(t) + noise
// Каждый компонент подбирается независимо
# Prophet — минимальный рабочий пример from prophet import Prophet import pandas as pd # Prophet требует колонки 'ds' (дата) и 'y' (значение) df = pd.DataFrame({'ds': dates, 'y': sales}) model = Prophet( yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=False ) # Добавляем праздники model.add_country_holidays(country_name='RU') model.fit(df) future = model.make_future_dataframe(periods=365) forecast = model.predict(future) # Сразу получаем: прогноз + доверительный интервал # forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']]
// За что любят Prophet в бизнесе

🗓️ Знает праздники: укажи страну — модель сама добавит 8 марта, Новый год, майские. Это критично для ритейла и доставки.

📊 Визуализирует компоненты: одна строка — и видите отдельно тренд, недельную сезонность, годовую сезонность.

🔄 Changepoints: автоматически находит точки, где тренд резко изменился (смена маркетинговой стратегии, кризис, пандемия).

// Аналогия

Prophet — это как нанять аналитика, который умеет автоматически учитывать праздники, выходные и смену трендов, и ещё показывает вам все свои расчёты на графике.

Плюсы
  • Очень просто в использовании
  • Встроенная поддержка праздников
  • Хорошие доверительные интервалы
  • Отличная визуализация компонентов
Минусы
  • Часто проигрывает ARIMA и XGBoost по точности
  • Плохо масштабируется на тысячи рядов
  • Устаревает — Meta почти не развивает его
04
// Уровень — экспертный
Нейросетевые методы
Deep learning для тех, кому мало остального

Нейросети пришли в прогнозирование временных рядов позже, чем в компьютерное зрение и NLP. Долгое время бустинг их обгонял. Но с 2020 года нейросетевые подходы стали стабильно выигрывать на больших датасетах.

10
Deep Learning

LSTM / RNN (рекуррентные сети)

LSTM — Long Short-Term Memory. Это специальный тип нейросети, у которой есть «память». Она читает ряд слева направо, накапливает важную информацию и «забывает» неважную.

Обычные нейросети не помнят, что было 100 шагов назад. LSTM помнит — у неё есть специальные ворота: forget gate, input gate, output gate.

Интуиция за LSTM
На каждом шаге t нейрон получает: x(t) + h(t-1) + C(t-1)
x(t) = текущее значение, h(t-1) = прошлый выход, C(t-1) = память ячейки
// Ворота решают: что запомнить, что забыть, что передать дальше
# LSTM на PyTorch (упрощённо) import torch import torch.nn as nn class LSTMForecaster(nn.Module): def __init__(self, input_size, hidden_size, output_size): super().__init__() self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.lstm(x) return self.fc(out[:, -1, :]) # берём последний hidden state model = LSTMForecaster( input_size=1, # одна переменная hidden_size=64, # размерность скрытого слоя output_size=1 # прогноз на 1 шаг )
// Когда LSTM реально нужен

📡 Нелинейные зависимости: когда связь между прошлым и будущим нелинейная — например, погодные паттерны, где важны комбинации условий.

🔗 Multivariate: несколько связанных рядов одновременно — температура, давление, влажность → предсказать потребление газа.

Честно: на практике LSTM часто не лучше LightGBM, зато гораздо сложнее в настройке. Используйте, когда нейросеть действительно нужна.

Плюсы
  • Улавливает нелинейные зависимости
  • Работает с несколькими рядами сразу
  • Хорошо масштабируется на GPU
Минусы
  • Нужно много данных (тысячи точек)
  • Долго и сложно обучать
  • Плохая интерпретируемость
  • Часто проигрывает бустингу на табличных данных
11-12
Deep Learning

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 прогноз без дообучения на ваших данных.

# TimeGPT — zero-shot прогноз за 5 строк from nixtla import NixtlaClient client = NixtlaClient(api_key='your_key') forecast = client.forecast( df=df, # ваши исторические данные h=30, # горизонт: 30 дней вперёд freq='D', # ежедневные данные time_col='date', target_col='sales' ) # Без обучения. Сразу результат.
// Современный стек в продакшн

🏆 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), и подходы к ансамблированию прогнозов — темы для отдельного гайда.