使用R

时间:2016-02-06 08:26:57

标签: r multithreading queue data.table stockquotes

这是一个关于数据结构和解决困难数据争论问题的整体方法的问题,我想在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"

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

感谢您阅读

1 个答案:

答案 0 :(得分:0)

在Google中输入您的查询(我输入“R中的建模订单簿数据”)会返回多个链接。第二个指向orderbook R packagethis paper。希望这有助于并向您展示他们至少如何做到这一点。如果没有,那么请回到另一个问题,表明你已经搜索了这个空间。