当证券没有数据时,以xts合并价格时间序列

时间:2014-04-18 21:14:54

标签: r merge xts bloomberg

我正在查询安全数据库。价格系列以xts为单位,有些可能没有数据(对于所选窗口)。实际时间序列可以模拟如下:

require(xts)

## Simulated time series
price=function(){
    x=floor(runif(1,1,4))
    xts(round(rnorm(x,5),3), Sys.Date()+1:x)    
}
## Sample tickers
(tick1=setNames(price(), "tick1"))
#            tick1
# 2014-04-20 5.829
# 2014-04-21 6.061
# 2014-04-22 5.813
(tick2=setNames(price(), "tick2"))
#            tick2
# 2014-04-20 6.458
# 2014-04-21 5.373
(tick3=xts(data.frame(tick3=numeric()), as.Date(numeric()))) # Security showing no data
#            tick3
## ...
## tickn

无需提及我事先不知道哪个安全性不会显示任何数据。

如果我在单个xts对象中合并价格,merge.xts会从输出中完全删除空安全性:

(port=merge(tick1, tick2, tick3))
#            tick1 tick2
# 2014-04-20 5.829 6.458
# 2014-04-21 6.061 5.373
# 2014-04-22 5.813    NA

相反,我想跟踪它们,因此打印类似于:

的输出
(cbind(port, tick3=NA))
#            tick1 tick2 tick3
# 2014-04-20 5.829 6.458    NA
# 2014-04-21 6.061 5.373    NA
# 2014-04-22 5.813    NA    NA

一种可能的解决方案是:

port=list(tick1, tick2, tick3) # ... tickn
port.m=lapply(port, function(sec){
    if(nrow(sec)==0) sec= xts(matrix(NA, dimnames=dimnames(tick3)), Sys.Date())
    sec
})
(port.m=do.call('merge', port.m))
#            tick1 tick2 tick3
# 2014-04-19    NA    NA    NA
# 2014-04-20 5.829 6.458    NA
# 2014-04-21 6.061 5.373    NA
# 2014-04-22 5.813    NA    NA
if(all(is.na(port.m[Sys.Date()])))
    (port.m=port.m[time(port.m)!=Sys.Date()])
#            tick1 tick2 tick3
# 2014-04-20 5.829 6.458    NA
# 2014-04-21 6.061 5.373    NA
# 2014-04-22 5.813    NA    NA

是否有可能找到更智能的解决方案?

1 个答案:

答案 0 :(得分:1)

你在这里犯了两个错误: 第一:您需要使用非零长度的向量。见:

length(integer())
length(NA)

第二:要使合并工作,xts对象索引必须匹配某些位置。

e.g。这样的事情会起作用:

require(xts)
x=xts(1:4, Sys.Date()+1:4)
v=xts(NA, Sys.Date()+1) 
(m=merge.xts(x,v))

此处起始索引匹配,剩余索引将被填满。

如果你想要非常特别,你可能会尝试这样的事情:

v=xts(rep(NA,4), Sys.Date()+1:4)

希望这会有所帮助!!