◇內(nèi)江師范學(xué)院數(shù)學(xué)與信息科學(xué)學(xué)院 李沁林 尹福成 陳 雪 康 倩
本文選取上證50成分股中的一部分股票作為對(duì)象,統(tǒng)計(jì)了日內(nèi)金融高頻數(shù)據(jù)以及各交易時(shí)間段互聯(lián)網(wǎng)資訊數(shù)量。將這些數(shù)據(jù)作為自變量,股價(jià)當(dāng)日與后一日的收盤價(jià)是否上漲作為因變量,采用BP神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,然后收集當(dāng)天的自變量帶入網(wǎng)絡(luò)對(duì)明天的股價(jià)股價(jià)是否上漲作出預(yù)測(cè)。通過五天的實(shí)驗(yàn),模型平均準(zhǔn)確率為70%。
隨著人工智能技術(shù)的不斷發(fā)展,各大券商、基金公司等推出了各種各樣的股價(jià)預(yù)測(cè)系統(tǒng),乃至炒股機(jī)器人。有的是利用α對(duì)沖來構(gòu)建可以套利的投資組合,有的是依靠收盤價(jià)、開盤價(jià)、最高價(jià)、最低價(jià)等歷史數(shù)據(jù)從統(tǒng)計(jì)的角度來預(yù)測(cè)股價(jià)[1]。本文構(gòu)建也是從統(tǒng)計(jì)的角度來預(yù)測(cè)股票價(jià)格,不同之處是加入了股票的新聞與股票的其它高頻數(shù)據(jù)一起來預(yù)測(cè)股價(jià),實(shí)現(xiàn)了一個(gè)自動(dòng)收集數(shù)據(jù)并作出預(yù)測(cè)的器人。
假設(shè)互聯(lián)網(wǎng)資訊對(duì)投資者的決策是有影響的,并且由于不同的投資者看到新聞的時(shí)間不同,新聞發(fā)出后的五分鐘內(nèi)一小部分人看到新聞的人所作出的買賣決定,可以代表隨后大多數(shù)投資者看到這條新聞后的想法。通過新聞發(fā)出后的五分鐘內(nèi)那少部分看到新聞的人作出的反應(yīng)來近似替代新聞對(duì)股價(jià)的影響。這樣做避免了逐條對(duì)新聞的本文內(nèi)容的挖掘。采用文本挖掘既無法得到投資者對(duì)于這條新聞?wù)嬲姆磻?yīng),實(shí)現(xiàn)起來也異常麻煩。
這里用python3.6.8+requests3.1.4.0接入新浪股票的API,提交請(qǐng)求后可以獲得最近五天內(nèi)該股票的五分鐘高頻數(shù)據(jù),包括開盤價(jià),收盤價(jià),最高價(jià),最低價(jià),成交量這幾個(gè)屬性。后面要對(duì)這些數(shù)據(jù)進(jìn)行訓(xùn)練,不同股票間的價(jià)格相差很大,會(huì)對(duì)訓(xùn)練造成不好的影響,所以這里對(duì)這幾個(gè)屬性計(jì)算它們的增長(zhǎng)率,其結(jié)果一般都在-1到1之間。除了個(gè)股的價(jià)格數(shù)據(jù)外,還可以獲取股票所在版塊的指數(shù)的價(jià)格數(shù)據(jù),然后做同樣的處理。最后制成一個(gè)csv文件用來保存某只股票在某一天的這些屬性,如表1所示。
表1 所得csv文件示例
從表的第一列開始,每一列依次表示:大盤五分鐘內(nèi)最高價(jià)增長(zhǎng)率、個(gè)股五分鐘內(nèi)最高價(jià)增長(zhǎng)率、大盤五分鐘內(nèi)最低價(jià)增長(zhǎng)率'、個(gè)股五分鐘內(nèi)最低價(jià)增長(zhǎng)率、大盤五分鐘內(nèi)開盤價(jià)增長(zhǎng)率、個(gè)股五分鐘內(nèi)開盤價(jià)增長(zhǎng)率、個(gè)股五分鐘內(nèi)的新發(fā)新聞數(shù)量、大盤五分鐘內(nèi)收盤價(jià)增長(zhǎng)率、個(gè)股五分鐘內(nèi)收盤價(jià)增長(zhǎng)率、大盤五分鐘內(nèi)交易量增長(zhǎng)率、個(gè)股五分鐘內(nèi)交易增長(zhǎng)率。每一行代表不同的時(shí)間段。第一行到最后一行依次表示從早上八點(diǎn)開始每5分鐘的數(shù)據(jù)。
引言提到的,要加入新聞?lì)A(yù)測(cè)股價(jià),必然要構(gòu)建一個(gè)可以獲取新聞的模塊??紤]到百度的大蜘蛛系統(tǒng)每五分鐘可以爬取一次全網(wǎng)資訊,本文就直接爬取百度關(guān)于股票的搜索結(jié)果,免去了從各大網(wǎng)站分別爬取資訊的苦惱。用python3.6.8+selenium來制作新聞爬蟲,可以繞開反爬機(jī)制。爬蟲模塊運(yùn)行后得到的結(jié)果如圖1所示。
圖1 爬蟲模塊爬取百度京東方搜索結(jié)果
爬蟲返回的結(jié)果與網(wǎng)頁直接搜索得到的沒有差別,統(tǒng)計(jì)交易時(shí)間內(nèi)的各五分鐘時(shí)間段的新聞發(fā)布數(shù)量,與股價(jià)數(shù)據(jù)一起作為我們最終使用的數(shù)據(jù),如表1所示。
選取上證50的部分股票作為對(duì)象,運(yùn)行程序,得到的每一個(gè)csv文件代表了某只股票某一天的股價(jià)高頻數(shù)據(jù)與新聞數(shù)據(jù)。將文件名命名為日期加股票名稱,若第二天上漲則放在文件名為“1”的文件夾下,若第二天沒有上漲則放在文件名為“0”的文件夾下。運(yùn)行程序當(dāng)天的數(shù)據(jù)放在“待判斷”文件夾下,模型訓(xùn)練后用這些文件對(duì)其第二天做預(yù)測(cè)。
股價(jià)的漲跌與其因素顯然是非線性的,還具有復(fù)雜的非線性關(guān)系。Universal approximation theorem(Hornik et al.,1989;Cybenko,1989)定理表明:前饋神經(jīng)網(wǎng)絡(luò),只需具備單層隱含層和有限個(gè)神經(jīng)單元,就能以任意精度擬合任意復(fù)雜度的函數(shù)[2]。這里我們選擇BP神經(jīng)網(wǎng)絡(luò)對(duì)股價(jià)做預(yù)測(cè),模型的結(jié)構(gòu)如圖2所示。
圖2 網(wǎng)絡(luò)結(jié)構(gòu)
網(wǎng)絡(luò)從上到下依次為64個(gè)神經(jīng)元的全連接層,relu激活層,16個(gè)神經(jīng)元的全連接層,relu激活層,2個(gè)神經(jīng)元的全連接層,sigmoid激活層。損失函數(shù)為sparse categorical crossentropy。
按照上述模型用keras搭建好之后,進(jìn)行300輪訓(xùn)練,然后將當(dāng)天的數(shù)據(jù)輸入網(wǎng)絡(luò),得到第二天股票的的預(yù)測(cè)漲跌,然后與真實(shí)值做對(duì)比,重復(fù)5天實(shí)驗(yàn)每一天準(zhǔn)確率如圖3所示。
圖3 每天實(shí)驗(yàn)的準(zhǔn)確率
圖4 五天預(yù)測(cè)的混淆矩陣
預(yù)測(cè)的準(zhǔn)確率都大于50%,效果較為理想,混淆矩陣如圖4所示。由圖4知,網(wǎng)絡(luò)的精確度度都在70%左右,說明神經(jīng)網(wǎng)絡(luò)確實(shí)學(xué)習(xí)到了一些規(guī)律。對(duì)下跌的預(yù)測(cè)靈敏度高達(dá)84.96%說明數(shù)據(jù)中的下跌樣本很多,導(dǎo)致模型預(yù)測(cè)下跌的頻率大。
互聯(lián)網(wǎng)資訊與股價(jià)高頻數(shù)據(jù)聯(lián)合預(yù)測(cè)股價(jià)的準(zhǔn)確率每日穩(wěn)定高于50%,說明了這套方法有很強(qiáng)的實(shí)用性。目前已經(jīng)實(shí)現(xiàn)了自動(dòng)數(shù)據(jù)收集和預(yù)測(cè)部分的代碼,相關(guān)代碼已上傳到GitHub,后續(xù)可以開發(fā)交易模塊得到一個(gè)基于此方法的全自動(dòng)炒股機(jī)器人。