Розробка AI-моделі на базі LSTM для часових рядів ринку

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка AI-моделі на базі LSTM для часових рядів ринку
Середній
~3-5 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1197
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Розробка 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 тижнів.