AI-трейдинг-бот на Bybit с классификатором рыночных режимов
XGBoost-классификатор направления BTC/USDT поверх K-Means-детектора рыночных режимов. Сейчас в paper trading на VDS, снимаю метрики.
- Клиент
- Собственный R&D-проект
- Дата
- 18 марта 2026 г.
- Срок
- 24 дней
Метрики
| Метрика | До | После |
|---|---|---|
| Accuracy на out-of-sample | — | 53.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.
Стек
Нужно похожее?
Напишите задачу в двух предложениях — отвечу в течение часа.