我是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
答案 0 :(得分:2)
我真的不熟悉fArma
包或它的功能,但我注意到你的代码有几个主要问题。
rollapply
;特别是你的第三个论点FUN=rsFun(data$returns)
。通常,如果要对foo
的数据对象x
应用(单参数)函数rollapply
,则函数调用应为rollapply(x,some_integer,foo)
。 所以在你的情况下,你会有
rollapply(data$returns,230,rsFit)
因为只使用一个参数(第一个rsFit
)调用x
是可以接受的,如帮助文件?rsFit
中所示)。
width
中指定的rollapply
230太大了 - 您的样本数据data$returns
的长度只有18 - 窗口大小必须小于比数据的长度。一种选择是使用较小的width
:我尝试了几个小值(5,10,...)和数据,但这会产生错误。就像我说的那样,我不熟悉fArma
中的函数,但我怀疑rsFit
一次需要超过5或10个观察值。更好的解决方案是使用更大的数据样本,如下所示。 即使进行了上述更改,您还会遇到一个问题。来自?rollapply
中的值部分(即返回值):
“与滚动结果的数据相同的类的对象 功能。“
通常这是某种类型的简单对象,例如vector
,matrix
等......取决于您的输入。但是,rsFit
会返回S4
类fHURST
对象,rollapply
显然无法处理。这并不奇怪,因为fHURST
对象具有相当复杂的结构 - 尝试运行str(rsFit(data$returns))
并记下它包含的所有各种插槽。基本上,对此的简单解决方案是返回在fHURST
中计算的整个rollapply
对象,而不是返回所需的组件/插槽。同样,我从未使用过rsFit
而且我没有时间阅读赫斯特指数的理论基础,但在下面我假设你主要关注占据@hurst
的估计系数值。 fHURST
个对象的插槽。
如上所述,我制作的玩具数据集远远大于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
)的正文以满足您的需求。