这是一个有关数据结构和解决难题的整体方法的问题,我想在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"
我什至不知道如何开始解决这个问题,甚至不确定结果应该具有什么样的形状/对象类。有什么建议?
谢谢阅读
最佳答案
将您的查询输入Google(我输入了“在R中建模订单簿数据”)会返回几个链接。第二个指向orderbook R package和this paper。希望对您有所帮助,并至少向您展示他们是如何做到的。如果不是,那么请再返回一个问题,表明您已经搜索了空间。
关于r - 使用R中的OrderBook数据建模价格时间优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35238966/