Python的期末大作业,需求如题,自己花了不少心思做的,记录一下
本项目需要实现以下三个功能:
从指定财经网站上随机爬取若干A股名称以及GP代码
对爬取到的GP代码进行处理之后,从财经网站上下载该GP从创建以来至今的GP信息,包括日期、GP代码、名称、收盘价、最高价、最低价、开盘价、前收盘、涨跌额、涨跌幅、换手率、成交量、成交金额、总市值、流通市值
对选定的GP用LSTM神经网络模型进行预测,并将预测结果可视化。
- 程序设计思路与流程图
- 程序设计思路
本项目的模块的独立性较强,故按照实现功能将该大项目分成两个小项目来做,第一部分为网络爬虫,即利用python自带的库进行数据下载。第二部分为预测部分,利用python自带算法库进行LSTM的模型建立,并用爬取到的数据进行训练以及预测。
-
- 模块功能及流程图
- Get-stock-num模块
- 模块功能及流程图
该模块利用requests库实现简便网页爬取,用csv库创建csv文件保存数据进行下一步处理。、
-
-
- Get-history-value模块
-
该模块通过lxml与Request,从一个web页面中抓取了所有想要的数据,将它们以列表的形式存在内存中,在这一步利用正则表达式获取GP的代码、创立时间以及到程序运行的日期,利用这三个数据对网页下载接口操作,下载历史数据。
-
-
- Stock-pred模块
-
本模块运用keras构建神经网络,同时导入相应的数学处理包进行数据预处理。理论上,GP价格是可以预测的,但是影响GP价格的因素有很多,而且目前为止,它们对GP的影响还不能清晰定义。这是因为GP预测是高度非线性的,这就要预测模型要能够处理非线性问题,并且,GP具有时间序列的特性,因此适合用循环神经网络,对GP进行预测。
虽然循环神经网络(RNN),允许信息的持久化,然而,一般的RNN模型对具备长记忆性的时间序列数据刻画能力较弱,在时间序列过长的时候,因为存在梯度消散和梯度爆炸现象RNN训练变得非常困难。Hochreiter 和 Schmidhuber 提出的长短期记忆( Long Short-Term Memory,LSTM)模型在RNN结构的基础上进行了改造,从而解决了RNN模型无法刻画时间序列长记忆性的问题,LSTM模型数学原理较为复杂,在这里不做赘述
。
本项目是基于pycharm的开发环境,具有便捷调试与编写的好处,同时具有相当便捷的Debug界面。对网络爬虫部分,只需运行相应的程序即可获得数据。需要注意的是,如果想获得更多的GP信息需要将下图page变量范围做出相应的修改进行遍历即可。
预测模块,将要预测的GP数据放入项目文件中后,以收盘价为例,在下图位置处添加标号,直接运行程序即可自动进行模型构建预测并画图。
- 结果分析
- 网络爬虫模块运行结果
本模块数据爬取结果运行成功,结果如下图,初始爬取的GP代码以及名称如下:
这里GP代码有前缀SH,表明属于沪市(0),在进行下一步数据爬取时,需要删除前缀,并且在网址部分设置code=0进行下载主数据,如下图:
爬取到的GP以GP代码命名并保存为csv文件,结果如下图:
其中任意一份结果如下:
预测部分由于能力有限,需要先对需要预测的部分进行数据预处理,具体以600884即彬彬股份预测为例,首先先将2012年以前的数据删除掉,这里使用pandas模块。选定以收盘价为例进行预测,预测结果如下:
结果分析:从图上可以看出,预测结果与实际结果的变化趋势相近,在具体数值上有微小的差异,而且再次运行程序预测结果会变化,表面了模型训练的效果是有差异的。
下图为对其他指标进行预测,只需按照使用手册改变索引即可
结果分析:以上三图看起来一样,但是在调试的时候查看内存后,改变索引之后确实改变了训练数据,所以理论上来说是理想的预测结果,至于相似的原因,我在观察爬取到的数据之后发现,这四个指标互相之间的变化不大,例如开盘价和收盘价之间的变化非常小。所以预测结果是符合预期的。