3

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

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)] })

当然有更好的方法可以更快地做到这一点,不是吗?澄清一下:我想使用重叠的时间段,只是滚动应该每月进行一次。

4

3 回答 3

3

如果我理解正确,您可以获取端点的日期,然后对于每个端点(即使用lapplyor for),调用rollapplyusing data 直到该点。

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

于 2012-08-18T18:55:32.427 回答
2

作为对“是否需要 zoo/xts 转换?”的回答:在这种情况下不需要它,但是如果你向它发送数据帧,rollapply 将不起作用,正如我最近从这个 StackOverflow 答案中发现的那样

于 2012-11-16T15:47:57.680 回答
0

你想要period.apply(),或者它的便利助手apply.monthly(),都在xts中。

例子:

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> 

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

于 2012-08-18T18:32:39.767 回答