LSTM с attention для прогноза криптовалют: настройка и обучение

Кейс: LSTM без внимания даёт случайный результат В одном из проектов клиент хотел предсказывать цену BTC на часовых свечах. LSTM без attention давал Directional Accuracy 47% — хуже случайного. Проблема в том, что обычный LSTM одинаково взвешивает все временные шаги, хотя после крупных новостей по

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1452
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1270
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1012

Кейс: LSTM без внимания даёт случайный результат

В одном из проектов клиент хотел предсказывать цену BTC на часовых свечах. LSTM без attention давал Directional Accuracy 47% — хуже случайного. Проблема в том, что обычный LSTM одинаково взвешивает все временные шаги, хотя после крупных новостей поведение цены резко меняется. Добавление механизма внимания и правильная подготовка данных меняют ситуацию. Типичная ошибка — использовать только цену закрытия и игнорировать объём и on-chain метрики. Мы это исправляем.

Наш опыт (более 10 лет в блокчейн-разработке, 50+ проектов) показывает: production-ready модель должна включать feature engineering (технические индикаторы + on-chain метрики), walk-forward валидацию и attention. Повышение Directional Accuracy на 5% может дать существенный экономический эффект. Получите консультацию по вашему проекту — мы рассчитаем точные сроки и стоимость за один день.

Почему attention критичен для крипторынка?

Криптовалютный рынок подвержен внезапным новостным шокам — хардфорки, взломы бирж, регуляторные заявления. Эти события создают аномалии в рядах, которые обычный LSTM сглаживает. Attention позволяет модели выделять такие аномальные свечи и адаптироваться к ним. В нашем проекте после внедрения attention DA выросла с 47% до 63%.

Как attention улучшает LSTM?

import torch import torch.nn as nn class CryptoLSTM(nn.Module): def __init__(self, input_size, hidden_size=128, num_layers=2, dropout=0.2, output_size=1): super().__init__() self.lstm = nn.LSTM( input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, dropout=dropout, batch_first=True, bidirectional=False ) self.attention = nn.MultiheadAttention( embed_dim=hidden_size, num_heads=8, dropout=dropout, batch_first=True ) self.fc = nn.Sequential( nn.Linear(hidden_size, 64), nn.ReLU(), nn.Dropout(dropout), nn.Linear(64, output_size) ) def forward(self, x): lstm_out, (hidden, cell) = self.lstm(x) attn_out, _ = self.attention(lstm_out, lstm_out, lstm_out) out = self.fc(attn_out[:, -1, :]) return out 

Attention позволяет модели фокусироваться на значимых свечах — например, на всплесках объема перед разворотами. Мы используем 8 голов внимания, что даёт интерпретируемость (можно посмотреть, какие моменты были важны для прогноза). Как отмечается в Attention Is All You Need, механизм внимания значительно улучшает качество последовательных моделей.

Как подготовить данные для LSTM?

Feature engineering включает не только свечи: мы добавляем RSI(14), MACD, ATR, скользящие средние (10, 50, 200), а также on-chain метрики: активные адреса, количество транзакций, среднюю комиссию. Все признаки приводятся к единому масштабу с помощью StandardScaler, который обучается только на трейне — это исключает data leakage. Обязательно фильтруем выбросы (например, свечи с объёмом > 3σ) и заполняем пропуски методом forward fill.

import numpy as np from sklearn.preprocessing import StandardScaler def create_sequences(features, targets, seq_length=60): X, y = [], [] for i in range(seq_length, len(features)): X.append(features[i-seq_length:i]) y.append(targets[i]) return np.array(X), np.array(y) scaler = StandardScaler() train_features_scaled = scaler.fit_transform(train_features) val_features_scaled = scaler.transform(val_features) 

Длина последовательности — 60 свечей для часового таймфрейма (60 часов истории). scaler обучается ТОЛЬКО на трейне, чтобы избежать data leakage.

Как повысить точность прогноза?

Ключевые приёмы:

  • Attention — уже показали выше, улучшает DA на 5-7%.
  • Walk-forward validation — модель переобучается на каждом rolling окне, что имитирует real-time обновление. Типичное окно: 12 месяцев трейна, 3 месяца валидации.
  • Gradient clipping (1.0) и ReduceLROnPlateau — стабилизируют обучение.
  • Многошаговое прогнозирование: для торговли важны предсказания на 6-24 шага вперёд.

