时间序列预测--基于CNN的股价预测(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥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)

% 显示真实值

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]李晨阳. 基于CNN-LSTM的股票价格预测及量化选股研究[D].西北大学,2021.DOI:10.27405/d.cnki.gxbdu.2021.001928.

🌈4 Matlab代码实现

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: CNN-LSTM是一种结合卷积神经网络和长短时记忆网络的模型,用于时间序列预测。在MATLAB中,可以通过代码实现CNN-LSTM模型进行时间序列预测。 首先,需要准备训练数据和测试数据。训练数据应该是已知的时间序列数据,而测试数据则是需要进行预测的数据。这两组数据应该分别存储在不同的文件中。 接着,导入MATLAB中的Deep Learning Toolbox工具包,使用其中的CNN和LSTM函数实现CNN-LSTM模型。可以根据实际需求选择不同的参数进行配置,比如CNN中卷积核的大小和数量、LSTM中记忆单元的数量等。然后将训练数据和测试数据分别输入CNN-LSTM模型进行训练和预测。 在训练过程中,可以通过迭代次数和训练误差来监控CNN-LSTM模型的表现。在预测过程中,可以将预测结果和真实结果进行比较,评估模型的准确性。 总之,通过MATLAB中的代码实现CNN-LSTM时间序列预测,可以方便地对时间序列数据进行预测,为实际应用中的决策提供支持。 ### 回答2: CNN-LSTM模型是一种用于时序预测的深度神经网络。它结合了卷积神经网络CNN)和长短期记忆网络(LSTM),可以用于处理带有时间序列数据的复杂预测任务。 下面是基于MATLAB实现CNN-LSTM时间序列预测代码: 1.数据准备: load traffic_data.mat train_data = traffic(train_ind,:); test_data = traffic(test_ind,:); train_x = train_data(:,1:end-1); %训练样本 train_y = train_data(:,end); %训练标签 test_x = test_data(:,1:end-1); %测试样本 test_y = test_data(:,end); %测试标签 train_x = reshape(train_x,[size(train_x,1),24,21]); %输入数据转换为3D数组 test_x = reshape(test_x,[size(test_x,1),24,21]); 2.设置CNN-LSTM网络: input_size = [24,21,1]; layers = [ ... sequenceInputLayer(input_size) convolution2dLayer([3,3],6,'Padding','same') maxPooling2dLayer([2,2],'Stride',2) reluLayer convolution2dLayer([3,3],12,'Padding','same') maxPooling2dLayer([2,2],'Stride',2) lstmLayer(64,'OutputMode','sequence') fullyConnectedLayer(1) regressionLayer]; 3.训练和测试: options = trainingOptions('adam', ... 'MaxEpochs',100, ... 'MiniBatchSize',64, ... 'GradientThreshold',1, ... 'InitialLearnRate',0.01, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.2, ... 'LearnRateDropPeriod',50, ... 'Verbose',0, ... 'Plots','training-progress'); net = trainNetwork(train_x,train_y,layers,options); %训练网络 ypred = predict(net,test_x); %测试网络 4.评估模型表现: MSE = mean((test_y-ypred).^2); %均方误差 RMSE = sqrt(MSE); %均方根误差 R = corrcoef(test_y,ypred); %相关系数 R = R(1,2); 通过以上步骤,我们可以实现CNN-LSTM时间序列预测,并对模型表现进行评估。值得注意的是,该模型仅作为示例代码,实际应用中可能需要进行更多的调参和优化才能获得更好的效果。 ### 回答3: cnn-lstm 时间序列预测是一种利用深度学习模型进行时间序列预测的方法,它结合了卷积神经网络CNN)和长短时记忆网络(LSTM)的优势,可以有效地处理时间序列数据中的长期依赖和非线性关系。 Matlab是一种功能强大的数学软件,它可以方便地实现cnn-lstm模型,并且提供了许多用于时间序列预测的工具和函数。 下面是cnn-lstm时间序列预测matlab代码实现步骤: 1. 数据预处理:通过matlab中的数据处理工具将时间序列数据进行归一化、平滑处理等,以便更好地适应模型的训练和预测过程。 2. 构建模型:利用matlab中的深度学习工具箱,构建cnn-lstm模型。其中,卷积层用于提取数据的特征,LSTM层用于在时间序列数据中捕获长期依赖关系。 3. 模型训练:将预处理好的数据输入到模型中,利用matlab中的SGD算法进行模型训练,调整模型的参数,使其最大化预测准确率。 4. 预测结果:模型训练完成后,将测试数据输入到模型中进行预测,得到时间序列的预测结果。可以通过matlab中的绘图工具将预测结果与真实值进行比较,评估模型的预测效果。 总结来说,利用matlab实现cnn-lstm时间序列预测,可以大大简化模型的搭建和训练过程,减少繁琐的代码编写。但是需要注意的是,模型的参数选择和数据预处理对于预测效果有很大的影响,在实际应用中需要进行多次试验和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值