10

我正在尝试计算滚动 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 也是错误的。

我应该在这里遗漏一些东西......

4

2 回答 2

24

您需要使用align='right'而不是使用默认值align='center',或者使用默认值rollapplyrollapplyr包装器而不是使用align='right'

来自?rollapply

align 指定与观察的滚动窗口相比,结果的索引是左对齐还是右对齐或居中(默认)。仅当 width 表示宽度时才使用此参数。

虽然,为此,我个人会使用runSDTTR,因为它使用编译代码并且会更快。

其中任何一个都应该符合您的预期,但第二个会更快。

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

library(TTR)
runSD(x, 20)
于 2012-11-06T01:43:33.787 回答
4

我推荐runnerrunner包中的函数以在滚动窗口上应用任何 R 函数。下面的输出与.runnerzoo

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")
)
于 2020-01-27T17:10:55.087 回答