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







