Skip to content

tired-racoon/TradePublic

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TradePublic

Открытый репозиторий моего 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 анализировать финансовые новости

Свинг-трендинг – это тип торговли, когда позиции в ценных бумагах держат несколько дней, а не в рамках одного дня, при этом делается попытка предугадать тренд)

Опытные свинг-трейдеры часто используют волновой подход, основанный на трендовой и коррекционной составляющих.

Задача модели – по сути научиться улавливать эти волны, предугадывать момент окончания текущей и начала следующей волн.

Важно, что волны могут быть абсолютно разного размера и амплитуды – в этом и заключается главная сложность. А еще стоит отличать свинг-трейдинг (держим позиции несколько дней/недель) от интрадей-трейдинга (в течение дня)

Intraday

Описание идеи

Проект создан с целью обучить модель и автоматизировать ее торговлю на Московской бирже.

Автоматизация необходима, чтобы торговать с нескольких брокерских счетов одновременно

Торговля будет осуществляться во временном интервале в несколько дней (разновидность свинг-трейдинга)

Используемые технологии

  • Модели: 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%)
  • нормализация

Обзор моделей: начало

  1. были эксперименты с моделями только из линейных слоев (до 7) – не подходят для моей задачи
  2. ARIMA - тоже слишком простая
  3. рекуррентные нейронные сети*:
  • RNN (самый базовый рекуррентный модуль, которому в библиотеках не придумали отдельного названия)
  • GRU (управляемый рекуррентный блок)
  • LSTM (модуль долгой краткосрочной памяти)

*для чистоты эксперимента использовался не только torch, но и keras

Результат: недообучение Модели оказались слишком простыми, чтобы предсказывать динамику, и сходились примерно к матожиданию (любопытно, что за срез в 20 лет матожидание составляет 0.05 п.п., то есть близко к 0)

Пример

Catboost: первые успехи

После неудачи с RNN важно было проверить: пригодны ли данные для обучения моделей в принципе

Подобранные параметры:

  • количество дней = 10
  • max_depth = 5
  • loss_func = MSE
  • num_trees = 200

Для оценки качества здесь и далее использовалась MAE, расшифровка:

  • MSE - mean squared error
  • MAE - mean absolute error

catboost

Погрешность по МАЕ ~ 31,42 красный - предсказания зеленый - реальные значения скользящего среднего

Сверточные нейросети

В отличие от RNN, CNN была реализована только на Keras (более удобный интерфейс)

Подобраны параметры:

  • loss_func = MAE
  • optimizer = Adam *batch_size = 64
  • n_epochs = 50
  • количество дней = 20

Под количеством дней подразумевается длина промежутка данных, который подается на вход модели

CNN

Выбор порога для CNN

Чтобы сделать алгоритм торговли, надо еще понять, каким значениям предсказаний от модели мы можем доверять, чтобы выйти в прибыль

graph 1 graph 2

Вероятность того, что реальное значение ≤ 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 на текущий момент выбрана основной

transformer

Погрешность по МАЕ ~ 30,1 красный - предсказания зеленый - реальные значения скользящего среднего

Выбор порога для трансформера

graph 1 graph 2

Вероятность того, что реальное значение ≤ Y (и соответственно ≥ Y) при условии, что модель предсказала X (т.е. ось Oy - истинные значения, Ox - предсказанные, напр. P(real ≥ Y | pred ≥ X))

Веб-интерфейс

После написания всех соответствующих скриптов и приложения, я создал докер-образ и расместил его на виртуальной машине с публичным IP Информация, представленная там, служит скорее для отладки и просмотра результатов работы модели, нежели для сторонних наблюдателей, поэтому дизайн там отсутствует

web

Алгоритм торговли

Важные аспекты работы:

  • выбран порог = 80 (и соответственно -80)

  • алгоритм не запускается, если сегодня выходной

  • неисполненные заявки на покупку автоматически отменяются брокером при закрытии Мосбиржи

  • отмена заявок на продажу важна, чтобы зафиксировать текущий свободный баланс

Алгоритм

Результаты работы

  • проект успешно функционирует уже около 3 месяцев
  • у него положительная alpha - доходность к рынку
  • раскрыть весь код проекта я не смог во избежание утечки чувствительных данных (а еще с некоторых пор он под NDA)

About

Public repository with some code for my TradeML project

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors