我正在计算滚动20期的历史波动率。我拿每日回报:
ret<-ROC(data1)
然后我使用rollapply为每列提供20天的HV:
vol<-rollapply(ret,20,sd,by.column=T,fill=NA)
问题是vol中的观察开始在十天后出现,这是我指定的错误。
这里的示例是数据样本:
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也是错误的。
我应该在这里遗漏一些东西......
答案 0 :(得分:20)
您需要使用align='right'
而不是使用align='center'
的默认值,或者使用rollapply
包含rollapplyr
的{{1}}封包器而不是align='right'
。作为默认值。
来自?rollapply
:
对准 指定与观察的滚动窗口相比,结果的索引是左对齐还是右对齐(默认)。仅当width表示宽度时才使用此参数。
尽管如此,就个人而言,我会使用TTR包中的runSD
,因为它使用已编译的代码并且会更快。
其中任何一个都应该达到你的预期,但第二个会更快。
library(zoo)
rollapply(x, 20, sd, fill=NA, align='right')
library(TTR)
runSD(x, 20)
答案 1 :(得分:3)
我建议使用runner包中的runner
函数在滚动窗口上应用任何R函数。在runner
下面的输出与zoo
相同。
library(runner)
runner(
x,
function(x) sd(x),
k = 20,
na_pad = TRUE
)
runner
可以重现zoo
的输出,还具有诸如处理不等间距的数据等选项(更多信息请访问documentation and vignettes)。
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")
)