Разработка AI-модели на базе LSTM для временных рядов рынка
LSTM (Long Short-Term Memory) — рекуррентная архитектура с явным механизмом памяти: ячейки могут "помнить" паттерны через длинные последовательности. Для финансовых данных это позволяет улавливать зависимости, которые gradient boosting пропускает при работе только с агрегированными фичами.
Когда LSTM оправдан для финансовых данных
LSTM имеет смысл, когда:
- Последовательность событий важна, не только агрегаты
- Нелинейные временные паттерны явно присутствуют
- Есть достаточно данных (> 10 000 наблюдений на инструмент)
LightGBM с лаговыми фичами часто превосходит LSTM на небольших датасетах. LSTM выигрывает при многомерных временных рядах (multiple instruments simultaneously) и сложных cross-asset зависимостях.
Архитектура модели
Базовая 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
Preprocessing и нормализация
Критически важно: нормализация без lookahead bias:
# Неправильно: scaler обучен на всём датасете
scaler = StandardScaler().fit(X_all)
# Правильно: нормализация в 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]) # target: future return
return np.array(X), np.array(y)
Обучение и регуляризация
Hyperparameters:
- Sequence length: 20-60 дней для дневных данных, 50-200 для часовых
- Hidden size: 64-256
- Layers: 2-3 (глубже обычно хуже на финансовых данных)
- Dropout: 0.1-0.4
- Batch size: 32-128
Регуляризация специфично для финансов:
- Temporal dropout: маскирование случайных временных шагов в sequence
- Feature noise: добавление гауссовского шума к входным фичам
- L2 weight decay: 1e-4 to 1e-3
Оптимизатор: AdamW с cosine annealing learning rate scheduler. Ранняя остановка по validation loss на 20% holdout.
Multi-asset LSTM
Для портфеля из N инструментов — Cross-sectional LSTM:
# Параллельная обработка всех инструментов
# x shape: [batch, seq_len, n_instruments × n_features]
# Или: отдельный LSTM per instrument + cross-attention между инструментами
Cross-attention между инструментами захватывает корреляционные паттерны: рост нефти влияет на нефтяные акции, флуктуации DXY — на EM активы.
Валидация без data leakage
Walk-forward с embargo:
# Temporal train/test split
embargo_size = horizon # N дней embargo = горизонт прогноза
train_end = int(0.6 * len(data))
embargo_end = train_end + embargo_size
val_end = int(0.8 * len(data))
# Между train и val — embargo период, не используется
Метрики:
- Directional Accuracy: % правильных предсказаний направления
- IC (Information Coefficient): spearman correlation предсказаний и реальных returns
- ICIR: IC / std(IC) — стабильность IC > 1.5 считается хорошим
LSTM vs. Transformer для финансов
| Аспект | LSTM | Transformer |
|---|---|---|
| Длинные зависимости | Хорошо | Отлично |
| Скорость обучения | Медленнее | Быстрее |
| Данных нужно | Меньше | Больше |
| Интерпретируемость | Низкая | Средняя (attention) |
| Production latency | Ниже | Выше |
Для коротких последовательностей (< 100 шагов) LSTM часто не уступает Transformer при значительно меньших требованиях к данным.
Сроки: обучение LSTM baseline с single-asset — 2-3 недели. Multi-asset модель с attention, walk-forward validation и production pipeline — 8-10 недель.







