我发现网上有大量的关于Hurst指数计算的文章,其中大多是R/S法求Hurst指数,因为其公式简洁容易通过代码实现。我通过网上的方法用python实现Hurst指数的计算后,我发现了一个问题:Hurst指数计算结果与理论结果偏差较大。我使用一系列随机数进行测试,发现Hurst值为0.54,从统计上显著异于理论的0.5,我一开始觉得是随机性导致的偏差,于是我重复生成了大量的一系列随机数进行上千次重复测试,取均值,得到Hurst指数为0.53,仍然从统计上显著异于理论的0.5。所以,我认为是Hurst的估计值出现了统计性的偏差,并不是随机性导致的。
我们发现R/S法计算Hurst指数其实有一个重要问题需要解决,就是如何将原来的时间序列进行分割,同样我使用的方法是网上比较流行的二分法,将时间序列分为1,2,4,8...,2^n个部分,再在每种分割情况下分别求R/S值。于是,我开始调整我的分割方式,我将最大几个(1,2,3...),最小几个(2^n,2^(n-1),....)的分割情况删去,将剩下的分割情况的log(R/S)与log(每组数据个数)进行回归,发现Hurst指数有所变化。于是,我不断调整终于将长度为10000的随机序列的Hurst估计结果均值调到了0.509。这时,我将长度改为1000,Hurst指数估计结果又从统计上显著异于理论的0.5。
下面是重点:
最后,我找到了这篇论文:Hurst指数估计法中的修正方法研究. 朱灵蕾;姚远程;姜军;秦明伟.电子技术应用,2016。里面详细介绍了几种Hurst求值方法修正方法,这里我只介绍R/S法的修正方法:m = 某种分割方法下每组数据的个数。
论文截图
通过增大m的最小值,可以Hurst指数估计值的减小误差。设m = xlog(N)
下面我分别对长度为500,1000,5000,10000的随机数列,在 x = 2 , 10 , 30 的情况下进行Hurst指数的计算,循环1000次取均值。
x值\随机序列长度 | 500 | 1000 | 5000 | 10000 |
2 | 0.556 | 0.547 | 0.534 | 0.531 |
10 | 0.529 | 0.526 | 0.519 | 0.513 |
30 | 0.516 | 0.51 | 0.509 | 0.51 |
确实如论文所说,Hurst指数的估计值精确度有所提升。
注明:一系列随机数,例如:random_data = np.random.uniform(-1, 1, 10000)
郑重申明:这个修正方法源于论文:Hurst指数估计法中的修正方法研究. 朱灵蕾;姚远程;姜军;秦明伟.电子技术应用,2016。