【问题标题】:rolling Hurst exponent滚动赫斯特指数
【发布时间】:2014-11-12 06:12:45
【问题描述】:

我对 R 很陌生,我一直在尝试计算滚动的 Hurst 指数,但无济于事。我已经安装了包 fArma(用于 Hurst)和 zoo(用于 rollapply)。数据位于称为“数据”的数据框中,并且是可变的“返回”。赫斯特的以下代码效果很好;

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        

【问题讨论】:

标签: r time-series


【解决方案1】:

我真的不熟悉fArma 包或其功能,但我注意到您的代码存在几个主要问题。

  1. 您尝试错误地使用rollapply;特别是您的第三个论点FUN=rsFun(data$returns)。通常,如果您在带有rollapply 的数据对象x 上应用(单参数)函数foo,您的函数调用应该是rollapply(x,some_integer,foo)

所以在你的情况下,你会有

rollapply(data$returns,230,rsFit)

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

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

    "滚动结果与数据同类的对象 函数。”

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

如上所述,我制作了一个比 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 的对象,因为在长度为 n 的对象上使用窗口大小为 krollapply 的输出是 n - (k-1)。当然,您可以更改上面rollapply 中使用的匿名函数(function(x){...})的主体以满足您的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多