В этой статье поделюсь своим опытом создания и развертывания Production решения для алготрейдинга. Возможно вам это конечно никогда и не понадобится. Сама проблема родилась из соображений, вот есть у меня алгоритм на R/Python который показал результат, что мне с ним делать ?
Этот подход подходит тем кто создает свои модели и прототипы на языке R или Python, таким образом команда может быть разделена на тех кто проектирует модели (Data Scientist) и на тех кто пишет платформу для исполнения торговых сигналов (Программисты).
Я буду рассказывать с точки зрения своего опыта, опыта создания промышленного и масштабированного решения для алготрейдинга. Я вовсе не утверждаю на что другие подходы не имеют право на жизнь.
Предположим что:
- Вы обладаете некоторым опытом анализа данных на языке R или Python
- У вас есть несколько стратегий использующие к примеру нейронные сети, машинное обучение или потоковый анализ новостей которые вы бы хотели внедрить в Production, предварительно вы протестировали ее на языке R/Python и построили прототип
- У вас есть платформа для исполнения торговых сигналов (C#, C++, Java etc) То что принято называть «ботом», в нем помимо всего прочего есть еще и слой отображения графической информации.
- Вы хотите использовать модели написанные R/Python для торговли в платформе написанной к примеру на C++ или C#
К примеру вы тестируете стратегию на R и она показала результат, и вы задаете вопрос, что дальше?.. Этим вопросом, как мне кажется задаются все. У вас на самом деле есть пара вариантов:
- Перевести стратегию с языка R на язык на котором написана платформа для исполнения;
- Использовать некоторую прослойку которая позволяет выполнять код на языке R в в платформе
Рассмотрим эти варианты:
- Чрезвычайно затратный, во первых необходимых библиотек или открытых реализаций которые вы использовали в R, на языке, на котором реализована платформа может не быть. К примеру бесплатных реализаций алгоритма Extreem Gradient Boosting ( самый популярный алгоритм на kaggle) на C# насколько я знаю нет, но даже если вы и найдете то не факт что там нет ошибок, необходимо все заново тестировать. Таким образом вы делаете одну и туже работу несколько раз 1 раз тестируете стратегию на R второй раз на C# или C++. Либо вы можете самостоятельно реализовать подобный алгоритм на языке платформы, что еще более затратнее, после недель отлова багов вы забиваете на это.
- Вы можете использовать прослойку между языком платформы и языком R, к примеру https://rdotnet.codeplex.com/ но кто хоть раз этим пользовался понимает насколько это не прозрачно, нереально для отладки и понимания где ошибка если она возникнет, к тому же это медленное и не стабильное решение.
- Развернуть свою модель как сервис, который доступен к примеру по WebAPI, это уже лучше, к примеру есть библиотеки которые позволяют это делать для python это Flask http://www.flaskapi.org/ для R это Plumber https://www.rplumber.io/. Таким образом схема может выглядеть так.
Кажется что третий вариант вроде бы рабочий, однако и тут есть куча подводных камней:
- Не единая точка входа для сервисов, так как у вас 2 технологии Flask, Plumber то и потенциальных проблем в 2 раза больше так как у обоих технологий разный environment
- Самая страшная проблема что R это single-threaded язык, а значит что WebAPI на R который развернут с помощью plumber будет очень медленный
Есть еще одно решение Microsoft R Server
https://www.microsoft.com/en-us/sql-server/machinelearningserver вот его существенные плюсы:
- Это кросс платформенное решение, вы можете деплоить свои модели на Windows, Linux, Haddop, Apache Spark или в облаке и иметь к ним единую точку входа
- Единая точка входа, мы можете разворачивать свои модели как сервисы на R или на Python
- Полная совместимость со всеми пакетами R и Python
- Стабильность и масштабируемость.
- Microsoft R Server создан для промышленных решений, а значит он невероятно быстрый. К примеру он позволяет работать с огромным количеством данных. Ниже на рисунке производительность R Server относительно обычного R клиента. Он позволяет обучать модели в лайв режиме.
- Вы можете разделить программистов и разработчиков торговых моделей
И так, мы выбираем Microsoft R Server, что же дальше?.. Предположим мы решили разворачивать наш контур на Windows. В таком случае мы можем использовать SQL Server 2016 в который интегрирована поддержка R на уровне хранимых процедур! Что это нам дает? Помимо того что я написал выше, еще куча возможностей!
Выкидываются из платформы все что связанно с отображением данных, графиков, таблиц и.т.д, если мы логируем в базу то всю визуальную обработку мы возложим либо на Reporting Service что интегрирован в SQL Server либо на стороннее приложение которое будет читать данные из базы и графически их отображать, к примеру R Shiny Dashboard.
Это снижает нагрузку и потенциально ошибку с главного узла(исполнителя сигналов) к тому же SQL Reporting Service для этого и создан он быстр, и стабилен. И поддерживает исполнение хранимок на языке R и все существующие к нему пакеты! К тому же доступ по Веб интерфейсу с аутентификацией с любого компа или телефона! Вот пример работы SQL Reporting Service из инета
Вот и все. Статья пожалуй получилась довольно смутной и не подробной, однако такой задачи и не было, более подробно все можно на нагуглить и самому ). Кажется что все это громоздко и не подъемно, однако нет. Не подъемно это делать из бота некоторый комбайн который делает все что только можно, и графики строит, и тестирует, и оптимизирует итд. В результате получать исключения по ошибкам которые никак не связанны с работой торговой стратегии.
Ну, «бесплатно» у майкрософт ничего не бывает.
Если верить этому прайсу idt-soft.ru/catalogue/microsoft/microsoft-r-server-2016
то ли 450 то ли 900 тыр лицензия стоит минимум.
интересное решение. у питона есть библиотека PythonNet, она неплохо работает с .net dll-ками. Т.е. это не IronPython, а нормальный питон, который умеет общаться с C#, VisualBasic. На у C библиотеки там нативно поддерживаются. Про R ничего не скажу, но думаю там ситуация чуть хуже действительно.
Вообще если действительно нужна скорость, то скорее всего придется переписать под Java, С++ или C#