只贴基本的适合小白的Matlab实现代码,深入的研究除了需要改进算法,我建议好好研究一下混沌与分形,不说让你抓住趋势,至少不会大亏,这个资金盈亏回调我以前研究过。
function [line_H,RS]=dfaX_0322(x)
%% 初始化数据处理% x=importdata('IF.txt');[line_H,RS]=dfaX_0322(x);line_H%x=1000*rand(4000,1);[line_H,RS]=dfaX_0322(x);line_Hx=x(:);x=x+2;%防止x中有0x1=log([x(2:end);10])-log(x);x=x1(1:end-1);%消除序列的短期自相关性,以满足R/S分析对观测对象独立的要求% x=cumsum(x-mean(x));%x=log(x(:));N=length(x);xulie=[8:floor(N/2)];%表示将x分成floor(N/xulie(i))段%% 处理input
len_xulie=length(xulie);
RS=zeros(1,len_xulie);%初始化序列的重标极差%% 求RS过程
for flag_i=1:len_xulie m=xulie(flag_i); junzhi_ij=zeros(1,floor(N/xulie(flag_i)));%初始化均值 biaozhuencha_ij=zeros(1,floor(N/xulie(flag_i)));%初始化标准差 jicha_ij=zeros(1,floor(N/xulie(flag_i)));%初始化极差 for flag_j=1:floor(N/xulie(flag_i)) yuansu_ij=x([m*(flag_j-1)+1:m*flag_j]); junzhi_ij(1,flag_j)=mean(yuansu_ij); biaozhuencha_ij(1,flag_j)=sqrt(mean((yuansu_ij-junzhi_ij(1,flag_j)).^2)); leijilicha_ij=cumsum(yuansu_ij-junzhi_ij(1,flag_j)); jicha_ij(1,flag_j)=max(leijilicha_ij)-min(leijilicha_ij); end RS(1,flag_i)=mean(jicha_ij./biaozhuencha_ij);end%% 拟合分段xulie和RS序列,求出Hurst指数
temp1=find(isnan(RS));RS(temp1)=[];xulie(temp1)=[];line_H=polyfit(log10(xulie),log10(RS),1);%% 作图
% subplot(1,2,1);plot(x);% subplot(1,2,2);% plot(log10(N./xulie(1:len_xulie)),log10(RS(1:len_xulie)),'ro');hold on;% plot(log10(N./xulie(1:len_xulie)),polyval(line_H,log10(N./xulie(1:len_xulie))),'-b*');% title(['拟合直线斜率',num2str(line_H(1))]);% Log_N_RS=[log10(N./xulie(1:len_xulie);log10(RS(1:len_xulie))];%%% Hurst指数和相关性的关系
% (1)当0.5<h<1时,说明时间序列具有长程相关性,呈现出趋势不断增强的状态,即在某一时间段是递增(递减)趋势,下一个时间段也会是递增(递减)趋势,且h越接近于1,相关性越强。% (2)当h=0.5时,说明时间序列不相关,是一个独立的随机过程,即当前状态不会影响将来状态。% (3)当0<h<0.5时,说明径流时间序列只存在负的相关性,呈现反持久性的状态,即时间序列在某一个时间段是递增(递减)的趋势,则在下一个时间段是递减(递增)的趋势。% 赫斯特指数有三种形式:
% 1.如果H=0.5,表明时间序列可以用随机游走来描述;% 2.如果0.5<H≤1,表明黑噪声(持续性)即暗示长期记忆的时间序列;% 3.如果0≤H<0.5,表明粉红噪声(反持续性)即均值回复过程。% 也就是说,只要H ≠0.5,就可以用有偏的布朗运动(分形布朗运动)来描述该时间序列数据。%% polyfit(拟合)和polyval(插值)应用例子
% x = (0: 0.1: 2.5)';% y = erf(x);% p = polyfit(x,y,6);% y1=polyval(p,x);% subplot(1,3,1);plot(x,y,'-b*');% subplot(1,3,2);plot(x,y1,'-ro');% subplot(1,3,3);plot(x,y,'-b*');hold on;plot(x,y1,'-ro');%% n的输入
% 2.^[2:15]'% 4% 8% 16% 32% 64% 128% 256% 512% 1024% 2048% 4096% 8192% 16384% 32768end