Придумал интересный подход. Мож кого натолкнет на интересные идеи какие-то.
Сейчас начал торговать ML модели. С практической стороны с моделями какая сложность – там есть процесс предобработки данных – генерация признаков в основном (если с точки зрения трейдинговых данных заходить), поэтому нельзя просто сохранить модель, в другом месте загрузить и она будет работать, надо сохранить, загрузить, предобработать исходные данные к тому виду, к которому приучена модель и только тогда она будет работать. К счастью тонна сопутствующих трудозатрат убирается такой классной штукой как пайплайн – сейчас моя модель это 2 пайплайна – один для предобработки данных, другой для предикта (сама модель). Т.е. я где-то что-то рисечу, дальше автоматика упаковывает в пайплайны (2 на модель, как сказал). Все, могу кинуть эти 2 файла в папку с моделями, откуда их забирает торгующий блок и, собственно, отторговывает. Красота. Всякие мета-данные – тикер там, время удержания позиции и прочие мета-логики упаковываю или в сам пайплайн или в название файла. Красота.
Но по сути, классические алгоритмы (обычные алго-стратегии) по факту можно так же упаковывать. Можно это делать по идее (хотя на практике ещё не пробовал – идея с пылу с жару только) даже с помощью той же библиотеки. Пайплайны как работают: на вход дата-фрейм (ну или дата-сет, если кто не знаком с пандасом), на выход дата-фрейм или вероятности или че хочешь. В этот контекст вполне можно вписать обычные логики стратегии, даешь на вход свечные (или какие используешь данные), в пайплайне зашиваешь логики стратегии, на выход сигнал, например, бинарно 0/1. Т.е. по факту пайплайн это код, это алгоритм, что для стратегии и нужно, собственно.
По идее, если унифицировать интерфейсы, то торгующий блок может не знать что в пайплайн упаковано – модель/алгоритм простой или что-то ещё, на вход идут данные, на выход предикт (например, бинарный). Все, состряпал стратегию, упаковываешь в пайплайн, кидаешь в папку, торгующий модуль на лету подхватывает, считывает мета-данные и торгует. Мета-данные инкапсулировать тоже очень удобно по-моему. Можно там настройки про риски зашивать в том числе, например, или что-то ещё. Торгующий блок может подгружая пайплайн считывать мета-данные и использовать их как ориентир, но при необходимости может их и не использовать. Например, получая модель первый раз давать ей «испытательный срок» месяц, гоняя с пониженными рисками, собирая стату, потом уже смотреть что там про риски говорит сам пайплайн и использовать эти данные уже, как вариант.
Обожаю автоматизацию.
И ему, торгующему модулю, должно быть совершенно по барабану, что там у вас происходит в модуле стратегий :). Пайплайны ли вы используете или функции одну за дргой вызываете.
Касательно МЛ, то тенсорфлов сделал tensorflow serving как раз именно для того что бы использовать модели в продакшене быстро и удобно. Однако там конечно не все так здорово и удобно )) без пол литра не разберешься.
— обученную модель
— метаданные описывающие процесс генерации признаков и модели
— перечень инструментов и диапазон дат на которых было произведено обучение
— метрику качества
— полное время на генерацию при знаков и обучение модели
2) сделать абстрагирующий интерфейс которому на вход данные, а на выход сигнал — это лежит на поверхности. Вопрос только в какой форме подавать данные вместе с историей.
У меня так: алгоритм может сериализоваться/десериализоваться вместе со своим внутреннем состоянием. Ну то есть если ему положим надо 20 последних баров, то он сам должен внутри держать буфер. При таком подходе алгоритму надо на вход только очередной бар чтобы он его «усвоил» и выдал результат. Время от времени сериализованное состояние скидывается в БД. Если приложение рестартует, то восстанавливает состояние из БД и докидывает бары до последнего известного.
Не универсально, но под специфику моих алгоритмов подходит идеально.