神经网络训练过程
预测后通过交易的模拟曲线和盈利状况
代码如下
% 神经网络预测股指走势
% Written by Phillip Wan
% Email:[email protected]
%% 准备工作
tic;
clear;
clc;
close all;
format compact;
w=windmatlab;
%% 导入数据
[w_wsi_data,w_wsi_codes,w_wsi_fields,w_wsi_times,w_wsi_errorid,w_wsi_reqid]=w.wsi('IF00.CFE','close,open,high,low,volume','2013-02-06 09:00:00','2013-04-06 16:09:58','PriceAdj=F');
%% 处理数据转置
close0=w_wsi_data(:,1)';
open0=w_wsi_data(:,2)';
high0=w_wsi_data(:,3)';
low0=w_wsi_data(:,4)';
vol0=w_wsi_data(:,5)';
%% 初始化变量
num=1; %初始项
endNum=300; %后endNum项不适用作为测试
no_use=0; %最后若干项不使用
% 输入项
v0=[close0(num:end-endNum);open0(num:end-endNum);high0(num:end-endNum);low0(num:end-endNum);vol0(num:end-endNum)];
% 输出项
p0=[close0(num+1:end-endNum+1)];
% 输入输出归一化
[v,vps]=mapminmax(v0);
[p,pps]=mapminmax(p0);
%% 建立网络
net=feedforwardnet([4,3]);
% 训练参数
net.trainParam.epochs=9000;
net.trainParam.goal=0.0002;
%% 开始训练
[net,tr]=train(net,v,p);
%% 存储训练好的神经网络
save net01 net;
load('net01.mat');
%% 使用网络
v_test0=[close0(end-endNum:end-no_use-1);open0(end-endNum:end-no_use-1);high0(end-endNum:end-no_use-1);low0(end-endNum:end-no_use-1);vol0(end-endNum:end-no_use-1)];
p_test=[close0(end-endNum+1:end-no_use)]; %实际结果
close_pre=[close0(end-endNum:end-no_use-1)]; %之前的收盘价
% 测试数据归一化
[v_test,v_testps]=mapminmax('apply',v_test0,vps);
result0=sim(net,v_test);
% 测试结果,反归一化
result=mapminmax('reverse',result0,pps);
%% 误差
error=result-p_test;
%% 详细盈亏
lg=length(close_pre);
windata=zeros(1,lg);
windata(1,1)=0;
winnum=0;
for i=2:lg
win=0; %盈亏钱数
if(result(1,i)>=close_pre(1,i-1))
win=p_test(1,i)-close_pre(1,i-1);
else
win=close_pre(1,i-1)-p_test(1,i);
end
if(win>=0)
winnum=winnum+1;
end
windata(1,i)=win+windata(1,i-1);
end
%c 成功率
win_rate=winnum/lg
%% 计算回撤
backratio=zeros(1,lg);
for m=1:lg
c=max(windata(1:m));
backratio(1,m)=(windata(1,m)-c)/c;
end
%% 作图
figure;
subplot(3,1,1);
plot(p_test);
hold on;
grid on;
plot(result,'g');
grid on;
legend('IF00','神经网络');
title('神经网络模拟曲线')
subplot(3,1,2);
plot(windata);
grid on;
title('资金盈利');
subplot(3,1,3);
plot(backratio);
grid on;
title('最大回撤');