Разработка AI-модели на базе LSTM для временных рядов рынка

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка AI-модели на базе LSTM для временных рядов рынка
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

Разработка 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 недель.