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
    1011

Кейс: 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 дає найкращий баланс точності та вартості. На практиці 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 успішних проектів у криптосфері. Зв'яжіться з нами для оцінки вашого проекту — ми розрахуємо вартість та терміни за один робочий день. Отримайте консультацію щодо вибору архітектури та оптимізації гіперпараметрів.