Календарный арбитраж на FORTS, Ч.2 - Создание торгового робота
Арбитражная торговля состоит в одновременной покупке одного инструмента (недооцененного) на одной торговой площадке и продаже того же инструмента (переоцененного) на другой площадке. В настоящее время все больше Forex-дилеров предоставляют возможность торговли CFD-контрактами на различные инструменты (акции, фьючерсы, товары и т.д.), что значительно расширяет возможности поиска арбитражных ситуаций между различными дилерами. Помимо этого, арбитраж CFD-контрактами интересен еще и тем, что большинство CFD-контрактов, как правило, низколиквидные, в результате чего, арбитражные ситуации сохраняются достаточно долго, иногда до нескольких минут, что позволяет спокойно войти в рынок, не боясь проскальзываний.
Рассмотрим пример реального арбитража CFD-контрактами на платину между двумя разными дилерами с помощью программы Megatrader.
Сначала закачиваем данные по спреду между CFD-контрактам от двух разных компаний:

Во-вторых, необходимо настроить таблицы данных Quik, необходимые для работы программы. Для реализации стратегии календарного арбитража нам понадобятся следующие таблицы: Таблица текущих параметров, Таблица позиций по клиентским счетам и Таблица заявок.
Таблицу текущих параметров можно создать командой меню "Таблицы > Текущая таблица". В окне настроек таблицы необходимо в списке "Заголовки строк" выбрать финансовые инструменты, входящие в спред, а в списке "Заголовки столбцов" выбрать параметры "Код бумаги", "Лучшая цена спроса", "Лучшая цена предложения", "Цена последней сделки" и "Стоимость шага цены":
Помимо этого для созданной таблицы необходимо установить параметры вывода по DDE. Для этого необходимо выполнить команду меню "Экспорт данных > Вывести по DDE" либо воспользоваться кнопкой "Экспортировать данные по DDE" на панели инструментов Quik. Откроется окно "Вывод через DDE сервер", в котором нужно установить следующие параметры: в поле "DDE сервер" ввести имя DDE сервера (по умолчанию это "MegaTrader"), в поле "Рабочая книга" ввести "MegaTrader", в поле "Лист" ввести "Params", включить флажки "Вывод при нажатии Ctrl+Shift+L" и "Формальные заголовки":
Таблица позиций по клиентским счетам создается командой меню Торговля > Позиции по клиентским счетам". В окне редактирования настроек таблицы нужно в списке "Выбранные параметры" выбрать параметры "Код инструмента" и "Тек. чист. поз.":
Настройки вывода по DDE для данной таблицы аналогичны описанным выше, за исключением поля "Лист", в которое нужно ввести значение "Futures".
Таблица заявок создается командой меню "Торговля > Заявки". В окне редактирования настроек таблицы нужно в списке "Заголовки столбцов" выбрать параметры "Номер", "Код бумаги", "Операция", "Кол-во", "Остаток" и "Состояние":
Настройки вывода по DDE для таблицы заявок аналогичны описанным выше, за исключением поля "Лист", в которое нужно ввести значение "Orders".
Теперь перейдем к настройкам программы Megatrader. В первую очередь необходимо установить общие настройки программы для работы с терминалом Quik. Для этого с помощью команды меню "Настройки > Общие настройки" открываем окно общих настроек, где на вкладке "Quik" указываем путь к терминалу, параметры торговых счетов и имя DDE-сервера (по умолчанию – "MegaTrader"):
Затем создаем инструменты, которые будут формировать спред. Для этого с помощью команды меню "Настройки > Настройки торгового инструмента" открываем окно настроек спреда, где в список "ШОРТ" добавляем дальний фьючерс, а в список "ЛОНГ" – ближний. При добавлении инструментов нужно не забывать в параметре «Код инструмента» указать актуальные коды фьючерсов, которые можно посмотреть на сайте биржи РТС. Код класса для всех фьючерсов FORTS – "SPBFUT".
Для запуска системы необходимо в терминале Quik запустить вывод по DDE с помощью команды меню "Экспорт данных > Начать экспорт таблиц по DDE", а в программе Megatrader выполнить команду меню «Связь» – «Установить соединение с Quik». В результате чего, в программу начнут поступать котировки, и она сможет отправлять торговые команды в терминал.
Теперь перейдем непосредственно к созданию логики работы торгового робота, которая описывается в программе при помощи специального встроенного языка скриптов. Простейшая логика торговли может заключаться, к примеру, в следующем. Наносим на график скользящую среднюю достаточно большого периода (к примеру, 50000), которая будет определять средний уровень колебания спреда. Будем продавать спред, когда он поднимается выше заданного отклонения от скользящей средней, и покупать, когда он опускается ниже заданного отклонения от скользящей средней. Закрывать позиции будем, когда спред вернется к средней.
Помимо этого, было бы неплохо предусмотреть для торгового робота возможность усреднения позиции, т.е. распределение покупок или продаж спреда по нескольким уровням относительно средней. К примеру, на расстоянии 30 пунктов от средней открываем первые 2 позиции. Затем, если спред начал отклоняться еще дальше, то на расстоянии 35 пунктов от средней открываем еще 2 позиции, на расстоянии 40 – еще 2 и т.д. с шагом в 5 пунктов.
Чтобы реализовать данную торговую стратегию в программе, необходимо сначала добавить к графику нужные индикаторы. Для этого с помощью команды меню «График > Добавить график > Mean Price» добавляем индикатор «Mean Price», который показывает среднее значение лучших цен спроса (Bid) и предложения (Offer) спреда. А затем с помощью команды меню «График > Добавить график > Moving Average» добавляем скользящую среднюю, указав в качестве источника данных созданный перед этим индикатор «MeanPrice». Также для скользящей средней нужно обязательно указать идентификатор, при помощи которого мы будем ссылаться на нее из тела скрипта. Пусть это будет «MA»:

