Моделирование приоритета цены и времени с использованием данных OrderBook в R

Это вопрос о структурах данных и общих подходах к сложной проблеме обработки данных, которую я хотел бы решить в R. Если я чему-то и научился здесь, так это тому, что часто есть действительно хорошие решения сложных проблем, поэтому любой совет будет очень полезен. ценится

У меня есть данные книги заказов с фондовой биржи, и я пытаюсь в любой момент перестроить из них очередь с приоритетом цены и времени. НАПРИМЕР. Существует очередь для всех, кто хочет торговать: покупатель (или продавец) с самой высокой ставкой (или самой низкой ценой продажи) всегда должен первым покупать (продавать), когда кто-то другой приходит с ним торговать. Если одинаковую цену предлагают несколько человек, то в начале очереди стоит тот, кто заявил о намерении купить (или продать) раньше. Это становится немного запутанным, потому что вы можете изменить цену и объем своего заказа после того, как отправили свой заказ. Если вы увеличите объем своего заказа, вы должны потерять свое место в очереди (но нет, если вы уменьшите объем вашего заказа). Так что на практике очередь может сильно меняться, и я хотел бы точно знать, кто находится в начале очереди покупателей (и то же самое для продавцов) в течение дня, в любое время, когда мне может понадобиться взглянуть на .

Вот пример данных, с которыми я работаю:

library(data.table)

set.seed(1)
unique.ids <- c("B-AAA","B-AAB","B-AAC","A-AAA","A-AAB", "A-AAC")
seconds.since.midnight <- sort(sample(40000:40010, 12, replace = TRUE))
order.type <- c("ENTER", "AMEND", "DELETE", "TRADE")

DT <- data.table(order = 1:12,
                 time.scnds = seconds.since.midnight,
                 type = order.type[c(1,1,1,1,2,4,
                                     1,2,2,4,3,
                                     1)],
                 bid.id = NA,
                 ask.id = NA,
                 price = c(3.0,3.5, 3.3, 3.8,3.9,3.8, 3.8, 3.95, 3.8, 3.8,NA, 4.1), 
                 volume = c(50,50,60,100,60,60,200,40,50,50,NA, 100),
                 oldprice = c(NA,NA,NA,NA,3.3,NA,NA,3.8,3.0,NA,NA,NA),
                 oldvolume = c(NA, NA,NA,NA,60,NA,NA,40,50,NA,NA,NA))


DT$bid.id[c(1,2,3,5,6,9,10)] <- unique.ids[c(1,2,3,3,3,1,1)]
DT$ask.id[c(4,6,7,8,10,11,12)] <- unique.ids[c(4,4,5,4,5,5,6)]
DT

    order time.scnds   type bid.id ask.id price volume oldprice oldvolume
 1:     1      40000  ENTER  B-AAA     NA  3.00     50       NA        NA
 2:     2      40001  ENTER  B-AAB     NA  3.50     50       NA        NA
 3:     3      40002  ENTER  B-AAC     NA  3.30     60       NA        NA
 4:     4      40002  ENTER     NA  A-AAA  3.80    100       NA        NA
 5:     5      40002  AMEND  B-AAC     NA  3.90     60      3.3        60
 6:     6      40004  TRADE  B-AAC  A-AAA  3.80     60       NA        NA
 7:     7      40006  ENTER     NA  A-AAB  3.80    200       NA        NA
 8:     8      40006  AMEND     NA  A-AAA  3.95     40      3.8        40
 9:     9      40007  AMEND  B-AAA     NA  3.80     50      3.0        50
10:    10      40009  TRADE  B-AAA  A-AAB  3.80     50       NA        NA
11:    11      40009 DELETE     NA  A-AAB    NA     NA       NA        NA
12:    12      40010  ENTER     NA  A-AAC  4.10    100       NA        NA

Когда ордера вводятся, изменяются, торгуются и удаляются, их ордера в очереди меняются. Я хотел бы получить что-то вроде очереди для покупателей и очереди для продавцов. Я не знаю, какой была бы лучшая структура данных для этого, но если бы это был список, он мог бы выглядеть, например, так:

buyers.queue
[[1]]
[1] "B-AAA"

[[2]]
[1] "B-AAB" "B-AAA"

[[3]]
[1] "B-AAB" "B-AAC" "B-AAA"

[[4]]
[1] "B-AAB" "B-AAC" "B-AAA"

[[5]]
[1] "B-AAC" "B-AAB" "B-AAA"

[[6]]
[1] "B-AAC" "B-AAB" "B-AAA"

[[7]]
[1] "B-AAB" "B-AAA"

[[8]]
[1] "B-AAB" "B-AAA"

[[9]]
[1] "B-AAA" "B-AAB"

[[10]]
[1] "B-AAA" "B-AAB"

[[11]]
[1] "B-AAB"

[[12]]
[1] "B-AAB"

Таким образом, каждый элемент списка (он имеет длину 12) представляет собой очередь в этой строке DT, и очередь упорядочена по лучшей цене (в данном случае лучшая цена, предлагаемая различными ставками, а затем по времени с момента поступления/последнего изменения). . Обратите внимание, как порядок может сильно меняться.

Для продавцов у нас было бы что-то вроде этого (если бы это было в списке - это не обязательно):

sellers.queue

[[1]]
[1] NA

[[2]]
[1] NA

[[3]]
[1] NA

[[4]]
[1] "A-AAA"

[[5]]
[1] "A-AAA"

[[6]]
[1] "A-AAA"

[[7]]
[1] "A-AAA" "A-AAB"

[[8]]
[1] "A-AAB" "A-AAA"

[[9]]
[1] "A-AAB" "A-AAA"

[[10]]
[1] "A-AAB" "A-AAA"

[[11]]
[1] "A-AAA"

[[12]]
[1] "A-AAA" "A-AAC"

Я даже не уверен, как начать решать эту проблему или даже какой класс формы/объекта должен иметь результат. Какие-либо предложения?

Спасибо за чтение


person user5364303    schedule 06.02.2016    source источник


Ответы (1)


Ввод вашего запроса в Google (я набрал «моделирование данных книги заказов в R») возвращает несколько ссылок. Второй указывает на пакет R книги заказов и эта статья. Надеюсь, что это поможет и покажет вам, как они это сделали, по крайней мере. Если нет, то, пожалуйста, вернитесь с другим вопросом, показывающим, что вы искали пространство.

person Matt Dowle    schedule 08.02.2016
comment
@ Matt-Dowle Спасибо за ответ. Пакет книги ордеров не имеет нужной мне функциональности (мне нужно определить ордера, из которых состоит стакан цен (и в порядке приоритета)). Я опубликую ответ на эту проблему, если/когда он у меня появится - person user5364303; 10.02.2016
comment
@ user5364303 Тогда вам, вероятно, лучше всего подойдут коммерческие продукты; например КДБ, OneTick. R не обладает необходимой для этого производительностью обновления от записи к записи. Или перейдите прямо к C, Rcpp, Cython и самостоятельно управляйте перераспределенными векторами. - person Matt Dowle; 10.02.2016