Реалізація прогнозування часових рядів (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 |
Усереднення метрик по всіх вікнах
Розмір тестового вікна = горизонт прогнозу. Крок зсуву = горизонт / 2 або = горизонт (без overlap).
Джерела Data Leakage:
- Використання майбутніх даних у scaling (fit scaler на всьому датасеті)
- Target encoding з майбутніми значеннями
- External features з майбутною інформацією (known future covariates vs. past covariates)
Feature Engineering для ML-підходу
Часові фічи:
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: у нейромережах — ансамбль через 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 тижнів.







