Інфраструктура і торгові роботи: Які мови програмування використовуються у сфері фінансів



Біржова торгівля — це високотехнологічна галузь. В нашому блозі на Хабре ми розповідали про те, які протоколи використовуються для передачі фінансової інформації (раз, два, три, чотири), демонстрували інфраструктуру вузла фінансового трейдингу і описували процес оптимізації продуктивності торгового терміналу.

Сьогодні мова піде про те, які мови програмування використовуються у сфері фінансів, для вирішення яких завдань вони застосовуються, і на якому з них зупинити вибір у кожному конкретному випадку.

Фінанси та програмування: короткий огляд

Традиційно у фінансовій індустрії затребувані мови програмування, які дозволяють створювати високонавантажених системи обробки і передачі даних, які взаємодіють з самим різним залізом.

Значна частина інфраструктури брокерських компаній і бірж створена із застосуванням мови 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.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.