以xts为单位的滚动计算

时间:2012-08-18 18:26:35

标签: r subset apply xts zoo

我熟悉zoo函数rollapply,它允许您对zooxts对象进行滚动计算,并且可以通过{{指定滚动增量1}}参数。我特别感兴趣的是每月应用一个函数,但是在计算中使用过去的所有日常数据。例如,假设我的数据集如下所示:

by

我想选择每个月的结尾和dte, val 1/01/2001, 10 1/02/2001, 11 ... 1/31/2001, 2 2/01/2001, 54 2/02/2001, 34 ... 2/30/2001, 29 一个使用所有日常数据的函数。这似乎不适用于apply,因为rollapply参数有时为30,其他29个月等等。我当前的想法是:

by

当然有更好的方法来做到这一点会更快吗? 澄清:我想使用重叠期间,只需每月进行滚动。

3 个答案:

答案 0 :(得分:3)

如果我理解正确,您可以获取端点的日期,然后针对每个端点(即使用lapplyfor),使用截至该点的数据调用rollapply

getSymbols("SPY", src='yahoo', from='2012-01-01', to='2012-08-01')
idx <- index(SPY)[endpoints(SPY, 'months')]
out <- lapply(idx, function(i) {
  as.xts(rollapplyr(as.zoo(SPY[paste0("/", i)]), 5, 
                    function(x) coef(lm(x[, 4] ~ x[, 1]))[2], by.column=FALSE))
})
sapply(out, NROW)
#[1]  16  36  58  78 100 121 142 143

我暂时向zoo强制rollapplyr以确保使用rollapply.zoo方法(与未导出的rollapply.xts方法相对),然后强制返回xts

答案 1 :(得分:2)

作为“需要动物园/ xts转换吗?”的答案: 在这种情况下不需要它,但如果你发送数据帧,rollapply将无法工作,正如我最近从this StackOverflow answer

发现的那样

答案 2 :(得分:0)

xts中您想要period.apply()或其便利助手apply.monthly()

示例:

R> foo <- xts(1:100, order.by=Sys.Date()+0:99)
R> apply.monthly(foo, sum)
           [,1]
2012-08-31  105
2012-09-30  885
2012-10-31 1860
2012-11-25 2200
R> 

或同样

R> apply.monthly(foo, quantile)
           0%   25%  50%   75% 100%
2012-08-31  1  4.25  7.5 10.75   14
2012-09-30 15 22.25 29.5 36.75   44
2012-10-31 45 52.50 60.0 67.50   75
2012-11-25 76 82.00 88.0 94.00  100
R> 

只是为了证明返回多个值的函数也可以使用。