目录
💥1 概述
📚2 运行结果
🎉3 参考文献
👨💻4 Matlab代码
💥1 概述
时间序列预测有很多方法,如传统的时序建模方法ARIMA、周期因子法、深度学习网络等,本次实验采用最简单的卷积神经网络进行训练。对于用CNN处理时序数据,通常使用一维卷积网络Conv1d。
随着我国资本市场的快速发展和居民收入水平的逐步提升,股票市场吸引了越来越多的投资者参与其中,特别是在2020年新冠疫情影响下,为提振经济实行的较为宽松的货币政策令股票市场表现不俗,股市吸引了大量新增投资者。数据显示,截至2020年12月,中国A股投资者共计1.77亿户,户均市值达到45万,全年新增投资者1802.11万户,同比增加了36.02%。股市的参与人数众多说明市场交易活跃,但是,个人投资者在交易中存在非理性投机倾向,盲目地追涨杀跌不利于股票市场的健康发展。倘若能够利用技术手段对股票价格走势进行预测,同时为投资者提供投资参考建议,那么此举将会促进资本市场的良性发展并提升投资者的收益水平,具有较强的理论和现实意义。本文在股票价格趋势预测中引入深度学习神经网络算法,使用CNN进行股价预测。
从结果来看,使用CNN来处理时间序列数据产生的预测值总体来说还行,但与真实值存在一定出入。对于股票来说,影响股价波动因素繁多,单单从历史股价进行预测未来股价是不足够的,这也符合弱式有效市场假说,即技术分析失败;另一方面,本次实验采用的网络结构较简单,采用更强大的网络进行回归预测任务则会得到更好的效果。
📚2 运行结果
主函数部分代码:
%% 清除工作空间中的变量和图形
clear,clc
close all
%% 1.加载337期上证指数开盘价格
load elm_stock
whos
rng(now)
price=price(:);
train_num=280;
price1=price(1:train_num); %前280个数据为训练组
price2=price(train_num+1:337); %后面的数据为测试组
x=price1';
%[x,ps]=mapminmax(x,0,1); %归一化处理,可自行添加或不加
lag=6; % 自回归阶数
iinput=x; % x为原始序列(行向量)
n=length(iinput);
%准备输入和输出数据
inputs=zeros(n-lag,lag);
for i=1:n-lag
inputs(i,:)=iinput(i:i+lag-1)';
end
targets=x(lag+1:end);
%创建网络
P=inputs;
P=P';
T=targets;
net=newff(minmax(P),[10,1],{'logsig','purelin'},'trainlm');
inputWeights=net.IW{1,1} ;
inputbias=net.b{1};
layerWeights=net.LW{2,1} ;
layerbias=net.b{2,1} ;
% 避免过拟合,划分训练,测试和验
net.trainParam.show = 50;
net.trainParam.lr = 0.1;
net.trainParam.mc = 0.04;
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-5;
%训练网络
[net,tr] = train(net,P,T);
%% 根据图表判断拟合好坏
yn=net(P);
errors=T-yn;
figure(1)
plot(T,'b-');
hold on
plot(yn,'r--')
legend('股价真实值','BP网络输出值')
title('训练数据的测试结果');
% 显示均方误差
mse1 = mse(errors);
fprintf(' mse = \n %f\n', mse1)
figure(2)
title('训练数据测试结果的残差')
% 显示相对误差
disp(' 相对误差:')
fprintf('%f ', (T - yn)./T );
fprintf('\n')
%% 预测
% 2.显示测试数据的测试结果
%预测
fn=57; %预测步数为fn。
f_in=iinput(n-lag+1:end)';
f_out=zeros(1,fn); %预测输出
% 多步预测时,用下面的循环将网络
for i=1:fn
f_out(i)=net(f_in);
f_in=[f_in(2:end);f_out(i)];
end
figure(3)
% 显示真实值
x2=1:length(price2');
plot(price2,'b-');
hold on
% 显示神经网络的输出值
plot(f_out,'r--')
legend('initial data','prediction result');
title('BP prediction');
hold off
grid on
% 显示残差
figure(4)
errors2=price2'-f_out;
mse2=mse(errors2);
plot(mse2)
title('测试数据测试结果的残差')
% 显示均方误差
mse2 = mse(errors2);
fprintf(' mse = \n %f\n', mse2)
% 显示相对误差
disp(' 相对误差:')
fprintf('%f ', errors2./price2' );
fprintf('\n')
🎉3 参考文献
[1]李晨阳. 基于CNN-LSTM的股票价格预测及量化选股研究[D].西北大学,2021.DOI:10.27405/d.cnki.gxbdu.2021.001928.