股票预测之BP神经网络
股票预测的算法有很多,可以用数学的卡尔曼滤波,粒子滤波、马尔科夫、神经网络......
这其中涉及到很多因素,比如说,你用的特征,你选择的范围(针对个股还是多股、历史时间范围、分析周期等等)。小编自身对股票了解不深,仅仅是从数据的角度分析。(有点想的太简单了O(∩_∩)O)
先从简单的入手:简单的算法:BP神经网络; 简单的范围:个股、每日线、5个特征:开盘、最高、最低、收盘、涨幅。个股数据量大概有2000个。
当然,这个过程和普通的BP没什么两样,也是输入数据,训练、测试这么一个过程,主要是看BP是否真的适合用来做预测。虽然有点简单,不过还是简单的描述一下吧。
数据从哪里来?这里我是用了同花顺这个软件,然后选一个股,按照 分析——>k线图——>按F1——>进入历史行情数据。点击右键——>导出数据——>下一步......这样就可以得到连续的历史数据表。接下来就是读出数据,进行训练和预测了。
首先,这里选用其中的5个特征:{开盘、最高、最低、收盘、涨幅}。这里用前一天的这样一个特征向量来预测下一个交易日(时刻)的收盘。也就是说,输入是这5维特征,输出是下一时刻的收盘。
有了这些数据,有确定了输入和输出,那就直接创建BP来训练。参数大多是默认的,隐层的转移函数选择sigmoid函数,其他参数可依据需要一步一步调整。这里选择前面1500个作为训练,后面的200个作为测试样本,训练过程并不快,主要是梯度的阈值设的太低,迭代次数有点高、机器的性能也一般(⊙o⊙)…好了,是不是很期待测试结果(*^__^*) ……
总体的预测和跟随效果还行,但是局部分析起来还是有很多不足,容易剧烈跳动,总体普遍偏小,在这边很关键的一点要指出,训练的数据的覆盖范围要尽可能大,如果你的测试数据不再训练的RANGE里面,很可能跑偏,甚至是一条直线。哪怕是你用头尾两端数据来训练,效果都比用一大段数据而没有覆盖后面或前面的数据来的好。在初次训练时候,由于有些参数是随机初始化的,又因为BP容易陷入局部极小值,所以有可能会一下子就收敛,结果是一条直线%>_<%。好了,股票预测比较简单的方法之BP就介绍到这里了。对了,不放代码是不是有点不厚道?_?。尽管代码很简单.....
data=xlsread('路径.xls');
PP=data';
PQ=[0; 0; 0; 0 ;0];
P=zeros(5,1500); %输入矩阵
T=zeros(1,1500); %输出
for i=1:1500 %输入输出赋值
PQ=PP(:,i);
P(:,i)=PQ;
T(i)=PP(4,i+1);
end
% 创建一个新的前向神经网络
net_1=newff(minmax(P),[30,1],{'tansig','purelin'},'traingdm')
% 当前输入层权值和阈值
inputWeights=net_1.IW{1,1};
inputbias=net_1.b{1};
% 当前网络层权值和阈值
layerWeights=net_1.LW{1,1};
layerbias=net_1.b{1};
% 设置训练参数
net_1.trainParam.show = 50;
net_1.trainParam.lr = 0.005;
net_1.trainParam.mc = 0.9;
net_1.trainParam.epochs = 10000;
net_1.trainParam.goal = 1e-3;
% 调用 TRAINGDM 算法训练 BP 网络
[net_1,tr]=train(net_1,P,T);
% 对 BP 网络进行仿真
A = sim(net_1,P);
% 计算仿真误差
E = T - A;
MSE=mse(E)
%--------------------------测试数据-----------------------------%
x=InputA(1501:1700); %测试数据
x=zeros(5,200);
for j=201:400
x(:,(j-200))=PP(:,j);
end
YY=sim(net_1,x) %用神经网络测试
XX=[1:length(x)];
plot(XX,YY,'-O'); %画出结果
hold on;
plot(XX,PP(4,1502:1701),'r-O'); %真实结果
PP=data';
PQ=[0; 0; 0; 0 ;0];
P=zeros(5,1500); %输入矩阵
T=zeros(1,1500); %输出
for i=1:1500 %输入输出赋值
PQ=PP(:,i);
P(:,i)=PQ;
T(i)=PP(4,i+1);
end
% 创建一个新的前向神经网络
net_1=newff(minmax(P),[30,1],{'tansig','purelin'},'traingdm')
% 当前输入层权值和阈值
inputWeights=net_1.IW{1,1};
inputbias=net_1.b{1};
% 当前网络层权值和阈值
layerWeights=net_1.LW{1,1};
layerbias=net_1.b{1};
% 设置训练参数
net_1.trainParam.show = 50;
net_1.trainParam.lr = 0.005;
net_1.trainParam.mc = 0.9;
net_1.trainParam.epochs = 10000;
net_1.trainParam.goal = 1e-3;
% 调用 TRAINGDM 算法训练 BP 网络
[net_1,tr]=train(net_1,P,T);
% 对 BP 网络进行仿真
A = sim(net_1,P);
% 计算仿真误差
E = T - A;
MSE=mse(E)
%--------------------------测试数据-----------------------------%
x=InputA(1501:1700); %测试数据
x=zeros(5,200);
for j=201:400
x(:,(j-200))=PP(:,j);
end
YY=sim(net_1,x) %用神经网络测试
XX=[1:length(x)];
plot(XX,YY,'-O'); %画出结果
hold on;
plot(XX,PP(4,1502:1701),'r-O'); %真实结果