Отдельный ML-механизм для прогноза BTC от фиксированного времени на горизонтах +5, +10 и +15 минут.
Проект сделан отдельно от торгового бота и отдельно от Polymarket-модуля. Он не отправляет ордера и не строит автоторговлю. Его задача только одна: обучить модель на исторических 5m-данных BTC и выдавать вероятностный прогноз UP / DOWN на ближайшие 1, 2 и 3 пятиминутные свечи.
Почему базовый таймфрейм здесь именно 5m:
- Это совпадает с логикой 5-minute BTC Up/Down рынков.
- Для горизонтов
+5,+10,+15минут не нужен лишний шум1m. - Исторических 5m-данных локально у тебя заметно больше, чем 1m.
- Загружать локальные BTC OHLCV-данные из feather.
- Строить признаки по
5m, а также добавлять informative-фичи из15mи1h. - При наличии файлов автоматически добавлять:
- basis futures против Binance spot
- spread futures против mark price
- funding rate и его дельты
- cross-venue spread против Binance futures
- spread между mark price разных venues
- Калибровать вероятности после обучения, чтобы thresholds были ближе к реальной частоте успеха.
- Применять recency bias через
weight_factor, чтобы более свежие бары весили больше старых. - Работать с ternary target
DOWN / NO_EDGE / UP, а не только с бинарнымUP / DOWN. - Сравнивать preprocessing режимы:
baselinepcapca_di_svm
- Обучать regime-specific submodels поверх глобальной модели.
- Обучать три отдельные модели:
+5m+10m+15m
- Делать walk-forward оценку по времени, а не случайный shuffle.
- По умолчанию учиться на fixed rolling window
30d, а не на unlimited history. - Сравнивать окна
20d,30d,45dпротив expanding window. - Поддерживать optional microstructure-фичи:
open interesttaker buy/sell imbalanceliquidations- Сохранять модели и метрики в
artifacts/. - Сохранять out-of-sample fold predictions для анализа signal gate.
- Давать прогноз на конкретное время или на последний доступный закрытый 5m бар.
- Показывать свежесть модели и блокировать live-trading, если артефакт старше
expiration_hours. - Применять второй слой
signal gate:UP/DOWN/SKIP. - Применять regime filter поверх gate.
- Давать отдельную команду
polymarket-signalпод 5-minute BTC Up/Down market. - Перед web-прогнозом подтягивать свежие BTC данные с биржи и дописывать их в
feather. - Запускать отдельный локальный
data-updater-daemon. - При наличии existing pipeline опционально дергать его как внешний sync hook.
- Строить в web UI график вероятностей
UPпо времени. - Показывать
Опорная ценаиз PolymarketPrice to beat.
btc_short_horizon_ml/
├── README.md
├── requirements.txt
└── app/
├── __init__.py
├── config.py
├── data_loader.py
├── exceptions.py
├── features.py
├── main.py
├── modeling.py
├── models.py
├── polymarket_reference.py
├── predictor.py
├── regime.py
├── live_data.py
├── web.py
├── web_index.html
├── training.py
└── utils.py
Минимально нужны:
pandasnumpyscikit-learnlightgbmpyarrowjoblibfastapiuvicornccxt
У тебя они уже стоят в /Users/mac/trade/.venv.
Если хочешь отдельное окружение:
cd "/Users/mac/Documents/New project/btc_short_horizon_ml"
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtЕсли хочешь использовать уже существующее рабочее окружение:
source /Users/mac/trade/.venv/bin/activateПо умолчанию модуль использует:
- base futures 5m:
/Users/mac/trade/user_data/data/bitget/futures/BTC_USDT_USDT-5m-futures.feather - optional mark 5m:
/Users/mac/trade/user_data/data/bitget/futures/BTC_USDT_USDT-5m-mark.feather - optional funding 1h:
/Users/mac/trade/user_data/data/bitget/futures/BTC_USDT_USDT-1h-funding_rate.feather - optional Binance spot 5m:
/Users/mac/trade/user_data/data/binance/BTC_USDT-5m.feather - optional Binance futures 5m:
/Users/mac/trade/user_data/data/binance/futures/BTC_USDT_USDT-5m-futures.feather - optional Binance mark 1h:
/Users/mac/trade/user_data/data/binance/futures/BTC_USDT_USDT-1h-mark.feather - optional Binance funding 1h:
/Users/mac/trade/user_data/data/binance/futures/BTC_USDT_USDT-1h-funding_rate.feather - optional open interest:
путь задается через
--open-interest-data-path - optional taker buy/sell:
путь задается через
--taker-data-path - optional liquidations:
путь задается через
--liquidation-data-path
Можно передать свои пути через CLI.
Важно: funding loader автоматически определяет, в какой колонке реально лежит funding rate. Это нужно, потому что у некоторых бирж в feather-файлах funding записан в open, а close может быть нулевым.
Базовый запуск:
cd "/Users/mac/Documents/New project/btc_short_horizon_ml"
source /Users/mac/trade/.venv/bin/activate
python -m app.main trainТеперь этот запуск по умолчанию использует:
- fixed rolling window
30d weight_factor=0.9998live_retrain_hours=0.5expiration_hours=0.5test_days=5,step_days=5- ternary target
DOWN / NO_EDGE / UP preprocessing_mode=baseline
Полезный запуск с ограничением истории и своими окнами walk-forward:
python -m app.main train \
--max-rows 25000 \
--min-train-days 30 \
--max-train-days 30 \
--test-days 5 \
--step-days 5 \
--weight-factor 0.9998Пример fixed rolling window:
python -m app.main train \
--min-train-days 30 \
--max-train-days 30 \
--test-days 5 \
--step-days 5Если нужен expanding window:
python -m app.main train \
--min-train-days 30 \
--expanding-windowЕсли хочешь жестче давить свежие данные:
python -m app.main train \
--weight-factor 0.9997Если хочешь мягче:
python -m app.main train \
--weight-factor 0.9999Если хочешь включить ternary target явно и задать ширину зоны NO_EDGE:
python -m app.main train \
--no-edge-threshold 0.0005Если нужно вернуться к старому бинарному target:
python -m app.main train \
--binary-targetПараметры свежести модели:
python -m app.main train \
--live-retrain-hours 0.25 \
--expiration-hours 0.5Preprocessing-режимы:
python -m app.main train --preprocessing-mode baseline
python -m app.main train --preprocessing-mode pca
python -m app.main train --preprocessing-mode pca_di_svmЕсли нужно сравнить чисто базовый контур без calibration или без regime models:
python -m app.main train --disable-calibration --disable-regime-modelsПосле обучения появятся:
artifacts/model_bundle.joblibartifacts/metrics_summary.jsonartifacts/fold_predictions.feather
Последний доступный закрытый 5m бар:
python -m app.main predictКонкретное время:
python -m app.main predict --at "2026-03-08T08:35:00Z"Если время не совпадает с границей свечи, будет взят последний закрытый 5m бар не позже указанного времени.
Прогноз с gate:
python -m app.main predict --with-gateСвоими порогами:
python -m app.main predict \
--with-gate \
--primary-threshold 0.60 \
--support-threshold 0.60 \
--min-alignment-count 1Для каждого горизонта:
- вероятность
UP - вероятность
DOWN - вероятность
NO_EDGE, если модель считает движение слишком слабым - итоговое направление
- уровень уверенности
- опорную цену на момент прогноза
- целевое время горизонта
model_freshness, чтобы было видно, пора ли уже retrain или артефакт протух
Если включен --with-gate, дополнительно будет:
- итоговое решение
UP,DOWNилиSKIP - причина решения
- какие supportive horizon подтвердили сигнал
- consensus score
Готовый сигнал специально под 5-minute BTC Up/Down:
python -m app.main polymarket-signalДля конкретного времени:
python -m app.main polymarket-signal --at "2026-03-08T05:30:00Z"Команда возвращает:
- текущий regime snapshot
- raw horizon predictions
- итоговый
UP,DOWNилиSKIP - причину, почему сигнал пропущен или принят
Логика такая:
- сначала идет consensus gate по
5mс подтверждением от10m/15m - потом regime filter может дополнительно вырезать:
- весь
range, потому что там качество сигнала оказалось слабым volatile_trend_up, потому что в этом режиме short-horizon сигнал сейчас шумный- слишком слабый сигнал в
high_volatility - сигнал, который идет против выраженного trend regime без достаточного edge
- весь
Чтобы понять, какие пороги реально улучшают точность, а какие только режут покрытие:
python -m app.main gate-reportМожно ограничить отчет минимальным покрытием:
python -m app.main gate-report --min-coverage 0.12 --top 10Отчет показывает:
- baseline без gate
- лучшие одиночные threshold'ы по каждому горизонту
- лучшие consensus-комбинации для
primary=5mс поддержкой10m/15m - результат default regime-aware gate
- breakdown по режимам рынка
Чтобы сравнить свежие fixed windows против expanding:
python -m app.main window-reportСвоими окнами:
python -m app.main window-report --windows 20,30,45,expandingОкна 20d, 30d, 45d здесь основная рабочая сетка для short-horizon BTC. expanding оставлен для сравнения, а не как дефолт.
Сравнение preprocessing режимов поверх тех же окон:
python -m app.main window-report \
--windows 20,30,45 \
--preprocessing-modes baseline,pca,pca_di_svmОтчет показывает:
- какое окно дало лучший
accuracy - как меняются
5m,10m,15mметрики - где фиксированное окно лучше expanding
Можно поднять локальную страницу, где прогноз будет пересчитываться циклически, пока включен свитчер Прогноз:
cd "/Users/mac/Documents/New project/btc_short_horizon_ml"
source /Users/mac/trade/.venv/bin/activate
python -m app.main web --host 127.0.0.1 --port 8010 \
--polymarket-event auto-currentПосле запуска открой:
http://127.0.0.1:8010
Что делает web-режим:
- показывает итоговый
UP,DOWNилиSKIP - показывает raw-прогнозы на
5m,10m,15m - показывает regime snapshot и confidence primary сигнала
- показывает
Опорная ценаиз PolymarketPrice to beat - перед прогнозом пытается подтянуть свежие BTC данные с биржи
- пишет историю вероятностей в локальный график на странице
- пока свитчер включен, обновляет прогноз через выбранный интервал
- когда свитчер выключен, останавливает циклические запросы
Важно: web-интерфейс сам по себе не обновляет исходные feather-данные. Он только перечитывает локальные данные и пересчитывает прогноз. Поэтому live-режим будет действительно живым только если внешний data pipeline параллельно обновляет BTC-файлы.
Дополнительно в web-режиме включена защита от ложного live-прогноза: если последний доступный 5m бар отстает от текущего UTC-времени больше чем на 15 минут, /api/forecast вернет ошибку о том, что данные устарели. Это сделано специально, чтобы не рисовать прогноз «в будущее» от давно устаревшей рыночной точки.
Под капотом web-режим теперь умеет:
- напрямую подтягивать BTC
5mи1hданные изBitgetиBinanceчерезccxt - обновлять
base,mark,funding,spot,binance futures,binance mark,binance funding - использовать cooldown между sync, чтобы не спамить биржу на каждом опросе
- опционально дергать existing script:
/Users/mac/Documents/New project/trade_control/tools/freqai_dataset_incremental_sync.sh
Если нужен отдельный локальный процесс, который держит BTC feather-данные свежими независимо от web UI:
cd "/Users/mac/Documents/New project/btc_short_horizon_ml"
source /Users/mac/trade/.venv/bin/activate
python -m app.main data-updater-daemon --daemon-interval-seconds 60Что делает daemon:
- циклически обновляет BTC источники и пишет их в
feather - использует межпроцессный lock, чтобы web и daemon не писали файлы одновременно
- по таймеру может запускать existing pipeline hook, если он есть
Для daemon добавлен LaunchAgent:
- plist:
/Users/mac/Documents/New project/btc_short_horizon_ml/launchd/ai.trade.btc-short-horizon-ml-data-updater.plist - run script:
/Users/mac/Documents/New project/btc_short_horizon_ml/scripts/run_data_updater_daemon.sh - install script:
/Users/mac/Documents/New project/btc_short_horizon_ml/tools/install_data_updater_launchagent.sh - при установке launcher копируется в:
~/Library/Application Support/btc_short_horizon_ml/run_data_updater_daemon.sh
Установка и перезапуск:
bash "/Users/mac/Documents/New project/btc_short_horizon_ml/tools/install_data_updater_launchagent.sh"После установки LaunchAgent будет:
- стартовать при логине
- автоматически перезапускаться при падении
- писать логи в:
/Users/mac/Documents/New project/btc_short_horizon_ml/runtime/launchd/ - запускаться через копию launcher-скрипта из
Application Support, чтобы обойти macOS-ограничение на прямой запуск background-скриптов изDocuments
Если нужно передать кастомные аргументы daemon, можно задать env:
export BTC_SHORT_HORIZON_ML_DAEMON_ARGS="--daemon-interval-seconds 30 --sync-cooldown-seconds 20"и потом перезагрузить LaunchAgent через install script.
- Probability calibration помогает сделать
0.58,0.60,0.65более честными порогами вероятности. - Extra market features добавляют не только OHLCV, но и funding/basis/cross-venue spread.
- Regime-specific submodels позволяют не заставлять один и тот же классификатор одинаково работать в
range,trendиhigh_volatility. - Window report помогает не переоценивать старую историю, если свежий rolling window реально работает лучше.
Если модель показывает:
UP probability = 0.74DOWN probability = 0.26confidence = 0.48
Это значит, что на данном историческом паттерне модель считает более вероятным сценарий close_future >= close_now на выбранном горизонте.
Это не гарантирует результат и не является торговой рекомендацией.
Точного ответа без walk-forward нет. На практике:
+5mобычно самый шумный+10mчасто дает лучший баланс между скоростью и стабильностью+15mиногда выигрывает по качеству сигнала, но медленнее реагирует
Этот модуль специально считает out-of-sample метрики отдельно для +5m, +10m, +15m, чтобы не гадать.
- Модель обучается только на том диапазоне истории, который есть локально.
- Если история короткая, качество walk-forward будет ограниченным.
- При смене биржи, режима рынка или микроструктуры модель нужно переобучать.
- Это infrastructure/research tool, а не стратегия автоторговли.
Модуль не обещает прибыль, не гарантирует точность и не заменяет риск-менеджмент. Используй его как исследовательский инструмент для проверки гипотез и вероятностной оценки направления BTC на ближайшие 5-15 минут.