Rollapply для временных рядов

Я пытаюсь рассчитать историческую волатильность скользящего 20 периода. Я беру ежедневные доходы:

ret<-ROC(data1)

И затем я использую rollapply, чтобы получить 20-дневное HV для каждого столбца:

vol<-rollapply(ret,20,sd,by.column=T,fill=NA)

Проблема в том, что наблюдения в vol начинают появляться через десять дней, что неправильно, как я указал 20.

Для демонстрации приведем образец данных:

0.000000000, 0.005277045, 0.023622047, 0.002564103,-0.002557545, -0.020512821,
0.007853403,-0.012987013,  0.007894737,  0.015665796,  0.000000000, -0.002570694,
0.002577320, -0.015424165, 0.002610966,  0.010416667,  0.002577320,  0.015424165, 
0.000000000, -0.002531646, -0.002538071, 0.030534351,  0.014814815, -0.007299270,
-0.009803922, -0.012376238,  0.002506266, -0.015000000,-0.002538071,  0.002544529

Предположим, что данные выше хранятся в x, а затем:

rollapply(x,20,sd,fill=NA)

выдаст первое наблюдение в 10-м ряду вместо 20. Кроме того, SD тоже не прав.

Я должен что-то здесь упустить...

1 ответ

Решение

Вам нужно использовать align='right' вместо использования по умолчанию, которое align='center'или вместо использования rollapply, использовать rollapplyr обертка, которая имеет align='right' по умолчанию.

От ?rollapply:

Параметр align указывает, должен ли индекс результата быть выровненным по левому или правому краю или по центру (по умолчанию) по сравнению с плавающим окном наблюдений. Этот аргумент используется только если ширина представляет ширину.

Хотя, для этого лично я бы использовал runSD из пакета TTR, потому что он использует скомпилированный код и будет быстрее.

Любой из них должен делать то, что вы ожидаете, но второй будет быстрее.

library(zoo)
rollapply(x, 20, sd, fill=NA, align='right')

library(TTR)
runSD(x, 20)

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

library(runner)

runner(
  x, 
  function(x) sd(x),
  k = 20, 
  na_pad = TRUE
)


runner может воспроизвести zooвывод, а также есть такие параметры, как обработка неравномерно разнесенных данных и другие (подробнее см. документацию и виньетки).

library(runner)
library(zoo)

x <- c(0.000000000, 0.005277045, 0.023622047, 0.002564103,-0.002557545, -0.020512821,
       0.007853403,-0.012987013,  0.007894737,  0.015665796,  0.000000000, -0.002570694,
       0.002577320, -0.015424165, 0.002610966,  0.010416667,  0.002577320,  0.015424165, 
       0.000000000, -0.002531646, -0.002538071, 0.030534351,  0.014814815, -0.007299270,
       -0.009803922, -0.012376238,  0.002506266, -0.015000000,-0.002538071,  0.002544529)

identical(
  runner(x, sd, k = 20, na_pad = TRUE),
  rollapply(x, 20, sd, fill = NA, align = "right")
)

# centered alignment
identical(
  runner(x, sd, k = 20, lag = -10, na_pad = TRUE),
  rollapply(x, 20, sd, fill = NA, align = "center")
)
Другие вопросы по тегам