Один день из жизни Ri. Или введение в микроструктурный анализ

Один день из жизни Ri. Или введение в микроструктурный анализ
Atom
10/10/2013
vlad1024


Для большинства трейдеров свечные графики различного таймфрейма это и есть рынок, там скрывается все - и тренд и боковик и хитрый маркет мэйкер с глобальным кукловодом. Начнем с простых фактов, за одну сессию 2012.11.07 на фьючерсе Ri ядро биржи обработало 10 449 043 транзакций или примерно 12 000 транзакций в минуту, одна свечка самого "высоко частотного" минутного таймфрема скрывает за собой огромное количество более элементарных действий. Поэтому мы спустимся на самый низкий уровень того, что происходит на бирже и начнем оттуда.

Можно долго рассказывать про то как устроена биржа, про промежуточные сервера и другие части "транспортной" инфракстуры, какие задержки они вносят при путешествии заявки, но в конце пути любая заявка попадает в ядро биржие, где непосредственно происходит то ради чего все собственно и затевалось - сведение(matching). И на этом уровне, в смысле формата данных и производимых элементарных действий, FORTS мало чем отличается от той же CME или любой другой современной биржи. Входной поток состоит из заявко двух типов, на вставку(insert) и отмену(cancel). Бьете вы по рынку или выставляете заявку в глубь стакана - для ядра нет разницы, все это в конечном итоге преобразуется в заявку на вставку, которой присваивается свой уникальный идентификатор. Другой тип заявок - на отмену, позволяет убрать часть(или всю) предшествующей заявки на вставку. Ядро принимая на входе поток состоящий из заявок на вставку и отмену, создает поток сведенных сделок, каждая сведенная сделка связана с двумя заявками участвующих в сделке. Исходя из полученного потока, затем строятся стаканы, и тиковые данные(сведенные сделки), которые рассылаются пользователям(к примеру на RTS срезы стаканов строятся с периодичностью 30 миллисекунд), и лишь затем тики преобразуются в красивые свечки, отображаемые на экране. Поток данных содержащий заявки на вставку, отмену и сведенные сделки, на FORTS называется Full Order Log.

Рассмотрим более подробно формат данных Full Order Log. Возьмем для примера маленький, кусочек:
Code
 QUOTE  TYPE    TIMESTAMP      SESSION    ORDER_ID  STATUS ACTION PRICE  VOL  DEAL_ID DEAL_PRICE
['riz2',  1, 1352315357375000, 20121107, 9368447574, 101401, 1, 141870.0, 1,,]
['riz2', -1, 1352315357380000, 20121107, 9368447558, 100001, 0, 141900.0, 3,,]
['riz2', -1, 1352315357380000, 20121107, 9368447580, 101401, 1, 141890.0, 3,,]
['riz2', -1, 1352315357381000, 20121107, 9368447559, 100001, 0, 141890.0, 2,,]
['riz2', -1, 1352315357381000, 20121107, 9368447581, 101401, 1, 141880.0, 2,,]
['riz2',  1, 1352315357381000, 20121107, 9368447507, 100001, 0, 141840.0, 4,,]
['riz2',  1, 1352315357381000, 20121107, 9368447582, 101401, 1, 141860.0, 4,,]
['riz2',  1, 1352315357384000, 20121107, 9368447522, 100001, 0, 141850.0, 8,,]
['riz2',  1, 1352315357384000, 20121107, 9368447586, 101401, 1, 141860.0, 8,,] <- A
['riz2',  1, 1352315357386000, 20121107, 9368447255, 201401, 0, 141850.0, 2,,]
           .... 
['riz2', 1, 1352315358149000, 20121107, 9368447396,      1, 2, 141860.0, 2, 657525271, 141860.0]
['riz2', 1, 1352315358149000, 20121107, 9368447454,      1, 2, 141860.0, 2, 657525272, 141860.0]
['riz2', 1, 1352315358149000, 20121107, 9368447586,      1, 2, 141860.0, 1, 657525273, 141860.0] <- B
['riz2',-1, 1352315358149000, 20121107, 9368447766,    402, 1, 134840.0, 5, ,,] <- C
['riz2',-1, 1352315358149000, 20121107, 9368447766,      2, 2, 134840.0, 2, 657525271, 141860.0]
['riz2',-1, 1352315358149000, 20121107, 9368447766,      2, 2, 134840.0, 2, 657525272, 141860.0]
['riz2',-1, 1352315358149000, 20121107, 9368447766,   1002, 2, 134840.0, 1, 657525273, 141860.0] <- D
['riz2', 1, 1352315358189000, 20121107, 9368447761, 100001, 0, 141840.0, 4, ,,]
['riz2', 1, 1352315358189000, 20121107, 9368447770, 101401, 1, 141860.0, 4, ,,]

