Выбираем язык программирования для разработки надежных торговых систем

Автор: Александр Кургузкин (mehanizator).

Сложился некий стандарт для количественных трейдеров (квантов) по выбору средств исследования и разработки: R, Python, C++. С первыми двумя все более-менее понятно, это неплохие средства для ведения исследовательской работы со множеством статистических/математических библиотек. Однако повальный выбор C++ в качестве средства для реализации конечных систем вызывает у меня недоумение.

Понятно, когда имеет смысл брать C++ — когда очень, ОЧЕНЬ нужна скорость. C++ даст самый быстрый код. Но этот код всего в два раза быстрее того, что можно получить на managed платформах типа jvm или .net. Много ли задач попадают в диапазон “native код достаточно быстр, а managed уже недостаточно быстр”? Если двукратное ускорение кода для вас критически важно — вопросов нет, берите C++ (но внимательно посмотрите на Fortran). Во всех же других случаях C++ — неоднозначный выбор, потому что у вас есть более интересные варианты, которые дадут вам более надежный код.

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

Я не говорю, что на C++ нельзя писать надежные системы. Если вы С++ гуру с 50 летним опытом, который знает свою область вдоль и поперек, наверное вам не о чем беспокоиться. Но если взять среднестатистического программиста в вакууме и вынудить его писать вашу систему на C++, полученный код будет менее надежен, чем код на многих других языках.

Какие свойства языка или платформы влияют на надежность и безопасность кода?

1. Managed/Native

Управляемый (managed) код более надежен, чем native код. Большая часть бизнес-логики сейчас пишется именно под managed платформы jvm и .net.

2. Типизация

Строгая статическая типизация дает более надежный код, чем нестрогая или динамическая типизация. В C++ — нестрогая статическая типизация, в Java/C# — строгая статическая. Есть класс ошибок, которые будут отловлены на уровне компилятора в случае строгой статической типизации и будут пропущены в случае какой-то другой. Дополнительный бонус статической типизация — более быстрый код.

3. Поддержка иммутабельности

Код, активно использующий неизменяемые (иммутабельные) структуры, более надежен, чем код на изменяемых структурах. Есть языки, в которых использование иммутабельности поддерживается из коробки и активно навязывается — для jvm это Clojure, Scala.

4. Обеспечение null-safety

Часто большие дырки в надежности возникают от плохой работы с null. Язык, в котором null-safety обеспечивается из коробки или принудительно, безопаснее. В традиционных языках (Java/C#/C++) null-safety из коробки не предусмотрено и обеспечивается через разного рода костыли. В относительно новых функциональных языках проблема решается через Option монаду. Kotlin пошел по пути явного объявления nullable типов.

Если оценивать языки, выставляя баллы по количеству критериев надежности, которые они обеспечивают, то мой несколько субъективный рейтинг будет выглядеть примерно так (к сожалению, не очень знаком с альтернативными языками платформы .net, поэтому их тут не будет):

4.0. Scala

4.0. Haskell

3.0. Clojure (динамический)

3.0. Erlang (динамический)

3.0. Kotlin

2.0. Java

2.0. C#

0.5. C++

Мой личный выбор для боевых систем — Scala. Хотя исследования и некритические куски кода продолжаю делать на Java.

Автор: mehanizator

Комментарии:

green09: Есть в Java библиотеки, которые облегчают работу с временными рядами? Например, как quantmod под R.


Подпишитесь на уведомления о новых постах

И получите доступ к специальным материалам сайта