<HELP> for explanation

rss

Профиль компании

Финансовые компании

Блог компании ITInvest | Часть №4. Заключительная. Что нужно учитывать при разработке первого торгового робота

Часть №1  smart-lab.ru/company/itinvest/blog/237155.php
Часть №2  smart-lab.ru/company/itinvest/blog/238521.php
Часть №3  smart-lab.ru/company/itinvest/blog/242615.php

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% задач подобное разбиение на три уровня представляется наиболее оправданным.

Этапы создания торгового робота


Разработка робота — это циклический процесc, который состоит из нескольких этапов.

Идея

Изначально у будущего алгоритмического торговца есть идея, понимание какого-либо торгового процесса или осознание наличия неэффективности, которую можно использовать для извлечения прибыли.

Бэктестинг

Впоследствии появившуюся торговую идею необходимо «прогнать на истории» — в зависимости от конкретного торгового подхода и таймфрейма для этого могут использоваться разные исторические данные — и «грубые» свечи, и тиковая последовательность сделок, и даже полный лог биржевых стаканов с учетом движения ордеров в них.

Анализ возможных расходов

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

image

Изображение: GETTY IMAGES

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

Написание робота и его «боевое» тестирование

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

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

Наиболее эффективным подходом является торговля на реальные деньги даже в период тестирования робота — необходимо выделить определенный бюджет (с ним можно заранее распрощаться), чтобы иметь возможность тестировать стратегию на небольших по объёму сделках. Пусть суммы будут совсем небольшими, но риск реальными деньгами дает принципиально иное понимание торговых процессов — только так их можно осознать и успешно моделировать в будущем.

Скорее всего сразу после начала торговли результат будет не совсем такой, как планировалось изначально, поэтому разработчику придется не раз и не два вернуться на пару этапов назад и что-то исправить.

Если стратегия заработала на малых объёмах средств, но для ее успешной работы требуется повысить объём, нужно постепенно двигаться к этому — на данном пути также наверняка будут проблемы и проигрыши средств, а значит нужно будет снова заниматься оптимизацией стратегии и кода.

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

— заместитель управляющего директора ITinvest Алексей Афанасьевский, интервью журналу F&O

Стабильная (возможно) работа

Через некоторое время постоянной оптимизации алгоритм (возможно) начнет стабильно показывать приемлемые результаты — этот этап чреват снижением концентрации (мечты о спортивных машинах, яхтах и виллах в теплых странах появляются очень быстро). Очень часто бывает так, что именно в этот момент реальность наносит ответный удар и заставляет создателя робота откатываться на несколько этапов назад, вплоть до пересмотра всей торговой стратегии в принципе.

image

Выводы


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

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

В любом случае, еще перед стартом работы над торговым роботом стоит быть готовым к тому, что создать универсальный инструмент по зарабатыванию денег и после этого отойти от дел и лишь наблюдать за увеличением счета не удастся. Алгоритмическая торговля — это интересная, но долгая и непрерывная работа по совершенствованию себя и своего понимания мира и рынка как его выражения. Если человеку интересно этим заниматься, то создание роботов станет лишь инструментом для получения результата, а не самоцелью.

В заключении поста привожу последние данные с Московской биржи.

Часть №4. Заключительная.  Что нужно учитывать при разработке первого торгового робота
Часть №4. Заключительная.  Что нужно учитывать при разработке первого торгового робота
 

Спасибо за интересную статью!
Однако утверждение, что C++ лучший язык для создания торговых роботов сильно преувеличено. Скорость работы программ написанных на C# колоссальна, сейчас практически ни в чем не уступает C++ и прекрасно подходит для HFT! Большинство, как правило, смущает, что данное ПО может работать только под Windows, а Linux платформы считаются надежнее. Это тоже утверждение весьма сомнительно.
Все «тормоза» как правило спрятаны в архитектуре и логике алгоритма торговой стратегии. Пишите на ассемблере если хотите выиграть пару миллисекунд, но значительных преимуществ это не принесет. А на разработку такой программы уйдёт на порядок больше времени! Данный подход применим только для спецсофта и колокейшена, и встречается крайне редко и только у крупных компаний.
К тому же очень важно иметь единую систему для протоговки, бектестинга и оптимизации торговых стратегий. Если вы протестируете ваш алгоритм в разных программах, то с большой долей вероятности не получите идентичные результаты. Будучи разработчиком собственной платформы для алготорговли могу с уверенностью сказать, что тестирование и оптимизация — это имитация биржевой торговли с большим количеством условностей и допущений. И каждый разработчик разбирается с ними по-своему. Поэтому протестировав торговую стратегию в одной программе, а проторговав в другой можно прийти к совершенно неожиданным результатам!
Единое решение очень сложно в разработке, однако я не стал искать простых путей и решил все задачи в комплексе:
softalgotrade.com/software-architecture/
avatar

