分享一下经典R/S分析法和Lo的MRS分析法计算Hurst指数的MATLAB代码。
如果有不对的地方,欢迎大家指正~
R/S
- clc;
- clear all;
- file='%文件路径%\test.xlsx';
- rate=xlsread(file,'Sheet1','C3:C3021');
- N=length(rate);
- stn=3;
- edn=floor(N/2); %floor函数表示向下取整
- for n=stn:edn
- a=floor(N/n);
- x=zeros(n,1);
- r=zeros(a,1);
- s=zeros(a,1);
- for j=1:a
- m=sum(rate((n*j-(n-1)):(n*j)))/n;
- for k=1:n
- x(k)=sum(rate(n*j-(n-1):n*j-(n-1)+k-1))-k*m;
- end
- r(j)=max(x)-min(x);
- s(j)=std(rate((n*j-(n-1)):(n*j)));
- end
- rs(n-2)=sum(r./s)/a;
- end
- n=3:floor(N/2);
- lgn=log(n);
- lgrs=log(rs);
- h=polyfit(lgn,lgrs,1);
- hurst=num2str(h(1));
- s=['hurst指数=' hurst]
- plot(lgn,lgrs);
- title(s)
- xlabel('log(n)');
- ylabel('log(R/S)');
- clc;
- clear all;
- % 导入文件
- file='C:\Users\Sylvia\Desktop\test.xlsx';
- x=xlsread(file,'06-17','C3:C3021');
- %计算参数q
- N=length(x);
- %t=autocorr(x,1);
- %t=t(2);
- %q=((3*N/2)^(1/3))*(2*t/(1-t^2))^(2/3);
- %q2 = floor(q); % 向下取整
- % 计算Hurst指数
- for n=3:floor(N/2)
- q=9;
- a=floor(N/n);
- X=reshape(x(1:a*n),n,a);
- ave=mean(X);
- cumdev=X-ones(n,1)*ave;
- cumdev=cumsum(cumdev);
- stdev=zeros(1,a);
- % Estimate the standard deviation
- for j=1:a
- sq=0;
- for k=0:q
- v(k+1)=sum(X(k+1:n,j)'*X(1:n-k,j))/(n-1);
- if k>0
- sq=sq+(1-1/(q+1))*v(k+1);
- end
- end
- stdev(j)=sqrt(v(1)+2*sq);
- end
- % Estiamte the rescaled range
- w=max(cumdev)-min(cumdev);
- rs=w./stdev;
- RS(n-2)=sum(rs)/a;
- %RS=sum/a;
- end
- n=3:floor(N/2);
- lgn=log(n);
- lgrs=log(RS);
- h=polyfit(lgn,lgrs,1);
- hurst=num2str(h(1));
- s=['hurst指数=' hurst]
- plot(lgn,lgrs);
- title(s)
- xlabel('log(n)');
- ylabel('log(R/S)');
第一种: q = [4(T/100)^(1/4)],其中T是总样本容量;
第二种即代码中给出的,由于q>=0,而我用第二种计算的q小于零,故采用第一种方法,取q=9。


雷达卡



京公网安备 11010802022788号







