BTCUSDT • XGBoost • Daily/Hourly forecast runtime
Аккуратный runtime для загрузки свечей Binance, расчёта вероятностного прогноза по BTC и публикации отчёта в stdout или Telegram.
Бот не торгует и не переобучает модель на лету: он использует подготовленные артефакты, применяет decision layer и сохраняет историю прогнозов.
- Загружает OHLCV-свечи Binance через REST
klines. - Валидирует структуру данных и шаг по времени.
- Собирает признаки, совместимые с обученной XGBoost-моделью.
- Загружает
artifacts/model.pklи runtime-конфиг артефактов. - Возвращает вероятности
UP / DOWN / UNSUREчерезpredict_proba. - Применяет лёгкий decision layer и порог уверенности.
- Печатает отчёт в stdout.
- Опционально отправляет этот же отчёт в Telegram.
- Сохраняет историю запусков в
logs/forecast_history.jsonl.
flowchart TD
binance["Binance REST klines"] --> validate["Валидация данных"]
validate --> features["Подготовка признаков"]
features --> model["Загрузка artifacts/model.pkl"]
model --> predict["Расчёт вероятностей"]
predict --> decision["Decision layer"]
decision --> console["Отчёт в консоль"]
decision --> telegram["Отчёт в Telegram"]
decision --> history["История в forecast_history.jsonl"]
run_daily_bot.pyзапускает runtime и собирает настройки из environment variables и JSON-артефактов.app.binance_loaderзагружает свежие свечи Binance и проверяет целостность OHLCV-данных.app.predictorстроит feature frame, загружает сериализованную модель и считает вероятности.app.reporterформатирует человекочитаемый отчёт и при необходимости отправляет Telegram-сообщение.app.runtimeдописывает результат вlogs/forecast_history.jsonl.
.
├── app/
│ ├── binance_loader.py
│ ├── predictor.py
│ ├── reporter.py
│ ├── runtime.py
│ └── settings.py
├── artifacts/
│ ├── decision_config.json
│ ├── feature_columns.json
│ ├── model.json
│ ├── model_meta.json
│ └── training_config.json
├── tests/
├── .env.example
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── run_daily_bot.py
└── run_daily_boy.py
run_daily_boy.py оставлен только как compatibility wrapper. Основной entrypoint: run_daily_bot.py.
В artifacts/ runtime ожидает такие файлы:
model.pkl- сериализованная модель, совместимая сjoblib.load.feature_columns.json- упорядоченный список колонок, которые ожидает модель.model_meta.json- метаданные модели, включаяsymbol,timeframeиmodel_version.training_config.json- training/runtime-параметры вродеexpected_freqиlookback_bars.decision_config.json- настройки decision layer и репортинга.
Важно: в репозитории сейчас лежат JSON-метаданные и legacy model.json, но сам runtime работает в fail-fast режиме и требует валидный model.pkl.
Поддерживаются такие переменные:
ARTIFACTS_DIR=artifactsTELEGRAM_ENABLED=falseTELEGRAM_BOT_TOKEN=TELEGRAM_CHAT_ID=BINANCE_SYMBOL=BTCUSDTBINANCE_INTERVAL=1hLOOKBACK_BARS=500DECISION_MARGIN=0.10REQUEST_TIMEOUT_SECONDS=20LOG_LEVEL=INFODRY_RUN=falseTZ=UTCUSE_CLOSED_CANDLE_ONLY=true
Приоритет такой:
- Значения из environment variables.
- Значения из
decision_config.json,training_config.jsonиmodel_meta.json. - Безопасные runtime defaults.
Пример .env:
ARTIFACTS_DIR=artifacts
TELEGRAM_ENABLED=false
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=
BINANCE_SYMBOL=BTCUSDT
BINANCE_INTERVAL=1h
LOOKBACK_BARS=500
DECISION_MARGIN=0.10
REQUEST_TIMEOUT_SECONDS=20
LOG_LEVEL=INFO
DRY_RUN=false
TZ=UTC
USE_CLOSED_CANDLE_ONLY=true- Создать виртуальное окружение и установить зависимости:
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt- Подготовить переменные окружения:
cp .env.example .env- Экспортировать переменные и запустить бота:
set -a
. ./.env
set +a
python run_daily_bot.pyЕсли Telegram credentials не заданы или TELEGRAM_ENABLED=false, бот не падает и просто пропускает отправку.
Сборка образа:
docker build -t btc-daily-bot .Запуск контейнера:
docker run --rm --env-file .env -v "$(pwd)/artifacts:/app/artifacts:ro" -v "$(pwd)/logs:/app/logs" btc-daily-botcp .env.example .env
docker compose up --build bot2026-04-17 08:00:00,000 INFO __main__ Starting BTC analyzer: symbol=BTCUSDT timeframe=1h lookback=500 dry_run=False
2026-04-17 08:00:01,234 INFO __main__ Loading market data from Binance
2026-04-17 08:00:02,345 INFO predictor Loading model artifact from artifacts/model.pkl
============================================================
BTC Daily Outlook
Symbol: BTCUSDT
Timeframe: 1h
Forecast time: 2026-04-17T08:00:02.500000+00:00
Model version: btc_h1_xgb_v1
Probabilities:
- UP: 41.20%
- DOWN: 27.35%
- UNSURE: 31.45%
Decision: UP
Confidence: 9.75%
Market context:
- Phase: bullish
- Volatility: normal
- Momentum: positive
============================================================
- Оставьте
TELEGRAM_ENABLED=false, чтобы бот работал только через stdout и всё равно писал историю вlogs/forecast_history.jsonl. - Установите
TELEGRAM_ENABLED=trueвместе сTELEGRAM_BOT_TOKENиTELEGRAM_CHAT_ID, чтобы включить отправку в Telegram. - Если Telegram включён, но credentials не заданы, runtime пропустит отправку и оставит warning в логах вместо падения.
- Экспортировать новую обученную модель в
artifacts/model.pkl. - Обновить
artifacts/feature_columns.json, если поменялся feature set. - Обновить
artifacts/model_meta.jsonс новойmodel_version. - При необходимости скорректировать
artifacts/training_config.json. - При необходимости скорректировать
artifacts/decision_config.json.
После этого можно перезапустить бота без изменения application code.
GitHub Actions запускается на каждом push в main и на pull_request в main.
- Python 3.11 поднимается через
actions/setup-python. - Зависимости ставятся из
requirements.txtс кэшемpip. - Дополнительно выполняется лёгкая syntax-проверка через
python -m compileall. - Затем запускается тестовый набор через
pytest -q.
Файл workflow: .github/workflows/ci.yml.