КейсPaper trading

AI-трейдинг-бот на Bybit с классификатором рыночных режимов

XGBoost-классификатор направления BTC/USDT поверх K-Means-детектора рыночных режимов. Сейчас в paper trading на VDS, снимаю метрики.

Клиент
Собственный R&D-проект
Дата
18 марта 2026 г.
Срок
24 дней

Метрики

МетрикаДоПосле
Accuracy на out-of-sample53.8%
Profit factor (paper)1.34
Максимальная просадка9.1%
Latency на сигнал≈ 1.2 с

Зачем всё это

Мне интересно, насколько классический ML способен держаться в стороне от "святого грааля" на крипторынке и при этом давать стабильную эдж-комбинацию. Цель проекта — не максимизировать доходность, а построить честную инженерную петлю: данные → фичи → модель → сигнал → исполнение → мониторинг — и проверять гипотезы без иллюзий.

Что сделал

Данные. Качаю 1h-свечи BTC/USDT с Bybit через ccxt, храню в локальной SQLite. Отдельный скрипт раз в час добирает новые бары и докидывает производные фичи: логарифмические доходности на нескольких таймфреймах, ATR, ADX, RSI, относительный объём, расстояние до ближайших уровней Bollinger.

Режимы рынка. На agg-фичах кручу KMeans с 4 кластерами: "тренд вверх", "тренд вниз", "низкая волатильность", "шум/разворот". Метка режима добавляется к каждой свече и становится one-hot фичей для основной модели. Это простое разделение, но оно заметно чистит предсказания модели от режима "боковик на низкой вол", где почти любая модель превращается в генератор шума.

Классификатор. XGBClassifier с бинарной целью — вырастет ли цена на горизонте 4h выше порога 0.3 × ATR. Подбирал гиперпараметры через optuna, валидация — time-series split без шафла. Модель переобучается раз в сутки по крону, метрики пишу в JSON-лог.

Исполнение. В paper-режиме: на каждом сигнале открываю виртуальную позицию с фиксированным риском 1% на сделку, стоп по 2 × ATR, тейк по 3 × ATR. Журнал сделок и equity-кривую отрисовывает отдельный дашборд на Streamlit.

Оповещения и эксплуатация. Telegram-бот на aiogram шлёт алерты: новый сигнал, закрытая сделка, ежедневный отчёт, ошибка в пайплайне. Всё крутится как systemd-unit на Ubuntu 24.04, логи — через journalctl, перезапуск при падении автоматический.

Результат на момент публикации

Модель в paper-режиме с начала марта. Показывать цифры из бэктеста я считаю бесполезным — ими легко соврать самому себе, особенно без учёта комиссий и проскальзывания. Поэтому ниже — метрики только по живому paper-логу.

  • Out-of-sample accuracy модели — 53.8%. Для бинарной классификации на криптоданных это скромно, но выше 50%.
  • Profit factor с учётом комиссий Bybit — 1.34.
  • Максимальная просадка по equity — 9.1%.
  • Среднее время от закрытия свечи до отправки сигнала — около 1.2 секунды.

Сейчас собираю данные ещё 1–2 месяца, потом решаю: либо переходим на микродепо с реальным капиталом, либо закрываю гипотезу и иду искать следующую.

Что было сложно

  • Утечки фич. В первой версии я случайно использовал будущий ATR при построении метки. На бэктесте получался profit factor 2.8, в paper-режиме — ~0.9. Чистое напоминание, почему time-series split и повторная валидация не пустая формальность.
  • Рестарт после обновлений. systemd-unit первую неделю падал с Timeout из-за долгой инициализации ccxt при плохой связи с биржей. Починил через отдельный healthcheck-скрипт и Restart=on-failure с бэкоффом.
  • Память под XGBoost. Обучение на 3 годах часовок выело 2 ГБ при подборе гиперпараметров. Вынес optuna в отдельный worker с лимитом по памяти, чтобы не конкурировать с live-инференсом.

Стек

Python 3.12 · XGBoost · scikit-learn · pandas · ccxt · Bybit API · aiogram · Streamlit · SQLite · systemd · Ubuntu 24.04 VDS

Что дальше

  • Добавить второй актив (ETH/USDT) и проверить, переносится ли модель.
  • Включить учёт funding-ставок в метрику сделки.
  • Попробовать трансформерную модель поверх тех же фич и сравнить на честном out-of-sample.

Стек

Python 3.12XGBoostscikit-learnpandasccxtBybit APIaiogramsystemdUbuntu 24.04

Нужно похожее?

Напишите задачу в двух предложениях — отвечу в течение часа.

Обсудить проект