基于BP神经网络的股票预测模型
对于很多人人为,股票预测是一个很难的问题。其实不然,运用今天这种数学工具你可以大概预测出股票的短期走势。因为长期走势受很多因素的影响。
运用MATLAB神经网络工具箱,快速建立BP网络结构。那么你会问什么是神经网络,那么我下面就给大家简单的介绍一下:
人工神经网络就是模拟人思维的第二种方式。这是一个非线性动力学系统,其特色在于信息的分布式存储和并行协同处理。虽然单个神经元的结构极其简单,功能有限,但大量神经元构成的网络系统所能实现的行为却是极其丰富多彩的。
人工神经网络首先要以一定的学习准则进行学习,然后才能工作。现以人工神经网络对手写“A”、“B”两个字母的识别为例进行说明,规定当“A”输入网络时,应该输出“1”,而当输入为“B”时,输出为“0”。
所以网络学习的准则应该是:如果网络作出错误的的判决,则通过网络的学习,应使得网络减少下次犯同样错误的可能性。首先,给网络的各连接权值赋予(0,1)区间内的随机值,将“A”所对应的图象模式输入给网络,网络将输入模式加权求和、与门限比较、再进行非线性运算,得到网络的输出。在此情况下,网络输出为“1”和“0”的概率各为50%,也就是说是完全随机的。这时如果输出为“1”(结果正确),则使连接权值增大,以便使网络再次遇到“A”模式输入时,仍然能作出正确的判断。
如果输出为“0”(即结果错误),则把网络连接权值朝着减小综合输入加权值的方向调整,其目的在于使网络下次再遇到“A”模式输入时,减小犯同样错误的可能性。如此操作调整,当给网络轮番输入若干个手写字母“A”、“B”后,经过网络按以上学习方法进行若干次学习后,网络判断的正确率将大大提高。这说明网络对这两个模式的学习已经获得了成功,它已将这两个模式分布地记忆在网络的各个连接权值上。当网络再次遇到其中任何一个模式时,能够作出迅速、准确的判断和识别。一般说来,网络中所含的神经元个数越多,则它能记忆、识别的模式也就越多。
如图所示拓扑结构的单隐层前馈网络,一般称为三层前馈网或三层感知器,即:输入层、中间层(也称隐层)和输出层。它的特点是:各层神经元仅与相邻层神经元之间相互全连接,同层内神经元之间无连接,各层神经元之间无反馈连接,构成具有层次结构的前馈型神经网络系统。单计算层前馈神经网络只能求解线性可分问题,能够求解非线性问题的网络必须是具有隐层的多层神经网络。
BP神经网络结构
言归正传,那么接下来就看看我对运用神经网络对股票的预测模型吧。以前五日的交易数据,作为输入,预测明天的股票价格。
mtlab代码:
%bp.m
%处理数据
clear
close all
echo on %窗口响应执行过程
clc
pause
a=xlsread('learn.xls',1,'A2:A301');%样本时间序号
a1=xlsread('learn.xls',1,'A7:A301');%预测时间序号
b=xlsread('learn.xls',1,'C2:C301');%读取指数
for i=1:1:295
y(i)=b(i+5);%理想输出
end
for i=1:1:295
for j=1:1:5
x(j,i)=b(i+j-1);%输入
end
end
a
x %以前五日预测明天的大盘指数的输入矩阵
y %理想的输出
%pause
[xn,minx,maxx,yn,miny,maxy]=premnmx(x,y) %数据归一化处理
xn
yn
%pause
tic;
%建立神经网络
net=newff(minmax(xn),[11,1],{'tansig','purelin'},'trainlm');
net.trainparam.show=50; %显示迭代过程
net.trainparam.lr=0.5; %学习率
net.trainparam.epochs=1000; %最大训练次数
net.trainparam.goal=1e-3; %训练要求精度
net.trainparam.mc=0; %动量因子
[net,tr]=train(net ,xn,yn); %训练bp网络
t = toc;
t
pause
inputWeights=net.iw{1,1} %输入层权值
inputbias=net.b{1} %输入层阈值
layerWeights=net.lw{2,1} %输出层权值
layerbias=net.b{2} %输出层阈值
%对网络仿真预测
On = sim (net ,xn);
E=On-yn %计算误差
M=sse(E)
N=mse(E)
%pause
a2=postmnmx(On,miny,maxy)
plot(a1,xn)
title('归一化处理后的样本','FontSize',12);
xlabel('统计时间2014.9.6-2015.11.10','FontSize',10);
ylabel('归一化后的上证指数','FontSize',10);
figure;
plot(a1,yn)
plot(a,b,'*');
title('上证指数预测收盘价格','FontSize',12);
xlabel('统计时间2014.9.1-2015.11.10','FontSize',10);
ylabel('上证指数','FontSize',10);
hold on
plot(a1,a2,'r+');
legend('实际值','r预测值');
echo off
pause
clc