В нашем блоге мы уже писали о важных этапах разработки механических торговых систем, выборе стратегий работы на рынке и их тестировании на исторических данных. В сегодняшнем материале мы обобщим ранее изложенную информацию и расскажем о том, как новичкам на фондовом рынке стоит подходить к созданию своего первого торгового робота, чтобы избежать распространенных ошибок.
Выбор технологий: умение идти на компромисс
Практически всегда при создании программных продуктов разработчикам так или иначе приходится идти на определенные компромиссы и искать баланс между несколькими вещами. В случае торговых роботов важную роль играют три фактора:
- Скорость торговли, т.е. совершения самих торговых операций — скорость выставления заявки, скорость получения ответа от биржи, скорость обработки самим роботом
- Универсальность и настраиваемость робота для работы с новыми рынками, финансовыми инструментами, вариантами алгоритмов
- Скорость разработки и внесение существенных изменений.
В тех случаях, когда более всего важна скорость работы, код, безусловно, должен писаться на эффективном низкоуровневом языке. Для этих задач очень хорошо подходит C++ и чистый C (о применении C++ в нашем интервью рассказывал разработчик торгового терминала SmartX). Бывает и так, что быстрые роботы создаются и чуть ли не на ассемблере — здесь стоит упомянуть механизмы прямого чтения-записи данных в память сетевой карты, минуя стандартные механизмы работы через драйверы, а также работу с «супербыстрым программируемым железом» вроде FPGA.
Понятие скорость включает в себя две разные, хоть и взаимосвязанные задачи. Первая из них — это оптимизация скорости взаимодействия с биржей (выставление ордеров, получение ответов). Для ее успешного решения необходимо не только оптимизировать код и иметь хорошее «железо», но и учитывать и использовать особенности биржевой архитектуры, вплоть до стойки, в которой расположен сервер. Вторая задача заключается в оптимизации логики самого торгового приложения.
Изображение: Businesswire
Архитектура и среда разработки
Не менее важным моментом является выбор архитектуры робота. Здесь также возможны компромиссы — например, делать ли робота, «заточенного» на конкретный рынок, биржевой шлюз, систему с одним алгоритмом или, может быть, даже с ограниченным набором инструментов? Подобная оптимизация позволяет добиться дополнительного выигрыша в производительности.
И напротив, более универсальный продукт позволяет увеличить скорость разработки, а также облегчить использование робота, но, вероятно, среди минусов такого подхода будет более низкая производительность.
Не меньшее значение на выбор технологий оказывает сам тип будущего робота и характер используемых алгоритмов. Если планируется создание высокочастотного робота, то использование C++, а иногда и C становится просто необходимым.
В том случае, если нужно автоматизировать торговую стратегию, предполагающую небольшое количество сделок (работа по схеме «быть не самым быстрым, а самым умным») и величина «проскальзывания» при входе в позицию может быть пренебрежимой величиной по сравнению как с возможной прибылью, так и с возможным убытком, то скорость и удобство разработки встают на первое место.
Очередным компромиссом между скоростью работы и скоростью разработки является .Net в любой своей ипостаси — С#, Visual Basic и вообще что угодно на этой платформе (эта тема также обсуждалась в одном из наших предыдущих материалов).
Если для работы робота нужны значительные вычисления, которые при этом не требуют проведения их в реальном времени, но используются для оптимизации параметров торговли в фоновом режиме, то вполне жизнеспособным может быть и использование экзотических вещей, вроде интерпретируемых языков Python, R и им подобных (один из них — скриптовый TradeScript, подробнее о создании роботов на нем рассказано здесь и здесь). Встречаются и реализации этих инструментов, которые совместимы с технологией .Net.
Пример создания простой торговой стратегии на TradeScript в терминале SmartX
Чтобы подвести черту под разговором о среде разработки, можно порекомендовать следующую трехуровневую архитектуру.
Этап #1
Достаточно примитивный, но максимально быстрый робот, совершающий простой набор операций. По сути, его задача — быстро брать с рынка или выдавать в рынок простой или синтетический актив, по предельно простому алгоритму. Этот уровень пишется на С, С++, и ассемблерах разного уровня
Этап #2
Система управления параметрами робота первого уровня, «обертка» вокруг него. Она сочетает в себе функции более сложного управления работой алгоритма и интерфейса пользователя, включающего управляющие параметры и механизмы представления результатов торговли. Реализовать такой продукт можно на С++, С#, Java или вообще в качестве веб-приложения.
Этап #3
Система бэк-тестирования и подбора параметров. Этот третий уровень напрямую не связан с торгующими первыми двумя, однако присутствует фундаментальная связь: именно здесь проводятся тесты новых алгоритмов на исторических данных, подбираются новые параметры к имеющимся алгоритмам.
Именно за тестированием новых идей и гипотез на исторических данных (а не за наблюдением за тем, как идет торговля созданных на первых двух этапах инструментов) создатель робота должен проводить большую часть своего рабочего времени.
Изображение: chicagosean
Хорошим стилем разработки считается ситуация, при которой алгоритм, написанный для системы третьего уровня «как есть», без внесения изменений в код после проведения тестов, может быть перенесен в торговый модуль. Заниматься реализацией этого уровня стоит с применением тех технологий, которые позволяют добиваться максимального комфорта и скорости разработки.
Встречаются и исключения, при которых описанная схема выглядит иначе — например, быстрые высокочастотные (HFT) роботы, по сути ограничиваются первым уровнем, исключая все лишние обвесы, а сложные опционные модели могут требовать поддержки вычислений на графических картах, например с использованием CUDA. При этом для 80% задач подобное разбиение на три уровня представляется наиболее оправданным.
Этапы создания торгового робота
Разработка робота — это циклический процесc, который состоит из нескольких этапов.
Идея
Изначально у будущего алгоритмического торговца есть идея, понимание какого-либо торгового процесса или осознание наличия неэффективности, которую можно использовать для извлечения прибыли.
Бэктестинг
Впоследствии появившуюся торговую идею необходимо «прогнать на истории» — в зависимости от конкретного торгового подхода и таймфрейма для этого могут использоваться разные исторические данные — и «грубые» свечи, и тиковая последовательность сделок, и даже полный лог биржевых стаканов с учетом движения ордеров в них.
Анализ возможных расходов
Важный этап, который новички на фондовом рынке часто недооценивают, заключается в анализе как обязательных (комиссии, ставки за перенос позиции, РЕПО и т.п.), так и возможных дополнительных плохопрогнозируемых расходов (проскальзывание цены при совершении сделки, непредвиденные задержки инфраструктуры в момент сильных движений на рынке).
Изображение: GETTY IMAGES
Совокупное количество таких расходов влияет на среднюю стоимость сделки. Существует множество алгоритмов, находящихся на грани прибыльности, и плохая оценка таких дополнительных расходов может создать иллюзию успешно найденного грааля там, где его нет и в помине.
Написание робота и его «боевое» тестирование
Собственно кодирование робота является, хоть и очень важной, но все же наиболее банальной задачей (при условии верного выбора архитектуры, рабочей идеи и т.д.).
После написания робота и его отладки (для этого можно использовать тестовый доступ на биржу с виртуальными деньгами), начинается практическое использование алгоритма.
Наиболее эффективным подходом является торговля на реальные деньги даже в период тестирования робота — необходимо выделить определенный бюджет (с ним можно заранее распрощаться), чтобы иметь возможность тестировать стратегию на небольших по объёму сделках. Пусть суммы будут совсем небольшими, но риск реальными деньгами дает принципиально иное понимание торговых процессов — только так их можно осознать и успешно моделировать в будущем.
Скорее всего сразу после начала торговли результат будет не совсем такой, как планировалось изначально, поэтому разработчику придется не раз и не два вернуться на пару этапов назад и что-то исправить.
Если стратегия заработала на малых объёмах средств, но для ее успешной работы требуется повысить объём, нужно постепенно двигаться к этому — на данном пути также наверняка будут проблемы и проигрыши средств, а значит нужно будет снова заниматься оптимизацией стратегии и кода.
Весной 2012 года я вдруг заработал лишние деньги, не понимая, при этом, откуда они взялись. Выяснилось, что у меня был неправильный долларовый хедж. В тот момент произошло сильное движение по индексу РТС, и моя «корзинка» была переоценена в большой плюс. Я заработал порядка 1,5 млн рублей, но вместе с тем прибыль послужила для меня поводом для серьезной трансформации системы, чтобы в будущем не было неожиданных провалов.
— заместитель управляющего директора ITinvest Алексей Афанасьевский, интервью журналу F&O
Стабильная (возможно) работа
Через некоторое время постоянной оптимизации алгоритм (возможно) начнет стабильно показывать приемлемые результаты — этот этап чреват снижением концентрации (мечты о спортивных машинах, яхтах и виллах в теплых странах появляются очень быстро). Очень часто бывает так, что именно в этот момент реальность наносит ответный удар и заставляет создателя робота откатываться на несколько этапов назад, вплоть до пересмотра всей торговой стратегии в принципе.
Выводы
Для того, чтобы добиться успеха в деле создания торговых роботов необходимо учитывать множество факторов: технологии, платформы, шлюзы, математику, «железо», расстояние до биржи, новости, время торгов, время выхода новостей, взаимосвязь экономики и политики и так далее.
Все эти параметры будут иметь различный вес в случае создания роботов разного типа — для высокочастотной торгови нужно быстрое исполнение, для направленного робота — хорошее понимание технических и/или фундаментальных процессов, для различных видов арбитража хорошие статистические методы. При этом нужно понимать, что в чистом виде подобной «классификации роботов» не существует — каждый продукт в разной степени «залезает на поляну разных подходов одновременно.
ИТ-специалистам, которые хотели бы попробовать свои силы в деле создания роботов необходимо сначала подтянуть свои знания об устройстве фондового рынка (в этом помогает профильная литература), а уже затем переходить к стадии написания кода и экспериментов. На пути к созданию робота, который добивается результата, неизбежны ошибки и финансовые потери.
В любом случае, еще перед стартом работы над торговым роботом стоит быть готовым к тому, что создать универсальный инструмент по зарабатыванию денег и после этого отойти от дел и лишь наблюдать за увеличением счета не удастся. Алгоритмическая торговля — это интересная, но долгая и непрерывная работа по совершенствованию себя и своего понимания мира и рынка как его выражения. Если человеку интересно этим заниматься, то создание роботов станет лишь инструментом для получения результата, а не самоцелью.
При подготовке материала использовалась информация из интервью заместителя управляющего директора ITinvest Алексея Афанасьевского журналу F&O
Картинка на тизере: modernmarketsinitiative
P. S. Если вы заметили опечатку, битую ссылку или другую неточность — напишите нам личным сообщением, и мы оперативно все исправим.