QUOTE - содержит название инструмента, TYPE - направление заявки (+1 - bid, -1 - ask), TIMESTAMP - временная метка в микросекундах, SESSION - идентификатор сессии, ORDER_ID - идентификатор заявки, STATUS - флаги заявки, ACTION - тип заявки (0 - отмена, 1 - вставка, 2 - сведенная сделка), PRICE - цена, VOL - объем заявки, DEAL_ID - идентификатор сделки, DEAL_PRICE - цена сделки.
На примере выше показан цикл жизни заявки, вставка заявки c идентификатором 9368447586 в поток (A), вставка встречно заявки (C), первая сторона сведенной сделки (B) и вторая сторона (D).

Теперь, немного разобравшись в формате данных, можно приступить к статистическому анализу. Всего за сессию было произведено 10 449 043 транзакций, из них 4 990 732 на вставку, и 4 362 829 на отмену, а сведено сделок - 1 095 482. То есть "в среднем по больнице" на каждую сделку приходилось 4 перестановки. Следующий вопрос, который возникает - каким образом данная активность распределена по объемам. Для этого посчитаем следующие факторы - количестов вставок и отмен для заданного объема, отношение отмененых заявок к выставленным, чем меньше это соотношение тем больше количество сделок сведено на каждую вставленную заявку, тогда умножив соотношение на количество вставленных заявок, мы получим количество проторгованных заявок для данного объема заявки. В результате получим следующую табличку, отсортированную по столбцу проторгованного объема(для анализа использовался python + scipy):


Code
   cancel_count  cancel_volume  insert_count  insert_volume     ratio    trade_volume  
        1176407              1       1452121              1  0.810130      275714  
         272998              5        327113              5  0.834568      270575  
        1257775              2       1369794              2  0.918222      224038  
          39698             10         55877             10  0.710453      161790  
         432361              4        470513              4  0.918914      152608  
         668395              3        718625              3  0.930103      150690  
          15002             20         20662             20  0.726067      113200  
           1455             50          3608             50  0.403271      107650  
            453            100          1404            100  0.322650       95100  
         201295              8        212359              8  0.947900       88512  
          21651             15         27185             15  0.796432       83010   
          99168              6        110608              6  0.896572       68640  
           1989             30          4107             30  0.484295       63540  
           4926             25          7438             25  0.662275       62800  
           1025            200          1310            200  0.782443       57000  
          37216             12         41715             12  0.892149       53988  
             68            500           172            500  0.395349       52000  
          17857              7         25274              7  0.706536       51919  


cancel_volume, insert_volume - объем в заявке на вставку или отмену, cancel_count - количество отмен, insert_count - количество вставок, ratio - соотношение, trade_volume - оценка проторгованного объема в контрактах.

Как видно, объемы заявок на вставку, можно условно разделить на две группы, small-volume traders с диапазоном объема 1-10 - высокочастотные трейдеры и скальперы, и всех остальных, как видно во второй группе, значения проторгованного объема кучкуются вокруг "психологических" уровней заявок - 15, 20, 25, 30, 50, 100, 200, 500.

код на питоне
Продолжение следует...


1 2  >
Самунджян Артем

Avatar
Date: 10/10/2013
Reply


Ждем продолжения!

Thanks:

Mikhail Sukhov

Avatar
Date: 10/10/2013
Reply


vlad1024

Code
   cancel_count  cancel_volume  insert_count  insert_volume     ratio    trade_volume  
        1176407              1       1452121              1  0.810130      275714  
         272998              5        327113              5  0.834568      270575  
        1257775              2       1369794              2  0.918222      224038  
          39698             10         55877             10  0.710453      161790  
         432361              4        470513              4  0.918914      152608  
         668395              3        718625              3  0.930103      150690  
          15002             20         20662             20  0.726067      113200  
           1455             50          3608             50  0.403271      107650  
            453            100          1404            100  0.322650       95100  
         201295              8        212359              8  0.947900       88512  
          21651             15         27185             15  0.796432       83010   
          99168              6        110608              6  0.896572       68640  
           1989             30          4107             30  0.484295       63540  
           4926             25          7438             25  0.662275       62800  
           1025            200          1310            200  0.782443       57000  
          37216             12         41715             12  0.892149       53988  
             68            500           172            500  0.395349       52000  
          17857              7         25274              7  0.706536       51919  


Сортировку нужно было конечно по объему сделать. Интересен объем 200. Я так понимаю, что это за какой-то день, и в других днях этот объем другой?

Вообщем график имеет судя по всему два холма. На микро объеме и на среднем большом.

Я в прошлом году еще проводил анализ соотношения объема с взятием ликвидности (рыночные заявки). Если бы не штрафы за перестановку заявок без сделок, алго получался бы вполне профитным. Надо идти в ММ, для них поддержка спреда дешевле по комиссам.
Thanks:

vlad1024

Avatar
Date: 10/10/2013
Reply


Михаил Сухов
vlad1024

