RS法计算Hurst指数

本文主要介绍一下使用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.

你可能感兴趣的:(RS分析法,Hurst指数,Python)