曾武序 钱文彬 王映龙 杨文姬 柳军
摘 要: 股票预测可以辅助投资者进行正确的金融投资,本文使用Python语言开发网页爬虫爬取真实的股票数据,首先通过requests库获取网页数据,使用BeautifulSoup库解析静态html页面,并通过查找标签获取股票数据,然后对数据进行解析,用xlwt库将数据存入excel文件,并对数据归一化处理,最后,在三层BP神经网络中根据批量梯度下降法调整隐含层结点个数,以获取相对更优的连接权值和阈值,从而对股票的涨跌做出预测,为投资者的投资行为提供参考。
关键词: Python; 网络爬虫; BP神经网络; 股票预测
中图分类号:TP183 文献标志码:A 文章编号:1006-8228(2018)06-72-04
A stock forecasting method based on Python and BP neural network
Zeng Wuxu1, Qian Wenbin1, Wang Yinglong2, Yang Wenji1, Liu Jun2
(1. School of Software, Jiangxi Agricultural University, Nanchang, Jiangxi 330045, China;
2. School of computer and information engineering, Jiangxi Agricultural University)
Abstract: Stock predictions can help investors to make the right financial investment. This article uses Python language to develop web crawlers to crawl real stock data. The web page data is obtained from the requests library first, the static html page is analyzed using the BeautifulSoup library, and the stock data is obtained through searching the tags. Then the data is analyzed, the data is stored in excel file by xlwt library, and the data is normalized. Finally, the number of hidden layer nodes is adjusted according to the batch gradient descent method in the three-layer BP neural network to obtain relatively better connection weights and thresholds, so as to predict the ups and downs of stocks and provide reference for investors' investment behavior.
Key words: Python; Web crawler; BP neural network; stock prediction
0 引言
人工神经网络(Artificial Neural Network)即神经网络,是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应[1]。神经细胞接收信息以及处理信息的过程用“线性加权”和“函数映射”来模拟,网络结构和权值调整用优化学习算法实现。这种人工神经网络虽然不能和生物神经网络等价,但在某些方面已经取得了优越的性能[2]。
随着经济的发展,股票市场吸引了众多投资者,如何通过已有的数据来预测股价,从而规避风险,获得更高的收益,是众多投资者所关注的。Lei Lei将粗糙集和小波神经相结合对股票指数进行预测[3];张晶华等人用支持向量机对上证指数进行预测研究[4];李晓青将灰度模型应用于股票预测[5];郝博乾將时间序列应用于股票预测[6];董理等人结合文本分析对股票指数进行预测[7]。影响股票的因素有很多,其中的规律很难被直接观察到,本文使用Python语言,编写网络爬虫爬取真实的股票数据,然后结合三层BP神经网络对个股的涨跌情况作预测。
1 基于Python的网络爬虫
网络爬虫是一种能自动抓取网页并提取网页内容的程序,是搜索引擎的信息获取渠道[8]。它能模仿浏览器访问网络资源,并自动提取所需要的信息[9-10],本文使用Python语言在Python3.6环境下实现了一个针对特定数据的主题爬虫[11-12]。
1.1 确定目标数据
爬取的目标网站为东方财富网(http://www.eastmoney.com/),网站的robots协议[13]允许爬虫爬取该网站所有链接。目标数据为深股通十大成交榜,如图1。目标网页URL[14]为http://data.eastmoney.com/hsgt/top10.html,能通过该网页查看最新的交易日的数据,也可以通过选择日期的方式来查看历史数据。根据历史数据可以分析出历史数据的请求URL均为”http://data.eastmoney.com/hsgt/top10”+日期字符串+”.html”的格式。使用chrome浏览器的开发者工具对目标网页进行分析,通过Elements选项卡查看目标数据可以发现,目标数据均在具有属性名为onmouseover、属性值为this.className='over'的tr标签中,页面中含有多个该种标签,目标数据位于第11个至第20个标签。
1.2 网络爬虫实现
根据URL格式:“http://data.eastmoney.com/hsgt/top10”+日期字符串+“.html”构造目标URL;运用requests库中的get方法向服务器发送get请求获取目标网页;结合re库和BeautifulSoup库解析网页中的数据[15],找出具有属性名为onmouseover,属性值为this.className='over'的所有tr标签,并放在列表中;最后将列表中的一系列数据通过Sheet对象的write方法写入到excel表中进行持久化存储。最终excel中的部分数据如图2所示;在其中筛选出美的集团的数据。
2 BP神经网络
BP(Back Propagation)神经网络,即误差向后传播神经网络,也是一种前馈神经网络,前馈体现为:在BP神经网络中,信息由输入层至隐含层到输出层向前传播;误差反向传播体现为:在计算出实际输出和期望输出的误差之后,誤差逐层由输出层向隐含层、输入层传播,并通过误差调整相应的连接权值及阈值。本文使用三层BP神经网络来预测个股的涨跌情况。
2.1 三层BP神经网络的结构
如图3所示,设输入层有I个结点,隐含层有J个结点,输出层有K个结点,对给定训练集D={(Xi,Yi)|i=1,2,3,…,N},N为训练样本个数;(Xi,Yi)为第个训练样本;Xi={xi|i=0,1,…,I-1}为第i个训练样本中的I维输入向量;Yi={yi|i=0,1,…,K-1}为第i个训练样本中的维期望输出向量;wij表示输入层第j个结点和隐含层第个结点间的权值;vjk表示隐含层第j个结点和输出层第 个结点间的权值;θj,θk分别表示隐含层第个结点和输出层第个结点的阈值。
2.2 BP算法
BP神经网络算法主要分为两个阶段。①正向传播阶段:信息从输入层经隐含层传递到输出层再输出,依次计算出各个结点的输出值。②误差反向传播阶段:误差逐层从输出层反向传递至隐含层、输入层,依次计算出各个结点的误差,并用此误差修正相应的权值和阈值,误差达到最小时,BP神经网络趋于稳定。
2.2.1 正向传播阶段
神经网络的输入信息为I维向量Xi={xi|i=0,1,…,I-1},输入层不作任何处理,对应输入层结点的输入/输出关系为:
隐含层结点和输出层结点使用sigmoid函数作为激活函数对信息进行处理,经过输入层信息传播至隐含层,对应隐含层结点j的输入输出关系为:
同理,对应输出层结点k的输入输出关系为:
2.2.2 误差反向传播阶段
假设神经网络的期望输出为,其中用均方误差MSE来衡量神经网络的误差,第m个样本的误差:
样本集总误差:
通过调整神经元之间的连接权值和神经元的阈值使误差达到最小。根据梯度下降法调整连接权值和阈值,用链式求导法则计算连接权值和阈值的修正量:
,η为学习步长
令
根据sigmoid函数的性质:
f'(x)=f(x)(1-f(x))
可得
f'(Ik-θk)=f(Ik-θk)(1-f(Ik-θk))=Ok(1-Ok)
Y=(Ok-dk)Ok(1-Ok)
又有,所以
同理可得,,
其中
3 实验分析
3.1 神经网络数据选取及处理
影响股票市场的因素有很多,考虑到股票市场的不确定性,为了避免人为操纵等不可控因素,本文选择选取港股通2017年美的集团的交易数据,美的集团在家电行业中总市值最高,过去一年的数据波动也并不大(涨跌幅最大均在5%左右),在已经获取的240天的深股通十大成交榜数据中,美的集团有238条记录,缺失两次,缺失值通过查询具体数据手工填充。
神经网络的输入为收盘价,涨跌幅,净买额(买入金额-卖出金额),买入金额,卖出金额,成交金额,输出为对股票下一个交易日的涨跌预测。根据公式[16]对数据进行归一化处理,X'为处理之后的数据,X为原数据,Xmin为原数据中对应属性的最小值,Xmax为原数据中对应属性的最大值。
3.2 隐层结点个数的选取
在神经网络中学习步长根据经验取0.5,神经网络的所有连接权值和阈值初始化为0-1之间的随机数,根据批量梯度下降法[17]来调整神经网络的连接权值和阈值,本文使用十则交叉验证[1]衡量BP神经网络性能,评价指标有预测精度accuracy和方差variance。实验得出的预测精度如图4所示,方差如图5所示。
图4中横坐标为隐层结点个数,纵坐标为预测精度,当隐层结点个数为21及以上时,平均预测精度为58.5714%,预测精度最大为71.4286%,最小为42.8571%。图5中横坐标为隐层结点个数,纵坐标为实验方差,当隐层结点个数为21及以上时,数据相对比较集中,方差为0.007279,根据实验结果,本文选取21作为隐层结点个数以便减少运算时间,同时提高预测精度。
3.3 权重及阈值更新方法的选择
在神经网络训练的过程中,根据梯度下降法调整权值和阈值使得网络趋于稳定。根据误差函数衡量的样本个数可将权值及阈值的更新方法分为随机梯度下降法[3]和批量梯度下降法。随机梯度下降法根据单个样本的误差调整神经网络的连接权值和阈值,批量梯度下降法根据训练样本集的总误差调整神经网络的连接权值和阈值,随机梯度下降法速度更快,但是容易陷入局部极小值,批量梯度下降法速度更慢。本文根据实验选择更优的连接权值及阈值的更新方法。实验结果数据如图所示。
和随机梯度下降法精度比较
数据的预测精度如图6所示,横坐标为隐层结点个数,纵坐标为预测精度。从图6能够看出,本例中批量梯度下降法的预测精度总体上要优于随机梯度下降法。耗时情况如图7所示,横坐标为隐层结点个数,纵坐标为时间,从图7能够看出,本例中批量梯度下降法的耗时远远小于随机梯度下降法。根据实验结果,选择批量梯度下降法用于调整神经网络的连接权值和阈值的效果更优。
和随机梯度下降法耗时比较
4 总结
本文结合三层BP神经网络进行股票预测,用十则交叉验证评估算法性能,根据经验确定学习步长为0.5,BP神经网络的初始权值和阈值为0~1之间的随机数,通过实验确定BP神经网络隐含层结点个数为21时,预测精度较高且运算量相对较小,采用批量梯度下降法修正连接权值和阈值所得出的预测精度比随机梯度下降法的精度更高。隐层结点个数为21,使用批量梯度下降法进行试验,平均预测精度可达58.5714%,最高预测精度可达71.4286%,能够为投资者的投资行为提供参考意见,具有重要的现实意义和经济价值。同时,此方法有待进一步优化,只能进行定性预测,预测精度也有待提高,下一步可结合小波神经网络对个股进行定量预测。
参考文献(References):
[1] 周志华.机器学习[M].清华大学出版社,2016.
[2] 焦李成,杨淑媛,刘芳等.神经网络七十年:回顾与展望[J].计算
机学报,2016.39(8):1697-1716
[3] Lei Lei, Wavelet Neural Network Prediction Method of
Stock Price Trend Based on Rough Set Attribute Reduction, Applied Soft Computing,2018.62:923-932
[4] 张晶华,莫文柯,甘宇健.基于SVM的上证指数预测研究[J].
软件导刊,2017.16(8):156-159,163
[5] 李晓青.灰色预测在股票价格中的研究应用[J].时代金融,
2017.12:158-160
[6] 郝博乾.基于时间序列分析的股票预测模型研究[D].电子科
技大学,2011.
[7] 董理,王中卿,熊德意.基于文本信息的股票指数预测[J].北京
大学学报(自然科学版),2017.53(2):273-278
[8] 于娟,刘强.主题网络爬虫研究综述[J].计算机工程与科学,
2015.37(2):231-237
[9] 涂辉,王锋,商庆伟.Python3编程实现网络图片爬虫[J].电脑
编程技巧与维护,2017.23:21-22
[10] 郭丽蓉.基于Python的网络爬虫程序设计[J].电子技术与软
件工程,2017.23:248-249
[11] 冯俐.爬虫技术综述[J].电脑知识与技术,2017.13(27):
213-214
[12] 赵庆爱.基于主题网络爬虫的科研信息管理系统的研究与
实现[D].安徽大学,2016.
[13] 張今.互联网新型不正当竞争行为的类型及认定[J].北京政
法职业学院学报,2014.2:5-9
[14] 陈琳,任芳.基于Python的新浪微博数据爬虫程序设计[J].
信息系统工程,2016.9:97-99
[15] 蔡光波.面向主题的多线程网络爬虫的设计与实现[D].西北
民族大学,2017.
[16] 王振武.数据挖掘算法原理与实现(第2版)[M].清华大学出
版社,2017.
[17] 廖丽芳.基于标签相关性和三层BP神经网络的多标签分类
算法研究[D].厦门大学,2017.