Для большинства трейдеров свечные графики различного таймфрейма это и есть рынок, там скрывается все — и тренд и боковик и хитрый маркет мэйкер с глобальным кукловодом. Начнем с простых фактов, за одну сессию 2012.11.07 на фьючерсе Ri ядро биржи обработало 10 449 043 транзакций или примерно 12 000 транзакций в минуту, одна свечка самого «высоко частотного» минутного таймфрема скрывает за собой огромное количество более элементарных действий. Поэтому мы спустимся на самый низкий уровень того, что происходит на бирже и начнем оттуда.
Можно долго рассказывать про то как устроена биржа, про промежуточные сервера и другие части «транспортной» инфракстуры, какие задержки они вносят при путешествии заявки, но в конце пути любая заявка попадает в ядро биржие, где непосредственно происходит то ради чего все собственно и затевалось — сведение(matching). И на этом уровне, в смысле формата данных и производимых элементарных действий, FORTS мало чем отличается от той же CME или любой другой современной биржи. Входной поток состоит из заявко двух типов, на вставку(insert) и отмену(cancel). Бьете вы по рынку или выставляете заявку в глубь стакана — для ядра нет разницы, все это в конечном итоге преобразуется в заявку на вставку, которой присваивается свой уникальный идентификатор. Другой тип заявок — на отмену, позволяет убрать часть(или всю) предшествующей заявки на вставку. Ядро принимая на входе поток состоящий из заявок на вставку и отмену, создает поток сведенных сделок, каждая сведенная сделка связана с двумя заявками участвующих в сделке. Исходя из полученного потока, затем строятся стаканы, и тиковые данные(сведенные сделки), которые рассылаются пользователям(к примеру на RTS срезы стаканов строятся с периодичностью 30 миллисекунд), и лишь затем тики преобразуются в красивые свечки, отображаемые на экране. Поток данных содержащий заявки на вставку, отмену и сведенные сделки, на FORTS называется Full Order Log.
Рассмотрим более подробно формат данных Full Order Log. Возьмем для примера маленький, кусочек:
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):
cancel_volume, insert_volume — объем в заявке на вставку или отмену, cancel_count — количество отмен, insert_count — количество вставок, ratio — соотношение, trade_volume — оценка проторгованного объема в контрактах. Как видно, объемы заявок на вставку, можно условно разделить на две группы, small-volume traders с диапазоном объема 1-10 — высокочастотные трейдеры и скальперы, и всех остальных, как видно во второй группе, значения проторгованного объема кучкуются вокруг «психологических» уровней заявок — 15, 20, 25, 30, 50, 100, 200, 500.
Код на питоне
Разработка роботов обучение Stocksharp
Клуб алготрейдеров
Продолжение следует…
Не знаю, как у Вас, но мне интересные сигналы получить из ордерлога удалось, сделать алгоритм с матожиданием>0 нет.
По этому использую ордерлог только для моделирования рынка при тестировании страт. К сожалению.
www.sec.gov/marketstructure/midas.html#.Uld9uCcQPgw
может наш «мегарегулятор» тоже когда-нибудь что-нибудь полезное начнет делать…