Сделан в рамках соревнования Хакатон «Финам Trade API» по созданию торговых систем на основе открытого торгового API «Финама».
Как сделать торгового робота с искусственным интеллектом?
Искусственный интеллект (англ. artificial intelligence) — это способность компьютера
обучаться, принимать решения и выполнять действия, свойственные человеческому интеллекту.
Сразу скажу, что под искусственным интеллектом здесь будет пониматься использование обученных нейросетей, т.е. мы будем обучать нейросеть, потом торговый робот на основании обученной модели будет принимать решение о покупке актива и выполнять действие - покупать актив.
Эта тема последовательно раскрывается в этой статье, сразу приведу основные этапы по созданию такого торгового робота:
1) получение исторических данных по торговым инструментам;
2) подготовка датасета из этих исторических данных по определенной логике для нейросети;
3) обучение нейросети и выбор лучшей обученной модели по параметрам loss, accuracy, val_loss, val_accuracy;
4) проверка предсказаний сделанных нейросетью;
5) проверка подключения к API Финама;
6) определение торговой логики для открытия позиций;
7) запуск live стратегии с использованием выбранной лучшей модели обученной нейросети с нашей торговой логикой.
Почему я выбрал использование нейросетей для торгового робота?
-
Тема использования искусственного интеллекта актуальна:
для прогнозирования поведения фондового рынка в целом,
для осуществления предсказаний поведения цены отдельных акций и/или фьючерсов и других инструментов
для поиска определенных торговых формаций на графиках цен
Широкое применение искусственного интеллекта очень активно развивается на Западных рынках, на Российском всё только начинается.
-
В открытом доступе нет полноценных примеров по использованию нейросетей для прогнозирования цен акций/фьючерсов, а те которые есть
или не работают
-
или чего-то для их работы постоянно не хватает.
По крайней мере лично мне ещё ни разу не встретились полноценно работающие примеры.
Поэтому и принял решение сделать торгового робота, который использует нейросети на основе компьютерного зрения для поиска определенных формаций на торговом графике акций и используя лучшую обученную модель осуществляет торговые операции.
Какие есть скрытые цели?
Т.к. этот пример торгового робота с использованием нейросетей хорошо документирован и последовательно проходит через все этапы:
получение исторических данных по акциям;
подготовка датасета с картинками формаций из графика акций по определенной логике;
обучение нейросети и выбор лучшей обученной модели по параметрам loss, accuracy, val_loss, val_accuracy;
проверка предсказаний сделанных нейросетью;
проверка подключения к API Финама;
запуск live стратегии с использованием выбранной лучшей модели обученной нейросети;
записано обучающее видео как запускать и работать с этим кодом, выложенное на YouTube и на RuTube.
то, это позволит всем, кто только начинает свой путь по применению нейросетей для аналитики, использовать этот код, как стартовый шаблон с последующим его усовершенствованием и допиливанием.
По крайней мере появился +1 рабочий пример использования нейросетей для аналитики цен графика акций.
Тем самым, станет больше роботов с использованием искусственного интеллекта,
это повлечет большую волатильность нашего фондового рынка;
большую ликвидность за счет большего количества сделок;
и соответственно больший приток капитала в фондовый рынок.
Зарабатывает ли сейчас этот робот?
Торговая стратегия заложенная в этом роботе не даст ему заработать, т.к. мы открываем позицию по подтвержденной нейросетью формации на графике (т.е. когда нейросеть предсказывает, что вероятно будет рост), но мы не ждем роста и закрываем позицию через +1 бар старшего таймфрейма. Как вариант, можно заходить в сделку 1 к 3 или 1 к 5 со стоп-лоссом. Т.е. ждать профита или стоп-лосса.))
==========================================================================
Установка
Самый простой способ:
git clone https://github.com/WISEPLAT/Hackathon-Finam-NN-Trade-Robot
Или через PyCharm:
-
нажмите на кнопку Get from VCS:
Вот ссылка на этот проект:
https://github.com/WISEPLAT/Hackathon-Finam-NN-Trade-Robot
-
вставьте эту ссылку в поле URL и нажмите на кнопку Clone
-
Теперь у нас появился проект торгового робота:
Установка дополнительных библиотек
Для работы торгового робота с использованием нейросетей, есть некоторые библиотеки, которые вам необходимо установить:
pip install aiohttp aiomoex pandas matplotlib tensorflow finam-trade-api
так же их можно установить такой командой
pip install -r requirements.txt
Обязательно! Выполните в корне вашего проекта через терминал эту команду:
git clone https://github.com/cia76/FinamPy
для клонирования библиотеки, которая позволяет работать с функционалом API брокера Финам.
P.S. Библиотека finam-trade-api - тоже позволяет работать с API Финам, просто для тестов я использовал обе.))) А для live торговли FinamPy.
Теперь наш проект выглядит вот так:
Начало работы
Вот перечень задач, которые нужно сделать для успешного запуска торгового робота использующего нейросети на основе компьютерного зрения для поиска формаций на торговом графике акций и осуществления им торговых операций:
-
Настроить конфигурационный файл my_config\trade_config.py
В нём можно указать по каким тикерам ищем формации и обучаем нейросеть (training_NN), и так же указать по каким тикерам торгуем (portfolio) используя обученную нейросеть. Остальные параметры можно оставить как есть.
-
Нужно получить исторические данные по акциям, для обучения нейросети
Исторические данные для обучения нейросети мы получаем с MOEX. Т.к. получаем их бесплатно, то есть задержка в полученных данных на 15 минут.
Для этого используется файл 1_get_historical_data_for_strategy_from_moex.py
-
Полученные исторические данные сохраняются в каталоге csv в CSV файлах.
-
Когда есть исторические данные, теперь мы можем подготовить картинки для обучающего набора данных
-
подготовка датасета с картинками формаций из графика акций по определенной логике:
на картинке рисуется цена закрытия и две скользящие средние - картинки рисуются для младшего таймфрейма
если на старшем таймфрейме закрытие выше предыдущего закрытия, то такой картинке назначаем класс 1 иначе 0
Для этого используется файл 2_prepare_dataset_images_from_historical_data.py
-
Полученные картинки сохраняются в каталоге NN\training_dataset_M1 в подкаталогах классификаций 0 и 1.
-
-
Наконец-то есть датасеты для обучения нейросети )) Теперь обучаем нейросеть
Используем сверточную нейронную сеть (CNN)
Для этого используется файл 3_train_neural_network.py
Лог обучения нейросети находится в файле 3_results_of_training_neural_network.txt
Сходимость нейросети находится в файле 3_Training and Validation Accuracy and Loss.png
-
При обучении нейросети файлы моделей сохраняются в каталог NN\_models
-
После успешного обучения нейросети нужно выбрать одну из обученных моделей для нашего торгового робота
-
Выбор лучшей обученной модели происходит по параметрам loss, accuracy, val_loss, val_accuracy
Выбранную модель нужно вручную сохранить в каталог NN_winner под именем cnn_Open.hdf5
-
-
Теперь нужно сделать проверку предсказаний сделанных нейросетью на части классифицированных картинках
Для этого используется файл 4_check_predictions_by_neural_network.py
-
Как говорится просто проверить - что Ок
-
Наконец-то делаем проверку подключения к API Финама, чтобы мы смогли торговать
Для этого используется файл 5_test_api_finam_v1.py - используем FinamPy для тестов
-
и файл 6_test_api_finam_v2.py - используем FinamTradeApiPy для тестов
Как получить токен API Финам:
Открыть счет в "Финаме" https://open.finam.ru/registration
Зарегистрироваться в сервисе Comon https://www.comon.ru/
В личном кабинете Comon получить токен https://www.comon.ru/my/trade-api/tokens для выбранного торгового счета
Скопируйте и вставьте в файл my_config\Config.py полученный Ключ API и номер торгового счета (пример конфиг файла здесь: my_config\Config_example.py)
# content of my_config\Config.py class Config: ClientIds = ('<Торговый счет>',) # Торговые счёта AccessToken = '<Токен>' # Торговый токен доступа
-
Теперь мы готовы запустить торгового робота в live режиме
Не забываем про Ключ API и номер торгового счета, уже должны быть прописаны в файле my_config\Config.py
запуск live стратегии осуществляется с помощью файла 7_live_strategy.py
-
в строке 266 этот параметр days_back отвечает за сколько дней назад взять данные, если запускаете скрипт в понедельник или после выходного/праздничного дня, то увеличьте это значение
days_back = 1 # на сколько дней назад берем данные
-
строку 206 можно раскомментировать, чтобы скрипт например не запускался, если рынок не открыт (выходные и праздники не учитывает)
await self.ensure_market_open() # проверяем, что рынок открыт
-
конфигурация торгового робота находится в файле my_config\trade_config.py хотелось бы указать, что т.к. мы берем исторические данные из MOEX, а не по API Финам (т.к. такой функционал будет реализован позже), то доступные тикеры для аналитики и скачивания данных необходимо подбирать вручную.
training_NN = {"SBER", "VTBR"} # тикеры по которым обучаем нейросеть portfolio = {"SBER", "VTBR"} # тикеры по которым торгуем и скачиваем исторические данные
Теперь можно запускать и смотреть, а предварительно лучше посмотреть видео по работе с этим кодом , выложенное на YouTube и на RuTube
Внимание
Некоторые файлы содержат строку: exit(777) # для запрета запуска кода, иначе перепишет результаты
это сделано специально, чтобы случайно не перезаписать данные, её можно закомментировать, когда будете тестировать свои модели и свои настройки.
P.S. В коде стратегии не реализована проверка на доступность денежных средств на счете для входа в сделку.
Код тестировался на M1=>M10
и M10=>H1
, для других таймфреймов необходимо создавать большее число обучающих выборок.
Работоспособность проверялась на Python 3.10+
и Python 3.11+
с последними версиями библиотек.
Весь код выложен на GitHub и доступен по этой ссылке
Спасибо
FinamPy: Игорю за библиотеку, которая позволяет работать с функционалом API брокера Финам.
FinamTradeApiPy: DBoyara за библиотеку, асинхронного REST-клиента для API Finam.
tensorflow: За простую и классную библиотеку для работы с нейросетями.
aiomoex: За хорошую реализацию получения данных с moex.
Важно
Исправление ошибок, доработка и развитие кода осуществляется автором и сообществом!
Пушьте ваши коммиты!