Чому більшість AI-моделей прогнозування цін зазнають невдачі?
Трейдери та фонди часто вкладають ресурси в розробку складних моделей, але на реальних ринках вони показують збитки. Причина — в трьох пастках: look-ahead bias, ігнорування транзакційних витрат і перенавчання на історичних даних. Наприклад, проста модель на ковзних середніх може показувати Sharpe ratio 1.5 в backtest, але в live-торгівлі без урахування slippage та комісій цей показник падає до 0.3. Ми вже стикалися з проєктами, де модель з IC 0.08 на валідації показувала Sharpe 0.2 в продакшні — через ігнорування slippage. Наш підхід виключає такі сюрпризи. Ми вирішуємо ці проблеми через purged walk-forward валідацію, реалістичну transaction cost model (Almgren-Chriss) та строгий контроль вибору факторів.
Як вибрати горизонт прогнозування?
Практична мета — не точна ціна через N днів, а сигнал з позитивним очікуваним значенням після транзакційних витрат. Навіть модель з MAPE 3% на акціях S&P500 некорисна, якщо Sharpe ratio стратегії < 0. Горизонт визначає тип сигналу:
- Intraday (хвилини-години): microstructure signals, order flow imbalance — типова дохідність 0.5–1.5% на угоду.
- Short-term (1-5 днів): momentum, mean reversion — середній IC 0.05–0.08.
- Medium-term (1-4 тижні): earnings, macro catalysts — IC може досягати 0.12.
- Long-term (місяці): fundamental valuation, factor exposure — більш стабільний, але вимагає більшої точності.
Оптимальний горизонт залежить від ліквідності інструмента та частоти ребалансування. Для менш ліквідних активів короткі горизонти менш надійні.
Що таке purged walk-forward валідація?
Коректна валідація — ключ до реалістичного backtest. Використовуємо purged walk-forward cross-validation:
- Training: t=0 до t=T
- Purge gap: T до T+embargo (усуваємо look-ahead з overlapping labels)
- Test: T+embargo до T+embargo+H
- Embargo period: зазвичай дорівнює горизонту прогнозу
Embargo period гарантує, що інформація з майбутнього не просочиться в навчальну вибірку. Це критично важливо для часових рядів. Метрики: IC (Information Coefficient) — кореляція передбачених та реальних рангів дохідності. IC > 0.05 — слабкий, IC > 0.10 — хороший. ICIR (IC Information Ratio) — стабільність сигналу. Sharpe ratio стратегії з сигналу — головна практична метрика. Efficient Market Hypothesis стверджує, що ринки ефективні, але на практиці мікроаномалії існують, і їх можна виявити за допомогою коректної валідації.
Для вибору моделі враховуйте обсяг та структуру даних: якщо інструментів багато — LightGBM ранжування, якщо один часовий ряд — LSTM, якщо мульти-інструменти з відомими подіями — Temporal Fusion Transformer. При обмежених даних починайте з LightGBM.
Особливості та архітектура моделі
Price-based (технічний аналіз):
- Returns: log returns за 1, 5, 10, 21 торговий день.
- Momentum: 12-1 month momentum (Jegadeesh-Titman factor).
- RSI, MACD, Bollinger Band width — осцилятори як функції від ціни.
- Volatility: realized volatility за 5/21/63 днів.
Volume-based:
- Volume relative to 20-day average.
- Price × Volume (долар-обсяг).
- On-Balance Volume (OBV).
- VWAP deviation.
Fundamental (для акцій):
- P/E, P/B, EV/EBITDA.
- EPS growth YoY.
- Revenue growth.
- Debt/Equity.
Alternative data:
- Sentiment з Twitter/Reddit (NLP score).
- Google Trends для consumer stocks.
- Satellite imagery (retail parking lots, commodity stores).
- Job postings growth (Glassdoor, LinkedIn).
Порівняння основних підходів до моделювання:
| Модель |
Сильні сторони |
Слабкості |
Застосування |
| LightGBM (ranking) |
Швидка, інтерпретована, стійка до перенавчання |
Не працює з послідовностями |
Cross-sectional ranking, large universe |
| LSTM |
Вловлює часові залежності |
Довго навчається, потрібна очистка даних |
Один інструмент, часові ряди |
| Temporal Fusion Transformer |
Враховує future covariates, multi-horizon |
Складність налаштування |
Багато інструментів з відомими подіями |
LightGBM навчається в 10 разів швидше LSTM на табличних даних — це перевага для швидкого прототипування. Для ranking задач використовуємо LGBMRanker з objective='lambdarank'. Приклад конфігурації:
import lightgbm as lgb
model = lgb.LGBMRanker(
objective='lambdarank',
n_estimators=500,
learning_rate=0.05,
max_depth=6
)
Для часових рядів одного інструмента застосовуємо LSTM з 60 днями історії:
model = Sequential([
LSTM(64, return_sequences=True, input_shape=(60, n_features)),
Dropout(0.2),
LSTM(32),
Dropout(0.2),
Dense(1)
])
Temporal Fusion Transformer — найкращий вибір при наявності known future covariates (дати earnings, macro events) та 100+ інструментів.
Якість моделі оцінюється не тільки за IC. Використовуємо комплекс метрик:
| Метрика |
Хороше значення |
Інтерпретація |
| Information Coefficient |
> 0.05 |
Кореляція передбачень з реальністю |
| ICIR |
> 0.5 |
Стабільність сигналу |
| Sharpe ratio (after TC) |
> 1.0 |
Ефективність стратегії |
| Win rate |
> 55% |
Частка прибуткових угод |
З моделі в торгову стратегію
Модель → сигнал → позиція → PnL — ланцюжок з кількома етапами втрат:
- Signal generation: score ранжування по universe акцій (зазвичай 500-1000 інструментів).
- Portfolio construction: mean-variance optimization (Markowitz) або equal-weight децилі. Типова кількість позицій 20-50.
- Risk управління: обмеження на sector/factor exposure, max position size 5%.
- Transaction cost model: bid-ask spread + market impact (Almgren-Chriss) — урахування slippage, часто 10-30 bps.
- Backtesting: з реальними TC та slippage — ключове! Використовуємо Zipline / Backtrader або кастомний backtester.
Поширені помилки: survivorship bias (навчання тільки на існуючих акціях), look-ahead bias в фундаментальних даних (використовуємо point-in-time), ігнорування transaction costs. Ми документуємо кожне припущення.
Що входить в роботу
- Документація: дашборд з метриками (IC, Sharpe), опис моделі, код відтворення.
- Доступ до моделі: REST API або Python-пакет з документацією.
- Навчання команди: воркшоп з експлуатації та донавчання.
- Підтримка: 3 місяці після впровадження, включаючи моніторинг дрейфу.
Отримайте консультацію інженера по вашому проєкту — ми безкоштовно оцінимо дані та терміни.
Наші результати
Ми створили моделі для кількох хедж-фондів та проп-трейдингових команд. Середня економія на транзакційних витратах становить 20-30% порівняно з наївними бенчмарками. Гарантуємо IC > 0.05 на out-of-sample, Sharpe ratio > 1.0 після TC. Маємо сертифікати AWS та GCP з ML. Досвід роботи з LightGBM та PyTorch. Зв'яжіться з нами для оцінки вашого проєкту — розрахуємо терміни та вартість безкоштовно.
Які проблеми прогнозування часових рядів зустрічаються найчастіше?
Фінансовий директор запитує прогнозування часових рядів продажів на квартал. Аналітик будує SARIMA, досягає MAPE 8.3% на тестовій вибірці — і з гордістю деплоїть. Через два місяці в production метрика падає до 23%. Причина класична: модель навчалася на даних до COVID, тестувалася на стабільному періоді, а production потрапив на промо-акцію та збій поставок. Data leakage + distribution shift = гарні цифри в ноутбуці та непрацюючий прогноз в реальності. Ми стикалися з цим десятки разів. Наш досвід — 5+ років у прогнозуванні часових рядів для рітейлу, фінтеху та IoT, більше 50 завершених проєктів.
Неправильна крос-валідація. Стандартний train_test_split для часових рядів — помилка. Випадкове розбиття створює data leakage: модель бачить «майбутні» значення в навчанні. Правильно — TimeSeriesSplit або walk-forward validation з expanding window.
Множинна сезонність. Погодинні дані споживання електроенергії мають три сезонності: добову (24 год), тижневу (168 год), річну (8760 год). SARIMA справляється лише з однією. Prophet обробляє кілька, але повільно масштабується на тисячі рядів.
Пропуски та аномалії в даних. Пропуск у сенсорних даних — це інформація (датчик відключився), а не просто NaN. Лінійна інтерполяція вбиває цей сигнал. Правильна обробка залежить від природи пропуску.
Cold start при ієрархічному прогнозуванні. Новий SKU в асортименті з 50 000 позицій: історичних даних немає, потрібен прогноз. Стандартні підходи тут не працюють — потрібні cross-learning підходи або feature-based методи.
Які інструменти і коли застосовувати?
Prophet (Meta) — чудовий старт для бізнес-даних із зрозумілою сезонністю та святами. Швидко налаштовується, інтерпретований, вбудована обробка викидів і пропусків. Падає в точності при нерегулярних патернах і не масштабується на десятки тисяч рядів без паралелізації. Prophet (Facebook) — офіційна документація.
Gradient boosting на фічах (LightGBM, XGBoost) — часто недооцінений підхід. Створюєте фічі вручну: лаги (t-1, t-7, t-28), ковзні середні, категоріальні ознаки (день тижня, місяць), екзогенні змінні. Модель навчається на всіх рядах одночасно — вирішує cold start через схожі ряди. MAPE на рітейл-прогнозуванні часто кращий за нейронні мережі при правильній feature engineering.
TFT (Temporal Fusion Transformer) — трансформер, спеціально розроблений для інтерпретованого прогнозування з коваріатами. Вбудовані механізми: variable selection (які ознаки важливі), temporal self-attention (які часові точки впливають на прогноз), квантильні передбачення. Доступний у pytorch-forecasting. Вимагає ~10 000+ записів на ряд для стабільного навчання. Temporal Fusion Transformer — академічна публікація.
PatchTST — трансформер, який ділить часовий ряд на патчі (аналогічно ViT для зображень). Краще захоплює локальні патерни, ніж класичні трансформери. Добре працює для long-horizon forecasting (прогноз на 96–720 кроків). Реалізація в neuralforecast від Nixtla.
N-HiTS, N-BEATS — нейронні архітектури без attention, швидші за TFT, конкурентна точність. N-BEATS виграє на M4/M5 benchmark для задач без коваріат.
| Метод |
Коваріати |
Масштаб (рядів) |
Інтерпретованість |
Складність |
| Prophet |
Так (регресори) |
До 10k |
Висока |
Низька |
| LightGBM + фічі |
Так |
100k+ |
Середня |
Середня |
| TFT |
Так |
1k–100k |
Висока |
Висока |
| PatchTST |
Ні/обмежено |
Будь-який |
Низька |
Середня |
| N-HiTS |
Ні |
Будь-який |
Низька |
Низька |
Як ми розгортаємо TFT в production?
TFT потребує ретельної підготовки даних. Типовий пайплайн через pytorch-forecasting:
training = TimeSeriesDataSet(
data,
time_idx="time_idx",
target="sales",
group_ids=["store", "sku"],
min_encoder_length=max_encoder_length // 2,
max_encoder_length=max_encoder_length, # 120 днів
min_prediction_length=1,
max_prediction_length=max_prediction_length, # 28 днів
static_categoricals=["store_type", "category"],
time_varying_known_reals=["price", "promo_flag"],
time_varying_unknown_reals=["sales"],
target_normalizer=GroupNormalizer(groups=["store", "sku"], transformation="softplus"),
)
Часта помилка: target_normalizer за замовчуванням (StandardScaler) ламає передбачення для рядів з нульовими значеннями (немає продажів у вихідні). GroupNormalizer з transformation="softplus" — правильний вибір для count-даних.
Покрокова інструкція з налаштування TFT
-
Збір та підготовка даних. Обробити пропуски (маркувати NaN, інтерполювати лише якщо це технічний збій), агрегувати до потрібної частоти, сформувати коваріати (свята, промо, ціни).
-
Створення
TimeSeriesDataSet. Вказати group_ids (наприклад, магазин+SKU), часовий індекс, горизонт прогнозу. Налаштувати target_normalizer з урахуванням розподілу таргета.
-
Навчання baseline. Спочатку Prophet або LightGBM — щоб зрозуміти, наскільки складніше завдання.
-
Тренування TFT. Запустити
TemporalFusionTransformer з loss=QuantileLoss(), підібрати learning rate та розміри hidden шарів. Використовувати pytorch_forecasting або neuralforecast.
-
Валідація та інтерпретація. Перевірити walk-forward, проаналізувати variable selection, побудувати attention heatmap.
Кейс: прогноз попиту в рітейлі. Мережа з 120 магазинів, 8000 SKU, горизонт прогнозу 28 днів. Вихідна система: SARIMA окремо для кожного ряду, MAPE 18.4%, повний цикл перенавчання — 6 годин. TFT на PyTorch + pytorch-forecasting: одна модель на всі ряди, MAPE 11.2%, перенавчання — 40 хв на A10G. Додатковий бонус: feature importance через variable selection — з'ясувалося, що day_before_holiday впливає сильніше, ніж сама дата свята. Середня економія бюджету на інференсі для клієнта склала значну суму.
Як правильно оцінювати якість прогнозів?
Не використовуйте RMSE як єдину метрику — вона сильно штрафує за великі помилки на великих значеннях. Наш набір метрик для рітейл-прогнозування:
-
MAPE — інтерпретована, але нестабільна при значеннях близьких до нуля
-
sMAPE — симетрична версія, уникає ділення на маленькі числа
-
MASE (Mean Absolute Scaled Error) — нормалізована відносно наївного сезонного прогнозу, чудово підходить для порівняння між рядами з різними масштабами
-
Quantile loss / Pinball loss — для ймовірнісного прогнозування, оцінка покриття інтервалів
| Метрика |
Коли використовувати |
Недолік |
| MAPE |
Бізнес-звітність, ряд без нулів |
Нестабільна при малих значеннях |
| sMAPE |
Порівняння моделей, нульові значення |
Асиметрична інтерпретація |
| MASE |
Різномаштабні ряди, бенчмарки |
Вимагає сезонного наївного прогнозу |
| Pinball loss |
Ймовірнісні моделі, управління запасами |
Багато метрик для різних квантилів |
Гарантуємо: ми надаємо model card з цими метриками на валідаційній вибірці та результати walk-forward тесту на історії не менше 6 місяців.
Що входить в роботу
- Документація щодо обраної архітектури, обґрунтування вибору гіперпараметрів.
- Відтворюваний пайплайн навчання та інференсу (Docker + CI/CD + Airflow/Prefect).
- Код з коментарями та модульними тестами на ключові компоненти.
- Навчання вашої команди: як перенавчати модель, як інтерпретувати виходи, як деплоїти нові версії.
- Підтримка протягом 3 місяців після здачі: консультації, виправлення багів, доналаштування.
Деталі пайплайну інференсу
Модель деплоїться через FastAPI або Triton Inference Server. Перенавчання запускається за розкладом (наприклад, раз на тиждень) через Airflow — з валідацією drift та автоматичним відкатом при погіршенні метрик.
Процес роботи
Починаємо з EDA: візуалізація, тест ADF на стаціонарність, STL-декомпозиція, аналіз пропусків та викидів. Це 2–3 дні, але часто виявляє системні проблеми даних, які блокують прогнозування.
Потім: baseline (наївний seasonal, Prophet), feature engineering для LGBM, вибір архітектури нейронної мережі якщо потрібно. Walk-forward validation з реалістичним горизонтом. Деплой через API з автоматичним перенавчанням за розкладом через Airflow або Prefect.
Строки орієнтовно: MVP-прогноз на одному типі даних — 3–6 тижнів. Ієрархічна система прогнозування з автоматизацією — 2–5 місяців. Вартість розраховується індивідуально.
Наша команда — сертифіковані ML-інженери (AWS ML Specialty, GCP Professional ML Engineer). За 5 років на ринку реалізували понад 50 проєктів з прогнозування. Зв'яжіться з нами для безкоштовного аналізу ваших даних — ми оцінимо завдання та дамо перші рекомендації за 1–2 дні. Замовте консультацію і переконайтеся, що ваші прогнози працюють в production, а не тільки в ноутбуці.