Скользящие вычисления в хтс по месяцам
Я знаком с 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>
просто чтобы доказать, что функции, возвращающие более одного значения, тоже могут быть использованы.