Пример торгового бота на Python.
Project description
Trading Bot
Этот репозиторий содержит пример торгового бота на Python. Для запуска необходимы файлы config.json и .env с ключами API.
Бот также умеет запрашивать анализ у GPT‑сервиса через модуль gpt_client.
Ответ ожидается в формате JSON:
{"signal": "buy", "tp_mult": 1.2, "sl_mult": 0.8}
где signal — рекомендация (buy, sell или hold), а tp_mult и sl_mult
задают множители для расчёта тейк‑профита и стоп‑лосса.
Disclaimer: This project is provided for educational purposes only and does not constitute financial advice. Use at your own risk.
Зависимости
Основные пакеты устанавливаются из requirements.txt и включают, например,
Flask для веб‑сервисов, pandas, numpy, httpx, psutil и scipy.
GPU-зависимости вынесены в отдельный файл requirements-gpu.txt и устанавливаются при необходимости.
Дополнительные библиотеки используются только для расширенного функционала и
устанавливаются при необходимости:
polars— работа с данными в формате Polars приuse_polars=True;websockets— потоковые обновления котировок;ta— расчёт технических индикаторов;ray— распределённые вычисления и оптимизация параметров;numba— ускорение критичных участков кода;python-telegram-bot— отправка уведомлений в Telegram.
При отсутствии любой из этих опциональных зависимостей соответствующие функции
недоступны и выдадут ошибку уровня error в логах.
Работа с паролями
Модуль password_utils.py предоставляет функции hash_password и
verify_password, использующие библиотеку bcrypt. Пароли короче
8 символов, длиннее 64 символов или не содержащие цифр, букв разных
регистров и спецсимволов приводят к ValueError.
Быстрый старт
-
Установите зависимости:
python3 -m venv venv source venv/bin/activate python -m pip install -r requirements.txt # Дополнительно для GPU python -m pip install -r requirements-gpu.txt # Зависимости для тестов ./scripts/install-test-deps.sh # С GPU-зависимостями INSTALL_GPU_DEPS=1 ./scripts/install-test-deps.sh
Пакет
Flaskустанавливается изrequirements.txtи необходим для работы HTTP‑сервисов. Если вы устанавливаете зависимости вручную, добавьтеpip install flask. В CI применяются только стандартные колёса PyTorch без поддержки CUDA. Если вам нужна GPU‑сборка с CUDA 12.4, установите PyTorch отдельно, указав дополнительный индекс:pip install torch>=2.7.1 --extra-index-url https://download.pytorch.org/whl/cu124
Эта команда ставит версии с поддержкой CUDA 12.4. Выполните её до
python -m pip install -r requirements.txt -r requirements-gpu.txt(или вместо него, если остальные зависимости уже установлены). Эта утилита устанавливает пакеты, необходимые для запуска тестов. Выполните её передpytest, чтобы все проверки прошли успешно. Файлrequirements-gpu.txtуже включаетcupy-cuda12xдля систем с CUDA 12.x. Системы без GPU могут пропустить этот шаг и использовать толькоrequirements.txt
- После обновления зависимостей пакет
optuna-integration[botorch]больше не используется. - Библиотека
catalystзакреплена на версии21.4, так как новые версии не устанавливаются сpip>=24.1. Если требуетсяcatalyst>=22.2, понизьтеpipниже 24.1.
-
Отредактируйте файл
.env, указав в нём свои значения. При запуске основные скрипты вызываютload_dotenv()из библиотекиpython-dotenv, поэтому переменные из файла подхватываются автоматически. При необходимости задайте торговую пару через переменнуюSYMBOL(по умолчанию используетсяBTCUSDT). Через переменнуюHOSTможно задать адрес, на котором запускаются сервисы Flask. ПеременнаяSERVICE_SCHEMEпозволяет выбрать схему (httpилиhttps) для автоматического формирования URL сервисов (по умолчанию используетсяhttp). Для безопасности сервисmodel_builderпо умолчанию слушает127.0.0.1; чтобы открыть его наружу, укажите явное значение, напримерHOST=0.0.0.0. ПеременнаяLOG_LEVELзадаёт уровень логирования (например,DEBUG,INFO,WARNING), аLOG_DIRопределяет каталог для файлов логов. После инициализации бот не печатаетINFO‑сообщения при обычной работе. Для подробного вывода запустите контейнеры сLOG_LEVEL=DEBUG:LOG_LEVEL=DEBUG docker compose -f docker-compose.yml -f docker-compose.cpu.yml up --build
Непрерывный вывод смотрите в файлах внутри
./logs/.Дополнительные переменные для вспомогательных сервисов:
-
STREAM_SYMBOLS— список пар через запятую, которыеdata_handler_serviceобновляет в фоне. -
CACHE_TTLиUPDATE_INTERVAL— время жизни кэша OHLCV и интервал фонового обновления (в секундах). -
MODEL_DIR— каталог, гдеmodel_builder_serviceхранит обученные модели по символам. -
BYBIT_API_KEYиBYBIT_API_SECRET— ключи API. Их читают какtrade_manager_service, так иdata_handler_service, поэтому укажите их для обоих контейнеров. ПеременныеTELEGRAM_BOT_TOKENиTELEGRAM_CHAT_IDнужны для уведомлений. Убедитесь, что все значения доступны сервисам, например черезenv_file: .envили секциюenvironment:вdocker-compose.yml.DataHandlerиTradeManagerпроверяют эти переменные при запуске и выводят предупреждение, если они отсутствуют. В этом случае Telegram уведомления отправляться не будут. -
TRADE_RISK_USD— величина риска в долларах для расчёта размера позиции, если/open_positionполучает толькоprice. -
GPT_MODEL— имя модели (по умолчаниюopenai/gpt-oss-20b). Модель загружается лениво при запуске сервера, поэтому первые запросы к API могут получать код503, пока загрузка не завершена. -
API_KEYS— список токенов через запятую для доступа к серверу FastAPI. Каждый запрос должен передавать заголовокAuthorization: Bearer <token>, иначе сервер вернёт401. -
HF_COMMIT_SHA— хеш коммита модели (например,10e9d713f8e4a9281c59c40be6c58537480635ea). Переменная обязательна и передаётся в параметрrevisionпри загрузке модели; без неё сервис не запустится. -
GPT_OSS_API— базовый адрес сервиса GPT OSS (без суффикса/completions), к которому обращаются функцииquery_gptиquery_gpt_async. Переменная обязательна; при её отсутствии эти функции завершатся ошибкой. Например:from bot.gpt_client import query_gpt result = query_gpt("Что ты видишь в этом коде:\n" + open("strategy_optimizer.py").read()) print(result)
-
GPT_OSS_WAIT_TIMEOUT— время ожидания запуска сервера GPT OSS в секундах (по умолчанию30). -
GPT_OSS_TIMEOUT— таймаут запроса к GPT OSS API в секундах (по умолчанию5). Используется функциямиquery_gptиquery_gpt_async.
В
docker-compose.ymlтеперь есть сервисgptoss, запускающий образghcr.io/openaccess-ai-collective/gpt-oss:cpu-latestна порту8003(внутри контейнера используется порт8000). Сервисbotзависит от него и получает переменнуюGPT_OSS_API=http://localhost:8003. Для кеширования моделей контейнеруgptossтребуется переменнаяTRANSFORMERS_CACHE, указывающая на путь в примонтированном томе.Дополнительно доступен сервис
gptoss_check, который монтирует репозиторий и запускаетpython3 gptoss_check/main.pyс тем же API. Поведение проверки настраивается через файлgptoss_check.configв корне проекта. В нём есть опцияskip_gptoss_check, по умолчанию равнаяtrue— в этом случае скрипт лишь выводит сообщение о пропуске проверки. Установите её вfalse, чтобы выполнить анализ кода. Пути к анализируемым файлам задаются переменнойCHECK_CODE_PATH— список, разделённый запятыми (по умолчаниюtrading_bot.py). Все эти сервисы подключены к общей сетиgptoss_net.Пример
docker-composeс передачей этих переменных обоим сервисам:services: data_handler: env_file: .env # Или задайте переменные напрямую: # environment: # BYBIT_API_KEY: ${BYBIT_API_KEY} # BYBIT_API_SECRET: ${BYBIT_API_SECRET} trade_manager: env_file: .env
-
-
Отредактируйте
config.jsonпод свои нужды. Помимо основных настроек можно задать параметры адаптации порогов. Полное описание доступных ключей приведено в CONFIG.md:loss_streak_thresholdиwin_streak_thresholdконтролируют количество подряд убыточных или прибыльных сделок, после которого базовый порог вероятности будет соответственно повышен или понижен.threshold_adjustmentзадаёт величину изменения порога.threshold_decay_rateконтролирует скорость возврата порога к базовому значению.- После каждого расчёта точности
ModelBuilderобновляет словарьbase_thresholds. Для каждой пары базовый порог постепенно приближается к фактической точности (значение ограничено диапазоном 0.5–0.9) и сохраняется в состоянии. reversal_marginзадаёт запас отклонения от противоположного порога, при котором после закрытия позиции открывается новая в обратную сторону.risk_sharpe_loss_factorиrisk_sharpe_win_factorуправляют снижением или повышением риска при отрицательном и высоком коэффициенте Шарпа.risk_vol_minиrisk_vol_maxограничивают влияние волатильности на итоговый размер позиции.target_change_thresholdзадаёт минимальный процент изменения цены для положительной метки при обучении модели.
backtest_intervalопределяет, как часто выполняется автоматический бектест стратегии.optimization_intervalзадаёт базовый интервал оптимизации параметров. Фактический запуск происходит динамически и может сокращаться при росте волатильности.enable_grid_searchвключает дополнительную проверку лучших параметров через GridSearchCV после оптимизации Optuna.use_strategy_optimizerвключает поиск общих параметров на уровне портфеля с помощьюStrategyOptimizer.max_symbolsзадаёт количество наиболее ликвидных торговых пар, которые бот выберет из доступных.secondary_timeframeопределяет дополнительный интервал (по умолчанию2h). Свечи этого таймфрейма бот запрашивает напрямую у биржи и не агрегирует из основного. См.DataHandler.load_initialи_send_subscriptions.max_subscriptions_per_connection(илиws_subscription_batch_size) определяет, сколько символов подписывается через одно WebSocket‑соединение. Еслиws_subscription_batch_sizeне указан, он приравнивается кmax_subscriptions_per_connection(по умолчанию 15).backup_ws_urlsзадаёт список альтернативных WebSocket‑адресов. При переподключенииDataHandlerперебирает их по очереди, что позволяет использовать другие дата‑центры.ws_inactivity_timeoutопределяет, сколько секунд ждать сообщений после отправки ping. Если данных нет дольше этого времени, соединение закрывается и открывается заново.history_batch_sizeзадаёт число одновременных запросов истории. При нехватке памяти значение автоматически снижается.history_retentionограничивает объём сохранённых данных после инициализации. Хранятся только последниеNбаров.ray_num_cpusзадаёт число потоков, которые Ray выделяет под задачи (по умолчанию 2). Убедитесь, что у хоста достаточно ядер или уменьшите значение.telegram_queue_sizeограничивает размер очереди сообщений Telegram.fine_tune_epochsзадаёт число эпох при дообучении модели.early_stopping_patienceзадаёт, сколько эпох ждать улучшения ошибки на валидации перед остановкой обучения.n_splitsопределяет число разбиений временного ряда для кросс-валидации при обучении и оптимизации (по умолчанию 3).performance_windowзадаёт размер окна для оценки точности. Если она падает нижеretrain_threshold, модель переобучается.freeze_base_layersпри дообучении замораживает начальные слои и ускоряет обучение.use_transfer_learningвключает режим дообучения существующей модели вместо полного переобучения.model_typeзадаёт архитектуру нейросети (gru,tftилиtransformer). Новый вариантtransformerиспользует слои самовнимания и позиционное кодирование. Он лучше выявляет долгосрочные зависимости в финансовых рядах. При большой истории увеличьтеd_modelиnum_layersвmodel_builder.py, а для малых выборок оставьте значения по умолчанию, чтобы избежать переобучения.- После расчёта индикаторов
DataHandlerкэширует признаки в памяти. Если установить его параметрfeature_callback, напримерModelBuilder.precompute_features, признаки заранее сохраняются вfeature_cache. Это снижает задержки при обучении и прогнозах, поскольку готовые данные не приходится вычислять заново. Пример фрагментаconfig.jsonс этими параметрами:
{
"n_splits": 10,
"performance_window": 200,
"retrain_threshold": 0.6,
"freeze_base_layers": true,
"early_stopping_patience": 5
}
Кросс-валидация повышает устойчивость оценки качества, автоматическое переобучение поддерживает модель актуальной, ранняя остановка и заморозка базовых слоёв сокращают переобучение и ускоряют тренировку.
- Запустите бота. При локальном запуске без Docker Compose задайте адреса сервисов переменными
DATA_HANDLER_URL,MODEL_BUILDER_URLиTRADE_MANAGER_URL:
DATA_HANDLER_URL=http://localhost:8000 \
MODEL_BUILDER_URL=http://localhost:8001 \
TRADE_MANAGER_URL=http://localhost:8002 \
python -m bot.trading_bot
Эти переменные задают URL-адреса сервисов data_handler, model_builder и trade_manager. В Compose они не требуются, так как сервисы обнаруживаются по имени.
Перед запуском убедитесь, что сервисы отвечают на /ping. В Docker Compose это происходит автоматически через встроенные health check'и, так что дополнительных настроек не требуется. При запуске вне Compose бот использует функцию check_services, которая повторяет запросы к /ping. Количество попыток и пауза между ними настраиваются переменными SERVICE_CHECK_RETRIES и SERVICE_CHECK_DELAY. По умолчанию бот делает 30 попыток с задержкой 2 секунды.
Также можно использовать docker-compose up --build для запуска в контейнере.
В зависимости от версии Docker команда может называться docker compose или
docker-compose.
По умолчанию используется образ с поддержкой GPU. Если она не требуется,
запустите compose с переменной DOCKERFILE и отключите NVIDIA-переменные:
RUNTIME= DOCKERFILE=Dockerfile.cpu NVIDIA_VISIBLE_DEVICES= NVIDIA_DRIVER_CAPABILITIES= docker-compose up --build
Set RUNTIME= if you want to run these CPU images without the NVIDIA runtime.
GPU acceleration with Numba requires the libnvvm.so library. The default
Dockerfile uses the nvidia/cuda:*‑cudnn-devel image so NVVM is available
at runtime. If you switch to a runtime-only base (for example
*-runtime or *-cudnn-runtime), copy the NVVM libraries from the build stage
or Numba will fall back to CPU mode. Build and run the GPU image with:
DOCKERFILE=Dockerfile docker compose -f docker-compose.yml -f docker-compose.gpu.yml up --build
Setting FORCE_CPU=1 disables all CUDA checks, which helps avoid crashes such as
free(): double free detected in tcache 2 when CUDA drivers are missing or
misconfigured.
When running with GPUs the trade_manager service automatically configures
Python's multiprocessing start method to "spawn". Forking workers can lead to
CUDA initialization errors, so the module switches to "spawn" on import. The
default should work for most setups, but you may call
multiprocessing.set_start_method() yourself before launching the service if
you need a different policy.
The services may build large data sets in memory. Compose allocates
8GB of shared memory for each container via shm_size: '8gb' so Polars
and other libraries do not run into the default /dev/shm limit.
The model_builder service sets TF_CPP_MIN_LOG_LEVEL=3 to hide verbose TensorFlow
GPU warnings. Set the environment variable to 2 or 3 before importing
TensorFlow if you want to suppress extra CUDA messages entirely. Adjust or
remove this variable if you need more detailed logs.
The Docker image also skips importing TensorFlow during its build-time library
check unless explicitly enabled. Set ENABLE_TF=1 as a build argument when
you require TensorFlow features:
docker build --build-arg ENABLE_TF=1 -t trading-bot-x .
Omit the argument to skip the import and avoid the associated warnings.
When both TensorFlow and PyTorch start in the same container you might see
messages like Unable to register cuDNN factory or computation placer already registered. These lines appear while each framework loads CUDA plugins and
tries to register them more than once. They are warnings, not fatal errors, and
can be safely ignored. Building the image with Dockerfile.cpu avoids them
entirely.
Lightweight service scripts
The services directory provides minimal versions of the microservices. They
avoid heavy dependencies so they start quickly and are useful for basic
testing.
Run each script directly from the project root:
gunicorn services.data_handler_service:app
python services/model_builder_service.py
python services/trade_manager_service.py
Для альтернативы без зависимостей можно запустить сервис через Waitress:
waitress-serve services.data_handler_service:app
data_handler_service.py fetches prices from Bybit using ccxt and exposes
/price/<symbol> and /ohlcv/<symbol>.
model_builder_service.py trains a small logistic regression when you POST
features to /train. Predictions are requested via /predict using
{"features": [...]} where the first element usually represents the price.
For backward compatibility a single price value is also accepted. The
service supports multi-class problems via
LogisticRegression(multi_class="auto") and returns an error if the labels
contain only a single class.
trade_manager_service.py opens and closes positions on Bybit via
/open_position and /close_position and also provides /positions, /ping
and /ready routes. The /open_position endpoint accepts either amount or
price, calculating the size from TRADE_RISK_USD when only a price is given.
trade_manager_service.py uses a simple token-based authentication. Set the
TRADE_MANAGER_TOKEN environment variable on the service and supply the same
token via an Authorization: Bearer header when calling any POST route or the
/positions endpoint. For example:
export TRADE_MANAGER_TOKEN=supersecret
curl --netrc-file /dev/null -H "Authorization: Bearer $TRADE_MANAGER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"symbol":"BTCUSDT","side":"buy","amount":1}' \
http://localhost:8002/open_position
These reference scripts expose the same HTTP routes as the full services but avoid heavy frameworks like TensorFlow and PyTorch, making them ideal for quick tests.
Все Flask-сервисы ограничивают размер тела запроса 1 МБ. При превышении
лимита клиент получает ответ 413 с JSON‑сообщением {"error": "payload too large"}.
The model builder maintains separate models per trading pair. POST JSON data of the form::
{"symbol": "BTC/USDT", "features": [[...], [...]], "labels": [0, 1]}
Switching implementations
docker-compose.yml uses the full implementations in data_handler.py and
model_builder.py. They depend on heavy packages like TensorFlow and PyTorch
which are installed in the Docker image. For lightweight testing you can run
the reference services instead. Replace the command entries for each service
with the scripts from the services directory:
data_handler:
command: gunicorn services.data_handler_service:app
model_builder:
command: python services/model_builder_service.py
trade_manager:
command: python services/trade_manager_service.py
Restore the Gunicorn commands when you want to launch the full services.
Running the full services
Running these full modules requires TensorFlow, PyTorch and related
libraries. They may take noticeably longer to start while the frameworks
initialise and will use a GPU if one is available. Ensure the compose file
sets RUNTIME=nvidia and that your system has the NVIDIA container runtime
installed. Without a GPU you can still run the services with
DOCKERFILE=Dockerfile.cpu but startup will remain slower than the lightweight
scripts above.
The default docker-compose.yml already points to the full-featured
implementations. If you replaced the command entries with the minimal scripts
earlier, simply revert those lines or copy the compose file from the repository
again. After restoring the Gunicorn commands, run:
docker compose -f docker-compose.yml -f docker-compose.cpu.yml up --build # CPU
docker compose -f docker-compose.yml -f docker-compose.gpu.yml up --build # GPU
so the heavy frameworks load and the services expose their production APIs.
Docker Compose logs
Просмотреть вывод контейнеров можно через docker compose logs (или
docker-compose logs в более старых версиях Docker).
Выберите нужный сервис или добавьте флаг -f для режима слежения:
docker compose logs data_handler # логи DataHandler
docker-compose logs data_handler # для docker-compose
docker compose logs -f trade_manager # следить за выводом TradeManager
docker-compose logs -f trade_manager
docker compose logs model_builder
docker-compose logs model_builder
Команда без аргументов печатает логи всех сервисов.
Если GPU недоступен, собирайте образ через переменную DOCKERFILE=Dockerfile.cpu
и укажите RUNTIME=, чтобы отключить NVIDIA‑runtime:
RUNTIME= DOCKERFILE=Dockerfile.cpu docker compose -f docker-compose.yml -f docker-compose.cpu.yml up --build
Troubleshooting service health
If trading_bot.py exits with dependent services are unavailable,
use these steps to diagnose the problem:
-
Inspect container logs to see why a service failed to start:
docker compose logs data_handler docker compose logs model_builder docker compose logs trade_manager
-
GPU images require the NVIDIA runtime (
nvidia-container-toolkitornvidia-docker2). Verify that the GPU is visible from a container:docker compose -f docker-compose.yml -f docker-compose.gpu.yml run --rm data_handler nvidia-smi
If no GPU is detected, rebuild with the CPU Dockerfile:
RUNTIME= DOCKERFILE=Dockerfile.cpu docker compose -f docker-compose.yml -f docker-compose.cpu.yml up --build
-
If services require more time to initialize, increase
SERVICE_CHECK_RETRIESorSERVICE_CHECK_DELAYin.env. By default, the bot performs 30 retries with a 2‑second delay. -
If logs contain
gymnasium import failed, install the package manually withpip install gymnasium. -
When RL components start, they import
gymnasium. If the package is missing, training will fail until you install it. -
If
gunicornlogs showWORKER TIMEOUTmessages, the service might need more time to respond. SetGUNICORN_TIMEOUTin your environment to increase the timeout in seconds. The compose file defaults to120seconds. -
Use an async-capable worker for
gunicorn(e.g.--worker-class uvicorn.workers.UvicornWorker) so async views like the trade manager's/open_positionroute can schedule tasks properly.
Telegram notifications
Set the TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID variables in .env to
enable notifications. Create the bot with telegram.Bot and pass it to both
DataHandler and TradeManager:
from telegram import Bot
import json
import os
with open("config.json") as f:
cfg = json.load(f)
bot = Bot(os.environ["TELEGRAM_BOT_TOKEN"])
chat_id = os.environ["TELEGRAM_CHAT_ID"]
data_handler = DataHandler(cfg, bot, chat_id)
model_builder = ModelBuilder(cfg, data_handler, None)
trade_manager = TradeManager(cfg, data_handler, model_builder, bot, chat_id)
You can limit the logger queue with `telegram_queue_size` in `config.json`.
# Optionally cache features ahead of time
# data_handler = DataHandler(cfg, bot, chat_id,
# feature_callback=model_builder.precompute_features)
Both services check the TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID
variables at startup. If either variable is missing, a warning is logged and
no Telegram alerts are sent.
To avoid processing old updates after a restart, store the update_id and pass
it to the offset parameter when calling get_updates. The helper class
TelegramUpdateListener handles this automatically and logs any errors.
Telegram enforces message limits per bot account, so duplicate notifications are
typically caused by bugs rather than global restrictions. Ensure that your code
filters repeated messages and checks that send_message returns HTTP 200.
You can run this bot either with long polling or a webhook using the
Application class from python-telegram-bot.
When deploying the trade_manager service with Gunicorn, use a single worker
(-w 1). This ensures only one TelegramUpdateListener polls the bot token,
preventing duplicated updates.
Лимиты WebSocket-подписок
Количество подписок через одно соединение ограничивается параметром max_subscriptions_per_connection (он же ws_subscription_batch_size). Если ws_subscription_batch_size не указан, используется max_subscriptions_per_connection. Если список пар превышает это значение, бот откроет дополнительные WebSocket‑соединения.
Подписки отправляются пакетами. Размер пакета определяется этим же параметром. При необходимости бот делает паузу между отправками, чтобы не превышать ограничения биржи на частоту запросов.
Пример настроек в config.json:
{
"max_subscriptions_per_connection": 15,
"history_batch_size": 10,
"history_retention": 200
}
Так бот будет разбивать список подписок на пакеты по 10–15 символов и делать небольшую паузу между отправками. Для большинства бирж этого достаточно, чтобы не превышать ограничения на частоту запросов.
Если сервер перестаёт присылать данные, DataHandler отправляет ping и ждёт ws_inactivity_timeout секунд. После тайм-аута соединение закрывается и бот пытается подключиться заново. В списке backup_ws_urls можно указать резервные WebSocket‑адреса — например, другие дата‑центры — которые будут пробоваться по очереди.
Model training
ModelBuilder автоматически обучает и переобучает нейросетевую модель на базе Transformer.
Для организации процесса можно выбрать ML-фреймворк: pytorch (по умолчанию), lightning или keras.
Тип указывается параметром nn_framework в config.json.
Для каждого актива формируются признаки из OHLCV‑данных и технических
индикаторов. Метка 1 присваивается, если через
lstm_timesteps баров цена выросла больше, чем на значение
target_change_threshold (по умолчанию 0.001). Иначе метка равна 0.
При установке prediction_target в "pnl" модель обучается прогнозировать
доходность следующего бара, и сигнал формируется, только если предсказанный
PnL превышает торговые издержки.
Обучение запускается удалённо через ray и использует GPU при наличии.
- После обучения выполняется калибровка вероятностей с помощью логистической
регрессии. Затем
TradeManagerприменяет откалиброванные прогнозы для открытия и закрытия позиций согласно динамическим порогам.
Для интерпретации модели вычисляются SHAP‑значения, и краткий отчёт о наиболее важных признаках отправляется в Telegram.
При включении use_transfer_learning повторные запуски обучения не создают модель с нуля,
а дообучают её на последних данных. Число эпох задаётся параметром fine_tune_epochs.
Модель переобучается, если точность за последние performance_window прогнозов опускается ниже retrain_threshold.
Обучение использует n_splits разбиений TimeSeriesSplit. Параметр early_stopping_patience прерывает цикл,
когда ошибка на валидации не улучшается, а freeze_base_layers помогает сохранить базовые представления при дообучении.
Пример запуска обучения вместе с ботом:
python -m bot.trading_bot
Transformer architecture
Архитектура transformer использует позиционное кодирование и механизмы
самовнимания вместо рекуррентных слоёв. Это позволяет эффективнее улавливать
долгосрочные зависимости в финансовых временных рядах и повышает стабильность
прогнозов на волатильных рынках. Включите её, указав в config.json:
{
"model_type": "transformer"
}
При увеличении объёма обучающих данных имеет смысл повысить ёмкость модели,
поменяв параметры d_model и num_layers в model_builder.py. Небольшие
истории наоборот лучше обучать на минимальных значениях, чтобы не потерять
обобщающую способность.
RL agents
Модуль RLAgent может обучать модели с помощью stable-baselines3, Ray RLlib или фреймворка Catalyst от Яндекса.
Выберите подходящий движок параметром rl_framework в config.json (stable_baselines3, rllib или catalyst).
Алгоритм указывается опцией rl_model (PPO или DQN), продолжительность обучения — rl_timesteps.
Если rl_use_imitation выставлен в true, перед обучением PPO/DQN политика
предобучается на действиях, полученных от базовой модели. Такой этап имитации
помогает быстрее сходиться модели, особенно когда исторических данных
недостаточно: политика сразу видит приближённые примеры и реже делает случайные
шаги.
Для корректной работы stable-baselines3 необходим пакет gymnasium. Он
устанавливается по умолчанию вместе с зависимостями проекта, поэтому
альтернативный gym не требуется.
Параметр drawdown_penalty задаёт штраф за просадку капитала в среде RL:
из вознаграждения вычитается коэффициент × текущая просадка. Такое наказание
позволяет уменьшить глубокие просадки баланса и делает торговлю более
устойчивой.
Пример настроек для активации этих возможностей в config.json:
{
"rl_use_imitation": true,
"drawdown_penalty": 0.1
}
При включённой имитации и разумном штрафе агент обычно быстрее сходится и
склонен избегать резких потерь капитала. Для работы stable-baselines3 нужен
пакет gymnasium, который ставится вместе с зависимостями проекта.
Периодическое переобучение задаётся параметром retrain_interval в
config.json. Можно запускать бота по расписанию (например, через cron) для
регулярного обновления моделей:
0 3 * * * cd /path/to/bot && /usr/bin/python -m bot.trading_bot
Signal ranking
During live trading the bot can rank entry signals from all symbols once per
check_interval. Signals are sorted by the predicted probability multiplied by
the expected ATR. Only the best top_signals trades are executed. Set
top_signals in config.json (defaults to max_positions).
MLflow
Если установить пакет mlflow и включить флаг mlflow_enabled в config.json,
бот будет сохранять параметры и метрики обучения в указанное хранилище.
По умолчанию используется локальная папка mlruns.
Чтобы задать другой адрес, укажите ключ mlflow_tracking_uri в config.json
или переменную окружения MLFLOW_TRACKING_URI.
Пример запуска с отслеживанием экспериментов:
MLFLOW_TRACKING_URI=mlruns python -m bot.trading_bot
Running tests
Running pytest requires the packages listed in requirements.txt.
Install them using the helper script:
./scripts/setup-tests.sh # CPU packages only
To install the GPU-enabled packages from requirements-gpu.txt as well, run:
./scripts/install-test-deps.sh --gpu
If you skip this step and run pytest anyway, common imports like
pandas, numpy or scipy will be missing and the tests will abort
with ModuleNotFoundError errors.
For a clean environment you can create a virtualenv and install the CPU requirements before running the tests:
python3 -m venv venv
source venv/bin/activate
./scripts/setup-tests.sh
pytest
Integration tests that require external services are marked with integration and are skipped by default. To run them separately:
pytest -m integration
The requirements.txt file already bundles pytest and all other
packages needed by the test suite.
Unit tests automatically set the environment variable TEST_MODE=1.
This disables the Telegram logger's background worker thread so tests
run without spawning extra threads.
When TEST_MODE=1 is exported manually, heavy dependencies like Ray,
stable-baselines3 and the Bybit SDK are replaced with lightweight stubs.
DataHandler also generates synthetic OHLCV data instead of calling
external APIs. This mode is useful for running examples on systems
without the full requirements installed.
Set DATA_HANDLER_PROFILE=1 to log how long DataHandler methods take.
Profiling information is printed to the standard log output.
For example:
DATA_HANDLER_PROFILE=1 python -m bot.trading_bot
If scikit-learn is not installed, tests marked with requires_sklearn
are skipped automatically. Install the package to run the full suite.
As noted above, make sure to run ./scripts/setup-tests.sh before
executing pytest; otherwise imports such as numpy, pandas, scipy and
httpx will fail.
Чтобы выполнить тесты на машине без GPU, создайте виртуальное окружение и установите зависимости из requirements.txt.
Пакет включает CPU‑сборки torch и tensorflow, поэтому тесты не подтягивают CUDA‑библиотеки.
Пример полного процесса:
python3 -m venv venv
source venv/bin/activate
./scripts/setup-tests.sh
pytest
Если у вас есть GPU и установленный CUDA, можно установить полный список
зависимостей командой ./scripts/install-test-deps.sh --full и затем
запустить те же тесты.
The requirements.txt file already includes test-only packages such as
pytest, optuna and tenacity, so no separate requirements-dev.txt
is required.
The test suite relies on the following packages:
- numpy
- pandas
- torch
- ccxt
- ccxtpro
- pybit
- python-telegram-bot
- aiohttp
- websockets
- ta
- scikit-learn
- optuna
- psutil
- python-dotenv
- joblib
- imbalanced-learn
- statsmodels
- scipy
- shap
- tenacity
- pyarrow
- jsonschema
- plotly
- numba
- ray
- stable-baselines3
- mlflow
- pytorch-lightning
- tensorflow
- catalyst
- pytest
GPU libraries such as CUDA-enabled torch or numba may be required for some tests.
Linting
The project uses flake8 for style checks. Install dependencies and enable the pre-commit hook so linting runs automatically:
pip install -r requirements.txt -r requirements-gpu.txt # or requirements.txt
pip install pre-commit
pre-commit install
This hook relies on .pre-commit-config.yaml to run flake8 before each
commit. Trigger it manually with:
pre-commit run --all-files
Linting configuration is stored in .flake8. Run the checker manually:
python -m flake8
State persistence
TradeManager now saves its open positions as a Parquet file and per-symbol
returns as JSON inside the directory specified by cache_dir. The files are
named trade_manager_state.parquet and trade_manager_returns.json
respectively. These non-executable formats replace the previous pickle-based
storage.
Historical simulator
Replay past market data using the built in trading logic:
python scripts/run_simulation.py --start 2020-01-01 --end 2020-01-02 --speed 60
If you do not have the full GPU requirements installed, set TEST_MODE=1 so
the simulator stubs heavy dependencies. Example:
TEST_MODE=1 python scripts/run_simulation.py --start ... --end ...
The simulator loads candles from the DataHandler cache and steps through them
rapidly while reusing TradeManager methods. Trailing stops and other
position logic behave exactly like in live trading.
If no cached candles exist for the chosen period, the simulator logs a warning
and exits.
Continuous integration
All pushes and pull requests trigger a GitHub Actions workflow that installs
dependencies via scripts/install-test-deps.sh (which also installs flake8),
runs python -m flake8, and executes pytest.
This ensures style checks and tests run automatically.
Security
Для снижения риска уязвимости CVE-2024-56433
проверьте, что диапазоны в /etc/subuid и /etc/subgid не пересекаются с UID
пользователей вашей сети. В репозитории добавлен скрипт
scripts/check_subuid_conflict.sh, который помогает выявить конфликтующие
диапазоны и предлагает безопасные значения.
Пример запуска:
./scripts/check_subuid_conflict.sh
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file trading_bot_x-0.1.1.tar.gz.
File metadata
- Download URL: trading_bot_x-0.1.1.tar.gz
- Upload date:
- Size: 189.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1a14aba52ea24a4d9ecf5946ca9c82591ddd495ba161f239875473b84e91232
|
|
| MD5 |
49b5e2dfa3c5494096fa538bb1aeae20
|
|
| BLAKE2b-256 |
aa0036535ae5cbd986dc06dd4ecb4663f53d93205ad5f5c527cf3fceaf530e56
|
File details
Details for the file trading_bot_x-0.1.1-py3-none-any.whl.
File metadata
- Download URL: trading_bot_x-0.1.1-py3-none-any.whl
- Upload date:
- Size: 124.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa85372db4827513b0407b2275ff8ea3c1c0a04c2a91735023ebfee2c82e6ea5
|
|
| MD5 |
e3e8223a3ca380725325cfb0dac5e1ef
|
|
| BLAKE2b-256 |
5037b839de0d9d45f81cc2e504f98f274b2da4edc406bef22dda4ab3ca2a6916
|