Блог им. DenisVo

Tорговая система на базе глубокого обучения от начала до реальных торгов. Часть IV. TFX продолжение.

Итак, в ходе моего эксперемента, как это часто бывает, я отошел немного в сторону и погрузился в рассмотрение работы TFX pipeline. Что на самом деле довольно не плохо, так как теперь понимаю как он работает.
Однако TFX, как и большинство опен сорс софта, имеет свои проблемы:

  • Как я писал в предыдущем посте, компоненты работают в основном только с тренировочным и оценочным (train, eval) наборами данных
  • Версия TFX 0.15 работает только с estimator API — однако говорят что в версии 0.21 ввели поддержку keras моделей без конвертирования ее в estimator, к сожалению не удалось это опробовать, так как в этой версии они сломали interactive context. Конечно, можно было бы и без него, просто все компоненты загнать в пайплайн, но хотелось, что бы и в ноутбуке все работало. 
  • При использовании keras моделей, так и не разобрался как заставить работать TFMA в полную силу, а штука выглядит забавной. Если кто то в курсе, буду рад совету %).

В общем и целом можно смело использовать все эти технологии, но лучше без интерактивных компонентов. Загоняем все в apache beam и строим модельки, проверяем, лучшие используем :). Думаю простейший метод это простой конвейер с функцией трансформации данных и самой моделью. Остальное можно и проигнорировать для домашнего пользования. 

Собственно вот видюшка, про все это



Буду рад, если найдете время на посмотреть.

Собственно, есть еще такой религиозный вопрос касательно данных. Как и где их обрабатывать.

  1. Скажем если есть у меня набор исторических даннах, я могу сформировать все входящие фичи еще на этапе подготовки данных, потом в блоке трансформации нормализовать их и изменить формат пригодный для наших моделей, далее обучаем модель. 
  2. На этапе подготовки мы берем просто сырые данные и шлем их в наш конвейер, там генерируем фичи, может быть что то еще подтягиваем с базы данных и получается у нас совершенно новый набор входных фич.

Если в первом случае у нас набор/количество фич на входе будет равен набору на выходе из функции обработки, то во втором они могут быть совершенно разные. Что, кстати, и происходит в примере на видео, и отсюда вытекают проблемы с использованием кераса и модуля для анализа моделей. 

И опять же, не ясно как лучше делать в реальной торговли, готовить фичи до того как их в модель загонять, или же подавать только последние поступившие данные, а там уже как в пункте 2 тянуть все со второстепенных источников.

Если кто пользует машинное обучение и нейронные сети, как решаете эту проблему?

зы. ссылка на код из видео
https://github.com/CloseToAlgoTrading/CodeFromVideo/tree/master/episode_10
★2
10 комментариев

Я на PyTorch пишу, поэтому ваши проблемы возможно не до конца понимаю, но в общем это зависит от ситуации.

 

Если фичи тяжело считать на лету, то возможно их целесообразно предвычислять. У меня в принципе была такая ситуация, что расчет фичей на лету занимал 95% времени, собственно операции с графом 5%. С каждой эпохой обучения выгода от предвычисления растет. 

 

Обратная сторона — фичи могут занимать в разы больше, чем исходные данные. Допустим у вас ряд котировок 1 млн значений, а вы на вход подаете в качестве фич слайс из 252 подряд идущих значений. Фичи у вас будут занимать 252 раза больше места, чем исходные данные для их построения. Наверное тут целесообразно вычислять на лету.

В общем надо профайлить — я в итоге решил считать на лету, но переписал все для максимального ускорения. Раньше расчет фичей делал в Pandas и Numpy, а переписал все прямо в PyTorch с отключенным расчетом градиентов. В результате расчет фич стал в ~100 раз быстрее идти. 

avatar
Михаил, Да вот именно последних два абзаца меня скажем так волнуют и смущают. Если у меня 100000х252 фичи ) то мне просто нужен большой диск или база данных, но вот решил я поменять скажем 252 на 600 и все надо пересчитыватью. 

Конкретно в тфх меня смущает что в их эталонном пайплайне они создают метамодель описывающие входные сырые данный и делают некоторый статистический анализ именно сырыз данных, а потом вроде как предлагают их трансформировать, но! трансформировать то можно поразному. 
И вот дальше в этом же подходе, предлагается проанализировать модель, исходят из того, что ты будешь рассматривать сырые фичи. В общем :) тут я немного мне кажется не допонял идеи. 

А так то да, в идеале что торч что тенсорфлоу предлагают функциональность на лету все клепать, и это мне кажется правильный подход.

А вы когда модель используете, данные сырые которые 252 подряд идущих, из файла, базы данных тащите или просто собираете их и как набралось нужное количество шлете в модель?
я имею ввиду не обучение, а уже когда используете в продакшене :)
avatar

Denis, 

но вот решил я поменять скажем 252 на 600 и все надо пересчитывать

Вряд ли вы будете менять это каждый день, особенно в продакшене. Решите поменять — посчитаете один раз ночью, а потом каждый день инкрементально будете досчитывать. На самом деле отдача есть, если вы тренируете больше одной эпохи, а это всегда так. Вопрос большая она или нет — зависит от данных и сложности фич.  

Конкретно в тфх меня смущает что в их эталонном пайплайне


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

И как правильно вы поймете только после первого результат — как часто вам нужно будет переучивать модель? Может вы ее обучите один раз и будете месяцами использовать, а может нужно доучивать практически на лету? Сколько будет данных, будут ли они лезть в память? Насколько сложно считать фичи? Как вы будете исполнять — может вам для быстрой торговли нужно будет на C все переписать, а не REST север разворачивать на Python, как вы где-то писали. 

 
«я имею ввиду не обучение, а уже когда используете в продакшене :)»


