1、将150组数据分为三等份,其中两份作为训练样本,用来对网络进行训练学习;另外一份作为测试样本,用来检验所训练出的网络的泛化能力。采用BP算法对隐含层和输出层权值进行修正,以达到计算输出和实际样本输出相差最小,最终实现较精确预测的目的。图1 预测模型的网络结构MATLAB源程序(版本不限)clear allclcclf%采用三层BP网络结构%输入层神经元数为5,隐含层神经元数为3,输出层神经元数为1%最大迭代次数maxcishu=5000;%e为计算输出和样本实际输出差%在内存中开辟maxcishu个存储空间e=zeros(maxcishu,1);% 输入数据维度5,输入节点数5% maxp当日
2、最高价序列% minp当日最低价序列% sp当日开盘价% ep当日收盘价% tnum当日成交量% 调用数据%shuju=xlsread(dm.xlsx, B1:K151);shuju=importdata(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)
3、;maxpt=maxp(jishu+1:minpt=minp(jishu+1:tnumt=tnum(jishu+1:ept=ep(jishu+1:%训练样本集sp=sp(1:jishu);maxp=maxp(1:minp=minp(1:tnum=tnum(1:ep=ep(1:%记录下每组的最大值最小值,为训练样本集的归一化准备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);
4、tnum_max=max(tnum);tnum_min=min(tnum);% 目标数据为次日的收盘价,相当于把当日收盘价时间序列向前挪动一个单位goalp=ep(2:%数据归一化,将所有数据归一化到(0 1)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以外的所有数据序列删除最后一个jishu-1);%
5、需要循环学习次数loopn,即训练样本的个数loopn=length(maxp);%为了方便表示将5个行向量放到一个5*loopn的矩阵中simp中,每一列是一个样本向量simp=maxp;minp;sp;ep;tnum;%隐含层节点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个神经元
6、节点的第n个输入数值的权重,%即,每一行对应一个节点%所以输入层到隐含层的权值W1构成一个bn*5的矩阵,初值随机生成W1=rand(bn,5);%W2(m)表示输出节点第m个输入的初始权值,采用随机生成W2=rand(1,bn);%loopn个训练样本,对应loopn个输出out=zeros(loopn,1);for k=1:1:maxcishu %训练开始,i表示为本次输入的是第i个样本向量 for i=1:loopn %求中层每个节点bx(n)的输出,系数对应的是W1的第n行 for j=1:bn bx(j)=W1(j,:)*simp(:,i); bxe(j)=jihuo(bx(j);
7、end %求输出 out(i)=W2*bxe; %误差反向传播过程 %计算输出节点的输入权值修正量,结果放在行向量AW2中 %输出神经元激活函数 f(x)=x %为了书写方便,将deta用A代替 AW2=zeros(1,bn); AW2=u*(out(i)-goalp(i)*bxe %计算隐含层节点的输入权值修正量,结果放在行向量AW1中,需要对隐含层节点逐个处理 AW1=zeros(bn,5); AW1(j,:)=u* (out(i)-goalp(i)*W2(j)*bxe(j)*(1-bxe(j)*simp(:,i) W1=W1-AW1; W2=W2-AW2; %计算样本偏差 e(k)=su
8、m(out-goalp).2)/2/loopn; %误差设定 if e(k)=0.01 disp(迭代次数) disp(k)训练样本集误差 disp(e(k) breakend%显示训练好的权值W1W2%绘制误差收敛曲线,直观展示收敛过程figure(1)hold one=e(1:k);plot(e)title(训练样本集误差曲线% 计算输出和实际输出对比图figure(2)plot(out,rpplot(goalp,bo训练样本集计算输出和实际输出对比%学习训练过程结束%进行测试样本阶段,变量用末尾的t区分训练样本maxpt=(maxpt-maxp_min)/(maxp_max-maxp_m
9、in);minpt=(minpt-minp_min)/(minp_max-minp_min);spt=(spt-sp_min)/(sp_max-sp_min);eptduibi=ept(2:ept=(ept-ep_min)/(ep_max-ep_min);tnumt=(tnumt-tnum_min)/(tnum_max-tnum_min);% 同样,将多维数据放入一个矩阵中,便于处理simpt=maxpt;minpt;spt;ept;tnumt;%因为是用当前的数据预测下一天的,所以检验样本第一天的收盘价和预测的最后一天的收盘价因为没有比对值而舍弃for i=1:length(maxpt)-1
10、)*simpt(: %输出预测序列 outt(i)=W2*bxe;%预测输出和实际对比散点图figure(3)plot(outt,plot(eptduibi,测试样本集预测输出和实际对比%计算全局误差disp(测试样本集误差disp(1/length(eptduibi)*0.5*sum(eptduibi-outt).2)结果及分析 图2为MATLAB命令窗口显示内容,图3为训练样本集误差曲线图,图4为训练样本集计算输出和实际输出对比图,图5为测试样本集预测数据与实际数据对比图。图2 MATLAB命令窗口显示内容图3 训练样本集误差曲线图4 训练样本集计算输出和实际输出对比图图5 测试样本集预测
11、数据与实际数据对比 由图2和图3可看出,刚开始的时候计算输出和实际输出误差比较大,经迭代259次后误差收敛到设定值0.01,且最后一组数据误差最小。训练好的网络隐含层和输出层权值矩阵分别为 W1和W2,向网络输入测试样本集后误差为0.0104,比训练样本集误差稍大。由图4可看出,对于100组训练样本来说,计算输出和实际样本输出整体拟合的比较好,虽然中间有几组数据发生了大的波动,但算法及时调整权值,可以看到最后几组样本数据拟合的相对要好,说明误差最终收敛。由图5可看出,输入50组测试样本得到的计算输出和实际样本输出误差比训练样本集要大,说明所设计的网络泛化能力不是很好。经分析,一是由于训练样本太
12、少,二是预测模型过于简单,收盘价格还和其他数据有关。结论本次作业采用BP网络建立对股票数据的预测模型,即利用前一天的相关数据来预测后一天的收盘价格。由于收盘价格跟很多数据有关,为了简化模型,经查找股票的相关资料后最终选择其中相关系数比较大的五种数据,以此作为网络的输入向量。从仿真结果来看,所建立的模型整体上能较好的实现对次日收盘价的预测。通过这次作业,我对神经网络的理解更深了一层,对它的应用有了切身体会。编程的时候遇到很多问题,比如没对数据归一化、隐含层神经元个数取太多、误差反传公式计算错误、算法逻辑混乱等等,不过最终还是较好的完成了网络设计和编程任务,这让我明白做事要肯下功夫,肯用心,不能纸上谈兵,光说不练永远也不能学到知识。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1