Торговый бот для участия в конкурсе Tinkoff Invest Robot Contest
Идея бота в том, чтобы подсказать, как дальше, скорее всего, будет двигаться тренд. А покупать или продавать, решает уже человек.
- Серверная часть.
Сканируются данные свечей. Бот в основном настроен на работу с Tinkoff API, но может подхватывать и API других систем. В качестве примера, помимо Tinkoff, подключён также API SouthXChange для прогнозирования пар криптовалют.
Затем проходят обработку фильтром Калмана, чтобы избежать излишне резких всплесков/отклонений. После этого строится модель прогнозов поведения графика, на основе поведения за предыдущие периоды. Модель на основе нейронной сети, используется библиотека scikit-learn.
Полученная модель даёт прогноз значения торгуемой пары через заданные промежутки времени (по-умолчанию, через 1 час, 2 часа, 4 часа и 8 часов, но можно настроить любые иные интервалы). Чем плавнее график пары, тем лучше прогнозы. В будущем результаты предсказания можно улучшить.
Модели уже созданы, но их можно пересоздать, чтобы обновить.
Все данные кэшируются, чтобы минимизировать обращения к API. Обученные модели сохраняются после обучения и заново загружаются при формировании прогноза.
Зависимости:
pip install tinkoff-api
pip install scikit-learn
pip install pykalman
pip install numpy
pip install scipy
pip install pandas
pip install requests
pip install matplotlib (только если планируется выводить графики вне Android-приложения)
Настройка
Основные параметры: config.py
tinkoffAPIToken - токен для доступа к API (тип: SANDBOX !). scanInterval - указано 5 минут. Интервал изменения данных свечей. Меньшие периоды не ботом не рассматриваются. tinkoffScanInterval - scanInterval персонально для Tinkoff API, так как интервал указывается не числом, а значением enum. Указано CandleResolution.MIN_5.
scanPeriod - какой отрезок времени показывать пользователю. По-умолчанию - 3 суток (3 дня взято, так как на выходных нет торгов, чтобы пользователь не испугался отсутствия данных).
predictPeriod - период поведения пары, на основе которого модель даст предсказание о будущих значениях. По-умолчанию - 1 сутки.
trainingPeriod - период данных для обучения. По-умолчанию - 100 суток. Период разбивается на сегменты с длительностью predictPeriod, для получения данных для обучения модели.
predictionIntervals - список интервалов прогноза. По-умолчанию - 1 час, 2 часа, 4 часа и 8 часов. При изменении, необходимо будет вызвать переобучение моделей.
TinkoffTrade - названия поддерживаемых торговых пар Тинькова и идентификаторы "figi".
Список торговых пар: trade_tuples.py
tradesTuple - набор объектов с даннымы торговых пар. Вся работа осуществляется только с этим набором. Можно добавить любые свои пары.
Просмотр графиков прогнозов: test_all.py Переобучение всех моделей: training_all.py
По оси Y - значение пары, по оси X - timestamp.
Поведение при отсутствии данных на выходных:
Длинная полоса - это как раз показывает предсказываемое значение после прошествия выходных и открытия торгов.
Папки models и data должны иметь права 777
API бота для использования в мобильном приложении:
Получить список торговых пар: get_pairs.py
Получить данные прогнозов: get_pairs_data.py
Папка api-cache должна иметь права 777
Пример данных:
(Сделать веб-сервер на python уже не успеваю, поэтому используется простая заплатка из PHP)
Список пар: http://0v.ru/NeuroInvest/get_pairs.php
["APPLE INC/USD", "GAZPROM NEFT PJSC/RUR", "DOGE/BTC"]
Данные пары:
http://0v.ru/NeuroInvest/get_pairs_data.php?pair=APPLE%20INC/USD {"tradeX":[1653046200,1653046500,1653046800,16530471....
- Мобильное приложение для просмотра данных
С помощью API серверной части, работает простое Android-приложение
APK-файл: http://0v.ru/NeuroInvest.1.001.apk
Скриншоты:
О конкурсе узнал в рассылке только 10 мая, доступ к API получил только 17 мая (были технические проблемы), так что были только одни свободные выходные :) Что успел, то успел. Надеюсь, вам понравится :)