我熟悉zoo函数rollapply,该函数允许您对zooxts对象进行滚动计算,并且可以通过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,因为by参数有时为30,其他月份为29,等等。我当前的想法是:

f <- function(xts_obj) { coef(lm(a ~ b, data=as.data.frame(xts_obj)))[1] }
month_end <- endpoints(my_xts, on="months", k=1)
rslt <- apply(month_end, 1, function(idx) { my_xts[paste0("/",idx)] })


当然,有更好的方法可以更快地做到这一点,不是吗?
需要说明的是:我想使用重叠期,只是应该每月进行一次滚动。

最佳答案

如果我理解正确,则可以获取端点的日期,然后对于每个端点(即使用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

09-06 08:15