Розробка AI-моделі на базі LSTM для часових рядів ринку
LSTM (Long Short-Term Memory) — рекурентна архітектура з явним механізмом пам'яті: клітини можуть "пам'ятати" паттерни протягом довгих послідовностей. Для фінансових даних це дозволяє визначити залежності, які gradient boosting пропускає при роботі лише з агрегованими ознаками.
Коли LSTM виправдана для фінансових даних
LSTM має сенс, коли:
- Послідовність подій важлива, не лише агрегати
- Нелінійні часові паттерни явно присутні
- Достатньо даних (> 10 000 спостережень на інструмент)
LightGBM з відставленими ознаками часто перевищує LSTM на невеликих наборах даних. LSTM перемагає при многовимірних часових рядах (кілька інструментів одночасно) та складних перехресних залежностях між активами.
Архітектура моделі
Базова 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]
# Самозалежність за часовим виміром
attn_out, _ = self.attention(lstm_out, lstm_out, lstm_out)
# Останній крок або залежна від уваги пула
out = self.fc(self.dropout(attn_out[:, -1, :]))
return out
Вхідні дані (seq_len × n_features):
- OHLCV нормовані (стандартизація за кружними вікнами, не за всіма даними)
- Технічні індикатори: RSI, MACD, ATR, Bollinger
- Для мультиактиву: конкатенація за виміром ознак
Предварительна обробка та нормалізація
Критично: нормалізація без смещення lookahead:
# Неправильно: скейлер навчений на всьому наборі даних
scaler = StandardScaler().fit(X_all)
# Правильно: нормалізація в кружному вікні
def rolling_normalize(X, window=252):
mu = X.rolling(window).mean()
sigma = X.rolling(window).std()
return (X - mu) / (sigma + 1e-8)
Прибутковість цін замість цін: Сирі ціни нестаціонарні, логарифмічні прибутки стаціонарні:
returns = np.log(prices / prices.shift(1)).dropna()
Генерація послідовностей:
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]) # target: future return
return np.array(X), np.array(y)
Навчання та регуляризація
Гіперпараметри:
- Довжина послідовності: 20-60 днів для щоденних даних, 50-200 для почасових
- Скритий розмір: 64-256
- Шари: 2-3 (глибше зазвичай гірше для фінансових даних)
- Dropout: 0.1-0.4
- Розмір партії: 32-128
Регуляризація, специфічна для фінансів:
- Часовий dropout: маскування випадкових часових кроків у послідовності
- Шум ознак: додавання гаусівського шуму до вхідних ознак
- L2 вагова затримка: 1e-4 до 1e-3
Оптимізатор: AdamW з планувальником косинусного відпалу швидкості навчання. Рання зупинка по втраті валідації з 20% утримання.
Мультиактивна LSTM
Для портфеля з N інструментів — Cross-sectional LSTM:
# Паралельна обробка всіх інструментів
# x shape: [batch, seq_len, n_instruments × n_features]
# Або: окремий LSTM на інструмент + крос-увага між інструментами
Крос-увага між інструментами захоплює кореляційні паттерни: зростання нафти впливає на нафтові акції, коливання DXY впливають на активи EM.
Валідація без витоку даних
Прямування вперед з ембарго:
# Часовий розподіл поїзд/тест
embargo_size = horizon # N днів ембарго = горизонт прогнозу
train_end = int(0.6 * len(data))
embargo_end = train_end + embargo_size
val_end = int(0.8 * len(data))
# Між поїздом і вал — період ембарго, не використовується
Метрики:
- Спрямованість точності: % правильних прогнозів спрямованості
- IC (Інформаційний коефіцієнт): спірманова кореляція прогнозів та реальних прибутків
- ICIR: IC / std(IC) — стабільність IC > 1.5 вважається хорошою
LSTM vs. Transformer для фінансів
| Аспект | LSTM | Transformer |
|---|---|---|
| Довгі залежності | Добре | Відмінно |
| Швидкість навчання | Повільніше | Швидше |
| Потребує даних | Менше | Більше |
| Інтерпретованість | Низька | Середня (увага) |
| Затримка виробництва | Нижче | Вище |
Для коротких послідовностей (< 100 кроків) LSTM часто відповідає Transformer з суттєво меншими вимогами до даних.
Часовая шкала: LSTM базовий тренінг з одноактивом — 2-3 тижні. Мультиактивна модель з увагою, прямуванням валідації та трубопровідом виробництва — 8-10 тижнів.







