我正在对订单簿随时间的发展进行建模。我在 xts 中有一个初始订单簿形状,然后也在 xts 中进行后续深度更新:
初始订单簿形状如下所示(所有条目具有相同的时间):
BID.price size
2014-02-11 23:59:42.494426 508.1000 10.0000000
2014-02-11 23:59:42.494426 509.1200 8.0000000
2014-02-11 23:59:42.494426 509.1000 10.0000000
随后的深度更新如下所示:
BID. price size
2014-02-12 04:57:51.191514 508.1000 -10.00000000
2014-02-12 04:57:51.640302 514.0000 10.00000000
我需要的是:
1) 对于更新中的每一行,将价格与订单簿进行比较:
1a) 如果更新价格水平已在订单簿中,请相应调整大小,因此上面的示例如下所示:
BID.price size
2014-02-12 04:57:51.191514 509.1200 8.0000000
2014-02-12 04:57:51.291514 509.1000 10.0000000
(价格水平508.10000已删除,时间已更新)
1b) 如果深度更新尚未在订单簿中,请添加具有给定大小的新奖金级别,因此示例如下所示:
BID.price size
2014-02-12 04:57:51.640302 509.1200 8.0000000
2014-02-12 04:57:51.640302 509.1000 10.0000000
2014-02-12 04:57:51.640302 514.0000 10.00000000
(新增价格等级514,时间调整)。
是否有任何方便快捷的方法来避免 for 循环深度更新 xts?
谢谢!
最佳答案
我认为这里不需要使用 xts 对象,因为所有观察的索引都是相同的,并且这里正确的 id 是 bid 变量。因此,我使用 1 个简单的 data.frame 解释我的解决方案,如上所示:
DT ## the day before
day bid size
1 1 508.10 10
2 1 509.12 8
3 1 509.10 10
DT1 ## the current or last day
day bid size
1 2 508.1 -10
2 2 514.0 10
现在使用merge
我们几乎有了解决方案:
dtm
bid day.x size.x day.y size.y
1 508.10 1 10 2 -10
2 509.10 1 10 NA NA
3 509.12 1 8 NA NA
4 514.00 NA NA 2 10
现在我们应该调整大小并删除空位置的出价。我在这里创建了一个中间 %+% 函数来处理缺失值。
## compute size
"%+%" <- function(x,y)
ifelse(is.na(x),
ifelse(is.na(y),NA,y),
ifelse(is.na(y),x,NA))
## remove numm poistion(size==0)
subset(transform(dtm,size=size.x%+%size.y,day=max(day.y,na.rm=T)),
size !=0,select=c(day,bid,size))
day bid size
2 2 509.10 10
3 2 509.12 8
4 2 514.00 10
我认为你可以使用data.table
在这里获得更简洁和语法糖的解决方案。
关于通过 xts 递归循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21878055/