我正在尝试计算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也是错误的。
我应该在这里想念一些东西...
最佳答案
您需要使用align='right'
代替默认的align='center'
,或者代替rollapply
使用带有rollapplyr
作为默认值的align='right'
包装器。
来自?rollapply
:
对齐
指定结果的索引与观察的滚动窗口相比是左对齐还是右对齐或居中(默认)。仅当width表示宽度时才使用此参数。
尽管为此,我个人会使用TTR包中的runSD
,因为它使用编译后的代码,并且速度更快。
这些方法中的任何一个都可以满足您的期望,但是第二个方法会更快。
library(zoo)
rollapply(x, 20, sd, fill=NA, align='right')
library(TTR)
runSD(x, 20)