Теперь можно приступать к созданию скрипта. Простейший скрипт, реализующий предложенную стратегию, будет иметь следующий вид:
Обратите внимание, что позиции в данном скрипте открываются и закрываются постепенно, по одной единице за раз. Сделано это специально, чтобы избежать возможных проблем, связанных с недостатком ликвидности на дальнем фьючерсе, поскольку если открывать позицию сразу на весь объем, то, в случае нехватки ликвидности, часть объема будет реализовано по более плохим ценам, т.е. возникнет «проскальзывание» цены.
В принципе, данный скрипт готов и его уже можно использовать, однако в нем остались не учтенными некоторые риски, встречающиеся в реальной торговле. Давайте более подробно рассмотрим эти риски и попытаемся учесть их в скрипте.
Как было отмечено в первой части статьи Календарный арбитраж на FORTS, наибольшие риски для стратегии календарного арбитража несет риск «проскальзывания» цены, т.е. риск исполнения заявок по ценам хуже тех, которые были при формировании заявок. Ситуации, когда наиболее вероятно возникновение проскальзываний, на графике спреда проявляются в виде так называемых «шипов» – моментов резких выбросов цен:
Время жизни таких шипов, как правило, составляет менее четверти секунды, и если попытаться совершить сделку в момент возникновения такого «шипа», то, скорее всего, к тому моменту, когда заявка попадет на биржу, его уже не будет, и заявка исполниться по другой цене.
Чтобы продемонстрировать влияние проскальзываний, проведем два тестирования системы: первое – без учета задержек в исполнении сделок, второе – с учетом задержек в 500 миллисекунд. Тестирование будем проводить на отрезке с 05 по 14 июня 2012 года, т.е. в последние 10 дней перед экспирацией ближнего контракта, как раз тогда, когда вероятность возникновения проскальзываний достигает своего максимума. В обоих тестах установим комиссию в размере 1 пункта и максимальный размер открытой позиции равный 10 единицам.
График доходности при тестировании без учета задержек:
График доходности при тестировании с учетом задержек в 500 миллисекунд:


