Открытый репозиторий моего TradeML проекта
Здесь находится код 2 версий парсера, несколько файлов, использованных при создании докер-контейнера (compose.yaml, Dockerfile, requirements), а также различные вспомогательные функции
Кроме того, есть 4 файла с кодом классов нейросетей (linear_nn, rnn, gru, lstm). Указаны версии в порядке их экспериментального исследования - было несколько попыток изменить архитектуру, оптимизатор, количество дней-фичей (параметр fit_size). Эти 4 модели (и соответственно их предыдущие версии, которые были удалены за ненадобностью) оказались неэффективны.
В файле transformer.py лежит рабочая модель трансформера на keras, но он оказался не лучше свертки, однако в нем больше параметров, так что я оставил в качестве основной модели свертку, как более легковесную
В ноутбуке OrderSys лежат черновики функций, используемых для торговли. В файле trade_utils эти же функции уже скомпонованы в итоговый инструмент, который используется в app.py - это последняя версия приложения на сервере. Там используются потоки и кэширование, чтобы независимо от get-запросов внутри работал алгоритм, обновляющий прогнозы модели и осуществляющий торговлю.
В настоящее время популярны алгоритмы высокочастотного трейдинга (есть даже соревнования торговых роботов) – это эффективно, но из-за необходимости быстрых вычислений (нейросети считают не мгновенно) алгоритм часто ищут “вручную”, а это очень долго.
Что касается ML-решений, то наиболее успешной была попытка научить GPT анализировать финансовые новости
Свинг-трендинг – это тип торговли, когда позиции в ценных бумагах держат несколько дней, а не в рамках одного дня, при этом делается попытка предугадать тренд)
Опытные свинг-трейдеры часто используют волновой подход, основанный на трендовой и коррекционной составляющих.
Задача модели – по сути научиться улавливать эти волны, предугадывать момент окончания текущей и начала следующей волн.
Важно, что волны могут быть абсолютно разного размера и амплитуды – в этом и заключается главная сложность. А еще стоит отличать свинг-трейдинг (держим позиции несколько дней/недель) от интрадей-трейдинга (в течение дня)
Проект создан с целью обучить модель и автоматизировать ее торговлю на Московской бирже.
Автоматизация необходима, чтобы торговать с нескольких брокерских счетов одновременно
Торговля будет осуществляться во временном интервале в несколько дней (разновидность свинг-трейдинга)
-
Модели: sclearn, catboost, pytorch, keras
-
Контейнеризация: Docker
-
Хранение данных: numpy, pandas, SQL
-
Работа сервера: flask
-
Кэш: redis
-
Визуализация: seaborn, matplotlib
-
Парсинг и торговля: Tinkoff Invest API
На текущий момент модель автономно работает на сервере на реальных текущих данных в течение нескольких месяцев.
Данные котировок взяты для компаний с капитализацией > 300 млрд. (больше 35 компаний), период с 2004 по 2023 год
Составлена вспомогательная таблица с параметрами акций компаний (тикер, figi и др.)
Примечание: figi - уникальный ID, существующий у каждого финансового инструмента
Необходимость: случайные события могут создавать временные колебания курсов, которые не влияют на общий тренд
Преобразование данных:
- использование скользящего среднего (размер окна = 3)
- порог удаления (взято 4,5%)
- порог ограничения (взято 2%)
- нормализация
- были эксперименты с моделями только из линейных слоев (до 7) – не подходят для моей задачи
- ARIMA - тоже слишком простая
- рекуррентные нейронные сети*:
- RNN (самый базовый рекуррентный модуль, которому в библиотеках не придумали отдельного названия)
- GRU (управляемый рекуррентный блок)
- LSTM (модуль долгой краткосрочной памяти)
*для чистоты эксперимента использовался не только torch, но и keras
Результат: недообучение Модели оказались слишком простыми, чтобы предсказывать динамику, и сходились примерно к матожиданию (любопытно, что за срез в 20 лет матожидание составляет 0.05 п.п., то есть близко к 0)
После неудачи с RNN важно было проверить: пригодны ли данные для обучения моделей в принципе
Подобранные параметры:
- количество дней = 10
- max_depth = 5
- loss_func = MSE
- num_trees = 200
Для оценки качества здесь и далее использовалась MAE, расшифровка:
- MSE - mean squared error
- MAE - mean absolute error
Погрешность по МАЕ ~ 31,42 красный - предсказания зеленый - реальные значения скользящего среднего
В отличие от RNN, CNN была реализована только на Keras (более удобный интерфейс)
Подобраны параметры:
- loss_func = MAE
- optimizer = Adam *batch_size = 64
- n_epochs = 50
- количество дней = 20
Под количеством дней подразумевается длина промежутка данных, который подается на вход модели
Чтобы сделать алгоритм торговли, надо еще понять, каким значениям предсказаний от модели мы можем доверять, чтобы выйти в прибыль
Вероятность того, что реальное значение ≤ Y (и соответственно ≥ Y) при условии, что модель предсказала X (т.е. ось Oy - истинные значения, Ox - предсказанные, напр. P(real ≥ Y | pred ≥ X))
Трансформер оказался не лучше CNN
Подобраны параметры:
- loss_func = MAE
- optimizer = Adam
- n_heads = 8
- n_epochs = 50
- дни: 20, 10, 5
По итогам экспериментов именно CNN на текущий момент выбрана основной
Погрешность по МАЕ ~ 30,1 красный - предсказания зеленый - реальные значения скользящего среднего
Вероятность того, что реальное значение ≤ Y (и соответственно ≥ Y) при условии, что модель предсказала X (т.е. ось Oy - истинные значения, Ox - предсказанные, напр. P(real ≥ Y | pred ≥ X))
После написания всех соответствующих скриптов и приложения, я создал докер-образ и расместил его на виртуальной машине с публичным IP Информация, представленная там, служит скорее для отладки и просмотра результатов работы модели, нежели для сторонних наблюдателей, поэтому дизайн там отсутствует
Важные аспекты работы:
-
выбран порог = 80 (и соответственно -80)
-
алгоритм не запускается, если сегодня выходной
-
неисполненные заявки на покупку автоматически отменяются брокером при закрытии Мосбиржи
-
отмена заявок на продажу важна, чтобы зафиксировать текущий свободный баланс
- проект успешно функционирует уже около 3 месяцев
- у него положительная alpha - доходность к рынку
- раскрыть весь код проекта я не смог во избежание утечки чувствительных данных (а еще с некоторых пор он под NDA)













