3.交叉验证(Cross-Validation)原则:训练误差曲线与确认误差曲线相背离,停止。
四. 神经网络算法
BP神经网络在数据预测中的算法流程图如下:
开始 导入并归一化数据 样本数据分类 训练数据 初始化网络给定神经元个数 测试数据 N 训练网络 网络收敛代入测试数据
仿真结果评价 合格 Y 结束 4.1 输出输入变量的选取
每日股票价格变化涉及的变量众多,有开盘价,收盘价,最高价,最低价,成交量,成交额,还有众多技术指标。采用什么作为输入量,什么作为输出量是一个必须考虑的问题,好的输入量配合好的模型和算法,就会给出很好的结果。
考虑到股票价格中收盘价是最重要的,其是衡量每日股价涨跌的唯一价格,所以这里我
21
们只选择和股票收盘价的量作为输出变量,这些量有:每日涨跌(即布尔量涨或跌,可将平盘看作上涨),每日涨跌幅度(-10%左右到10%左右),每日收盘价。
至于输出量可选择前几日股票的开盘价,收盘价,最高价,最低价,成交量,成交额等量,例如选择前五日的股票的这些数据作为输入量。但是这样会有一个问题—输入变量维数会很高,会有30个输入变量。如此多的输入变量,需要的训练样本将会是十分庞大的。机器学习领域已经证明需要的训练样本是随输入变量的维数成指数增加的,也就是说输入变量每增加一维,所需要的训练样本的个数要在原来的基础上翻几倍,这也就是所谓的“维数灾难”。所以选取这么多输入量明显是不可取的,因为训练样本的规模将无法满足,得到的结果必然会是过拟合的,没有泛化能力,也就没有实用价值。所以变量的维数必须减小,可以通过两个方面减小维数:第一,减少需要数据的天数,将前五日改为前三日或者前两日;第二,减小每天的输入变量,比如去掉最高价,最低价等。我们采用第二种只考虑股票的收盘价和成交量,原因是股票的收盘价最重要,而成交额可以通过成交价和成交量估算出来,所以只用成交量。另外股票一般以五天为一周期即五个工作日,所以采用前五天的每天收盘价和每天的成交量作为输入量。
4.2数据归一化处理
数据的预处理和后处理是有效训练神经网络的很重要的步骤,常见的方法是将原始数据进行归一化处理,即通过一定的线性变换将输入和输出数据统一限制在[0,1]或者[-1,1]区间内。归一化的数据消除了输入量之间的数量级差别,比如股票价格和成交量之间存在很大的数量级差别,若不归一化,在神经网络计算权值和阈值的时候,可能使成交量相关的权值和阈值变得很小,这样在计算机存在舍入误差时很有可能被去掉或者改变,影响到训练后神经网络的性能。
我们可以采用Matlab的代码premnmx,将数据归一化到[-1,1]区间;采用postmnmx代码将归一化后的数据还原。
4.3数据样本分类
样本数据的分类一般是将样本数据分为训练数据和测试数据,训练数据用来训练网络,测试数据用来测试网络的预测能力。这样的话就可以通过测试数据代入训练后的网络,来访真测试数据的输出值,和真实的输出值做比较便可以看出网络的优劣。测试数据和训练数据规模的比例不宜太高,太高的话训练的网络使用的训练数据少,测试数据多,测试结果一般都会很差,这是可想而知的,用少量的数据来表示大量的数据显然是不好的。我们选择样本数据的前4/5做训练样本,后1/5来做测试样本。
4.4网络初始化
网络初始化是给定网络的一些基本参数包括隐层个层数,隐层神经元的个数,还有网络阈值和权值的初始选择,已经训练函数的选择等。这里的参数主要指的是BP神经网络中的隐层层数和隐层神经元的个数。由于单隐层的BP网络可以解决大多数的数据预测问题,理论上也证明了单隐层的BP网络有着很强的插值能力和拟合能力,其可以以任意精度逼近L2函数空间的任意函数。多隐层的BP网络有着某些特殊的用途,在数据预测方面一般的数据输出量和输出量的关系用单隐层BP网络来刻画已经足够了。 关于隐层神经元个数的选取是预测问题中一个很重要的问题,其直接关系到模型结果的好坏。太少的隐层神经元个数会导致得到的结果拟合能力比较差,预测误差较大;太多的隐层神经元会导致模型过拟合,缺乏泛化能力,预测结果难以令人信服。
一般采用交叉验证法来确定隐层神经元数,该方法将数据分为训练数据和验证数据,选取不同的神经元个数利用训练数据训练网络,再将网络用在验证数据上验证,求误差,之后
22
将训练数据和验证数据交换,同样求误差,两次误差求平均。哪种神经元个数对应的误差最小就选择那个神经元。这种方法有一个确点就是要不断的代入不同的神经元个数进行训练,当样本数据较大时,耗时将相当多。当然对于股票数据来说,样本数据的量也不小,这样一次次的训练将会很浪费时间。
我们回想到普通的数据拟合问题当中,当待估计参数的个数较多并很接近训练样本的个数时,将会出现过拟合现象,根本原因是待求参数过多,而样本数据过少,简单的说就是方程组的变量很多,而方程组的个数却很少。这时数据的拟合程度会非常好,而预测能力却非常差,原因是过多的参数,过少的样本会导致每一组样本的作用会变得很大,这样求解方程时将会把每一组样本里的一些误差和个性的东西带入模型当中,而预测数据的误差是随机的,原来的模型就无法应对这些误差了。欠拟合现象刚好相反,即样本数据很多,而模型参数却很少,使得给出的模型对数据的可解释性很差,模型考虑到数据的共性成分很多,而对每组样本数据的个性很少,这样同样使得模型预测能力很差。对于某些样本数据比较规范,规律比较明显有时采用比较少的参数,模型的泛函依然会很强。说以对于模型参数个数的选择不仅依赖于样本数据的多少还依赖于样本数据的分布规律。
那么和BP神经网络中的待求参数是什么呢?答案是网络的权值和阈值,也就是说一个网络中权值和阈值的个数就是该神经网络中待求参数的个数,换句话说一个BP神经网络中的所有权值和阈值都给定了这个网络就给定了。 隐层神经元的个数决定着这些权值和阈值个数。简单的说n的隐层神经元,m个输入量一个输出变量的单隐层前馈网络对应的权值数是(m?n?n)和阈值的个数是(n+1)个,一共是(m?n?2n?1)个,也就是说一共有这么多待求参数,如果假设样本的个数为k个的话,要不过拟合的必要条件是
k?1,这样我们就给了隐层神经元个数的一个上界估m?2k?1计。但仅仅满足这个条件是不够的,一般情况n要不小的多,才能不过拟合。一般来
m?2m?n?2n?1?k,也就是说n?说样本数据规律比较明显,映射关系比较简单所需要的神经元个数也就越少,但股票的量价关系复杂,股价的波动也很难用简单的函数关系表示,所以股票预测问题中神经元个数的选择不会太少。我们可以选择神经元个数在[k?1]之内选取,采用交叉验证法来确定神经
2(m?2)元个数。
可以采用Matlab代码
net=newff(PR,[S1,S2,?,Sn],{TF1,TF2?TFn},BTF) 对神经网络进行初始化配置
其中,PR为R×2维矩阵,表示R维输入矢量中每维输入的最小值和最大值之间的范围;[S1,S2,?,Sn]中各元素分别表示从第一层隐层开始到输出层的各层神经元的数目;{TF1,TF2?TFn}中各元素表示各层神经元采用的传递函数;BTF表示神经网络训练时所用的训练函数;net为生成的BP网络对象。newff生成BP网络的同时即对网络的各层的权值和阀值自动进行了初始化,根据不同的需要,使用者可以对各层网络权值和阀值的初始化函数重新定义。
4.5 训练网络
在BP神经网络生成和初始化以后,即可以利用现有的“输入一输出”样
本矢量数据对网络进行训练。BP网络的训练通常采用train数来完成,在训练之 前有必要对网络训练参数net.trainparam进行适当的设置。设置完训练参数后, 就可以调用train函数对BP网络进行训练。该函数采用动量法和学习速率自适
23
应调整策略训练网络,将动量法和自适应学习速率结合起来,利用两方面的优点, 来优化BP神经网络的训练,返回误差参数。其常用格式如下:
[net,tr]=train(net,P,T)
其中,尸为输入样本矢量集;T为对应的目标样本矢量集:等号左右两侧的 net分别用于表示训练得到和训练以前的神经网络对象;f,存储训练过程中的步 数信息和误差信息,并给出网络误差实时变化曲线。
4.6网络仿真
采用训练数据训练得到网络,可将训练数据和测试数据一起代入网络中得到网络的模拟数据的输出,与实际数据输出做对比,可以观察到网络的预测效果。
利用sim函数对训练以后得到的网络进行仿真,sim函数的常用格式如下: [y,pf,af,e,perf]=sim(net,P,Pi,Ai,T)
其中,输入net为神经网络对象,P为网络输入,Pi为输入延迟的初始状态,Ai 为层延迟的初始状态,T为目标矢量,y为网络输出,ef为训练终止时的输入延
迟状态,af厂为训练终止时的层延迟状态,e为输出和目标矢量之间的误差,perf为网络性能值。
五. 仿真实验
该节以实际的股票数据,采用BP神经网络对数据训练仿真。农业银行2011年10月24日到2013年01月04的股票数据。由于小盘股的波动较大,容易在短期受到不同游资的炒作,股价跌宕起伏,成交量忽大忽小,短期空多头形势变化较快,且太容易收到人为操作股价,所以我们在BP神经网络模型的普适性还不确定的情况下,选择大盘股的股价数据来做实验。
4.1 单日收盘价对单日收盘价预测
首先由最简单的模型开始,我们采用前一日股票收盘价为输入,后一日收盘价为输出。网络模型如下图:
一个输入,一个输出,五个隐层神经元(通过实验比较得到),隐层激活函数为tansig函数,输出层激活函数为线性激活函数purelin。
24
农业银行日收盘价对收盘价的预测图3原始数据拟合数据预测数据 2.92.8股价/元2.72.62.52.42.3 050100150时间/天200250300
上图为实验结果,可以看出训练数据拟合的较好,预测数据大部分也比较好,但是在有些个别点上出现了比较大的误差。
4.2 单日收盘价,成交量对单日收盘价预测
两个输入,一个输出,四个隐层神经元(通过实验比较得到),隐层激活函数为tansig函数,输出层激活函数为线性激活函数purelin。
25