LSTM для фінансових часових рядів: архітектура та валідація
Уявіть: ви навчили LSTM на п'яти роках денок, отримали accuracy 68% на тесті. У продакшені модель показує 49% — гірше за випадковий. Типова помилка: data leakage при нормалізації або неправильна валідація. Ми розгорнемо production-ready архітектуру LSTM для фінансових часових рядів на основі реальних проектів з multi-asset портфелями та walk-forward валідацією. Наша команда має 10+ років досвіду в AI/ML для фінансів, реалізувала 30+ моделей для хедж-фондів та брокерів. Гарантуємо відсутність lookahead bias та відтворюваність експериментів. Використовуємо PyTorch та Hugging Face Transformers, навчаємо на кластері GPU A100, моніторимо через MLflow та Weights & Biases. Оптимізація гіперпараметрів проводиться за допомогою Optuna, валідація — строга walk-forward з embargo-періодом, щоб виключити витік. Результат: стабільний Information Coefficient (IC) > 0.05 та ICIR > 1.5 на аут-оф-семпл тесті. Вартість розробки залежить від складності моделі та обсягу даних — фінальна ціна обговорюється після аналізу. Орієнтовна тривалість single-asset рішення — від 2 до 3 тижнів роботи команди, multi-asset з attention — від 8 до 10 тижнів.
Чому LSTM, а не градієнтний бустинг?
LSTM виграє, коли послідовність подій важливіша за агрегати, а нелінійні часові патерни явно виражені. LightGBM з лаговими фічами часто обходить LSTM на малих датасетах (<10 000 спостережень). Але на багатовимірних рядах (кілька інструментів одночасно) та складних cross-asset залежностях LSTM дає перевагу. Архітектура вперше описана в статті Long Short-Term Memory (Hochreiter & Schmidhuber). LSTM — базова архітектура.
Архітектура моделі
Переглянути код моделі
import torch import torch.nn as nn class FinancialLSTM(nn.Module): def __init__(self, input_size, hidden_size=128, num_layers=2, dropout=0.2): super().__init__() self.lstm = nn.LSTM( input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True, dropout=dropout ) self.attention = nn.MultiheadAttention(hidden_size, num_heads=8) self.fc = nn.Linear(hidden_size, 1) self.dropout = nn.Dropout(dropout) def forward(self, x): lstm_out, _ = self.lstm(x) # [batch, seq_len, hidden] # Self-attention по часовому виміру attn_out, _ = self.attention(lstm_out, lstm_out, lstm_out) # Останній крок або attention-weighted pool out = self.fc(self.dropout(attn_out[:, -1, :])) return out Вхідні дані (seq_len × n_features): OHLCV, нормовані по ковзному вікну, технічні індикатори (RSI, MACD, ATR, Bollinger). Для multi-asset — конкатенація по feature dimension. Реалізація доступна в PyTorch LSTM.
Передобробка та нормалізація
Критично важливо: нормалізація без lookahead bias. Використовуємо нормалізацію в rolling вікні:
def rolling_normalize(X, window=252): mu = X.rolling(window).mean() sigma = X.rolling(window).std() return (X - mu) / (sigma + 1e-8) Price returns замість цін: сирі ціни нестаціонарні, log returns стаціонарні:
returns = np.log(prices / prices.shift(1)).dropna() Sequence generation:
def create_sequences(data, seq_len=60, horizon=5): X, y = [], [] for i in range(len(data) - seq_len - horizon): X.append(data[i:i+seq_len]) y.append(data[i+seq_len+horizon-1, 0]) return np.array(X), np.array(y) Навчання та регуляризація
Як налаштувати гіперпараметри для фінансових LSTM?
Sequence length: 20–60 днів для денних даних, 50–200 для годинних. Hidden size: 64–256. Layers: 2–3 (глибше зазвичай гірше на фінансових даних). Dropout: 0.1–0.4. Batch size: 32–128. Регуляризація: temporal dropout, feature noise, L2 weight decay (1e-4 to 1e-3). Оптимізатор: AdamW з cosine annealing LR scheduler. Рання зупинка по validation loss на 20% holdout.
Для портфеля з N інструментів застосовуємо Cross-sectional LSTM з паралельною обробкою всіх інструментів та cross-attention між ними, щоб захопити кореляційні патерни (нафта → нафтові акції, DXY → EM активи).
Валідація без data leakage
Walk-forward з embargo:
embargo_size = horizon train_end = int(0.6 * len(data)) embargo_end = train_end + embargo_size val_end = int(0.8 * len(data)) Метрики: Directional Accuracy, Information Coefficient (spearman correlation), ICIR (IC / std(IC) — стабільність; ICIR > 1.5 вважається хорошим).
Порівняння методів нормалізації
| Метод | Lookahead bias | Стаціонарність | Застосовність |
|---|---|---|---|
| StandardScaler (весь датасет) | Є | Так | Не можна для часових рядів |
| Rolling normalize (вікно 252) | Немає | Так | Рекомендується для фінансів |
| MinMaxScaler (весь датасет) | Є | Ні | Тільки для нечасових задач |
| Log returns + rolling normalize | Немає | Так | Найкращий варіант для цін |
LSTM vs Transformer для фінансів
| Аспект | LSTM | Transformer |
|---|---|---|
| Довгі залежності | Добре | Відмінно |
| Швидкість навчання | Повільніше | Швидше |
| Даних потрібно | Менше | Більше |
| Інтерпретовність | Низька | Середня (attention) |
| Production latency | Нижча | Вища |
Для коротких послідовностей (< 100 кроків) LSTM часто не поступається Transformer при значно менших вимогах до даних.
Що входить у роботу
- Baseline модель single-asset з побудовою pipeline та документацією
- Multi-asset архітектура з cross-attention та walk-forward валідацією
- Оптимізація гіперпараметрів (Optuna) з логами в MLflow
- Деплой в Docker з Triton Inference Server та моніторингом в Prometheus
- Навчання команди експлуатації та передача model card
Кожен етап супроводжується звітами та коментарями в коді. Ми не просто віддаємо ваги — ми передаємо відтворюваний експеримент.
Процес роботи та терміни
- Аналітика — збір та візуалізація даних, визначення горизонту прогнозу.
- Проєктування — вибір архітектури (LSTM/Transformer, single/multi-asset).
- Реалізація — написання pipeline, навчання baseline, оптимізація.
- Тест — walk-forward валідація, стрес-тестування на аномаліях.
- Деплой — упаковка в Docker, розгортання на GPU-сервері, моніторинг.
Терміни: single-asset baseline — від 2 до 3 тижнів; multi-asset модель з attention та production pipeline — від 8 до 10 тижнів. Вартість розраховується індивідуально.
Замовте консультацію для попередньої оцінки вашого датасету — ми проаналізуємо його за 1–2 дні. Зв'яжіться з нами, щоб обговорити архітектуру моделі та терміни.