SoftAlgoTrade

SoftAlgoTrade, Не согласен. C# изначально создавался как язык для быстрой разработки приложения (в ущерб производительности). Целевая аудитория: студенты, небольшие фирмы, доморощенные прогеры. Словом те, кто особо не любит или которым не хватает мозгов лезть в кишки низкоуровневых операций. В шарпе слишком много посреднических служб, каких-то библиотек, которые где-то нужны, а где-то только мешают. В результате тормоза. ИМХО, чем ближе язык к машинному коду, тем он быстрей. А это как ни крути ASM и C/С++. Ну и Фортран с Паскалем где-то рядом.
chizhan, вижу смысл в плюсах только для HFT поближе к бирже. иначе C#, или вообще python. Вспомним еще .NET Native. Но чтобы не быть голословным — проверю и напишу статью :)
Arsen G, Не только HFT, но и бектестинг. Когда сутками приходится ждать прогон по истории, то энтузиазм несколько уменьшается. Ведь вдохновение не вечно.
chizhan, дело не в либах, что шарп что джава делают сборку мусора. Пример из жизни, вам нужно взять позу по двум инструментам

отправил заявку 1 0.000130 сек
включается GC 0.2 — 0.4 сек стоп
отправил заявку 2 0.400290 сек

цена второго инструмента улетела, арбитраж не вышел.

на плюсах это

отправил заявку 1 0.000130 сек
отправил заявку 2 0.000290 сек
SoftAlgoTrade,
1 накуй с++ и с# и ассемблер если есть обычный си
С каких пор стали удалять комменты? Мне что оставить красочный коммент на хабре как матрикс теряет заявки, позиции и пол сессии не работает??
Александр, если вы что- то негативное пишите про компанию, то сразу приводите доказательства а не пустые слова иначе воздух сотрясать не стоит. Если у вас что-то не работает, позвоните и разбиритесь. Можете написать мне лично, я тоже попробую помочь. У меня каждый день с утра до ночи открыт терминал матрикс и я никаких проблем уже давно не наблюдал! Если вы всё вспоминаете диддос атаки год назад то этого больше не повторилось и не повторится, теперь и новые провайдеры и более серьёзная защита. Если у вас есть проблемы, напишите мне свой BP и я постараюсь помочь. Если проблемы действительно будут со стороны компании и их никто не сможет решить, то тогда и оставляйте негативные комментарии где вам угодно.
Василий Олейник, а смысл писать, ответ один переходите на резервный сервер. Сообщения с форума удаляются как и здесь. Идея у системы клевая, реализация нет. Мне проще робота переключить и руками выравнять позу чем писать каждый раз письма. Примерно месяц назад матрикс стоял два дня подряд.
Александр, может это проблемы частного характера? Просто я не использую роботов и дополнительного ПО, поэтому у меня нет никаких проблем. В любом случае, если ещё буду проблемы, то чиркните мне здесь в личку, я постараюсь помочь.
Александр, я сижу почти каждый день рядом с тех службой и со службой поддержки и слышу все звонки и вопросы от клиентов. Из нескольких тысяч человек вы первый от кого поступают подобные комментарии. Ещё раз, если есть проблемы напиши в личку ваш BP номер и номер телефона и в понедельник с вами свяжутся.
Василий Олейник, при возникновении новых проблем буду тебя информировать.
Хочу набраться сил — и прочитать все части. Чувствую, буду в шоке.
Достойные показатели. (-:

P.S. Не важно какой «язык» Вы используете, главное, что — с учётом всех прочих параметров — Вы на этом делаете деньги. Хоть на перфокартах программируйте, используя машинный код — результат и «точка». (-;

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.

Залогиниться

Зарегистрироваться
....все тэги
Регистрация
UP