Как видно по результатам тестирования, проскальзывание цены из-за задержки всего в полсекунды «съедает» всю прибыль системы. Конечно, для тестирования был выбран наиболее рискованный с точки зрения возникновения проскальзываний период, и если протестировать систему на более раннем периоде, когда конкуренция среди трейдеров еще не столь велика, то влияние проскальзываний будет не существенным. Однако все равно лучше заранее предусмотреть риск проскальзывания и по возможности попытаться свести его к минимуму.
Опираясь на наш опыт, можем сказать, что полностью избежать риска проскальзывания не удастся, однако уменьшить вероятность возникновения подобных ситуаций вполне возможно. Здесь могут быть два решения: 1) увеличить скорость получения информации и исполнения заявок; 2) использовать более хитрый алгоритм открытия и закрытия позиций, позволяющий отфильтровывать «шипы».
Первый вариант с нашей точки зрения является бесперспективным, поскольку подразумевает втягивание в «гонку скоростей» с другими трейдерами и требует постоянных вложений на поддержание конкурентного преимущества. При этом всегда может найтись кто-то другой, кто будет быстрее по причине наличия более мощных технических средств или даже по причине более близкого расположения с биржей. Поэтому мы предлагаем рассматривать только второй вариант.
Рассмотрим предлагаемый нами простейший алгоритм фильтрации «шипов». Идея заключается в том, чтобы продавать спред не просто, когда лучшая цена предложения (offer) превысит уровень продажи, а тогда, когда короткая скользящая средняя лучшей цены предложения превысит этот уровень. Аналогично покупать спред нужно только тогда, когда короткая скользящая средняя лучшей цены спроса превысит уровень покупки. Короткая скользящая средняя будет отфильтровывать «шипы» и реагировать только на существенные отклонения цены, что поможет частично избежать проскальзываний.
Для реализации данной идеи необходимо добавить к графику две скользящие средние с коротким периодом (к примеру, 10). В качестве источника данных для первой средней указываем Offer, для второй – Bid. Чтобы была возможность ссылаться на эти средние в теле скрипта, необходимо присвоить им какие-нибудь идентификаторы, к примеру, для первой средней укажем идентификатор «OfferMA», для второй – «BidMA»:
Итоговый скрипт с фильтром «шипов» будет иметь следующий вид:
Протестируем доработанный скрипт на том же самом периоде, с 05 по 14 июня 2012 года, с учетом задержек в 500 миллисекунд:
Как видно, результаты системы улучшились – она продолжает давать прибыль даже в последние 10 дней перед экспирацией.
Ну и, наконец, протестируем торгового робота с новым скриптом на более раннем периоде – с 15 марта по 14 мая 2012 года, который является реальным рабочем периодом для системы. Параметры тестирования те же: комиссия в размере 1 пункта, задержка – 500 миллисекунд, максимальный размер позиции – 10 единиц:
За указанный период торговый робот заработала 10240 р. Рассчитаем, сколько это будет в процентах от вложенных средств, чтобы понять потенциальную доходность системы. Максимальный размер гарантийного обеспечения за указанный период не превышал 2000 р. за контракт. Учитывая тот факт, что при торговле календарными спредами на рынке FORTS резервируется гарантийное обеспечение только для одного из контрактов, легко подсчитать, что для ведения торговли десятью единицами спреда потребуется иметь на счете не более 20 000 р. Таким образом, доходность стратегии за два месяца (с 15 марта по 14 мая 2012 года) без реинвестирования прибыли составила 50%.
В заключении отметим, что приведенный в данной статье торговый робот является достаточно универсальным и может быть использован для реализации практически любых арбитражных стратегий. Для этого достаточно будет в настройках программы указать торгуемые финансовые инструменты, а в скрипте задать соответствующие уровни отклонения спреда.

Вернуться на главную страницу
Контактные данные:

По вопросам приобретения торгового робота:
+1 123 4567890 hello@loftpineapple.com

По вопросам технической поддержки:
+1 123 4567890 hello@loftpineapple.com

Адрес:
Loft Pineapple, 22 Pink Street,
New York