У меня стратегия инвестиционная, поэтому мне не нужен какой-то суровый продакшен. В моем случае это выглядит так:

Раз в день в 19.45 на MOEX обновляются данные ISS. Я запускаю скрипт, он докачивает все обновления данных в MongoDB. Далее все необходимые данные берутся из базы (в моем случае они легко влезают в память и это не только котировки из ISS). С нуля учится модель, а фичи генерятся на лету иногда с lru_cache. Делается предсказание на следующий день по примерно 100 инструментам. К предсказаниям применяется, условно назовём, портфельная теория. Далее выдается рекомендация, какой  инструмент в моем портфеле нужно продать, а какой купить, или рекомендация ничего не трогать. Все от начала скачки до рекомендации занимает около 5 минут. 

Где-то раз в месяц я запускаю процедуру байсовской оптимизации гиперпараметров модели — она занимает около суток. 

Торгую я ручками по этим рекомендациям, благо сделок немного и далеко не каждый день.

avatar
Михаил, спасибо за развернутый ответ. 
 Я вам еще в прошлый раз писал, что вы по моему, чем-то не тем занимаетесь — у вас скорее исследовательская задача...
Тут у меня есть еще просто интерес в технологиях покапаться. 
Все исследования по старинке в питоновском ноутбуке делаю.

может вам для быстрой торговли нужно будет на C все переписать, а не REST север разворачивать на Python, как вы где-то писали. 
Ну тут проблем как раз таки с тенсорфлоу еще нет :), он отлично коннектится через gRPC.
avatar
Denis, можно покопаться в технологиях, которые более актуальны для решения задачи — делаете простой генератор признаков, простой луп для обучения и простую процедуру оценки качества ваших предсказаний. И исследуйте десятки архитектур, которые можно попытаться применить, пока результат не получите. 

А потом будет ясно этот скрипт, как у меня, REST сервер, gRPC или монолитное высокооптимизированное приложение на колокейшене, а модель вы будете например офлайн тренировать, а потом ночью грузить на сервер колокейшен, чтобы использовать на следующий день. А то и вообще ничего путного не получится, что тоже бывает. 

Мне вот например пришлось написать некий генератор описания параметров модели, используемых признаков и их параметров, а также процедуру сборки и обучения модели по этому описанию, чтобы подбор оптимальной модели производить, хотя когда я начинал, вряд ли я об этом думал. И вряд ли есть такое готовое решение. 
avatar
Михаил, Вы в целом абсолютно правы, ну может я только вот с этим утверждением в корне не согласен:
И исследуйте десятки архитектур, которые можно попытаться применить, пока результат не получите. 

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

Мне вот например пришлось написать некий генератор описания параметров модели
Так ведь все эти модные технологии, я про тфх, как раз таки и направленны на автоматизирование этих действий, а значит и экономии времени на исследования. Хочется в это верить :)
avatar
Denis, я могу ошибаться, но основная  его задача — развертывание систем в продавшен. Причем продавшен достаточно определенный, который интересен Google и прочим web-сервисам, — много запросов от многих пользователей, на которые нужно отвечать в пределах секунды — сотен милисекунд. То есть он заведомо не подходит для наших целей —  у вас скорее всего будет один клиент. Причем, если это HFT — то скорости будет недостаточно, а если инвестиции, то будет избыточно. 


А по-поводу сетей и данных: вся история NN — это поиск все более совершенных архитектур для тех же данных. Картинки или текст давно существуют и ничего нового с ними не делают, но постепенно изобретают RezNet или BERT. У вас тоже вряд ли будут какие-то необычные данные. Скорее всего дальше котировок вы никуда не уйдете, а если уйдете, то это будет отдельное непростое приключение по поиску и сбору данных. Поэтому основной ваш инструмент — это правильно подобрать архитектуру.
avatar
Михаил, думаю вы не ошибаетесь, в основном конечно гугл его для больших систем придумал.

Поэтому основной ваш инструмент — это правильно подобрать архитектуру.

Боюсь что все в это и выплывет, хотя мне такой подход не нравится, это такой каггл подход, берем какие-то данные и начинаем искать архитектуру, а вдруг повезет. То же кстати с анализом фич происходит,  сеть что то выдает хорошее значит и фичи хороши.
Я люблю исходить все же от понимания данных. Хотя именно в этом эксперементе который пытаюсь реализовать, все идет в обратную сторону ).
avatar
Denis, никто не мешает архитектуру придумывать с учетом особенности данных. Ряд равноправных значений — наверное нет смысла пробовать Dense слой,  а лучше взять Conv или LSTM. На практике люди используют годовые скользящие средние, а в исследованиях аномалий рынка один из важных факторов годовой моментум, наверное нужно грузить в сеть историю за год, то есть порядка 252 значений, но на таких последовательностях LSTM уже не работает, поэтому видимо Conv. Учитывая, что дневные данные имеют периодичность в 5 рабочих дней, разумно попробовать свертки 5. Если учить, на данных многих инструментов, разумно добавить эмбединг инструмента, его отраслевой принадлежности и т.д.

И в кагле реальные чемпионы не пробуют все подряд, они знают, что обычно заходит, как тюнить модели под конкретные задачи, хотя для не знающего это кажется беспорядочным перебором.
avatar
Как же у Вас всё сложно с анализом данных. Из своего короткого опыта анализа данных я знаю, что всю сложность архитектуры базы расчётов можно упростить через набор стандартных терминальных индикаторов. При этом «правильных» моделей можно построить точно больше одной.
avatar

теги блога CloseToAlgoTrading

....все тэги



UPDONW