Реализация прогнозирования временных рядов (Time Series Forecasting)
Временные ряды — данные с временной меткой. Это охватывает продажи, потребление энергии, биржевые котировки, IoT-датчики, трафик. Правильный выбор модели и методологии критичен: неверное обращение с temporal зависимостями приводит к data leakage и ложно-оптимистичным результатам на backtest.
Классификация временных рядов
Перед выбором метода — анализ свойств ряда:
Стационарность: ADF-тест (Augmented Dickey-Fuller). Нестационарные ряды требуют дифференцирования или специальных методов.
Сезонность: ACF/PACF анализ. Одиночная (недельная) или множественная (недельная + годовая) сезонность влияет на выбор модели.
Прерывистость (intermittency): ADI (Average Demand Interval) > 1.32 — специальные методы (Croston, IMAPA).
Нелинейность: тест Terasvirta / BDS-тест. Линейные модели (ARIMA) неадекватны при сильной нелинейности.
Иерархия методов
| Метод | Применение | Плюсы | Ограничения |
|---|---|---|---|
| Naive / Seasonal Naive | Baseline, intermittent | Быстрый, интерпретируемый | Низкая точность |
| ETS (Exponential Smoothing) | Одиночная сезонность | Автоматический, хорошо работает | Множественная сезонность |
| SARIMA | Статистика, одиночная сезонность | Теория, confidence intervals | Медленный, одна сезонность |
| Prophet | Бизнес-данные с праздниками | Простота, интерпретируемость | Не лучший для сложных паттернов |
| LightGBM с лагами | Много внешних факторов | Высокая точность, фичи | Требует feature engineering |
| N-BEATS / N-HiTS | Чистый TS без внешних фич | SOTA на M4/M5 | Черный ящик |
| TFT | Много рядов + known covariates | SOTA для ансамблей | Сложность, GPU |
| TimesGPT / TimesFM | Foundation model, zero-shot | Быстрый старт | Дорого, меньше контроля |
Правильный бэктестинг
Проблема: нельзя использовать стандартный train/test split для временных рядов — нарушается temporal ordering.
Walk-Forward Validation:
|---Train---| Test |
|----Train----| Test |
|-----Train-----| Test |
Average metrics across all windows
Размер тестового окна = прогнозный горизонт. Шаг сдвига = горизонт / 2 или = горизонт (без overlap).
Data leakage sources:
- Использование будущих данных в scaling (fit scaler на всём датасете)
- Target encoding с будущими значениями
- External features с будущей информацией (known future covariates vs. past covariates)
Feature Engineering для ML-подхода
Временны́е features:
df['hour'] = df.index.hour
df['day_of_week'] = df.index.dayofweek
df['week_of_year'] = df.index.isocalendar().week
df['month'] = df.index.month
df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
# Cyclical encoding
df['sin_hour'] = np.sin(2 * np.pi * df['hour'] / 24)
df['cos_hour'] = np.cos(2 * np.pi * df['hour'] / 24)
Lag features: t-1, t-7, t-14, t-28 для дневных данных; t-1, t-24, t-168 для почасовых.
Rolling statistics: среднее, std, min, max за 7/28/90 дней. Разности: (t-1) - (t-7) для захвата тренда.
Probabilistic Forecasting
Точечный прогноз без неопределённости — недостаточно для бизнес-решений. Квантильные прогнозы:
-
Quantile Regression: LightGBM с
objective='quantile', alpha=0.1/0.5/0.9 - Conformal Prediction: теоретически обоснованные интервалы, не предполагают распределение
- Monte Carlo Dropout: в нейросетях — ensemble через dropout в inference
- N-HiTS с квантилями: нативная поддержка в библиотеке neuralforecast
Production Pipeline
# Пример с Nixtla / statsforecast
from statsforecast import StatsForecast
from statsforecast.models import AutoARIMA, AutoETS, AutoTheta
models = [AutoARIMA(season_length=7), AutoETS(season_length=7), AutoTheta()]
sf = StatsForecast(models=models, freq='D', n_jobs=-1)
sf.fit(train_df)
forecasts = sf.predict(h=28, level=[80, 95])
MLflow tracking: каждый эксперимент — версия данных, гиперпараметры, метрики, артефакт модели.
Scheduling: Airflow DAG для ежедневного переобучения и публикации прогнозов в Data Warehouse.
Мониторинг: Evidently для отслеживания data drift входных фич и prediction drift выхода модели.
Сроки: статистические baseline модели (AutoARIMA, Prophet) — 2-3 недели. ML-система с walk-forward validation, квантильными прогнозами и production pipeline — 8-12 недель.







