Скользящие вычисления в хтс по месяцам

Я знаком с 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)] })

Конечно, есть лучший способ сделать это, который был бы быстрее, нет? Чтобы уточнить: я хотел бы использовать перекрывающиеся периоды, только переход должен выполняться ежемесячно.

3 ответа

Решение

Если я правильно понимаю, вы можете получить даты ваших конечных точек, то для каждой конечной точки (то есть с помощью 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

В ответ на вопрос "Нужно ли преобразование zoo/xts?": В этом случае оно не нужно, но rollapply не будет работать, если вы отправите ему фрейм данных, как я недавно обнаружил в ответе Stackru.

Ты хочешь 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> 

просто чтобы доказать, что функции, возвращающие более одного значения, тоже могут быть использованы.

Другие вопросы по тегам