通过xts递归循环

时间:2014-02-19 10:41:56

标签: r time-series xts

随着时间的推移,我正在为订单的开发建模。我有一个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?

谢谢!

1 个答案:

答案 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来获得更多的简洁和语法糖解决方案。