Разработка AI-модели на базе Transformer для финансовых данных
Transformer-архитектуры, изменившие NLP, пришли в финансовый ML с 2019-2020 годов. Механизм self-attention позволяет модели явно фокусироваться на разных временных точках истории при формировании прогноза. Для финансовых данных это ценно: кризис 2008 года может быть релевантен сегодня, несмотря на 15-летний временной разрыв.
Архитектура финансового Transformer
Базовый Vanilla Transformer для временных рядов:
import torch
import torch.nn as nn
class FinancialTransformer(nn.Module):
def __init__(self, d_model=256, nhead=8, num_layers=4,
dim_feedforward=512, dropout=0.1, seq_len=60):
super().__init__()
self.input_projection = nn.Linear(n_features, d_model)
self.pos_encoding = PositionalEncoding(d_model, dropout)
encoder_layer = nn.TransformerEncoderLayer(
d_model=d_model, nhead=nhead,
dim_feedforward=dim_feedforward,
dropout=dropout, batch_first=True
)
self.transformer = nn.TransformerEncoder(encoder_layer, num_layers)
self.output_head = nn.Linear(d_model, 1)
def forward(self, x, src_mask=None):
x = self.input_projection(x)
x = self.pos_encoding(x)
x = self.transformer(x, mask=src_mask)
return self.output_head(x[:, -1, :])
Causal masking: важно для финансового Transformer — будущие данные не должны влиять на текущий шаг. Upper-triangular mask обеспечивает это автоматически.
Специализированные финансовые Transformer
Temporal Fusion Transformer (TFT): Разработан специально для задач прогнозирования временных рядов:
- Gate Recurrent Unit (GRU) для обработки локальных паттернов
- Variable Selection Network: автоматический отбор релевантных признаков
- Multi-head attention для долгосрочных зависимостей
- Выдаёт квантильные прогнозы (p10/p50/p90)
from pytorch_forecasting import TemporalFusionTransformer, TimeSeriesDataSet
training = TimeSeriesDataSet(
data,
time_idx="time_idx",
target="return",
group_ids=["ticker"],
max_encoder_length=60,
max_prediction_length=5,
time_varying_known_reals=["vix", "dollar_index", "yield_10y"],
time_varying_unknown_reals=["return", "volume", "rsi", "atr"],
)
tft = TemporalFusionTransformer.from_dataset(training)
Informer: оптимизирован для длинных последовательностей через sparse attention O(L log L) вместо O(L²). Полезен для high-frequency данных с контекстом 500-1000 шагов.
PatchTST (2023): разбивает временной ряд на patches (аналог токенов в BERT). Self-supervised предобучение + fine-tuning. State-of-the-art на многих бенчмарках.
Multi-modal Transformer для финансов
Сила Transformer — fusion разных типов данных:
News + Price Transformer:
News embeddings (BERT/FinBERT) ──┐
├→ Cross-attention → Output
Price sequence embeddings ────────┘
FinBERT (дообученный на финансовых текстах) кодирует новости в 768-мерные векторы. Cross-attention позволяет модели "смотреть" на какие новости релевантны в момент конкретного ценового паттерна.
Cross-asset Transformer: Одновременная обработка 50-500 инструментов:
- Каждый инструмент = токен
- Attention across instruments = рыночные корреляции
- Temporal attention = история каждого инструмента
Обучение и регуляризация
Pre-training: masked prediction на большом корпусе финансовых данных (200+ инструментов за 10+ лет) → fine-tuning на конкретной задаче. Значительно улучшает generalization при малом объёме целевых данных.
Regularization:
- Dropout: 0.1-0.3 в attention и FFN слоях
- Weight decay: 1e-4 (AdamW по умолчанию)
- Label smoothing: 0.1 для классификации направления
- Mixup: интерполяция между обучающими примерами
Learning rate schedule:
# Warmup + cosine decay
def lr_lambda(step):
if step < warmup_steps:
return step / warmup_steps
progress = (step - warmup_steps) / (total_steps - warmup_steps)
return 0.5 * (1 + math.cos(math.pi * progress))
Интерпретация через Attention
Visualization attention weights даёт инсайт в "мышление" модели:
- Высокий attention к точкам 20-25 дней назад → модель реагирует на месячный паттерн
- Attention spike на конкретную дату → события того периода важны для прогноза
Variable Importance (из TFT): TFT выдаёт явные веса важности входных переменных через Variable Selection Network. Практический пример: 30-дневная доходность получает вес 0.25, VIX — 0.18, объём — 0.12.
Production Considerations
Inference latency:
- Transformer с seq_len=60, d_model=256: ~5-15 мс на CPU, < 1 мс на GPU
- Для HFT неприемлемо, для дневной/часовой торговли — нормально
Model size:
- TFT с базовыми параметрами: ~5-20M параметров
- ONNX export + quantization (int8): ускорение inference в 2-4×
Updating: Онлайн fine-tuning на новых данных каждые 4-8 недель. Полное переобучение при значительном regime change (VIX > 35, корреляционный breakdown).
Сроки: TFT baseline для single-asset прогноза — 3-4 недели. Multi-asset Cross-Transformer с news fusion и pre-training — 3-5 месяцев.







