hurst指数
来源:雪球App,作者: 量化还有sei,(https://xueqiu.com/8572240683/69748500)
本文将对hurst指数的历史及数学背景做尽可能详细而直白的介绍。简介:
1.布朗运动( Brownian motion ): 被分子撞击的悬浮微粒做无规则运动的现象叫做布朗运动。例如常见的解释是:显微镜下水中花粉微粒在水分子的撞击下观测到的运动轨迹。布朗运动是大量分子做无规则运动对悬浮的固体微粒各个方向撞击作用的不均衡性造成的,所以布朗运动是大量液体分子集体行为的结果,是一种随机涨落现象。由布朗发现,后经爱因斯坦、维纳等人发展成为分子运动论和统计力学的基础。
2.布朗运动数学描述:
{ B(t) } 布朗运动,满足下面性质:
1.B(t)是独立增量过程:对于任意的t>s, B(t)-B(s)独立于之前的过程B(u):0<=u<=s.
2. B(t)有正态的增量:B(t)-B(s)满足均值为0方差为t-s的正态分布。
3.B(t)有连续的路径:B(t), t>=0是关于t的连续函数。
下图是 二维布朗运动 的一个模拟图,像不像像花粉微粒在水中的运动咯~


我们再看看 一维的标准布朗运动 :均值为0,方差为sqrt(T) ,(你能找到它和股票价格走势的区别我给你五毛钱~


3.爱因斯坦的发现
爱因斯坦于1908年发表了关于布朗运动的论文,使得布朗运动成为随机游走的基本模型。爱因斯坦发现,分子布朗运动的半径可以用涵盖时间的平方根来测度:
R=T^(0.5); 其中R分子随机运动的半径(如上图),T是时间(Time) (1)
Hurst指数就是在这基础上发现新的统计量来对时间序列的随机性进行检验。
4.Hurst指数背景
由英国水文学家 H.E.HURST(赫斯特)提出,用于研究洪水形成周期:洪水过程是时间系列曲线,具有正的长时间相关效应。即干旱愈久,就可能出现持续的干旱;大洪水年过后仍然会有较大洪水。(有木有发现和股市很像

而Hurst发现上述这种特性可以用他本人提出的Hurst index来衡量。
5.Hurst指数数学依据
从上述爱因斯坦的结论(1)式中,我们知道标准布朗运动的半径R=T^(0.5),那么对于一般的时间序列呢?!受爱因斯坦的结果影响,我们相信分子运动半径R与时间T依旧存在类似的关系:R~T^(H),其中H就是所谓的Hurst指数,这里不再用等号是认为此时半径应该正比于T^(H)。
经研究得出Hurst指数的三种形式:
1.如果H=0.5:标准布朗运动,表明时间序列可以用随机游走来描述,表现出马尔科夫性;
2.如果0.5<H<1,表明时间序列存在长期记忆性,表明一定时间范围内走势记录会持续相当长的时间,从而形成一个大的循环;
3.如果0≤H<0.5,表明粉红噪声(反持续性)即均值回复过程,该序列理论上无数次返回它的历史出发点(说的就是此时股票价格就是处在震荡时刻)。
也就是说,只要H≠0.5,就可以用有偏的布朗运动(分形布朗运动)来描述该时间序列数据。
问题来了,那怎么计算Hurst指数呢?( 看完下面的计算过程,我想你会后悔这么着急着想看这了~

6.Hurst指数计算过程( 以股价时间序列为例 )


7.这样就完成Hurst index的计算了咯~哎,别走啊,再看一遍吧,真的不难啊~

下面我以 上证指数 为例,计算了2013年以来该指数N(=120)日的Hurst指数:

我们可以看到该上证指数大概在2/3的时间里的Hurst指数是大于0.5的,也就是说,上证指数的走势在很大范围里具有长周期记忆过程,而在约1/3的时刻处于震荡状态~(这可不是我说的~不信你看图

8.下面是该图的 源 代码 :
import numpy as np import pandas as pd from scipy import stats from statsmodels import regression import math def init(context): #stocks=find_by_group("sz50") stocks="sha-6000001" universe.extend(stocks) context.bench_mark="sza-000001" context.slippage=0.003 context.N=121 #取样数 context.A=range(2,61) def handle_data(context,data): stock=context.bench_mark n=context.N his=history(n,"close")[stock] his1=[] for i in range(0,len(his)-1): his1.append(np.log(float(his[i+1])/float(his[i]))) x=[] y=[] for a in context.A: M=(n-1)/a x.append(np.log(a)) R_S=0 for i in range(M): his2=his1[i*a:(i+1)*a] mean=np.mean(his2) st=np.sqrt(np.var(his2)) his3=[0]*a his3[0]=his2[0]-mean for j in range(1,a): his3[j]=his3[j-1]+his2[j]-mean R=max(his3)-min(his3) R_S=R_S+R/st y.append(np.log(R_S/M)) slope, intercept, r_value, p_value, slope_std_error = stats.linregress(x, y) H=slope #log.info("x===%s"%x) record("H",H) #log.info("y===%s"%y) #log.info("H==%s"%H) #log.info("%s"%data.dt)有了上面这个计算过程,至于怎么形成交易信号就比较容易了咯~(要不你先试试?!

这里我就用sha-600000作为参考,以H>0.62作为买入信号,H<0.48作为卖出信号。可以看到建仓出仓次数很少,至于效果嘛~我没有过多尝试尝试的设置,自己动手做做咯~这里只是参考嘛,当然你也可以重新设置股票或者以股票池来操作,具体这些都很简单啦~
源代码及回测:
import numpy as np import pandas as pd from scipy import stats from statsmodels import regression import math def init(context): stocks="sha-600000" universe.append(stocks) context.bench_mark="sha-600000" context.slippage=0.003 context.N=121 #取样数 context.A=range(2,61) def handle_data(context,data): stock="sha-600000" n=context.N his=history(n,"close")[stock] his1=[] for i in range(0,len(his)-1): his1.append(np.log(float(his[i+1])/float(his[i]))) x=[] y=[] for a in context.A: M=(n-1)/a x.append(np.log(a)) R_S=0 for i in range(M): his2=his1[i*a:(i+1)*a] mean=np.mean(his2) st=np.sqrt(np.var(his2)) his3=[0]*a his3[0]=his2[0]-mean for j in range(1,a): his3[j]=his3[j-1]+his2[j]-mean R=max(his3)-min(his3) R_S=R_S+R/st y.append(np.log(R_S/M)) slope, intercept, r_value, p_value, slope_std_error = stats.linregress(x, y) H=slope #log.info("x===%s"%x) record("H",H) #log.info("y===%s"%y) #log.info("H==%s"%H) #log.info("%s"%data.dt) if H>0.62: if context.portfolio.positions[stock].amount==0: cash=context.portfolio.cash order_value(stock,cash) log.info("Buying~") if H<0.48: if context.portfolio.positions[stock].amount>0: order_target(stock,0) log.info("selling~")

hurst指数 布朗运动 分形布朗运动 赫斯特指数

9.最后根据V统计量来观察我国股票市场的趋势周期情况,目测我国股市大概30个交易日左右一个周期
原发布网址: 网页链接