基于BP网络的股票数据预测模型

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1基于BP网络的股票数据预测模型姓名:江政班级:控制2015级学号:20150280811000152016年6月26日1需求分析和网络结构设计根据我们对自然神经系统的构造和机理的认识,神经系统是由大量的神经细胞(神经元)构成的复杂的网络,人们对这一网络建立一定的数学模型和算法,设法使它能够实现诸如基于数据的模式识别,函数映射等带有“智能”的功能,这种网络就是神经网络。其中,BP(BackPropagation)神经网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差反向传播算法训练的多层前馈网络。BP网络能学习和存贮大量的输入—输出模式映射关系,而无需事先揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。是目前应用最广泛的神经网络模型之一。因此理解BP网络结构和权值调整算法对学习其他神经网络具有重要作用。针对150组股票数据进行拟合(详细数据请见《附件1》),选取其中的开盘、最高、最低、收盘和成交次数五组数据,用当日的这五组数据来预测次日的收盘数据,从而等效建立一个股票数据预测模型。采用包括输入层、隐含层和输出层的三层BP网络结构,如图1所示,输入层包含五个神经元,隐含层包含三个神经元,输出层为一个神经元。其中,隐含层神经元的激活函数采用非对称型Sigmoid函数,函数表达式为:))exp(1/(1)(xxf,输出层神经元的激活函数采用线性函数,表达式为:xxf)(。将150组数据分为三等份,其中两份作为训练样本,用来对网络进行训练学习;另外一份作为测试样本,用来检验所训练出的网络的泛化能力。采用BP算法对隐含层和输出层权值进行修正,以达到计算输出和实际样本输出相差最小,最终实现较精确预测的目的。12开盘最高次日收盘成交次数收盘最低图1预测模型的网络结构2MATLAB源程序(版本不限)clearallclcclf%采用三层BP网络结构%输入层神经元数为5,隐含层神经元数为3,输出层神经元数为1%最大迭代次数maxcishu=5000;%e为计算输出和样本实际输出差%在内存中开辟maxcishu个存储空间e=zeros(maxcishu,1);%输入数据维度5,输入节点数5%maxp当日最高价序列%minp当日最低价序列%sp当日开盘价%ep当日收盘价%tnum当日成交量%调用数据%shuju=xlsread('dm.xlsx','B1:K151');shuju=importdata('dm.xlsx');sp=shuju.data(:,1)';maxp=shuju.data(:,2)';minp=shuju.data(:,3)';tnum=shuju.data(:,10)';ep=shuju.data(:,4)';%将数据集按照2:1分为训练样本集,和测试样本集jishu=length(ep);jishu=ceil(jishu/3*2);%测试样本集是2/3处到最后一个spt=sp(jishu+1:end);maxpt=maxp(jishu+1:end);minpt=minp(jishu+1:end);tnumt=tnum(jishu+1:end);ept=ep(jishu+1:end);%训练样本集3sp=sp(1:jishu);maxp=maxp(1:jishu);minp=minp(1:jishu);tnum=tnum(1:jishu);ep=ep(1:jishu);%记录下每组的最大值最小值,为训练样本集的归一化准备maxp_max=max(maxp);maxp_min=min(maxp);minp_max=max(minp);minp_min=min(minp);ep_max=max(ep);ep_min=min(ep);sp_max=max(sp);sp_min=min(sp);tnum_max=max(tnum);tnum_min=min(tnum);%目标数据为次日的收盘价,相当于把当日收盘价时间序列向前挪动一个单位goalp=ep(2:jishu);%数据归一化,将所有数据归一化到(01)guiyi=@(A)((A-min(A))/(max(A)-min(A)));maxp=guiyi(maxp);minp=guiyi(minp);sp=guiyi(sp);ep=guiyi(ep);tnum=guiyi(tnum);%后面的目标数据goalp个数是ep向前移动一位得到,所以最后一组的目标数据缺失%所以,要把除了目标数据goalp以外的所有数据序列删除最后一个maxp=maxp(1:jishu-1);minp=minp(1:jishu-1);sp=sp(1:jishu-1);ep=ep(1:jishu-1);tnum=tnum(1:jishu-1);%需要循环学习次数loopn,即训练样本的个数loopn=length(maxp);%为了方便表示将5个行向量放到一个5*loopn的矩阵中simp中,每一列是一个样本向量simp=[maxp;minp;sp;ep;tnum];4%隐含层节点n%根据相关资料,隐含层节点数比输入节点数少,一般取1/2输入节点数bn=3;%隐含层激活函数为S型函数jihuo=@(x)(1/(1+exp(-x)));%bx用来存放隐含层每个节点的输出%bxe用来保存bx经过S函数处理的值,即输出层的输入bx=zeros(bn,1);bxe=zeros(bn,1);%权值学习率uu=0.02;%W1(m,n)表示隐含层第m个神经元节点的第n个输入数值的权重,%即,每一行对应一个节点%所以输入层到隐含层的权值W1构成一个bn*5的矩阵,初值随机生成W1=rand(bn,5);%W2(m)表示输出节点第m个输入的初始权值,采用随机生成W2=rand(1,bn);%loopn个训练样本,对应loopn个输出out=zeros(loopn,1);fork=1:1:maxcishu%训练开始,i表示为本次输入的是第i个样本向量fori=1:1:loopn%求中层每个节点bx(n)的输出,系数对应的是W1的第n行forj=1:1:bnbx(j)=W1(j,:)*simp(:,i);bxe(j)=jihuo(bx(j));end%求输出out(i)=W2*bxe;%误差反向传播过程%计算输出节点的输入权值修正量,结果放在行向量AW2中%输出神经元激活函数f(x)=x%为了书写方便,将deta用A代替5AW2=zeros(1,bn);AW2=u*(out(i)-goalp(i))*bxe';%计算隐含层节点的输入权值修正量,结果放在行向量AW1中,需要对隐含层节点逐个处理AW1=zeros(bn,5);forj=1:1:bnAW1(j,:)=u*(out(i)-goalp(i))*W2(j)*bxe(j)*(1-bxe(j))*simp(:,i)';endW1=W1-AW1;W2=W2-AW2;end%计算样本偏差e(k)=sum((out-goalp').^2)/2/loopn;%误差设定ife(k)=0.01disp('迭代次数')disp(k)disp('训练样本集误差')disp(e(k))breakendend%显示训练好的权值W1W2%绘制误差收敛曲线,直观展示收敛过程figure(1)holdone=e(1:k);plot(e)title('训练样本集误差曲线')%计算输出和实际输出对比图figure(2)plot(out,'rp')holdonplot(goalp,'bo')title('训练样本集计算输出和实际输出对比')%学习训练过程结束6%进行测试样本阶段,变量用末尾的t区分训练样本maxpt=(maxpt-maxp_min)/(maxp_max-maxp_min);minpt=(minpt-minp_min)/(minp_max-minp_min);spt=(spt-sp_min)/(sp_max-sp_min);eptduibi=ept(2:end);ept=(ept-ep_min)/(ep_max-ep_min);tnumt=(tnumt-tnum_min)/(tnum_max-tnum_min);%同样,将多维数据放入一个矩阵中,便于处理simpt=[maxpt;minpt;spt;ept;tnumt];%因为是用当前的数据预测下一天的,所以检验样本第一天的收盘价和预测的最后一天的收盘价因为没有比对值而舍弃fori=1:1:length(maxpt)-1forj=1:1:bnbx(j)=W1(j,:)*simpt(:,i);bxe(j)=jihuo(bx(j));end%输出预测序列outt(i)=W2*bxe;end%预测输出和实际对比散点图figure(3)holdonplot(outt,'rp')plot(eptduibi,'bo')title('测试样本集预测输出和实际对比')%计算全局误差disp('测试样本集误差')disp(1/length(eptduibi)*0.5*sum((eptduibi-outt).^2))结果及分析图2为MATLAB命令窗口显示内容,图3为训练样本集误差曲线图,图4为训练样本集计算输出和实际输出对比图,图5为测试样本集预测数据与实际数据对比图。7图2MATLAB命令窗口显示内容图3训练样本集误差曲线05010015020025030000.20.40.60.811.21.4训练样本集误差曲线8图4训练样本集计算输出和实际输出对比图图5测试样本集预测数据与实际数据对比由图2和图3可看出,刚开始的时候计算输出和实际输出误差比较大,经迭代259次后误差收敛到设定值0.01,且最后一组数据误差最小。训练好的网络隐含层和输出层权值矩阵分别为W1和W2,向网络输入测试样本集后误差为0.0104,比训练样本集误差稍大。由图4可看出,对于100组训练样本来说,计算输出和实际样本输出整体拟合的比较好,虽然中间有几组数据发生了大的波动,但算法及时调整权值,可以看到最后几组样本数据拟合的相对要好,说明误差最终收敛。由图5可看出,输入50组测试样本得到的计算输出和实际样本输出误差比训练样本集要大,说明所设计的网络泛化能力不是很好。经分析,一是由于训练样本太少,二是预测模型过于简单,收盘价格还和其他数据有关。01020304050607080901003.544.555.56训练样本集计算输出和实际输出对比0510152025303540455044.555.5测试样本集预测数据和实际对比9结论本次作业采用BP网络建立对股票数据的预测模型,即利用前一天的相关数据来预测后一天的收盘价格。由于收盘价格跟很多数据有关,为了简化模型,经查找股票的相关资料后最终选择其中相关系数比较大的五种数据,以此作为网络的输入向量。从仿真结果来看,所建立的模型整体上能较好的实现对次日收盘价的预测。通过这次作业,我对神经网络的理解更深了一层,对它的应用有了切身体会。编程的时候遇到很多问题,比如没对数据归一化、隐含层神经元个数取太多、误差反传公式计算错误、算法逻辑混乱等等,不过最终还是较好的完成了网络设计和编程任务,这让我明白做事要肯下功夫,肯用心,不能纸上谈兵,光说不练永远也不能学到知识。

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功