Блог им. r0man

Еще одно тестирование алгоритма Маркет Мэйкера

    • 10 июля 2015, 09:42
    • |
    • r0man
  • Еще

Продолжая  тему тестирования алгоритма Маркет Мэйкера, поделюсь своими результатами и мыслями по его работе:
1. Основной режим работы алгоритма — это маркетмэйкинг (он же арбитраж ликвидности, он же торговля спредом). И конечно же, прибыльность этой стратегии сильно зависит от рыночных условий, скорости получения данных и работы системы исполнения. Средняя прибыль на сделку даже и при идеальном исполнении не будет превышать значение спреда (2-5 пунктов по Si в среднем). А в период сильной волатильности, когда стакан бросает из стороны в сторону на 10-30 пунктов, несмотря на большое количество положительных сделок ( около 70%), алгоритм становится убыточным. В основном из-за комиссий, конечно.

2. Да, математические формулы сильно ограничили многих желание понять, как устроен алгоритм. Но на самом деле, если вдумчиво посмотреть картинки (карты политик), получается все ясно и просто. А будет еще проще, если посмотреть картинки графиков из других статей, лежащих в основе алгоритма (например Guilbaud, Fabien, and Huyen Pham, 2013, Optimal high-frequency trading with limit and market orders). Забудем на минутку про дисбаланс бид/акс объемов и построим карту политик для открытой позиции при разных значениях спреда:

Еще одно тестирование алгоритма Маркет Мэйкера

Требуется пояснение по зонам (в скобках указано название политики для тестируемого алогритма с дисбалансом):
Зона Ba, Bb (MarketMaking) —  одновременное выставление лимитных заявок по цене лучшего бида и цене лучшего аска;
Зона Ba, Bb+ (Pinging Bid Side) —  одновременное выставление лимитных заявок по цене лучшего бида — тик и цене лучшего аска;
Зона Ba-, Bb (Pinging Ask Side) —  одновременное выставление лимитных заявок по цене лучшего бида и лучшего аска — тик;
Зона Ba-, Bb (Pinging Bid & Ask Sides) —  одновременное выставление лимитных заявок по цене лучшего бида — тик и цене лучшего аска — тик;
Зона BUY AT MARKET (Inventory Control) — закрытие короткой позиции по рыночной цене;
Зона SELL AT MARKET (Inventory Control) — закрытие длинной позиции по рыночной цене.

Теперь, надеюсь, всё стало понятно. Внесение дисбаланса объемов немного модифицирует зоны и оптимизирует контроль и закрытие позиций.
Хотя предсказательная способность дисбаланска не велика, практическая польза от него все же есть. Большой объем по лучшему биду или аску снижает верятность исполнения заявки, выставленной на этот же уровень, поэтому алгоритм выдаст сигнал выставляться на тик меньше.

3. Перейдем к реализции и тестированию алгоритма. Система устроена следующим образом:
Расчетная часть:
— За предудущий день собирается история тиков и лучших бидов/асков;
— Далее считаем рыночные параметры, необходиммые для расчета политик;
— Затем считаем политики и сохранем их в виде массивов. То есть для каждого значения времени (t), открытой позиции (y), дисбаланса (f), спреда (s) массив выдаст сигнал, в какой зоне нужно работать.
Часть исполнения:
— Загружаем расчитанные массивы;
— По обновления лучшего бида/аска считаем t, y, f, s и получаем соответствующую политику из массивов;
— Формируем сигналы  в соответствии с политикой и выставляем заявки;
— Неисполненные заявки, если они не соответствуют текущей политике, снимаем.

Политики MarketMaking и Pinging не предусматривают какой объем выставлять, чтобы «поймать» спред. Объем определяется исполнителем при выставлении заявки. Для тестов — это всего 1 контракт. Но если какая-то из лимитных заявок не исполняется, а политика при следующем сигнале будет опять маркетмейкерская, то позиция может увеличиваться до тех пор, пока не сработает сигнал по Inventory Control. По сути, тут работает усреднение, но его можно регулировать или совсем исключить, изменив уровень риска (gamma) и допустимое количество заявок по рыночной цене (dzettaMax). 

