本文主要介绍一下使用RS法计算Hurst指数,文章原理等来自互联网,使用python进行了简单的实现。
声明:本博客的内容来源于各大论文和互联网,其正确性有待考究。目的仅仅为了记录一下本人的学习过程,如果正好也能对你有一点帮助或者发现文中的错误所在,非常欢迎留言交流呀。
1 原理
本人是一个小白,今天搜索了很多文章,讲得都不怎么透彻,最后看到了这篇http://club.excelhome.net/thread-1414154-1-1.html文章,讲得非常详细,这里我将其主要部分贴在此处。(原文中讲得非常详细,还涉及到了如何优化计算等问题)
2 意义
本人是个小白,以下内容来自引用[2],其Hurst数值大小的意义如下:
3 代码实现(python)
详细的实现代码也是根据该文中提供的原理进行编写的,是最原始的解法,未进行优化,其中的命名也是和上图中的原理是一一对应的,便于理解。
import numpy as np
import math
def hurst_rs(data:list):
"""
使用rs法计算Hurst指数值
"""
t_i = []
for r in range(2, (len(data))//2 + 1):
g = len(data)//r
x_i_j = [data[i * r : (i+1)*r] for i in range(g)]
x_i_mean = [sum(x_i)/r for x_i in x_i_j]
y_i_j = [[x_i_j[i][j] - x_i_mean[i] for j in range(r)] for i in range(g)]
z_i_j = [[sum(y_i_j[i][ : j + 1]) for j in range(r)] for i in range(g)]
r_i = [max(z_i_j[i])-min(z_i_j[i]) for i in range(g)]
s_i = [math.sqrt(sum([ (x_i_j[i][j]-x_i_mean[i])**2 for j in range(r)]) / (r-1)) for i in range(g)]
rs_i = [r_i[i]/s_i[i] for i in range(g)]
rs_mean = sum(rs_i)/g
# t_i.append( math.sqrt(sum([(rs_i[i] - rs_mean)**2 for i in range(g)])/(g-1)) )
t_i.append(rs_mean)
return np.polyfit(np.log(np.arange(2, len(data)//2 + 1)), np.log(np.array(t_i)), 1)[0]
if __name__ == "__main__":
# 测试
data_test = list(np.arange(0, 100))
print(hurst_rs(data_test))
以上代码的测试结果为:1.0539540901544668
参考文献
[1] RS 分析法和 Hurst 指数计算方法 http://club.excelhome.net/thread-1414154-1-1.html(出处: ExcelHome技术论坛)
[2] 薛静. 基于Hurst指数的AED自动诊断分析算法研究[D]. 2014.