Code
   cancel_count  cancel_volume  insert_count  insert_volume     ratio    trade_volume  
        1176407              1       1452121              1  0.810130      275714  
         272998              5        327113              5  0.834568      270575  
        1257775              2       1369794              2  0.918222      224038  
          39698             10         55877             10  0.710453      161790  
         432361              4        470513              4  0.918914      152608  
         668395              3        718625              3  0.930103      150690  
          15002             20         20662             20  0.726067      113200  
           1455             50          3608             50  0.403271      107650  
            453            100          1404            100  0.322650       95100  
         201295              8        212359              8  0.947900       88512  
          21651             15         27185             15  0.796432       83010   
          99168              6        110608              6  0.896572       68640  
           1989             30          4107             30  0.484295       63540  
           4926             25          7438             25  0.662275       62800  
           1025            200          1310            200  0.782443       57000  
          37216             12         41715             12  0.892149       53988  
             68            500           172            500  0.395349       52000  
          17857              7         25274              7  0.706536       51919  


Сортировку нужно было конечно по объему сделать. Интересен объем 200. Я так понимаю, что это за какой-то день, и в других днях этот объем другой?

Вообщем график имеет судя по всему два холма. На микро объеме и на среднем большом.

Я в прошлом году еще проводил анализ соотношения объема с взятием ликвидности (рыночные заявки). Если бы не штрафы за перестановку заявок без сделок, алго получался бы вполне профитным. Надо идти в ММ, для них поддержка спреда дешевле по комиссам.

Да за один день, но если посчитать за другой день, то ничем принципиально не отличается. Сортировка по проторгованному объему интересна тем, что "важные" объемы всплыли вверх сами собой.
Thanks:

Mikhail Sukhov

Avatar
Date: 10/10/2013
Reply


vlad1024
Сортировка по проторгованному объему интересна тем, что "важные" объемы всплыли вверх сами собой.


В том то и дело, что сортировка идет по кол-ву сделок. А мне кажеца объем заявок тут куда как интереснее.
Thanks:

Андрей Шабанов

Avatar
Date: 11/3/2013
Reply


Михаил Сухов
vlad1024
Сортировка по проторгованному объему интересна тем, что "важные" объемы всплыли вверх сами собой.


В том то и дело, что сортировка идет по кол-ву сделок. А мне кажеца объем заявок тут куда как интереснее.


Собирали подобную статистику по Ri летом за несколько лет) раньше когда было не так много роботов пики на объемах 1 5 10 20 ... были очень выразительны)
Thanks:

Андрей Шабанов

Avatar
Date: 11/3/2013
Reply


недавно потратил немножко времени смотрел как ведут себя спреды и (Бид+Аск)/2 (Будем называть эту величину мидпрайс) разного объема (средневзвес) к сожалению картинок почти не сохранилось, разве что вот:

здесь показано как ведет себя мидпрайс рассчитанный по разному объему и "Скользящее средние" рассчитанное по последним N уникальным значениям этого самого мидпрайса.
Зачем это надо? ну мы почему-то используем эту методику для получения значений фьючерса при котировании опционов. Жизненно необходимо (особенно если дельта хедж происходит на каждую сделку) не реагировать на случайные всплески фьючерса..как видно из рисунков (из них вообщем-то не видно но можно подкрепить цифрами) набор из стакана не сильно уменьшает дисперсию БА, а усреднение по времени вполне закономерно приводит к смещению котировок на движении...

соответственно вот думаю как такую проблему решать. пока думал о некотором machine-learning фильтре которые проводил бы классификацию движений Базового актива и выдавал вероятности ошибиться в предположении что это не шумовое движение. На ум еще приходят идеи о байесовском риске из той же серии.. есть у кого идеи как данную проблему решать (уменьшение дисперсии без смещения/отставания?
P.S. необходимо естественно отсутствие громозких алгоритмов фильтрации онлайн так как скорость есть скорость.


Volume1.png 19 KB (379) timeshift1.png 30 KB (321)
Thanks: Mikhail Sukhov

Slepoy

Avatar
Date: 4/3/2014
Reply


vlad1024

На примере выше показан цикл жизни заявки, вставка заявки c идентификатором 9368447586 в поток (A), вставка встречно заявки (C), первая сторона сведенной сделки (B) и вторая сторона (D).


Судя по ордер-логу показан не полный цикл данной заявки, а только что ее удовлетворили в размере 1 лота. И вообще не понятно куда из ордер-лога пропали лишние биды?
Thanks:

Mikhail Sukhov

Avatar
Date: 4/3/2014
Reply


slepoy

И вообще не понятно куда из ордер-лога пропали лишние биды?


В ОЛ этих данных нет.
Thanks:

Slepoy

Avatar
Date: 4/3/2014
Reply


Михаил Сухов
В ОЛ этих данных нет.

Как нету?
вот бид ['riz2', 1, 1352315357375000, 20121107, 9368447574, 101401, 1, 141870.0, 1,,]
Это активная заявка на покупку, с ценой 141870, объемом 1 лот. Она должна идти прямо в стакан.
или ее должны снять ['riz2', 1, 1352315357375000, 20121107, 9368447574, 101401, выставить = 0 , 141870.0, 1,,]
Или исполнить. Но в ордер-логе этой записи нет! Пропущена.
Thanks:

Mikhail Sukhov

Avatar
Date: 4/3/2014
Reply


slepoy
Михаил Сухов
В ОЛ этих данных нет.

Как нету?


Так нет. Это лог заявок. И цены там не бидов асков, а цены заявок и их исполнения.
Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy