我熟悉zoo
函数rollapply
,该函数允许您对zoo
或xts
对象进行滚动计算,并且可以通过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)] })
当然,有更好的方法可以更快地做到这一点,不是吗?
需要说明的是:我想使用重叠期,只是应该每月进行一次滚动。
最佳答案
如果我理解正确,则可以获取端点的日期,然后对于每个端点(即使用lapply
或for
),使用到那时的数据调用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