股票价格预测神器: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('开盘价仿真预测值');