Создание Трейдинг-бота на Python
Вступление
Этот проект не выходил у меня из головы уже довольно давно. Действительно, это было главной мотивацией, руководившей моей учёбой:
- Что мне нужно знать, чтобы создавать прибыльные алгоритмы автоматической торговли, развёртывать их в облаке и отслеживать во время их работы?
Компоненты
Проект состоит из трёх основных компонентов:
- Класс бота
- Обновляет текущие балансы портфеля- Обновляет рыночные данные- Вычисляет новый прогноз на основе новых данных- Рассчитывает новый “идеальный портфель” на основе прогноза- Выполняет заказы для достижения такого портфеля- Сохраняет то, что произошло с csv-файлами (данные, стоимость портфеля, прогноз, заказы и т.д.)
- Панель управления
- Считывает данные из csv-файлов, которые бот постоянно обновляет- Показывает всю информацию в удобном пользовательском интерфейсе
- Модель
- Самый модульный компонент в проекте- В этой статье мы будем использовать модель заполнителя
В этой статье описывается класс ботов. Обратите внимание, что это не было учтено при производстве.
Класс bot
Поскольку прогнозы делает модель, а сбор и обработка данных в данном случае не очень увлекательны (объединение строк в существующий фрейм данных, сохранение в .csv, простые операции), преимущество класса bot состоит в:
- Правильном соблюдение сроков выполнения операций
- Преобразовании прогнозов модели в заказы для биржи
- Размещении действительных ордеров на бирже для получения желаемого портфеля -Это включает в себя округление чисел, проверку доступных остатков и проверку минимальной стоимости заказа
- Стабильности, чтобы не прерывать торговлю в критические моменты
Хорошо иметь быстрого бота, однако мы имеем дело с Python и на самом деле не оптимизируем скорость. Бот предназначен для выполнения своей программы каждые 1 минуту, что достаточно быстро для раннего выявления тенденций.
Запуск бота
- “ModelName” используется для определения местоположения папки модели, которая содержит её масштабаторы и параметры. Подробнее об этих параметрах позже.
- “symbol” определяет, на каком рынке Binance будет осуществляться торговля.
- ”minPctChange" ограничивает размер изменений, которые боту разрешено вносить в свой портфель (позволяет избежать рассылки спама заказами)
- “exposureMultiplier” входит в уравнение, которое преобразует прогноз в идеальную подверженность активу
Этот раздел кода расположен в конце “liveBotClass.py ”, который определяет класс bot, поэтому бота можно инициализировать, введя в терминале из корневой папки:
Инициализация бота
Как только экземпляр бота создан, он запускает функцию __init__:
Внутри self.initializeBot() находятся все функции инициализации, которые вызываются только при инициализации бота. Они проверяют, существует ли уже папка для этого бота, если да, то загружаются все прошлые данные, которые бот сохранил перед завершением работы. В противном случае он создаёт папку и файлы. Таким образом, бот может продолжить с того места, на котором остановился, если что-то пойдет не так.
Если вы обратите внимание, self.mainTradeLoop() был вызван внутри асинхронной функции, чтобы запустить бота:
Эта функция вызывает RefreshAll(), smartSignals() и saveFinish() каждую минуту. Перед вызовом smartSignals() и saveFinish() она проверяет актуальность данных путём сравнения текущей минуты с самой последней минутой в рыночных данных (lastMarketDataTS).
Большая часть кода в основном цикле служит цели обеспечения правильного выбора времени.
Функции обновления
RefreshAll() - это короткая функция, вызывающая множество других функций:
Хотя она немного длиннее, этот код не должен быть трудным для понимания. Чтобы было понятнее, вот смысловая карта RefreshAll():
Зелёные прямоугольники представляют обновления в атрибутах класса, а жёлтые прямоугольники представляют обновления в csv-файлах.
Функция saveFinish() не используется в RefreshAll(), она вызывается после smartSignals().
Как только выполняется функция RefreshAll(), бот обновляется и готов принять решение.
Торговые функции
Все торговые вычисления выполняются с помощью функции smartSignals(), точно так же, как все обновления данных выполняются с помощью вызова функции RefreshAll(). Эти функции в сумме составляют изрядный объём кода, но являются последней частью класса bot.
Чтобы было понятнее, вот смысловая карта smartSignals():
Как вы можете видеть, существует пара операций для проверки минимального значения, округления десятичных знаков заказов, двойной проверки доступных остатков и т.д. Очень важно, чтобы бот работал стабильно, чтобы не прерывать торговлю в ключевые моменты.
Наконец, бот вызывает saveFinish() в конце процедуры. Функция saveFinish() сохраняет временную метку, стоимость портфеля, подверженность риску активов и текущий прогноз в preds.csv. Эти данные позже используются для отображения пользовательского интерфейса.
Работает ли это?
Вы можете клонировать этот репозиторий для тестирования бота. Если всё пойдет хорошо, вы должны быть в состоянии сделать это:
В следующей статье мы рассмотрим пользовательский интерфейс бота, который создадим с помощью streamlit.
Статья была взята из этого источника: