曾武序 錢(qián)文彬 王映龍 楊文姬 柳軍
摘 要: 股票預(yù)測(cè)可以輔助投資者進(jìn)行正確的金融投資,本文使用Python語(yǔ)言開(kāi)發(fā)網(wǎng)頁(yè)爬蟲(chóng)爬取真實(shí)的股票數(shù)據(jù),首先通過(guò)requests庫(kù)獲取網(wǎng)頁(yè)數(shù)據(jù),使用BeautifulSoup庫(kù)解析靜態(tài)html頁(yè)面,并通過(guò)查找標(biāo)簽獲取股票數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行解析,用xlwt庫(kù)將數(shù)據(jù)存入excel文件,并對(duì)數(shù)據(jù)歸一化處理,最后,在三層BP神經(jīng)網(wǎng)絡(luò)中根據(jù)批量梯度下降法調(diào)整隱含層結(jié)點(diǎn)個(gè)數(shù),以獲取相對(duì)更優(yōu)的連接權(quán)值和閾值,從而對(duì)股票的漲跌做出預(yù)測(cè),為投資者的投資行為提供參考。
關(guān)鍵詞: Python; 網(wǎng)絡(luò)爬蟲(chóng); BP神經(jīng)網(wǎng)絡(luò); 股票預(yù)測(cè)
中圖分類號(hào):TP183 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):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 引言
人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Network)即神經(jīng)網(wǎng)絡(luò),是由具有適應(yīng)性的簡(jiǎn)單單元組成的廣泛并行互連的網(wǎng)絡(luò),它的組織能夠模擬生物神經(jīng)系統(tǒng)對(duì)真實(shí)世界物體所作出的交互反應(yīng)[1]。神經(jīng)細(xì)胞接收信息以及處理信息的過(guò)程用“線性加權(quán)”和“函數(shù)映射”來(lái)模擬,網(wǎng)絡(luò)結(jié)構(gòu)和權(quán)值調(diào)整用優(yōu)化學(xué)習(xí)算法實(shí)現(xiàn)。這種人工神經(jīng)網(wǎng)絡(luò)雖然不能和生物神經(jīng)網(wǎng)絡(luò)等價(jià),但在某些方面已經(jīng)取得了優(yōu)越的性能[2]。
隨著經(jīng)濟(jì)的發(fā)展,股票市場(chǎng)吸引了眾多投資者,如何通過(guò)已有的數(shù)據(jù)來(lái)預(yù)測(cè)股價(jià),從而規(guī)避風(fēng)險(xiǎn),獲得更高的收益,是眾多投資者所關(guān)注的。Lei Lei將粗糙集和小波神經(jīng)相結(jié)合對(duì)股票指數(shù)進(jìn)行預(yù)測(cè)[3];張晶華等人用支持向量機(jī)對(duì)上證指數(shù)進(jìn)行預(yù)測(cè)研究[4];李曉青將灰度模型應(yīng)用于股票預(yù)測(cè)[5];郝博乾將時(shí)間序列應(yīng)用于股票預(yù)測(cè)[6];董理等人結(jié)合文本分析對(duì)股票指數(shù)進(jìn)行預(yù)測(cè)[7]。影響股票的因素有很多,其中的規(guī)律很難被直接觀察到,本文使用Python語(yǔ)言,編寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)爬取真實(shí)的股票數(shù)據(jù),然后結(jié)合三層BP神經(jīng)網(wǎng)絡(luò)對(duì)個(gè)股的漲跌情況作預(yù)測(cè)。
1 基于Python的網(wǎng)絡(luò)爬蟲(chóng)
網(wǎng)絡(luò)爬蟲(chóng)是一種能自動(dòng)抓取網(wǎng)頁(yè)并提取網(wǎng)頁(yè)內(nèi)容的程序,是搜索引擎的信息獲取渠道[8]。它能模仿瀏覽器訪問(wèn)網(wǎng)絡(luò)資源,并自動(dòng)提取所需要的信息[9-10],本文使用Python語(yǔ)言在Python3.6環(huán)境下實(shí)現(xiàn)了一個(gè)針對(duì)特定數(shù)據(jù)的主題爬蟲(chóng)[11-12]。
1.1 確定目標(biāo)數(shù)據(jù)
爬取的目標(biāo)網(wǎng)站為東方財(cái)富網(wǎng)(http://www.eastmoney.com/),網(wǎng)站的robots協(xié)議[13]允許爬蟲(chóng)爬取該網(wǎng)站所有鏈接。目標(biāo)數(shù)據(jù)為深股通十大成交榜,如圖1。目標(biāo)網(wǎng)頁(yè)URL[14]為http://data.eastmoney.com/hsgt/top10.html,能通過(guò)該網(wǎng)頁(yè)查看最新的交易日的數(shù)據(jù),也可以通過(guò)選擇日期的方式來(lái)查看歷史數(shù)據(jù)。根據(jù)歷史數(shù)據(jù)可以分析出歷史數(shù)據(jù)的請(qǐng)求URL均為”http://data.eastmoney.com/hsgt/top10”+日期字符串+”.html”的格式。使用chrome瀏覽器的開(kāi)發(fā)者工具對(duì)目標(biāo)網(wǎng)頁(yè)進(jìn)行分析,通過(guò)Elements選項(xiàng)卡查看目標(biāo)數(shù)據(jù)可以發(fā)現(xiàn),目標(biāo)數(shù)據(jù)均在具有屬性名為onmouseover、屬性值為this.className='over'的tr標(biāo)簽中,頁(yè)面中含有多個(gè)該種標(biāo)簽,目標(biāo)數(shù)據(jù)位于第11個(gè)至第20個(gè)標(biāo)簽。
1.2 網(wǎng)絡(luò)爬蟲(chóng)實(shí)現(xiàn)
根據(jù)URL格式:“http://data.eastmoney.com/hsgt/top10”+日期字符串+“.html”構(gòu)造目標(biāo)URL;運(yùn)用requests庫(kù)中的get方法向服務(wù)器發(fā)送get請(qǐng)求獲取目標(biāo)網(wǎng)頁(yè);結(jié)合re庫(kù)和BeautifulSoup庫(kù)解析網(wǎng)頁(yè)中的數(shù)據(jù)[15],找出具有屬性名為onmouseover,屬性值為this.className='over'的所有tr標(biāo)簽,并放在列表中;最后將列表中的一系列數(shù)據(jù)通過(guò)Sheet對(duì)象的write方法寫(xiě)入到excel表中進(jìn)行持久化存儲(chǔ)。最終excel中的部分?jǐn)?shù)據(jù)如圖2所示;在其中篩選出美的集團(tuán)的數(shù)據(jù)。
2 BP神經(jīng)網(wǎng)絡(luò)
BP(Back Propagation)神經(jīng)網(wǎng)絡(luò),即誤差向后傳播神經(jīng)網(wǎng)絡(luò),也是一種前饋神經(jīng)網(wǎng)絡(luò),前饋體現(xiàn)為:在BP神經(jīng)網(wǎng)絡(luò)中,信息由輸入層至隱含層到輸出層向前傳播;誤差反向傳播體現(xiàn)為:在計(jì)算出實(shí)際輸出和期望輸出的誤差之后,誤差逐層由輸出層向隱含層、輸入層傳播,并通過(guò)誤差調(diào)整相應(yīng)的連接權(quán)值及閾值。本文使用三層BP神經(jīng)網(wǎng)絡(luò)來(lái)預(yù)測(cè)個(gè)股的漲跌情況。
2.1 三層BP神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)
如圖3所示,設(shè)輸入層有I個(gè)結(jié)點(diǎn),隱含層有J個(gè)結(jié)點(diǎn),輸出層有K個(gè)結(jié)點(diǎn),對(duì)給定訓(xùn)練集D={(Xi,Yi)|i=1,2,3,…,N},N為訓(xùn)練樣本個(gè)數(shù);(Xi,Yi)為第個(gè)訓(xùn)練樣本;Xi={xi|i=0,1,…,I-1}為第i個(gè)訓(xùn)練樣本中的I維輸入向量;Yi={yi|i=0,1,…,K-1}為第i個(gè)訓(xùn)練樣本中的維期望輸出向量;wij表示輸入層第j個(gè)結(jié)點(diǎn)和隱含層第個(gè)結(jié)點(diǎn)間的權(quán)值;vjk表示隱含層第j個(gè)結(jié)點(diǎn)和輸出層第 個(gè)結(jié)點(diǎn)間的權(quán)值;θj,θk分別表示隱含層第個(gè)結(jié)點(diǎn)和輸出層第個(gè)結(jié)點(diǎn)的閾值。
2.2 BP算法
BP神經(jīng)網(wǎng)絡(luò)算法主要分為兩個(gè)階段。①正向傳播階段:信息從輸入層經(jīng)隱含層傳遞到輸出層再輸出,依次計(jì)算出各個(gè)結(jié)點(diǎn)的輸出值。②誤差反向傳播階段:誤差逐層從輸出層反向傳遞至隱含層、輸入層,依次計(jì)算出各個(gè)結(jié)點(diǎn)的誤差,并用此誤差修正相應(yīng)的權(quán)值和閾值,誤差達(dá)到最小時(shí),BP神經(jīng)網(wǎng)絡(luò)趨于穩(wěn)定。
2.2.1 正向傳播階段
神經(jīng)網(wǎng)絡(luò)的輸入信息為I維向量Xi={xi|i=0,1,…,I-1},輸入層不作任何處理,對(duì)應(yīng)輸入層結(jié)點(diǎn)的輸入/輸出關(guān)系為:
隱含層結(jié)點(diǎn)和輸出層結(jié)點(diǎn)使用sigmoid函數(shù)作為激活函數(shù)對(duì)信息進(jìn)行處理,經(jīng)過(guò)輸入層信息傳播至隱含層,對(duì)應(yīng)隱含層結(jié)點(diǎn)j的輸入輸出關(guān)系為:
同理,對(duì)應(yīng)輸出層結(jié)點(diǎn)k的輸入輸出關(guān)系為:
2.2.2 誤差反向傳播階段
假設(shè)神經(jīng)網(wǎng)絡(luò)的期望輸出為,其中用均方誤差MSE來(lái)衡量神經(jīng)網(wǎng)絡(luò)的誤差,第m個(gè)樣本的誤差:
樣本集總誤差:
通過(guò)調(diào)整神經(jīng)元之間的連接權(quán)值和神經(jīng)元的閾值使誤差達(dá)到最小。根據(jù)梯度下降法調(diào)整連接權(quán)值和閾值,用鏈?zhǔn)角髮?dǎo)法則計(jì)算連接權(quán)值和閾值的修正量:
,η為學(xué)習(xí)步長(zhǎng)
令
根據(jù)sigmoid函數(shù)的性質(zhì):
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 實(shí)驗(yàn)分析
3.1 神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)選取及處理
影響股票市場(chǎng)的因素有很多,考慮到股票市場(chǎng)的不確定性,為了避免人為操縱等不可控因素,本文選擇選取港股通2017年美的集團(tuán)的交易數(shù)據(jù),美的集團(tuán)在家電行業(yè)中總市值最高,過(guò)去一年的數(shù)據(jù)波動(dòng)也并不大(漲跌幅最大均在5%左右),在已經(jīng)獲取的240天的深股通十大成交榜數(shù)據(jù)中,美的集團(tuán)有238條記錄,缺失兩次,缺失值通過(guò)查詢具體數(shù)據(jù)手工填充。
神經(jīng)網(wǎng)絡(luò)的輸入為收盤(pán)價(jià),漲跌幅,凈買(mǎi)額(買(mǎi)入金額-賣(mài)出金額),買(mǎi)入金額,賣(mài)出金額,成交金額,輸出為對(duì)股票下一個(gè)交易日的漲跌預(yù)測(cè)。根據(jù)公式[16]對(duì)數(shù)據(jù)進(jìn)行歸一化處理,X'為處理之后的數(shù)據(jù),X為原數(shù)據(jù),Xmin為原數(shù)據(jù)中對(duì)應(yīng)屬性的最小值,Xmax為原數(shù)據(jù)中對(duì)應(yīng)屬性的最大值。
3.2 隱層結(jié)點(diǎn)個(gè)數(shù)的選取
在神經(jīng)網(wǎng)絡(luò)中學(xué)習(xí)步長(zhǎng)根據(jù)經(jīng)驗(yàn)取0.5,神經(jīng)網(wǎng)絡(luò)的所有連接權(quán)值和閾值初始化為0-1之間的隨機(jī)數(shù),根據(jù)批量梯度下降法[17]來(lái)調(diào)整神經(jīng)網(wǎng)絡(luò)的連接權(quán)值和閾值,本文使用十則交叉驗(yàn)證[1]衡量BP神經(jīng)網(wǎng)絡(luò)性能,評(píng)價(jià)指標(biāo)有預(yù)測(cè)精度accuracy和方差variance。實(shí)驗(yàn)得出的預(yù)測(cè)精度如圖4所示,方差如圖5所示。
圖4中橫坐標(biāo)為隱層結(jié)點(diǎn)個(gè)數(shù),縱坐標(biāo)為預(yù)測(cè)精度,當(dāng)隱層結(jié)點(diǎn)個(gè)數(shù)為21及以上時(shí),平均預(yù)測(cè)精度為58.5714%,預(yù)測(cè)精度最大為71.4286%,最小為42.8571%。圖5中橫坐標(biāo)為隱層結(jié)點(diǎn)個(gè)數(shù),縱坐標(biāo)為實(shí)驗(yàn)方差,當(dāng)隱層結(jié)點(diǎn)個(gè)數(shù)為21及以上時(shí),數(shù)據(jù)相對(duì)比較集中,方差為0.007279,根據(jù)實(shí)驗(yàn)結(jié)果,本文選取21作為隱層結(jié)點(diǎn)個(gè)數(shù)以便減少運(yùn)算時(shí)間,同時(shí)提高預(yù)測(cè)精度。
3.3 權(quán)重及閾值更新方法的選擇
在神經(jīng)網(wǎng)絡(luò)訓(xùn)練的過(guò)程中,根據(jù)梯度下降法調(diào)整權(quán)值和閾值使得網(wǎng)絡(luò)趨于穩(wěn)定。根據(jù)誤差函數(shù)衡量的樣本個(gè)數(shù)可將權(quán)值及閾值的更新方法分為隨機(jī)梯度下降法[3]和批量梯度下降法。隨機(jī)梯度下降法根據(jù)單個(gè)樣本的誤差調(diào)整神經(jīng)網(wǎng)絡(luò)的連接權(quán)值和閾值,批量梯度下降法根據(jù)訓(xùn)練樣本集的總誤差調(diào)整神經(jīng)網(wǎng)絡(luò)的連接權(quán)值和閾值,隨機(jī)梯度下降法速度更快,但是容易陷入局部極小值,批量梯度下降法速度更慢。本文根據(jù)實(shí)驗(yàn)選擇更優(yōu)的連接權(quán)值及閾值的更新方法。實(shí)驗(yàn)結(jié)果數(shù)據(jù)如圖所示。
和隨機(jī)梯度下降法精度比較
數(shù)據(jù)的預(yù)測(cè)精度如圖6所示,橫坐標(biāo)為隱層結(jié)點(diǎn)個(gè)數(shù),縱坐標(biāo)為預(yù)測(cè)精度。從圖6能夠看出,本例中批量梯度下降法的預(yù)測(cè)精度總體上要優(yōu)于隨機(jī)梯度下降法。耗時(shí)情況如圖7所示,橫坐標(biāo)為隱層結(jié)點(diǎn)個(gè)數(shù),縱坐標(biāo)為時(shí)間,從圖7能夠看出,本例中批量梯度下降法的耗時(shí)遠(yuǎn)遠(yuǎn)小于隨機(jī)梯度下降法。根據(jù)實(shí)驗(yàn)結(jié)果,選擇批量梯度下降法用于調(diào)整神經(jīng)網(wǎng)絡(luò)的連接權(quán)值和閾值的效果更優(yōu)。
和隨機(jī)梯度下降法耗時(shí)比較
4 總結(jié)
本文結(jié)合三層BP神經(jīng)網(wǎng)絡(luò)進(jìn)行股票預(yù)測(cè),用十則交叉驗(yàn)證評(píng)估算法性能,根據(jù)經(jīng)驗(yàn)確定學(xué)習(xí)步長(zhǎng)為0.5,BP神經(jīng)網(wǎng)絡(luò)的初始權(quán)值和閾值為0~1之間的隨機(jī)數(shù),通過(guò)實(shí)驗(yàn)確定BP神經(jīng)網(wǎng)絡(luò)隱含層結(jié)點(diǎn)個(gè)數(shù)為21時(shí),預(yù)測(cè)精度較高且運(yùn)算量相對(duì)較小,采用批量梯度下降法修正連接權(quán)值和閾值所得出的預(yù)測(cè)精度比隨機(jī)梯度下降法的精度更高。隱層結(jié)點(diǎn)個(gè)數(shù)為21,使用批量梯度下降法進(jìn)行試驗(yàn),平均預(yù)測(cè)精度可達(dá)58.5714%,最高預(yù)測(cè)精度可達(dá)71.4286%,能夠?yàn)橥顿Y者的投資行為提供參考意見(jiàn),具有重要的現(xiàn)實(shí)意義和經(jīng)濟(jì)價(jià)值。同時(shí),此方法有待進(jìn)一步優(yōu)化,只能進(jìn)行定性預(yù)測(cè),預(yù)測(cè)精度也有待提高,下一步可結(jié)合小波神經(jīng)網(wǎng)絡(luò)對(duì)個(gè)股進(jìn)行定量預(yù)測(cè)。
參考文獻(xiàn)(References):
[1] 周志華.機(jī)器學(xué)習(xí)[M].清華大學(xué)出版社,2016.
[2] 焦李成,楊淑媛,劉芳等.神經(jīng)網(wǎng)絡(luò)七十年:回顧與展望[J].計(jì)算
機(jī)學(xué)報(bào),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的上證指數(shù)預(yù)測(cè)研究[J].
軟件導(dǎo)刊,2017.16(8):156-159,163
[5] 李曉青.灰色預(yù)測(cè)在股票價(jià)格中的研究應(yīng)用[J].時(shí)代金融,
2017.12:158-160
[6] 郝博乾.基于時(shí)間序列分析的股票預(yù)測(cè)模型研究[D].電子科
技大學(xué),2011.
[7] 董理,王中卿,熊德意.基于文本信息的股票指數(shù)預(yù)測(cè)[J].北京
大學(xué)學(xué)報(bào)(自然科學(xué)版),2017.53(2):273-278
[8] 于娟,劉強(qiáng).主題網(wǎng)絡(luò)爬蟲(chóng)研究綜述[J].計(jì)算機(jī)工程與科學(xué),
2015.37(2):231-237
[9] 涂輝,王鋒,商慶偉.Python3編程實(shí)現(xiàn)網(wǎng)絡(luò)圖片爬蟲(chóng)[J].電腦
編程技巧與維護(hù),2017.23:21-22
[10] 郭麗蓉.基于Python的網(wǎng)絡(luò)爬蟲(chóng)程序設(shè)計(jì)[J].電子技術(shù)與軟
件工程,2017.23:248-249
[11] 馮俐.爬蟲(chóng)技術(shù)綜述[J].電腦知識(shí)與技術(shù),2017.13(27):
213-214
[12] 趙慶愛(ài).基于主題網(wǎng)絡(luò)爬蟲(chóng)的科研信息管理系統(tǒng)的研究與
實(shí)現(xiàn)[D].安徽大學(xué),2016.
[13] 張今.互聯(lián)網(wǎng)新型不正當(dāng)競(jìng)爭(zhēng)行為的類型及認(rèn)定[J].北京政
法職業(yè)學(xué)院學(xué)報(bào),2014.2:5-9
[14] 陳琳,任芳.基于Python的新浪微博數(shù)據(jù)爬蟲(chóng)程序設(shè)計(jì)[J].
信息系統(tǒng)工程,2016.9:97-99
[15] 蔡光波.面向主題的多線程網(wǎng)絡(luò)爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn)[D].西北
民族大學(xué),2017.
[16] 王振武.數(shù)據(jù)挖掘算法原理與實(shí)現(xiàn)(第2版)[M].清華大學(xué)出
版社,2017.
[17] 廖麗芳.基于標(biāo)簽相關(guān)性和三層BP神經(jīng)網(wǎng)絡(luò)的多標(biāo)簽分類
算法研究[D].廈門(mén)大學(xué),2017.