一、项目简介
股票预测是金融领域中的重要问题,通过对历史股票数据的分析和建模,我们可以尝试预测未来股票的价格趋势,为投资决策提供参考。本项目是基于PyTorch深度学习框架实现一个使用2D卷积神经网络(2DCNN)来进行股票预测的项目,该网络可以有效地处理时间序列数据,通过卷积层和提取输入序列中的特征,并通过全连接层进行预测。网络的输入是历史股票开盘价、收盘价、最高价、最低价、成交量指标、百分比变化量(多特征),输出是预测下一天的股票收盘价。【本项目的代码文件分模块整理,包含模型构建、数据划分、训练过程等模块都清晰分明】
二、实验数据集
实验采用的是深沪300数据集sh300.csv(后文有源码和数据集获取方式),这是公开的数据集,百度一下应该也可以找得到,数据集展示如下(所展示的数据是本人删掉某些列的数据,即sh300_test.csv),实验只使用了红框中的数据特征作为输入特征进行预测。
数据划分:以滑窗的方式进行数据划分,滑窗大小为20,输入特征为6,每次滑窗的第21天的收盘价为预测的标签值。
三、实验环境
平台:Window 11
语言:python3.9
编译器:Pycharm
框架:Pytorch:1.13.1
四、实验内容及部分代码展示
1、model_2DCNN.py 模型构建
model_2DCNN.py定义了项目用到的网络模型,本项目用到的模型是三层的二维卷积网络,使用relu激活,最后使用两层全连接层输出预测结果。
每层网络的输出结果为:
2、train.py 训练通用模板
训练过程集成到fit函数里面,包含测试集训练过程和验证集计算过程,是项目训练过程的通用代码,其他项目也可以在它的基础上修改后使用。
3、Config.py 参数定义
config中定义了项目所有需要的参数,可以在里面修改训练参数。其中可以看到三个卷积层的输出通道为[16,32,64]。根据实现效果调试[16,32,64]的训练效果比[32,64,128]要好很多,原因可能是数据集比较简单,通道数设置少一些就可以提取出不错的特征。
4、DataSplit.py 数据划分
DataSplit.py 是实现数据划分的函数,通过滑动窗口,将每个窗口大小的六个特征数据作为训练数据,将滑窗后面一个收盘价的数据作为预测结果并制作成标签,最后再进行划分训练数据和标签,最后分成训练集和验证集。
5、test_stock_2DCNN_run.py 训练文件
该py文件实现整体训练流程并做绘图操作。依次实现加载数据、数据标准化、取出WIND数据、划分训练集测试集、数据转化为Tensor、形成数据更迭器、载入模型、定义损失、定义优化器、开始训练、损失可视化、显示预测结果。
6、test_pth.py 模型训练后的测试文件
采用模型训练完成后产生的的pth参数文件对测试数据进行预测,可以展示模型预测效果,前面的处理过程类似test_stock_2DCNN_run.py所示。
7、loss_draw.py 模型训练后的测试文件
将训练产生并收集的loss.csv展示出来,也就是损失图,红框处可调展示范围。
五、实验结果及分析
1、loss损失图
训练了200个epoch的损失图:
纵坐标局部范围展示(0-0.0002):左图是上一篇文章写的1DCNN单特征实现的股票预测,右图是上述loss图的y轴局部放大展示,明显本篇模型的loss值比上一篇文章的低,也就是说多特征2DCNN的预测效果比单特征1DCNN的效果要好。
2、预测效果展示
训练epoch=200后的股票收盘价预测效果如下(使用pth文件进行预测):其中,蓝色为预测曲线,红色为真实曲线,显然,预测基本相近,该模型对股价预测的效果不错,可以翻到上一篇的文章看一下单特征1DCNN的效果,明显要比这个差很多。
局部展示(展示前两百天的预测效果):局部展示的效果也算是不错的
六、总结及资源
若有朋友需要可运行的源码和数据集,可以guan注【科研小条】公众号,回复【股票预测2dcnn】,即可获得。