股票价格预测神器:BP神经网络预测的matlab模拟代码;
自动优选神经元个数;
自动迭代15000次,精度0.001;
代码运行效果图:
原始代码自此处开始:
% 本代码由重庆科技学院范巧副教授于2018年7月22日12:00撰写;
% 本代码版权保护,不得用于科研或学习之外的其他用途;
% 小范学数量经济学之四:BP神经网络预测的MATLAB模拟代码;
% 参考文献:杨德平,刘喜华.经济预测与决策技术及MATLAB实现(第2版)[M].北京:机械工业出版社,2016:239-252。
% 录入数据,第1列为开盘价,第2列为最高价,第3列为最低价,第4列为收盘价(依据实际分析情况修改);
X = randn(500,4);
% 以第2行至第m行第1列数据为输出目标,以第1行至第m-1行所有列数据为输入数据序列;
% 以历史开盘价、收盘价、最高价、最低价为依据,来预测开盘价;
[m,n] = size(X);
ts = X(2:m,1);
tsx = X(1:m-1,:);
TSX = tsx';
% 以premnmx函数对TS、TSX数据序列进行无量纲归一化处理;
[Pn1,minp1,maxp1] = premnmx(TS);
[Pn2,minp2,maxp2] = premnmx(TSX);
s0 = 2*n+3;
s1 = n:s0;%神经元取值个数的范围;
s2 = length(s1);
% 确定最优神经元的个数;
for i = 1:s2;
rand('state',0);
PR0 = minmax(Pn2);
% 创建神经网络系统,并定义参数;
net0 = newff(PR0,[s1(i),1],{'tansig','purelin'},'traingdx','learngdm','mse');
% newff指建立一个前馈BP神经网络;net = newff(PR,SN,TF,BTF,BLF,PF)
% PR为输入元素的最大值和最小值组成的P*2为矩阵;
% SN为网络隐层和输出层的神经元个数;
% TF为网络隐层和输出层的传递函数,常见的有tansig(默认),purelin,logsig等形式;
% BTF为训练函数,traingdm为普通训练函数,需设定学习速率和动量系数;trainlm为快速训练函数。
% BLF为网络权重学习函数,默认为learngdm;
% PF为网络性能函数,默认为mse,表示网络输出和目标输出之间的均方误差。
net0.trainparam.lr = 0.1; % 学习速率,权重阈值的调整幅度;
net0.trainparam.epochs = 500; % 训练次数;
net0.trainparam.goal = 0.0001; % 误差精度;
% 训练神经网络;
net0 = train(net0,Pn2,Pn1);
net0 = train(net0,Pn2(:,1:m-4),Pn1(1:m-4));
% [z1,z2] = train(net,X,Y), 其中X为输入样本矢量集,Y为对应的目标样本矢量集
% net为训练之前的神经网络对象;z1为训练之后的神经网络对象;z2为训练过程的步数信息和误差信息存储对象;
% 仿真预测;
Test0 = Pn2(:,1:m-4);
Y = sim(net0,Test0);
% [k1,k2,k3,k4,k5] = sim(net,X1,X01,X02,X2),BP神经网络的仿真;
% k1为网络输出,k2为训练终止时的输入延迟状态,k3为训练终止时的层延迟状态,k4为输出矢量和目标矢量之间的误差,k5为网络性能值;
% net为神经网络对象,X1为神经网络的输入对象,X01为输入延迟的初始状态,X02为层延迟的初始状态,X2为目标矢量;
% 确定预测误差大小;
Test1 = Pn2(1:m-4);
resids0 = Test1-Y;
resids1(i) = norm(resids0);
s3 = find(resids1 == min(resids1));
Optimal_num = s3+n-1;
rand('state',0);
PR1 = [-1*ones(n,1),ones(n,1)];
% 创建BP神经网络,并设定参数;
net = newff(PR1,[Optimal_num,1],{'tansig','purelin'},'traingdx','learngdm','mse');
net.trainparam.show = 50; % 训练状态的显示幅度,默认25;
net.trainparam.lr = 0.05; % 学习速率,权重阈值的调整幅度;
net.trainparam.mc = 0.95; % 权重阈值改变的重复度;
net.trainparam.epochs = 15000; % 训练次数;
net.trainparam.goal = 0.0001; % 误差精度;
net = init(net);
% 训练网络;
net = train(net,Pn2(:,1:m-4),Pn1(1:m-4));
Forecast0 = Pn2(:,m-Optimal_num-1:m-1);
Forecast1 = sim(net,Forecast0);
% 利用postmnmx函数进行反归一化处理;
Forecast2 = postmnmx(Forecast1,minp1,maxp1);
% 确定预测误差;
Real0 = X(m-Optimal_num:m,1);
resids2 = (Real0-Forecast2)./Real0;
resids3 = norm(resids2);
% 画出开盘价预测图;
T = m-Optimal_num:m;
plot(T,Real0,'-+',T,Forecast2,'O');
xlabel('交易日天数');
ylabel('开盘价仿真预测值');