rolling computations in xts by month

apply, r, subset, xts, zoo

Solution

If I understand correctly, you can get the dates of your endpoints, then for each endpoint (i.e. using `lapply` or `for`), call `rollapply` using data up to that point.

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

I temporarily coerce to `zoo` for the `rollapplyr` to make sure the `rollapply.zoo` method is being used (as opposed to the unexported `rollapply.xts` method), then coerce back to `xts`

Problem

I am familiar with the `zoo` function `rollapply` which allows you to do rolling computations on `zoo` or `xts` objects and you can specify the rolling increment via the `by` parameter. I am specifically interested in applying a function every month but using all of the past daily data in the computation. For example say my data set looks like this: ``` 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 ``` I would like to select the end of each month and `apply` a function that uses all the daily data. This doesn't seem like it would work with `rollapply` since the `by` argument would be 30 sometimes, 29 other months, etc. My current idea is: ``` 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)] }) ``` Surely there is a better way to do this that would be quicker no? To clarify: I would like to use overlapping periods just the rolling should be done monthly.

Original source