在R中使用订单数据建模价格-时间优先级

在R中使用订单数据建模价格-时间优先级,r,multithreading,queue,data.table,stockquotes,R,Multithreading,Queue,Data.table,Stockquotes,这是一个关于数据结构和解决一个困难的数据争论问题的总体方法的问题,我想在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
因此,列表中的每个元素(长度为12)都是该行DT的队列,队列按最佳价格排序(在本例中,按不同出价提供的最佳价格排序,然后按到达/最近修改后的时间排序)。请注意订单是如何变化的

对于卖家,我们会有类似的东西(如果它在列表中-不一定是):

我甚至不知道如何开始解决这个问题,甚至不知道结果应该是什么形状/对象类。有什么建议吗


感谢阅读

在Google中键入您的查询(我键入了“R中的建模订单数据”),返回多个链接。第二个指向和。希望这能帮助你,至少能向你展示他们是如何做到的。如果没有,请回答另一个问题,表明您已经搜索了该空间。

@matt dowle感谢您的回答。orderbook软件包没有我需要的功能(我需要确定市场深度所包含的订单(以及优先级顺序))。如果/当我有时间,我会发布这个问题的答案one@user5364303那么你最好还是买些商业产品;e、 g.KDB,OneTick。R没有为此所需的逐记录更新性能。或者直接去C、Rcpp、Cython,自己直接管理分配过多的向量。
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"
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"