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

Выводы


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

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

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

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

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

P. S. Если вы заметили опечатку, битую ссылку или другую неточность — напишите нам личным сообщением, и мы оперативно все исправим.