4. По бэктестам получились результаты приблизительно такие же как у Eskalibur. Правда мой бэктест, пока еще не доведен до ума полностью. Протестировать более менее полную торговую сессию на реальном счете удалось лишь в пятницу из-за постоянных доработок системы.
Вот статистика за 03/07/2015 (с учетом комиссий: биржевая = 0.25, брокерская = половине биржевой (брокер Ай Ти Инвест, тариф Форсаж)):

Symbol             SIU5 (09.2015)
Num.Txns                     1986
Num.Trades                   1986
Net.Trading.PL             474.25
Avg.Trade.PL                 0.24
Med.Trade.PL                -0.38
Largest.Winner              30.92
Largest.Loser              -20.81
Gross.Profits             2304.09
Gross.Losses             -1829.84
Std.Dev.Trade.PL             3.43
Percent.Positive            36.81
Percent.Negative            63.19
Profit.Factor                1.26
Avg.Win.Trade                3.15
Med.Win.Trade                2.62
Avg.Losing.Trade            -1.46
Med.Losing.Trade            -0.38
Avg.Daily.PL               237.13
Med.Daily.PL               237.13
Std.Dev.Daily.PL           335.35
Max.Drawdown              -222.62
Profit.To.Max.Draw           2.13
Avg.WinLoss.Ratio            2.16
Med.WinLoss.Ratio               7
Max.Equity                    585
Min.Equity                      0
End.Equity                 474.25

Эквити:

Еще одно тестирование алгоритма Маркет Мэйкера

Максимально неблагоприятные исполнения:

Еще одно тестирование алгоритма Маркет Мэйкера

Максимально благоприятные исполнения:

Еще одно тестирование алгоритма Маркет Мэйкера


По тестам система выглядит вполне замечательно, но и рынок прошлую неделю был не такой волатильный. Текущая неделя (06/07/2015-10/07/2015) показала, что алгоритм требует серьезной доработки для учета волатильности. Но это уже предмет следующей статьи. Работа над алгоритмом и приведение его к стабильным результатам продолжается.

Спасибо uralpro и Eskalibur за поддержку, плодотворный обмен идеями и сотрудничество.
Смотрите эту статью, а также  другие материалы по алгоритмической торговле на сайте: www.quantalgos.ru

★30
5 комментариев
Не очень понял фразу, почему при сильной волатильности алгоритм становится убыточным из-за комиссий. Комиссия-то одинаковая везде
Vlad495, при сильной волатильности средний размер убытка сильно увеличивается -> прибыль до вычета комиссий уменьшается. Затем вычетаем комиссию и получаем убыток.
avatar
Ну я так и понял)))
Просто нелогичная фраза получилась)))

А статистика эта чем подсчитана ?
Это за 1 день торгуя 1 контрактом Si ?
Почему тогда Net.Trading.PL не равен Avg.Daily.PL? Или потому что вечёрка как следующий день считается.

Вообще выглядит перспективно, но Max.Drawdown великоват.

Думаю можно поработать в сторону ограничения/прекращения торговли в моменты сильной волатильности.

Vlad495, статистика в R подсчитана пакетом blotter. Это один день, поэтому Avg.Daily.PL,Med.Daily.PL, Std.Dev.Daily.PL неинформативны (забыл их убрать, на самом деле).
Заход в маркетмэйкинг одним контарктом по обе стороны. Может добрать до 3 контрактов, затем позция будет закрываться. На графике эквити синяя линия показывает величину открытой позиции.
avatar
Автору спасибо! к сожалению посты о трейдинге не популярны на данном ресурсе судя по лучшим записям за 24 часа…

теги блога r0man

....все тэги



UPDONW
Новый дизайн