How-to: Що потрібно враховувати при розробці першого торгового робота

image

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

Вибір технологій: вміння йти на компроміс

Практично завжди при створенні програмних продуктів розробникам так чи інакше доводиться йти на певні компроміси та шукати баланс між кількома речами. У разі торгових роботів важливу роль відіграють три фактори:

  • Швидкість торгівлі, тобто здійснення самих торговельних операцій — швидкість виставлення заявки, швидкість отримання відповіді від біржі, швидкість обробки самим роботом
  • Універсальність і настроюваність робота для роботи з новими ринками, фінансовими інструментами, варіантами алгоритмів
  • Швидкість розробки і внесення суттєвих змін.
У тих випадках, коли найбільше важлива швидкість роботи, код, безумовно, повинен писатися на ефективному низкоуровневом мовою. Для цих завдань дуже добре підходить C++ і чистий C (про застосування C++ в нашому інтерв'ю розповідав розробник торгового терміналу SmartX). Буває і так, що швидкі роботи створюються і мало не на асемблері — тут варто згадати механізми прямого читання-запису даних в пам'ять мережевої карти, минаючи стандартні механізми роботи через драйвери, а також роботу з «супербыстрым програмованим залізом» начебто FPGA.

Поняття швидкість включає в себе дві різні, хоча і взаємозв'язані завдання. Перша з них — це оптимізація швидкості взаємодії з біржею (виставлення ордерів, отримання відповідей). Для її успішного рішення необхідно не тільки оптимізувати код і мати хороше «залізо», але й враховувати і використовувати особливості біржової архітектури, аж до розташування сервера в стійці. Друга задача полягає в оптимізації логіки самого торгового програми.

image

Зображення: Businesswire

Архітектура і середовище розробки

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

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

Не менше значення на вибір технологій надає сам тип майбутнього робота і характер використовуваних алгоритмів. Якщо планується створення високочастотного робота, то використання C++, а іноді і C стає просто необхідним.

У тому випадку, якщо потрібно автоматизувати торговельну стратегію, яка передбачає невелику кількість угод (робота за схемою «бути не самим швидким, а самим розумним») і величина «прослизання» при вході в позицію може бути пренебрежимой величиною порівняно як з можливим прибутком, так і з можливим збитком, то швидкість і зручність розробки встають на перше місце.

Черговим компромісом між швидкістю роботи і швидкістю розробки .Net у будь-якій своїй іпостасі — С#, Visual Basic і взагалі що завгодно на цій платформі (ця тема також обговорювалася в одному з наших попередніх матеріалів).

Якщо для роботи робота потрібні значні обчислення, які не вимагають проведення їх в реальному часі, але використовуються для оптимізації параметрів торгівлі у фоновому режимі, то цілком життєздатним може бути і використання екзотичних речей, на зразок інтерпретованих мов Python, R і їм подібних (один з них — скриптова TradeScript детальніше про створення роботів на ньому розказано тут і тут). Зустрічаються і реалізації цих інструментів, які сумісні з технологією .Net.

image

Приклад створення простої торгової стратегії на TradeScript в терміналі SmartX

Щоб підвести риску під розмовою про середовище розробки, можна порекомендувати наступну трирівневу архітектуру.

Етап #1
Досить примітивний, але максимально швидкий робот, який здійснює простий набір операцій. По суті, його завдання — швидко брати з ринку або видавати в ринок простий або синтетичний актив, за гранично простим алгоритмом. Цей рівень пишеться на С, С++, і ассемблерах різного рівня

Етап #2
Система управління параметрами робота першого рівня, «обгортка» навколо нього. Вона поєднує в собі функції більш складного управління роботою алгоритму та інтерфейсу користувача, що включає керуючі параметри та механізми представлення результатів торгівлі. Реалізувати такий продукт можна на С++, С#, Java або взагалі як веб-додатки.

Етап #3
Система бек-тестування та підбору параметрів. Цей третій рівень безпосередньо не пов'язаний з торгуючими першими двома, однак є фундаментальна зв'язок: саме тут проводяться тести нових алгоритмів на історичних даних, підбираються нові параметри до існуючих алгоритмів.

Саме за тестуванням нових ідей та гіпотез на історичних даних (а не за спостереженням за тим, як іде торгівля створених на перших двох етапах інструментів) творець робота має проводити більшу частину свого робочого часу.

image

Зображення: chicagosean

Гарним стилем розробки вважається ситуація, при якій алгоритм, написаний для системи третього рівня «як є», без внесення змін в код після проведення тестів, може бути перенесений в торговий движок. Займатися реалізацією цього рівня варто з застосуванням тих технологій, які дозволяють домагатися максимального комфорту і швидкості розробки.

Зустрічаються і винятки, при яких описана вище схема виглядає інакше — наприклад, швидкі високочастотні (HFT) роботи, по суті обмежуються першим рівнем, виключаючи всі зайві обважування, а складні опціонні моделі можуть вимагати підтримки обчислень на графічних картах, наприклад з використанням CUDA. При цьому для 80% завдань подібне розділення на три рівні представляється найбільш виправданим.

Етапи створення торгового робота

Розробка робота — це циклічний процес, який складається з декількох етапів.

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

Бэктестинг
Згодом з'явилася торговельну ідею необхідно «прогнати на історії» — в залежності від конкретного торговельного підходу і таймфрейма для цього можуть використовуватися різні історичні дані — і «грубі» свічки, і тиковая послідовність операцій, і навіть повний лог біржових склянок з урахуванням руху ордерів в них.

Аналіз можливих витрат
Важливий етап, який новачки на фондовому ринку часто недооцінюють, полягає в аналізі як обов'язкових (комісії, ставки за перенесення позиції, РЕПО тощо), так і можливих додаткових плохоконтролируемых витрат (прослизання ціни при вчиненні правочину, непередбачені затримки інфраструктури в момент сильних рухів на ринку).

image

Зображення: GETTY IMAGES

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

Написання робота і його «бойове» тестування
Власне кодування робота є, хоч і дуже важливою, але все ж найбільш банальної завданням (за умови правильного вибору архітектури, робочої ідеї тощо).

Після написання робота і його налагодження (для цього можна використовувати тестовий доступ на біржу з віртуальними грошима), починається практичне використання алгоритму.

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

Швидше за все відразу після початку торгівлі результат буде не зовсім такою, як планувалося спочатку, тому розробнику доведеться не раз і не два повернутися на кілька етапів назад і щось виправити.

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

Навесні 2012 року я раптом заробив зайві гроші, не розуміючи, при цьому, звідки вони взялися. З'ясувалося, що у мене був неправильний доларовий хедж. В той момент стався сильний рух по індексу РТС, і моя «кошик» було переоцінено у великий плюс. Я заробив близько 1,5 млн рублів, але разом з тим прибуток стала для мене приводом для серйозної трансформації системи, щоб у майбутньому не було несподіваних провалів.

— заступник керуючого директора ITinvest Олексій Афанасієвський, інтерв'ю журналу F&O
Стабільна (можливо) робота
Через деякий час постійної оптимізації алгоритм (можливо) почне стабільно показувати прийнятні результати — цей етап загрожує зниженням концентрації (мрії про спортивні машини, яхти і вілли в теплих країнах з'являються дуже швидко). Дуже часто буває так, що саме в цей момент реальність завдає удару і змушує творця робота відкочуватися на кілька етапів тому, аж до перегляду всієї торгової стратегії в принципі.

image

Висновки

Для того, щоб домогтися успіху в справі створення торгових роботів необхідно враховувати безліч факторів: технології, платформи, шлюзи, математику, «залізо», відстань до біржі, новини, час торгів, час виходу новин, взаємозв'язок економіки і політики і так далі.
Всі ці параметри будуть мати різний вагу в разі створення роботів різного типу — для високочастотної торгівлі потрібно швидке виконання, для спрямованого робота — хороше розуміння технічних і/або фундаментальних процесів, для різних видів арбітражу хороші статистичні методи. При цьому потрібно розуміти, що в чистому вигляді такої «класифікації роботів» не існує — кожен продукт різною мірою «залазить на полян» різних підходів одночасно.

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

У будь-якому разі, ще перед стартом роботи над торговим роботом варто бути готовим до того, що створити універсальний інструмент заробляння грошей і після цього відійти від справ і лише спостерігати за збільшенням рахунку не вдасться. Алгоритмічна торгівля — це цікава, але тривала і безперервна робота по вдосконаленню себе і свого розуміння світу і ринку як його вираження. Якщо людині цікаво цим займатися, то створення роботів стане лише інструментом для отримання результату, а не самоціллю.

При підготовці матеріалу використовувалася інформація з інтерв'ю заступника керуючого директора ITinvest Олексія Афанасьевского журналу F&O

Картинка на тизері: modernmarketsinitiative

P. S. Якщо ви помітили помилку, биту посилання або іншу неточність — напишіть нам особистим повідомленням, і ми оперативно все виправимо.

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

0 коментарів

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