滚动赫斯特指数

时间:2014-11-07 14:29:16

标签: r time-series

我是R的新手,我一直试图计算一个滚动的赫斯特指数而无济于事。我已经安装了包fArma(用于Hurst)和动物园(用于rollapply)。数据位于名为“数据”的数据框中。并且是可变的'返回'。以下Hurst的代码很有用;

rsFit(data$returns, levels = 50, minnpts = 3, cut.off = 10^c(0.7, 2.5), + doplot = FALSE, trace = FALSE, title = NULL, description = NULL)

下面是我对窗口大小230的滚动Hurst指数的尝试,它会产生错误。

rollapply(data$returns, 230, (rsFit(data$returns, levels = 50, minnpts = 3, cut.off = 10^c(0.7, 2.5), + doplot = FALSE, trace = FALSE, title = NULL, description = NULL)))

我们非常感谢您对代码的任何帮助。我试图在230周期窗口计算Hurst指数,一次向前滚动1个周期。

数据是;

    returns 
1   -0.002002003    
2   -0.002006019    
3   0.000000000 
4   0.000000000 
5   -0.009077218    
6   -0.003044142    
7   -0.002034589    
8   0.004065046 
9   0.002026343 
10  0.001011634 
11  0.001010612 
12  0.000000000     
13  -0.001010612    
14  -0.001011634    
15  0.003031837 
16  -0.001009591    
17  0.001009591 
18  -0.002020203        

1 个答案:

答案 0 :(得分:2)

我真的不熟悉fArma包或它的功能,但我注意到你的代码有几个主要问题。

  1. 您正试图错误地使用rollapply;特别是你的第三个论点FUN=rsFun(data$returns)。通常,如果要对foo的数据对象x应用(单参数)函数rollapply,则函数调用应为rollapply(x,some_integer,foo)
  2. 所以在你的情况下,你会有

    rollapply(data$returns,230,rsFit)
    

    因为只使用一个参数(第一个rsFit)调用x是可以接受的,如帮助文件?rsFit中所示)。

    1. 您在width中指定的rollapply 230太大了 - 您的样本数据data$returns的长度只有18 - 窗口大小必须小于比数据的长度。一种选择是使用较小的width:我尝试了几个小值(5,10,...)和数据,但这会产生错误。就像我说的那样,我不熟悉fArma中的函数,但我怀疑rsFit一次需要超过5或10个观察值。更好的解决方案是使用更大的数据样本,如下所示。
    2. 即使进行了上述更改,您还会遇到一个问题。来自?rollapply中的部分(即返回值):

        

      “与滚动结果的数据相同的类的对象   功能。“

      通常这是某种类型的简单对象,例如vectormatrix等......取决于您的输入。但是,rsFit会返回S4fHURST对象,rollapply显然无法处理。这并不奇怪,因为fHURST对象具有相当复杂的结构 - 尝试运行str(rsFit(data$returns))并记下它包含的所有各种插槽。基本上,对此的简单解决方案是返回在fHURST中计算的整个rollapply对象,而不是返回所需的组件/插槽。同样,我从未使用过rsFit而且我没有时间阅读赫斯特指数的理论基础,但在下面我假设你主要关注占据@hurst的估计系数值。 fHURST个对象的插槽。

    3. 如上所述,我制作的玩具数据集远远大于18个观察值,因此我可以将width=230保留在rollapply中。

      library(fArma)
      library(zoo)
      ##
      set.seed(123)
      data2 <- rnorm(690)
      ##
      data2.ra <- rollapply(data2,230,function(x){
        hSlot <- rsFit(x)@hurst
        result <- data.frame(
          H = hSlot$H,
          beta = hSlot$beta,
          Estimate.intercept = hSlot$diag[1,1],
          Estimate.X = hSlot$diag[2,1])
        result
      })
      ##
      > head(data2.ra)
                H      beta Estimate.intercept Estimate.X
      1 0.6257476 0.6257476       -0.143363281  0.6257476
      2 0.6627804 0.6627804       -0.193806373  0.6627804
      3 0.6235309 0.6235309       -0.133828565  0.6235309
      4 0.5683417 0.5683417       -0.055960572  0.5683417
      5 0.5520769 0.5520769       -0.027270395  0.5520769
      6 0.5334170 0.5334170       -0.003523383  0.5334170
      > dim(data2.ra)
      [1] 461   4
      > 690 - (230-1)
      [1] 461
      

      这是一个长度为461的对象,因为在长度为rollapply的对象上使用k窗口大小为n的输出为n - (k-1)。当然,您可以更改上面function(x){...}中使用的匿名函数(rollapply)的正文以满足您的需求。