【问题标题】:Rollapply for time series滚动申请时间序列
【发布时间】:2012-10-25 22:34:23
【问题描述】:

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

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

【问题讨论】:

    标签: r zoo


    【解决方案1】:

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

    来自?rollapply

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

    不过,就我个人而言,我会使用 TTR 包中的 runSD,因为它使用已编译的代码并且会更快。

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

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

    【讨论】:

      【解决方案2】:

      我推荐 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")
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 2019-08-17
        • 1970-01-01
        • 2017-11-08
        • 2021-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多