随着时间的推移,我正在为订单的开发建模。我有一个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
以及随后的深度udpates如下所示:
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?
谢谢!
答案 0 :(得分:2)
我认为不需要在这里使用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
来获得更多的简洁和语法糖解决方案。