Реализация AI-прогнозирования цен криптовалют в мобильном приложении
Честное предупреждение: предсказание цен криптовалют — задача с высоким шумом. Академические работы показывают accuracy 54–60% на направление движения для LSTM моделей на BTC — это немного лучше случайного угадывания. Ценность системы не в точности предсказания, а в том, что она обрабатывает больше сигналов быстрее, чем человек вручную.
Данные: что берём за основу
OHLCV через CCXT
ccxt — Python библиотека с единым API для 100+ бирж. Стандарт для получения исторических данных:
import ccxt
import pandas as pd
exchange = ccxt.binance()
ohlcv = exchange.fetch_ohlcv(
symbol="BTC/USDT",
timeframe="1h",
since=exchange.parse8601("2023-01-01T00:00:00Z"),
limit=1000
)
df = pd.DataFrame(ohlcv, columns=["timestamp", "open", "high", "low", "close", "volume"])
df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
Binance отдаёт до 1000 свечей за запрос. Для полной истории — пагинация через since параметр.
On-chain данные
Для BTC и ETH on-chain метрики добавляют сигналы, которых нет в OHLCV:
- Glassnode API: SOPR (Spent Output Profit Ratio), NVT, NUPL, Exchange Net Flow. Платный, но есть бесплатный тир с дневными данными
- Etherscan API: объём транзакций, gas fees, активные адреса
- CoinGecko / CoinMarketCap: market cap, dominance, total market volume
import requests
class GlassnodeCollector:
BASE_URL = "https://api.glassnode.com/v1/metrics"
def get_sopr(self, api_key: str, since: int, until: int) -> pd.DataFrame:
response = requests.get(
f"{self.BASE_URL}/indicators/sopr",
params={
"a": "BTC",
"i": "24h",
"s": since,
"u": until,
"api_key": api_key
}
)
data = response.json()
return pd.DataFrame(data).rename(columns={"t": "timestamp", "v": "sopr"})
SOPR > 1 на рынке в рост = держатели продают в прибыль. SOPR < 1 на падении = капитуляция. Это дополнительный контекст для ML-модели.
Технические индикаторы как фичи
Сырые OHLCV → технические индикаторы через pandas-ta или ta-lib:
import pandas_ta as ta
df.ta.rsi(length=14, append=True) # RSI_14
df.ta.macd(append=True) # MACD_12_26_9, MACDh, MACDs
df.ta.bbands(length=20, append=True) # BBL, BBM, BBU, BBB, BBP
df.ta.atr(length=14, append=True) # ATRr_14
df.ta.obv(append=True) # OBV
df.ta.vwap(append=True) # VWAP_D
Важно: все индикаторы нормализуем. RSI уже в [0, 100]. MACD — нормализуем Z-score или min-max по скользящему окну. Сырые цены в модель не подаём — даём returns (процентное изменение) и нормализованные фичи.
Модели: сравнение подходов
LSTM для временных рядов
Стандартный выбор. Принимает последовательность из N свечей, предсказывает следующую:
import tensorflow as tf
def build_lstm_model(sequence_length: int, n_features: int) -> tf.keras.Model:
inputs = tf.keras.Input(shape=(sequence_length, n_features))
x = tf.keras.layers.LSTM(128, return_sequences=True, dropout=0.2)(inputs)
x = tf.keras.layers.LSTM(64, dropout=0.2)(x)
x = tf.keras.layers.Dense(32, activation="relu")(x)
# Предсказываем направление (классификация) или return (регрессия)
outputs = tf.keras.layers.Dense(3, activation="softmax")(x) # up/down/sideways
return tf.keras.Model(inputs, outputs)
Классификация направления (up/down/sideways) надёжнее регрессии точной цены. Метрика — accuracy и F1 на out-of-sample данных.
Temporal Fusion Transformer (TFT)
TFT от Google — state-of-the-art для финансовых временных рядов. Поддерживает несколько временных горизонтов, static и dynamic covariates, интерпретируемость через attention. Реализован в pytorch-forecasting. Тяжелее LSTM, но точнее при правильно подготовленных данных.
XGBoost как baseline
Не недооценивайте gradient boosting на правильных фичах. XGBoost без temporal context часто конкурирует с LSTM. Быстро обучается, легко конвертируется в TFLite. Отличный baseline для сравнения.
| Модель | Преимущества | Недостатки |
|---|---|---|
| LSTM | Учитывает временной контекст | Медленное обучение, много данных |
| TFT | Интерпретируемость, точность | Сложная конфигурация |
| XGBoost | Скорость, простота | Нет temporal memory |
| Ensemble | Компенсация слабостей | Сложнее деплой |
Деплой в мобильном приложении
Инференс — на сервере. Модель принимает 168 часовых свечей (7 дней), возвращает вероятности направления на 4/8/24 часа. REST endpoint с кешированием: прогноз пересчитывается раз в час.
На мобиле — только отображение результата:
struct PricePrediction: Codable {
let symbol: String
let horizon4h: PredictionOutcome
let horizon8h: PredictionOutcome
let horizon24h: PredictionOutcome
let updatedAt: Date
}
struct PredictionOutcome: Codable {
let direction: String // "up", "down", "sideways"
let probability: Double // 0.0 - 1.0
let confidenceInterval: ClosedRange<Double> // ценовой диапазон
}
Доверительный интервал (quantile regression) показывает диапазон вместо точечного предсказания. «BTC через 24ч: 55 000–61 000 USDT с вероятностью 70%» — честнее, чем «57 432 USDT».
Мониторинг деградации модели
Криптовалютный рынок меняется: bull/bear режимы, новые активы, регуляторные события. Модель, обученная на бычьем рынке 2021 года, плохо работает в 2022 году.
Метрики мониторинга:
- rolling accuracy за последние 30 дней
- distribution shift входных фич (KL-дивергенция train vs recent data)
- Sharpe ratio если используется в торговле
При degrade (accuracy упала на 5%+ от baseline) — автоматическое переобучение на свежих данных.
Дисклеймер
В приложении обязательно: «Прогнозы носят информационный характер. Прошлая точность не гарантирует будущей. Не является инвестиционной рекомендацией.»
Процесс работы
Сбор и очистка данных (OHLCV + on-chain). Feature engineering и normalization. Обучение и валидация нескольких моделей. Выбор лучшей, конвертация и деплой API. Мобильный UI: график с прогнозом, доверительный интервал. Настройка мониторинга и автопереобучения.
Ориентиры по срокам
LSTM-модель с базовым набором фич и мобильным дашбордом — 2–4 недели. Ансамбль с on-chain данными, multi-horizon прогнозом и мониторингом — 5–10 недель.







