Replikant_mih
Replikant_mih личный блог
09 сентября 2020, 12:22

Архитектура, при которой стратегия упаковывается в файл. Algo-only.

Придумал интересный подход. Мож кого натолкнет на интересные идеи какие-то.

 

Сейчас начал торговать ML модели. С практической стороны с моделями какая сложность – там есть процесс предобработки данных – генерация признаков в основном (если с точки зрения трейдинговых данных заходить), поэтому нельзя просто сохранить модель, в другом месте загрузить и она будет работать, надо сохранить, загрузить, предобработать исходные данные к тому виду, к которому приучена модель и только тогда она будет работать. К счастью тонна сопутствующих трудозатрат убирается такой классной штукой как пайплайн – сейчас моя модель это 2 пайплайна – один для предобработки данных, другой для предикта (сама модель). Т.е. я где-то что-то рисечу, дальше автоматика упаковывает в пайплайны (2 на модель, как сказал). Все, могу кинуть эти 2 файла в папку с моделями, откуда их забирает торгующий блок и, собственно, отторговывает. Красота. Всякие мета-данные – тикер там, время удержания позиции и прочие мета-логики упаковываю или в сам пайплайн или в название файла. Красота.

 

 

Но по сути, классические алгоритмы (обычные алго-стратегии) по факту можно так же упаковывать. Можно это делать по идее (хотя на практике ещё не пробовал – идея с пылу с жару только) даже с помощью той же библиотеки. Пайплайны как работают: на вход дата-фрейм (ну или дата-сет, если кто не знаком с пандасом), на выход дата-фрейм или вероятности или че хочешь. В этот контекст вполне можно вписать обычные логики стратегии, даешь на вход свечные (или какие используешь данные), в пайплайне зашиваешь логики стратегии, на выход сигнал, например, бинарно 0/1. Т.е. по факту пайплайн это код, это алгоритм, что для стратегии и нужно, собственно.

 

По идее, если унифицировать интерфейсы, то торгующий блок может не знать что в пайплайн упаковано – модель/алгоритм простой или что-то ещё, на вход идут данные, на выход предикт (например, бинарный). Все, состряпал стратегию, упаковываешь в пайплайн, кидаешь в папку, торгующий модуль на лету подхватывает, считывает мета-данные и торгует. Мета-данные инкапсулировать тоже очень удобно по-моему. Можно там настройки про риски зашивать в том числе, например, или что-то ещё. Торгующий блок может подгружая пайплайн считывать мета-данные и использовать их как ориентир, но при необходимости может их и не использовать. Например, получая модель первый раз давать ей «испытательный срок» месяц, гоняя с пониженными рисками, собирая стату, потом уже смотреть что там про риски говорит сам пайплайн и использовать эти данные уже, как вариант.

 

Обожаю автоматизацию.

