Биржевая торговля — это высокотехнологичная отрасль. В нашем блоге на Хабре мы рассказывали о том, какие протоколы используются для передачи финансовой информации (раз, два, три, четыре), демонстрировали инфраструктуру узла финансового трейдинга и описывали процесс оптимизации производительности торгового терминала.
Сегодня речь пойдет о том, какие языки программирования используются в сфере финансов, для решения каких задач они применяются, и на каком из них остановить выбор в каждом конкретном случае.
Финансы и программирование: краткий обзор
Традиционно в финансовой индустрии востребованы языки программирования, которые позволяют создавать высоконагруженные системы обработки и передачи данных, которые взаимодействуют с самым разным железом.
Значительная часть инфраструктуры брокерских компаний и бирж создана с применением языка C++ — с его помощью создаются самые разные продукты от библиотек для расчета ценовых моделей производных инструментов до модулей обработки потоков данных. Неудивительно, что специалисты, знающие этот язык, крайне востребованы в сфере финансов.
Кроме того, крайне востребованными языками программирования являются C# и Java. Эти языки реже используются для непосредственного решения инфраструктурных задач, однако на рынке можно часто встретить торговых роботов, модули которых реализованы на этих языках. Кроме того финансовые компании могут использовать их для реализации различных фронтенл-сервисов. Специалисты по C# и Java также востребованы в таких компаниях.
Отдельный пласт представляют собой скриптовые языки — например, Python, MATLAB и R. Их часто используют для описания торговых стратегий и прототипирования квантовых моделей. Часто трейдеры пишут код своих прототипов на скриптовых языках, а позднее уже описывают их с помощью более производительных языков вроде C++.
Однако в некоторых случаях механические торговые системы могут быть целиком реализованы на скриптовых языках. Некоторые из таких инструментов, вроде языка TradeScript, даже включают в торговые терминалы, что позволяет пользователям быстро «набросать» торговую стратегию, не отвлекаясь от анализа котировок и графиков.
Ниже представлен код на TradeScript, с помощью которого описана торговая стратегия, использующая для генерации сигналов индикаторы Parabolic SAR и экспоненциальные скользящие средние (exponential moving average, EMA). В данном случае, для входа в позицию используется 20-периодная и 60-периодная EMA, а для выхода из нее — параболическая система.
Код простой торговой системы на TradeScript
Buy Signals
# 20-периодная EMA пересекает снизу-вверх 60-периодную EMA
CROSSOVER(EMA(CLOSE, 20), EMA(CLOSE, 60))
Sell Signals
# 20-периодная EMA пересекает сверху вниз 60-периодную EMA
CROSSOVER(EMA(CLOSE, 60), EMA(CLOSE, 20))
Exit Long
# Цена закрытия пересекает снизу-вверх Parabolic SAR
CROSSOVER(CLOSE, PSAR(CLOSE, 0.02, 0.2))
Exit Short
# Цена закрытия пересекает сверху вниз Parabolic SAR
CROSSOVER(PSAR(CLOSE, 0.02, 0.2), CLOSE)
Написание торговых роботов
Одной из наиболее динамично развивающихся сфер в финансовой индустрии в последние годы является алгоритмическая торговля и создание торговых роботов. Поговорим о том, какие языки программирования и почему используются в этом случае.
Прежде всего, как и в случае любых программных продуктов, разработчикам торговых роботов так или иначе приходится идти на различные компромиссы, которые позволяют учесть главные факторы, влияющие на успешность работы на рынке:
- Скорость торговли, т.е. совершения самих торговых операций — скорость выставления заявки, скорость получения ответа от биржи, скорость обработки самим роботом
- Универсальность и настраиваемость робота для работы с новыми рынками, финансовыми инструментами, вариантами алгоритмов
- Скорость разработки и внесение существенных изменений.
Соответственно, тех случаях, когда важна скорость работы (например, в случае HFT-трейдинга), используются эффективные низкоуровневые языки — C++ и даже чистый С.
Если же планируется программирование торговой системы, которая будет работать по стратегии, не предполагающей совершение большого количества сделок, то здесь на первый взгляд выходит не скорость работы, а удобство и скорость самой разработки — в таком случае применяют не самые быстрые языки, например, на платформе .NET (тот же C# или Visal Basic).
Еще один вариант — это ситуация, при которой требуется производить значительные вычисления, но не обязательно в режиме реального времени. В таких случаях может быть оправданным использование интерпретируемых языков Python, R или TradeScript.
Иными словами, для различных модулей торгового робота используются соответствующие языки программирования:
- Торговый движок — простой, максимально быстрый робот, совершающий простой набор операций, как правило создается на C, C++ и ассемблерах разного уровня.
- Система управления параметрами — такой модуль сочетает в себе функции управления работой алгоритмы и интерфейса пользователя, может включать управляющие параметры и механизмы представления результатов торговли. Здесь могут использоваться C++, C#, Java и т.п.
- Система бэк-тестинга и подбора параметров торговли — модуль используется для тестирования новых алгоритмов на исторических данных, подбирает новые параметры к текущим алгоритмам. Для реализации данного модуля можно использовать Python и другие скриптовые языки. (В нашем блоге мы публиковали рассказ о создании системе событийно-ориентированного бэктестинга на Python).
Советы экспертов
Для того, чтобы лучше подобрать язык программирования для конкретной ситуации, одного теоретического описания сферы применения этих инструментов может быть недостаточно. Поэтому следует также изучать и опыт других разработчиков торговых систем.
Ниже мы собрали несколько советов от российских и зарубежных экспертов, занимающихся созданием торговых роботов и финансового софта.
В ходе дискуссии о выборе языков программирования для создания торговых роботов на сервисе Quora PhD-профессор Принстонского университета и руководитель департамента разработки компании Flexport Эндрю Ледвин, высказался о том, какие инструменты нужно выбирать для описания самой торговой стратегии:
Здесь нам нужно генерировать приносящие прибыль правила работы, основываясь на различных сигналах. […] На данном уровне ключевым моментом является выразительность языка. Часто на нем используются языки вроде Python или даже C++ с Java, но я считаю идеальным вариантом Haskell или Ruby в качестве «обертки» с последующей разработкой ключевых модулей на более низкоуровневых языках.
Еще один важный этап — поиск сигналов. Чаще всего это офлайн-активность, в ходе которой анализируется большое количество статистики с учетом ограничений систем реального времени. Здесь используют инструменты вроде R или Matlab (как тот же Goldman). Важна возможность машинного обучения и работы с большими объёмами данных с минимальными усилиями. Но вообще, здесь главное результат — если вам удается добиваться его с помощью Excel, то кому какое дело?
В том же треде разработчик сервиса YCharts Джеффри Шек в тех случаях, когда речь не идет о высокочастотной торговле, советовал обращать внимание на C#, Java или Python, а также не забывать о средствах разработки, обеспечивающих работу «бухгалтерской» части торговой системы:
Если вам нужно агрегировать данные для анализа, то скорее всего вы захотите использовать что-то с большим количеством библиотек, довольно быстродействующим, с большим количеством уже написанного кода для решения разных задач (чтобы каждый раз не изобретать колесо). Чаще всего это будет что-то типа C#, Java или Python..
Также крайне важны языки для обработки данных. Хотите сохранить каждую заявку по акциям Microsoft за день? Попробуйте сделать это с помощью SQL-базы данных (MySQL, SQLite и т.п.). Весьма вероятно в таком случае вам придется потратить много часов на оптимизацию, прежде чем на основе этих данных удастся совершить сделку.
Я бы рекомендовал обратить внимание на языки, которые позволяют хранить данные в колоночном формате (а не в строковом) — это хорошо подходит для тиковых данных. Среди подобных технологий можно назвать KDB, OneTick, SECDB (созданная в Goldman Sachs). Если же нужно просто хранить цены акций, то отлично подойдут и MySQL с PosgreSQL
В интервью нашему блогу разработчик терминала SmartX Андрей Горьковенко говорил о том, что собственного торгового робота создавал с помощью C# и C++:
Изначально я писал проект на C# потому что на нем мне было проще и быстрее сделать готовый продукт. Функциональность, доступная в платформе .NET, довольно богата (работа с контейнерами, потоками, файлами, с XML, наличие GUI), что делает ее неплохим выбором. Причина перехода на C++ банальна — не хватает производительности. Сейчас требования к софту в этом плане очень высоки —время пересчета стратегий измеряется единицами микросекунд. Каждая микросекунда на счету.
Эта связка языков — C# и С++ — крайне жизнеспособна. На то, чтобы написать новую торговую стратегию или видоизменить старую у меня уходить час-два времени. В случае сложной математики — день-полтора. При этом в систему встроена функция бэк-теста, новую стратегию можно тут же протестировать на исторических данных. Кроме того, есть генетические алгоритмы, с помощью которых можно оптимизировать стратегии.
Руководитель направления алгоритмического трейдинга в АО «Финам» Алексей Афанасьевский называл следующие языки программирования для создания быстрых торговых роботов:
Для этих задач очень хорошо подходит C++ и чистый C. Бывает и так, что быстрые роботы создаются и чуть ли не на ассемблере — здесь стоит упомянуть механизмы прямого чтения-записи данных в память сетевой карты, минуя стандартные механизмы работы через драйверы, а также работу с «супербыстрым программируемым железом» вроде FPGA.
Основатель платформы StockSharp Михаил Сухов так описывает области применения различных языков программирования:
Языки в трейдинге можно условно разделить на две подгруппы:
1) Платформенные языки. R, Matlab и так далее. Качество языков неотрывно связанно с самой платформой, поэтому разбор отдельно языка и сравнение его с аналогом не несет особо смысла. Если вам отлично подходит какая-то платформа, но при этом язык крайне неудобен, то вам придется использовать его независимо от всех недостатков. И, наоборот, в случае прекрасно удобного языка на неудобной платформе данный язык все равно не будет выбран для разработки.
2) Платформо-независимые языки. C#, Java, С++, Python и т.д…
а) Java и C# (=.NET) практически идентичные платформы. Java в основном используется на *nix подобных системах. C# на Windows. Мы выбрали C# в качестве основы нашей платформы StockSharp, потому что трейдеров под Windows больше, чем трейдеров под другие системы (Андроид не в счет, так как мобильные платформы являются дополняющими, а не основными).
б) Что касается C++, то среди трейдеров практически не развит из-за своей сложности. Но его используют профессиональные программисты, пишущие системы с большой нагрузкой и быстротой реакции.
в) Python (в эту категорию можно занести языки вроде List, Haskell) являются простыми средствами для решения алгоритмических задач. Трейдеры чаще выбирают данный язык. Но для построения платформы подобные языки ограничены из-за слабой интеграции с операционными системами, низкой производительности и отсутствием хороших графических библиотек.
В сухом остатке могу сказать, что языка, универсально удобно подходящего к любой задаче и под любую категорию пользователей, не существует. Поэтому важно понимать перед выбором языка не преимущества того или другого инструмента, а собственную задачу и ваши возможности.
Заключение
Выбор языка (или языков) программирования для создания торгового робота или другой системы, работающей на финансовом рынке, непростое занятие. Для того, чтобы подобрать подходящие инструменты разработки, необходим глубокий анализ архитектуры всей будущей системы. Важно учитывать различные факторы — производительность, простоту разработки, тестирование, доступность исходного кода сопутствующих библиотек и их устойчивость и так далее.
Сама природа торговых систем способствует тому, чтобы на разных этапах ее жизни использовались различные технологии — нельзя один раз запрограммировать алгоритм, который годами будет приносить прибыль. Проект будет постоянно развиваться и модернизироваться, и на протяжении его жизни для решения конкретных задач могут подходить самые разные языки программирования.
В итоге вполне может существовать система, в которой для быстрой работы с процессором используются C++ или CUDA, для обработки данных применяется Java, для тестирования на исторических данных используется Python, а отчеты создаются с помощью Excel/VBA.
Комментарии (7)
dyadyaSerezha
23.11.2015 19:05+1В итоге вполне может существовать система, в которой для быстрой работы с процессором используются C++ или CUDA, для обработки данных применяется Java, для тестирования на исторических данных используется Python, а отчеты создаются с помощью Excel/VBA.
Добавьте сюда Perl, пару каких-нибудь проприетарных языков платформы, bash, SQL, TCL, и т.д. и т.п. — и будет более-менее реальная торговая система. :)
scumware
24.11.2015 03:45-2Не мог оторваться от картинки: очень нечасто (слава богу) приходится видеть функции принимающие голые с указатели именами типа «barg», и тут же их к чему-то кастущие.
Если эта картинка про биржевой софт, и призвана напугать, то уже боюсь — нафиг такое счастье.
sgolubev
24.11.2015 14:57Интересно, что сам автор C++ Bjarne Stroustrup оказывается в Morgan Stanley рабоатет: www.morganstanley.com/profiles/bjarne-stroustrup-managing-director-technology. И у них, насколько я помню, даже свой язык программирования.
webmascon
28.11.2015 17:06Морган стенли слишком большой чтобы однозначно говлрить о том что у них свой язык. Языков у них такой же зоопарк как и в любом другом банке: джава си сиплюсплюс питон скала vba
maratvildan
Что же MQL?