Пример работы в рамках соревнования Tinkoff Invest Robot Contest #2
с использованием обучения с подкреплением.
Исследуя область использования машинного обучения в торговли сразу на ум приходит мысль о том, что надо строить авторегрессионные
модели или модели на основе LSTM
для предсказания цены акции на будущее.
Проблема данного подхода в том, что временной ряд цены акции практически полностью не стационарный. И цена акции может измениться в любой момент времени из-за различных факторов. Но существует другой поход, который позволяет использовать нейросеть в принятии решения о покупке
или продаже
актива. Этот подход предполагает использования техник обучения с подкреплением. Более подробно можно прочитать в папке статьи.
В данной торговой стратегии использовался агент DDQN
для предсказания наилучшего действия. Для данного подхода также требовалось создать среду обучения. Реализация данной среды можно найти в файле multidatasetenv.ipynb.
Общая концепция стратегии показана на рисунке ниже.
Порядок действий:
- Каждый час в 4 минуты загружаем исторические данные за
30 дней
по акцииЯндекс
- Добавляем индикаторы
'macd', 'macds', 'macdh', 'rsi_12'
- Берём последние 10 свечей
- Стандартизируем данные и превращаем массив в вектор
- Подаём данные на вход нейросети и получаем массив из 2 чисел
- Берём индекс максимального числа, который и являет действием которое надо выполнить
И всё!! Если индекс 0
- то мы продаём всё или пропускаем свечи, иначе если 1
- то покупаем на всю котлету или держим
Прежде всего для решения любой задачи обучения с подкреплением необходимы 2 "вещи".
- Создать среду, симулирующую "реальный мир"
- Продумать функцию вознаграждения.
При создании среды было выяснено, что обучения на одном активе было недостаточно, поэтому было решено сделать среду, которая возвращает состояния по нескольким активам.
А вот функция вознаграждения является своеобразным творческим подходом. Ведь нет чётких правил, как поощрять агента за правильные действия. От функции вознаграждения будет зависеть напрямую то, как агент будет себя вести в среде. Лично экспериментальным путём я создал данную функцию представленную ниже
reward = (последняя оценка портфеля - максимальная оценка за 50 предыдущих шагов) * 300 - 1
При данной функции вознаграждения у меня получился наилучший результат на валидации. Также стоит отметить, что данная функция максимизирует оценку портфеля за 50 свечей, и штрафует агента за бездействие или убыток.
Обучение модели происходило по следующему алгоритму:
- Загружаем данные часовых свечей по акциям
Газпром
,Сбер
,ВТБ
,Яндекс
за 1.5 года - Добавляем индикаторы
- Создаём среды: тренировочную (возвращается состояние по 4 акциям) и тестовую (используется последние 2 месяца акии Яндекса). Предварительно последние 2 месяца данных у тренировочной выборки мы удаляем.
- Запускаем цикл обучения. Более подробно прошу ознакомится в файле multidatasetenv.ipynb
- Сохраняем лучшую модель на валидации
Пример обучения модели представлен на рисунке ниже
Полностью реализованная торговая стратегия находиться в папке ddqn_strategy.
Установка необходимых библиотек и зависимостей
Important
Для использования моделей Torch
на cuda
используйте официальную документацию PyTorch
Иначе модели будут использоваться на cpu
.
Далее скачайте все необходимые библиотеки
pip install -r requirements.txt
После установки библиотек отредактируйте config.json
.
Пример конфиг файла
{
"TOKEN": "токен доступа",
"account_id": "account_id",
"app_name": "YarickVodila",
"figi": "BBG006L8G4H1",
"is_open": true,
"quantity_stock": 12,
"is_create_new_account": false,
"start_balance": 50000,
"trans_commission": 0.03
}
TOKEN
- токен доступаaccount_id
- id аккаунтаapp_name
- app_namefigi
- figi инструмента на котором вы хотите торговатьis_open
- открыта ли позиция. Этот параметр сам меняется во время торговлиquantity_stock
- количество акций которые сейчас в портфелеis_create_new_account
- Выставитьtrue
в самом начале. Будет открыт новыйaccount_id
со стартовым балансом, а также сбросится статистика.start_balance
- начальный баланс который вы хотите использовать для тестированияtrans_commission
- комиссия за сделку. (P.S. Я выставил не правильно так как комиссия 0.3% -> 0.003, но заметил я это очень поздно)
Далее конфиг файл трогать не надо. Он сам перезаписывается при необходимости.
Следующий шаг это настройка файла main_trading.py.
Необходимые параметры для настройки
model_path
- путь до вашей моделиconfig_path
- путь до файлаconfig.json
logs_path
- путь до лога (P.S. можно передать любую строку он не рабочий пока что так как весь лог выводится на экран)trading_statistic_path
- путь до фалаtrading_statistic.csv
где будет находится таблица с колонкамиdate
,portfolio_valuation
,last_price
,action
,quantity_stock
schedule.every().hour.at(":04").do(system.select_action)
- данная строка отвечает за время когда будет выполнятся скрипт.04
означает что каждый час в 4 минуты мы будем проверять что нам необходимо сделать. Точнее это будет делать модель
Для автоматизации запуска виртуального окружения рекомендую сделать файл .bat
, пример
Результаты можно вывести с помощью файла plot_resalt.ipynb
Пример результатов моей торговли
Вывод лога в консоли
Мой агент на протяжении месяца старался держать позицию и не продавать. При этом эта стратегия была довольно успешной.
Так как работа на 100% ещё не выполнена, хотелось бы отметить пару пунктов, которые способствовали бы улучшению стратегии.
- Добавить больше индикаторов
- Использовать
Марковские сети
илиModel-based
агента - Улучшить функцию вознаграждения
- Добавить модель анализа настроения по новостям
- Использовать больше инструментов для торговли
В целом я доволен результатом, так как этот конкурс помог и дал толчок реализовать данную стратегию. Если вдруг у кого-нибудь будут вопросы или предложения, то я открыт для критики и для сотрудничества.
telegram
- https://t.me/YarKo9_9почта
- y.koltashev@mail.ru