数据来源
本文数据来源于第十六届“五一数学建模竞赛”的C题数据,原题目《科创板拟上市企业估值》,原题目要求如下:截至2019年4月27日,上海证券交易所已受理93家企业申报科创板上市,并且公布了93家企业2016-2018年的基本面数据。参照美国NASDAQ市场的估值量化模型、中国A股市场的流动性指标,预测我国首批科创板企业上市后的估值水平。
BP神经网络简介
BP神经网络是一种神经网络学习算法,由输入层、中间层和输出层组成,中间层可扩展为多层。相邻层之间各神经元进行全连接,而每层各神经元之间无连接,网络按有教师向量的方式进行学习,当一对学习模式提供网络后,各神经元获得网络的输入响应产生连接权值。然后按减小希望输出与实际输出误差的方向,从输出层经各中间层逐层修正各连接权,回到输入层。此过程反复交替进行,直至网络的全局误差趋向给定的极小值,即完成学习过程三层BP神经网络结构下如图所示。
BP神经网络最大优点是具有极强的非线性映射能力,表现为以下四个方面:
- 函数逼近用输入向量和相应的输出向量训练一个网络以逼近某个函数。
- 模式识别用待定的输出向量将它与输入向量联系起来。
- 分类把输入向量所定义的合适方式进行分类。
- 数据压缩减少输出向量维数以便传输或存储。
理论上对于一个3层和3层以上的BP网络,只要隐层神经元数目足够多,该网络就能以任意精度逼近一个非线性函数。
BP神经网络同时具有对外界刺激和输入信息进行联想记忆能力,这种能力使其在图像复原、语言处理、模式识别等方面具有重要应用。BP神经网络对外界输入样本有很强的识别与分类能力,解决了神经网络发展史上的非线性分类难题。BP神经网络还具有优化计算能力,其本质上是一个非线性优化问题它可以在已知约束条件下,寻找参数组合,使该组合确定的目标函数达到最小。
本文的神经网络预测流程如下所示:
案例实战
首先将2009-2018年的营业收入、归母净利润、净资产收益率、年成交量、年平均换手率、年成交额共6项指标作为输入变量,2009-2018年国估值水平作为输出变量对神经网络进行训练,然后将2019年各项指标的预测值作为输入变量可得到2019年估值水平的预测值,美国2019估值水平的预测值为5.5199,中国2019估值水平的预测值为5.2469,训练出来的神经网络图像如下所示。
附该题神经网络代码:
%% 导入数据
x=[120728.4973 11213.31569 4062.381933 245714976.3 27.30783341 508491.1979
144172.5906 15264.90045 -10.68503406 244004366.8 85.1555084 685388.0204
178478.4477 17123.83569 9.428828315 230163128.6 34.83853076 721050.0948
190306.5839 17619.30792 6.407338655 198308120.7 55.64335634 724832.3937
204091.3887 28051.42658 25.50445558 205708470.2 62.02682612 788015.785
220694.5977 21316.86829 -0.317657836 225644604.9 80.46068768 1106891.344
234988.5008 21563.64066 -1.530533557 219105201.3 70.4040333 1076378.604
248652.9858 22839.7377 350.8292175 229151345.5 92.41705427 1018375.803
280164.0668 30934.26718 12.40673671 230771137.9 77.56972671 1197640.008
293721.3857 30932.48299 6.067514146 251028619.4 81.83903728 1645955.361];
y=[0.764366035 1.250975713 0.747069728 2.251129029 3.570905827 5.228548311 3.49526642 3.296167318 10.13930106 5.096094661]; %替换
x=x';
y=y';
[pn,minp,maxp,tn,mint,maxt]=premnmx(x,y); %对于输入矩阵x和输出矩阵y进行归一化处理
dx=[-1,1;-1,1;-1,1;-1,1;-1,1;-1,1]; %对应输入数据组数
net=newff(dx,[6,10,1],{'tansig','tansig','purelin'},'traingdx');
net.trainParam.show=1000; %1000轮回显示一次结果
net.trainParam.Lr=0.05; %学习速度为0.05
net.trainParam.epochs=50000; %最大训练轮回为50000次
net.trainParam.goal=0.65*10^(-3); %均方误差
net=train(net,pn,tn); %开始训练,其中pn,tn分别为输入输出样本
x1=[331041.5655 33260.53948 176.7517535 280991819.6 83.24674735 -55138.03985];
x1=x1';
y1=[6.431211609];
y1=y1';
y1=y1';
p1=tramnmx(x,minp,maxp);
anewn=sim(net,p1);
anew=postmnmx(anewn,mint,maxt)
p2=tramnmx(x1,minp,maxp);
anewn1=sim(net,p2);
anew1=postmnmx(anewn1,mint,maxt)
figure
t=[2009:2018];
plot(t,y','r-o',t,anew,'b--+')
legend('训练结果','原始结果');
xlabel('时间');