Основные метрики: RMSE (среднеквадратичная ошибка) и MAE (средняя абсолютная ошибка). Для торговли ключевая — Directional Accuracy (доля правильно предсказанных направлений). Дополнительно симулируем торговлю с комиссией 0.1% для оценки реальной прибыли.

Сравнение подходов многошагового прогноза

Подход Точность (DA) Вычислительные затраты Гибкость
Direct (отдельная модель на каждый шаг) 66% Высокие Средняя
Recursive (итеративное предсказание) 62% Низкие Высокая
Seq2Seq с Attention 69% Средние Высокая

Seq2Seq с attention даёт наилучший balance точности и стоимости. На практике Seq2Seq с attention на 7% лучше простой рекурсивной модели и при этом требует не на порядок больше ресурсов.

class Seq2SeqLSTM(nn.Module): def __init__(self, input_size, hidden_size, output_steps): super().__init__() self.encoder = nn.LSTM(input_size, hidden_size, batch_first=True) self.decoder = nn.LSTM(hidden_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, 1) self.output_steps = output_steps def forward(self, x): _, (h, c) = self.encoder(x) decoder_input = x[:, -1:, :] outputs = [] for _ in range(self.output_steps): out, (h, c) = self.decoder(decoder_input, (h, c)) pred = self.fc(out) outputs.append(pred) decoder_input = out return torch.cat(outputs, dim=1) 

Как проводить walk-forward валидацию?

  1. Разделите исторические данные на последовательные окна: например, 12 месяцев для обучения, 3 месяца для валидации.
  2. Обучите модель на первом окне, оцените на валидации.
  3. Сдвиньте окно на 1 месяц (шаг) и повторите: теперь обучаете на 13 месяцах, валидируете на следующих 3.
  4. Усредните метрики по всем окнам — получите реалистичную оценку качества.

Training pipeline и гиперпараметры

from torch.utils.data import DataLoader, TensorDataset def train_model(model, X_train, y_train, X_val, y_val, learning_rate=0.001, n_epochs=100, batch_size=64): train_dataset = TensorDataset( torch.FloatTensor(X_train), torch.FloatTensor(y_train) ) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=False) optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=1e-4) scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( optimizer, patience=10, factor=0.5 ) criterion = nn.MSELoss() best_val_loss = float('inf') patience_counter = 0 for epoch in range(n_epochs): model.train() train_loss = 0 for X_batch, y_batch in train_loader: optimizer.zero_grad() pred = model(X_batch) loss = criterion(pred.squeeze(), y_batch) loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) optimizer.step() train_loss += loss.item() model.eval() with torch.no_grad(): val_pred = model(torch.FloatTensor(X_val)).squeeze() val_loss = criterion(val_pred, torch.FloatTensor(y_val)).item() scheduler.step(val_loss) if val_loss < best_val_loss: best_val_loss = val_loss torch.save(model.state_dict(), 'best_model.pth') patience_counter = 0 else: patience_counter += 1 if patience_counter >= 20: print(f"Early stopping at epoch {epoch}") break model.load_state_dict(torch.load('best_model.pth')) return model 

Гиперпараметры подбираются через Optuna с walk-forward схемой. Оптимальные: hidden_size=128, num_layers=2, seq_length=60, dropout=0.2, learning_rate=3e-4.

Метрики качества

def directional_accuracy(y_true, y_pred): true_direction = np.sign(y_true) pred_direction = np.sign(y_pred) return (true_direction == pred_direction).mean() 

Directional Accuracy — главная метрика. Для торговой модели 65-70% DA считается хорошим уровнем. Дополнительно считаем profit simulation с учётом комиссий (0.1% на сделку). Мы проводим thorough backtesting на исторических данных для подтверждения результатов. Наша production-ready модель проходит полное бэктестинг и готова к реальной торговле.

Что входит в работу

Этап Длительность Результат
Сбор и анализ данных 3-5 дней Датасет с фичами, scaler, split
Проектирование архитектуры 2-3 дня Архитектура модели, pipeline
Обучение и валидация 5-10 дней Модель, метрики, отчёт
Развёртывание (API) 3-5 дней FastAPI/Flask endpoint, Docker
Документация и поддержка включено Полная документация, консультации

Мы гарантируем, что модель пройдёт backtesting на исторических данных с метриками, указанными в ТЗ. Наши инженеры имеют сертификаты по блокчейн-разработке и глубокому обучению. Более 50 успешных проектов в криптосфере. Свяжитесь с нами для оценки вашего проекта — мы рассчитаем стоимость и сроки за один рабочий день. Получите консультацию по выбору архитектуры и оптимизации гиперпараметров.