43 Комментария
  • CloseToAlgoTrading
    09 сентября 2020, 13:12
    По идее все так и должно быть, ваш торгующий модуль который обращается к какой либо стратегии, должен всегда обращаться к некоторому стандартному/общему интерфесу от блока стратегий. Как вы интерфейс опишите, это уже ваше дело, можете в джесон формате все там передавать. 
    И ему, торгующему модулю, должно быть совершенно по барабану, что там у вас происходит в модуле стратегий :). Пайплайны ли вы используете или функции одну за дргой вызываете.
    Касательно МЛ, то тенсорфлов сделал tensorflow serving как раз именно для того что бы использовать модели в продакшене быстро и удобно. Однако там конечно не все так здорово и удобно )) без пол литра не разберешься.
      • CloseToAlgoTrading
        09 сентября 2020, 13:36
        Replikant_mih, кажется тут уже когда то обсуждалось, но если у вас все на питоне то вы можете использовать flask и пакуйте все что угодно внутрь, получите доступ через рест к вашим алгоритмам с любых платформ ).
        Но если у вас крутится на одном языке и в одной коробочке, то это все не обязательно.
          • Михаил
            09 сентября 2020, 14:21
            Replikant_mih, вы в endpoint Flask передаете название модели. Flask забирает данные из папочки с соответствующим именем и отдает ответ. Ничего перезапускать вам не прийдется. 
              • Михаил
                09 сентября 2020, 14:29
                Replikant_mih, это нужно, если вы хотите куда-то передавать модельки через REST, как CloseToAlgoTrading изначально предлагал. Если вы все делаете на одном компе большого смысла в этом нет. 
          • CloseToAlgoTrading
            09 сентября 2020, 14:23
            Replikant_mih, :) если все работает, то и хорошо.
            Так то «пайплайн» это просто обозначение конвеера выполнения задач, вы же его как то вызываете и данные на вход передаете. Вот этот момент можете обернуть в какой нить апи, и отделить полностью работу ваших стратегий, рекомендательных алгоритмов и тд, от остального приложения. Но только если вам это нужно. 

            зы. хотя возможно вы уже используете нечто подобное, :) говоря «сохраняю модель в пайплайн».
  • Михаил
    09 сентября 2020, 14:52
    Я в MongoDB кладу вместо папочек:
    — обученную модель
    — метаданные описывающие процесс генерации признаков и модели
    — перечень инструментов и диапазон дат на которых было произведено обучение
    — метрику качества
    — полное время на генерацию при знаков и обучение модели
      • Михаил
        09 сентября 2020, 15:07
        Replikant_mih, я как-то не очень понимаю, в чем разница. Как вы свои пайплайны сохраняете? Что вы будете делать, если у вас появятся новые типы шагов в пайплайне?
          • Михаил
            09 сентября 2020, 15:24
            Replikant_mih, я так и не понял, что значит «я просто говорю: сохрани вот эту модель» — в каком формате?
            Я тоже просто делаю вызов сохрани модель — в результате получается грубо json с последовательностью шагов (имен функций) и параметров вызовов. Есть простая функция которая умеет загружать — берет json и делает вызовы соответствующих функций с соответствующими параметрами.
            Если функции лежат в нужных модулях, то ничего больше делать не надо.

            • Михаил
              09 сентября 2020, 15:28
              Михаил, json стоит из нескольких блоков:
              — что нужно сделать, чтобы сгенерировать признаки
              — как и с какими параметрами строится обучающий алгоритм
              — как и с какими параметрами осуществляется обучение.
              • Михаил
                09 сентября 2020, 15:31
                Михаил, соответсвенно я могу простым вызовом:
                — сохранить соответсвующий json
                — загрузить json, обучить модель, сохранить обученную модель с указанием метаданных обучения — на каких инструментах и временных интервалах
                — загрузить модель и часть json с описанием признаков и сделать предсказание для конкретной даты

              • Михаил
                09 сентября 2020, 16:02
                Replikant_mih, я юпитер не люблю — в нем код имеет тенденцию в хлам превращаться. Сразу py файлы пишу. 

                Упаковываю это просто красивое слово — sklearn_pipeline за вас хранит ссылки на функции и параметры, и ничего он не упаковывает.

                Внутри sklearn_pipeline хранит всего один атрибут — список кортежей (название шага, функция/класс шага, передаваемые параметры).

                А основной метод по существу сводится к циклу — пройдись по списку вызови класс с соответсвующими аргументами, печатай в лог название шага. 

                Я этот цикл сам написал. Так как вы не лезете внутрь sklearn_pipeline, то видимо делаете pickle класса. Так как я имею доступ внутрь своего класса, мне легче список кортежей сохранить в виде json, но при желании могу сделать и pickle.

                Просто pickle не удобен тем, что он бинарный и не понятный. Вот лежит он на диске, а чего там внутри. А json в человеко читаемом виде — собственно тот самый перечень шагов и параметров. 

                Плюс я не заперт в классах sklearn, а они не очень ложатся на сети. 
                  • Михаил
                    09 сентября 2020, 16:57
                    Replikant_mih, тут каждому свою.

                    Хотел для себя прояснить, потому, что звучит несколько странно

                    Ну окей, а гиде тогда сами функции?)) Я на другую машину переношу только пайплайны. Она знать не знает что я там нарисечил), единственное только надо обеспечить совместимость по версиям либ.

                    А как вы все-таки сохраняете пайплайн, потому что pickle надо иметь доступ к определениям всех типов для восстановления. В интернете народ тоже вроде жалуется, что не удается перетащить с кастомными функциями? Выскакивают ошибки из серии

                    AttributeError: module '__main__' has no attribute 'CustomTransformer'

                    На что рекомендуют:
                    You'll have to make your CustomTransformer class available in the new session, either by re-defining or importing it.

                    Каким образом вы эту проблему обходите?
                      • Михаил
                        09 сентября 2020, 19:55
                        Replikant_mih, как сейчас стало модно говорить, ушёл на пенсию в 38:)
                          • Михаил
                            09 сентября 2020, 20:11
                            Replikant_mih, я исключитель на DL сейчас. 
                              • Михаил
                                09 сентября 2020, 20:32
                                Replikant_mih, я что-то похожее на WaveNet использую. Но чужой опыт, как мне кажется, редко помогает, лучше самому поэкспериментировать с учетом уже имеющихся наработок.
                                  • Михаил
                                    09 сентября 2020, 21:12
                                    Replikant_mih, с DL действительно возни больше. ML выбрал модель дернул fit /predict и все готово. Думаешь, только над тем, как фичи придумать. А тут придётся руками сетку собирать (у меня где-то 300 строк), для чего полезно статьи почитать. Потом руками training loop пишешь еще несколько десятков строк. Ну и данные готовишь, как в обычном ML. В общем не факт, что в это стоит погружаться, если более простые методы устраивают. 
                                      • Михаил
                                        09 сентября 2020, 21:43
                                        Replikant_mih, Возможно повторяюсь, если признаки придумывать любите сами, то большого смысла в сетях нет. Нет смысла и в полносвязный сетях. Тут лучше бустинг использовать. 
                                        В сети лучше котировки напрямую пихать, что-то странное типа твитов. 
  • Roman Ivanov
    09 сентября 2020, 18:18
    Чет как-то сумбурно. 1) Обычно пайплайн это не алгоритм, а последовательность обработки. Алгоритм — это частный случай узла графа пайплайна.
    2) сделать абстрагирующий интерфейс которому на вход данные, а на выход сигнал — это лежит на поверхности. Вопрос только в какой форме подавать данные вместе с историей.

    У меня так: алгоритм может сериализоваться/десериализоваться вместе со своим внутреннем состоянием. Ну то есть если ему положим надо 20 последних баров, то он сам должен внутри держать буфер. При таком подходе алгоритму надо на вход только очередной бар чтобы он его «усвоил» и выдал результат. Время от времени сериализованное состояние скидывается в БД. Если приложение рестартует, то восстанавливает состояние из БД и докидывает бары до последнего известного.
    Не универсально, но под специфику моих алгоритмов подходит идеально.
      • Roman Ivanov
        09 сентября 2020, 19:30
        Replikant_mih, я подход выбирал с учетом скорости моделирования на истории. Если на каждом шаге окно просматривать, то будет дольше, хотя и гибче. Потому инкрементальные алгоритмы в основном.
        Про алгоритм: ясень что где там грань несколько размытая. Но сам пайплайн обычно это разновидность «орекстратора» задача которого в определенной последовательности вызвать собственно алгоритмы.
          • Roman Ivanov
            09 сентября 2020, 19:49
            Replikant_mih, раньше было весело, сейчас вяло. Но уже 10 лет в игре и планирую продолжать (не лудоман ;).
              • Roman Ivanov
                09 сентября 2020, 20:20
                Replikant_mih, смотря что называть ML, так то ничего нового. Тупой оптимизатор.
                  • Roman Ivanov
                    09 сентября 2020, 20:53
                    Replikant_mih, не, не использую.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн