韓山杰 談世哲(中國海洋大學(xué)信息科學(xué)與工程學(xué)院 山東 青島 266100)
股票市場(chǎng)是國民經(jīng)濟(jì)發(fā)展變化的“晴雨表”,股票價(jià)格的漲跌也是政治、經(jīng)濟(jì)、社會(huì)等諸多因素的綜合反映[1]。所謂“凡事預(yù)則立,不預(yù)則廢”。對(duì)股票投資者來說,對(duì)股市的變化趨勢(shì)預(yù)測(cè)與利潤的獲取有著直接的聯(lián)系,預(yù)測(cè)越準(zhǔn)確,對(duì)風(fēng)險(xiǎn)的防范就越有把握;對(duì)上市公司來說,股票指數(shù)反映了該公司的經(jīng)營情況以及未來發(fā)展趨勢(shì),影響著整個(gè)公司的效益,是分析和研究該公司的主要技術(shù)指標(biāo);對(duì)國家的經(jīng)濟(jì)發(fā)展而言,股票預(yù)測(cè)研究同樣具有重要作用。因此對(duì)股市的內(nèi)在價(jià)值及預(yù)測(cè)的研究具有重大的理論意義和應(yīng)用前景。目前,股票預(yù)測(cè)的方法已經(jīng)有很多種,大致可以分為兩類:統(tǒng)計(jì)學(xué)方法和人工智能方法。統(tǒng)計(jì)學(xué)方法有Logistic回歸模型、ARCH模型等;人工智能方法有多層感知器神經(jīng)網(wǎng)絡(luò)、支持向量機(jī)[2-3]等。
TensorFlow是谷歌第二代分布式機(jī)器學(xué)習(xí)系統(tǒng),最初設(shè)計(jì)的意圖是加速機(jī)器學(xué)習(xí)的研究并快速地將原型轉(zhuǎn)化為產(chǎn)品。與原來的系統(tǒng)相比,TensorFlow更快,更加智能化,也更加靈活,因此可以更加輕松地適應(yīng)新產(chǎn)品和研究工作[4]。除了執(zhí)行深度學(xué)習(xí)算法,TensorFlow還可以實(shí)現(xiàn)很多其他算法,包括線性回歸、邏輯回歸、隨機(jī)森林等。TensorFlow建立的大規(guī)模深度學(xué)習(xí)模型的應(yīng)用場(chǎng)景非常廣泛,包括語音識(shí)別、自然語言處理、計(jì)算機(jī)視覺、機(jī)器人控制、信息抽取、數(shù)據(jù)分析及預(yù)測(cè)等[5]。TensorFlow提供了很多構(gòu)建神經(jīng)網(wǎng)絡(luò)的API接口,便于構(gòu)建MLP神經(jīng)網(wǎng)絡(luò)模型,也簡化了編程工作,與傳統(tǒng)平臺(tái)構(gòu)建的模型相比,極大地提高了效率。
TensorFlow既是一個(gè)實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的接口,同時(shí)也是執(zhí)行機(jī)器學(xué)習(xí)算法的框架[6]。它前端支持Python、C++、go等多種開發(fā)語言,后端使用C++、CUDA(Compute Unified Device Architecture)等寫成。TensorFlow使用數(shù)據(jù)流式圖來規(guī)劃計(jì)算流程,它可以將計(jì)算映射到不同的硬件和操作系統(tǒng)平臺(tái)。無論是個(gè)人的PC還是大規(guī)模GPU集群,TensorFlow都能在這些平臺(tái)上良好運(yùn)行。TensorFlow中的計(jì)算可以表示為一個(gè)有向圖,或稱為計(jì)算圖,其中每一個(gè)運(yùn)算操作將作為一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)與節(jié)點(diǎn)之間的連接稱為邊[7]。圖1描述了數(shù)據(jù)的計(jì)算流程[8],其中每個(gè)運(yùn)算操作都代表了一種類型的抽象運(yùn)算,比如矩陣乘法或者向量加法。這些運(yùn)算還負(fù)責(zé)維護(hù)和更新狀態(tài),用戶可以對(duì)計(jì)算圖的分支進(jìn)行控制或循環(huán)操作。
圖1 TensorFlow計(jì)算示例
本文通過在Linux操作系統(tǒng)上安裝TensorFlow,并基于TensorFlow構(gòu)建MLP神經(jīng)網(wǎng)絡(luò)模型,在此基礎(chǔ)上使用Python語言實(shí)現(xiàn)股票的預(yù)測(cè)程序。并且采用多項(xiàng)指標(biāo)對(duì)比了傳統(tǒng)MATLAB平臺(tái)構(gòu)建的BP神經(jīng)網(wǎng)絡(luò),驗(yàn)證基于TensorFlow構(gòu)建的深度學(xué)習(xí)模型的優(yōu)越性能。
1.2.1 Anaconda 簡介
Anaconda是一個(gè)用于科學(xué)計(jì)算的Python發(fā)行版,支持 Linux、Mac、Windows系統(tǒng),提供了包管理與環(huán)境管理的功能,可以很方便地解決多版本Python并存、切換以及各種第三方包安裝問題。Anaconda利用工具/命令conda來進(jìn)行package和environment的管理,并且已經(jīng)包含了Python和相關(guān)的配套工具。
1.2.2 TensorFlow 安裝
1) 首先到Anaconda官網(wǎng)(www.continuum.io/downloads)下載電腦所對(duì)應(yīng)版本的Anaconda,這里下載的是最新的Linux版本。
2) 到下載完成的路徑執(zhí)行:
bash Anaconda3-4.4.0-Linux-x86_64.sh
3) 創(chuàng)建一個(gè)conda運(yùn)行環(huán)境,我們起名tensorflow,Python版本采用Python3.6:
conda create -n tensorflow python=3.6
4) 激活TensorFlow環(huán)境:
source activate tensorflow
TensorFlow程序可以分為構(gòu)建圖和執(zhí)行圖兩個(gè)階段[9],如圖2所示。
圖2 TensorFlow計(jì)算流程圖
1) 構(gòu)建圖:TensorFlow在計(jì)算之前首先必須完成計(jì)算圖的構(gòu)建,包括初始化節(jié)點(diǎn)、定義程序中所需的變量和常量。用戶可以通過session的Extend方法添加新的節(jié)點(diǎn)和邊,用以創(chuàng)建計(jì)算圖。
2) 執(zhí)行圖:圖構(gòu)建完之后就可以通過session對(duì)象的run方法執(zhí)行計(jì)算圖,包括執(zhí)行節(jié)點(diǎn)之間的相應(yīng)操作并更新變量值,最后得到相應(yīng)數(shù)據(jù)。
多層感知器(MLP)基于前向反饋人工神經(jīng)網(wǎng)絡(luò),含有多層節(jié)點(diǎn),包括輸入層、隱含層和輸出層,每層節(jié)點(diǎn)與網(wǎng)絡(luò)的下一層節(jié)點(diǎn)完全連接[10]。輸入層節(jié)點(diǎn)代表輸入數(shù)據(jù)集,其他層的節(jié)點(diǎn)通過將輸入數(shù)據(jù)與層上節(jié)點(diǎn)的權(quán)重W以及閾值b組合且應(yīng)用一個(gè)激活函數(shù)得到該層相應(yīng)的輸出。MLP的學(xué)習(xí)規(guī)則是使用最速下降法,通過反向傳播來不斷調(diào)整神經(jīng)網(wǎng)絡(luò)的權(quán)值和閾值,使網(wǎng)絡(luò)的均方誤差達(dá)到最小[11]。
三層MLP神經(jīng)網(wǎng)絡(luò)模型如圖3所示,分為輸入層,隱含層和輸出層,神經(jīng)網(wǎng)絡(luò)中的參數(shù)主要有:
W1:輸入層到第一個(gè)隱含層的權(quán)重。
W12:隱含層到輸出層的權(quán)重。
b1:隱含層的激活閾值。
b2:輸出層的激活閾值。
f1:隱含層激活函數(shù)采用sigmod型的激活函數(shù):
(1)
f2:輸出層使用softmax方程:
(2)
圖3 MLP神經(jīng)網(wǎng)絡(luò)模型
三層MLP神經(jīng)網(wǎng)絡(luò)可以寫成矩陣形式如下:
a2=f2(w2f1(w1p+b1)+b2)
(3)
誤差函數(shù):均方誤差函數(shù)MSE是:
(4)
式中:Yi是神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)輸出結(jié)果,Ti是期望輸出結(jié)果,n是樣本總量。
MLP算法的核心是依據(jù)梯度下降法,通過計(jì)算輸出層誤差,調(diào)整輸入層和隱含層,隱含層和輸出層之間的權(quán)值和閾值。通過反復(fù)修正,一直到MSE函數(shù)值最小或者達(dá)到指定訓(xùn)練次數(shù)。圖4是MLP算法簡單流圖。
圖4 MLP算法流程
本實(shí)驗(yàn)采用從互聯(lián)網(wǎng)上獲取的蘋果公司的股票價(jià)格作數(shù)據(jù)集,數(shù)據(jù)集包含240天的股票信息,分為每日開盤價(jià)格和收盤價(jià)格,存儲(chǔ)在本地并命名為apple.csv。將數(shù)據(jù)集中的70%作為訓(xùn)練集,30%作為驗(yàn)證集。以開盤價(jià)格作為訓(xùn)練數(shù)據(jù),收盤價(jià)格作為目標(biāo)數(shù)據(jù),使用Python語言和TensorFlow庫編寫算法程序,以此構(gòu)建股票預(yù)測(cè)的神經(jīng)網(wǎng)絡(luò)模型。
輸入層設(shè)計(jì):將每日股票開盤價(jià)格作為訓(xùn)練數(shù)據(jù),收盤價(jià)格作為目標(biāo)數(shù)據(jù),輸入到神經(jīng)網(wǎng)絡(luò)中作為輸入層:
x=tf.placeholder(″float″, [None, 1])
y=tf.placeholder(″float″, [None,1])
其中x是訓(xùn)練數(shù)據(jù),y是目標(biāo)數(shù)據(jù)。
隱含層設(shè)計(jì):n_input是輸入層神經(jīng)元節(jié)點(diǎn)數(shù),n_hidden_1是當(dāng)前隱含層節(jié)點(diǎn)數(shù)。
weight_1是輸入層與隱含層之間連接權(quán)重,bias_1是隱含層的閾值。
weights_1=np.empty([n_input,n_hidden_1],
dtype=np.float32)
bias_1=np.empty(n_hidden_1,dtype=np.float32)
輸出層設(shè)計(jì):輸出層采用softmax回歸函數(shù)。
y=softmax(wx+b)
(5)
softmax是tf.nn下面的一個(gè)函數(shù),而tf.nn包含了大量神經(jīng)網(wǎng)絡(luò)的組件[12],我們用一行簡單的代碼就定義了softmax regression,語法和直接寫數(shù)學(xué)公式很像。
誤差計(jì)算:訓(xùn)練過程與MSE的作用類似,但是克服了MSE做誤差函數(shù)帶來的權(quán)重更新過慢問題。
pred=multilayer_perceptron(x, weights, biases)
cost=tf.reduce_mean(tf.square(pred-y))
其中pred是訓(xùn)練過程中的網(wǎng)絡(luò),cost是誤差。
使用訓(xùn)練好的模型進(jìn)行預(yù)測(cè):
y_predicted=pred.eval(feed_dict={x:x_test})
y_predicted=scaler.inverse_transform(y_predicted)
y_test=scaler.inverse_transform(y_test)
其中,y_predicted是網(wǎng)絡(luò)預(yù)測(cè)的結(jié)果,y_test是實(shí)際的股票價(jià)格。
在完成了網(wǎng)絡(luò)訓(xùn)練后,使用訓(xùn)練完成的網(wǎng)絡(luò)進(jìn)行預(yù)測(cè),需要對(duì)模型的準(zhǔn)確率進(jìn)行評(píng)測(cè)。計(jì)算根均方誤差RMSE,并作為網(wǎng)絡(luò)模型優(yōu)劣的評(píng)判標(biāo)準(zhǔn):
RMSE=math.sqrt(metrics.mean_squared_error(y_predicted, y_test))
訓(xùn)練完成后,將測(cè)試樣本輸入至MLP神經(jīng)網(wǎng)絡(luò)模型,得到預(yù)測(cè)的結(jié)果,如圖5所示。
圖5 收盤價(jià)格預(yù)測(cè)結(jié)果
其中,圓點(diǎn)表示的是預(yù)測(cè)結(jié)果,折線表示的測(cè)試樣本的價(jià)格,可以看出每個(gè)圓點(diǎn)幾乎都落在了折線的轉(zhuǎn)折點(diǎn)處,而轉(zhuǎn)折點(diǎn)處就是實(shí)際的每日收盤價(jià)格。這表明構(gòu)建的股票預(yù)測(cè)神經(jīng)網(wǎng)絡(luò)模型效果理想,能夠很好地應(yīng)用到金融數(shù)據(jù)分析當(dāng)中。
同時(shí)我們參考文獻(xiàn)[13-14]中使用BP神經(jīng)網(wǎng)絡(luò)進(jìn)行預(yù)測(cè)的方法,使用相同的數(shù)據(jù)集進(jìn)行了對(duì)比試驗(yàn),試驗(yàn)結(jié)果如圖6所示。
圖6 BP神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)結(jié)果
對(duì)比兩個(gè)預(yù)測(cè)結(jié)果圖明顯看出BP網(wǎng)絡(luò)預(yù)測(cè)點(diǎn)偏離期望輸出更大;而且從數(shù)據(jù)上來看,TensorFlow模型的RMSE=0.624 5,而BP神經(jīng)網(wǎng)絡(luò)的RMSE=0.894 2,顯示出TensorFlow在預(yù)測(cè)準(zhǔn)確度上更勝一籌。更有,我們?cè)诮y(tǒng)計(jì)了50次試驗(yàn)中每個(gè)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)所用時(shí)間的平均值Tm之后,TensorFlow神經(jīng)網(wǎng)絡(luò)模型的Tm=1.221 s而BP神經(jīng)網(wǎng)絡(luò)的Tm=2.483 s,顯示了TensorFlow在并行計(jì)算模式的支持下,加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練的效果十分明顯。
訓(xùn)練誤差我們采用RMSE,隨著訓(xùn)練迭代次數(shù)的增加,RMSE的變化如圖7所示。
圖7 迭代次數(shù)對(duì)訓(xùn)練誤差的影響
(6)
從圖7可以看出,隨著迭代次數(shù)的增加,神經(jīng)網(wǎng)絡(luò)模型的準(zhǔn)確度也在不斷提高,但當(dāng)?shù)螖?shù)達(dá)到1 000之后,準(zhǔn)確度幾乎沒有明顯變化,說明此時(shí)神經(jīng)網(wǎng)絡(luò)訓(xùn)練的權(quán)值和閾值已經(jīng)達(dá)到穩(wěn)定,接下來的實(shí)驗(yàn)將采用1 000為迭代次數(shù)進(jìn)行訓(xùn)練。
神經(jīng)網(wǎng)絡(luò)的隱含層數(shù)量和隱含層節(jié)點(diǎn)數(shù)對(duì)于其模型準(zhǔn)確度有很大影響。對(duì)于不是很復(fù)雜的問題,1個(gè)或2個(gè)隱含層就能達(dá)到不錯(cuò)的效果,太多反而會(huì)增加訓(xùn)練的和預(yù)測(cè)的時(shí)間。本實(shí)驗(yàn)針對(duì)這兩種情況做了實(shí)驗(yàn),結(jié)論是當(dāng)隱含層節(jié)點(diǎn)數(shù)相同的情況下,2個(gè)隱含層的RMSE最小,但訓(xùn)練用時(shí)Tm稍大于一個(gè)隱含層的情況,鑒于該時(shí)間因素影響不大,所以后續(xù)實(shí)驗(yàn)采用隱含層數(shù)為2。
對(duì)于隱含層節(jié)點(diǎn)數(shù)量,始終沒有一個(gè)非常權(quán)威而可靠的方式,一般在經(jīng)驗(yàn)公式的基礎(chǔ)上采用逐步實(shí)驗(yàn)法找出最佳的節(jié)點(diǎn)數(shù)。
(7)
式中:m是隱含層節(jié)點(diǎn)數(shù),n是輸入層節(jié)點(diǎn)數(shù),l是輸出層節(jié)點(diǎn)數(shù),a是1~10之間的常數(shù)。
當(dāng)隱含層層數(shù)固定為2時(shí),隱含層最大節(jié)點(diǎn)數(shù)對(duì)于預(yù)測(cè)效果的影響如圖8和圖9所示。
由圖可知,通過增加節(jié)點(diǎn)數(shù)可以在一定階段內(nèi)提高預(yù)測(cè)準(zhǔn)確度;但是當(dāng)節(jié)點(diǎn)數(shù)量達(dá)到一定程度時(shí),誤差幾乎不變,但是預(yù)測(cè)的時(shí)間會(huì)迅速增加。因此我們?cè)趯?shí)際應(yīng)用中要根據(jù)具體要求,同時(shí)考慮到模型運(yùn)行時(shí)間和準(zhǔn)確度,找到最佳的網(wǎng)絡(luò)結(jié)構(gòu)。
TensorFlow提供了一個(gè)很好的機(jī)器學(xué)習(xí)算法框架,可以幫助我們?cè)跇O短的時(shí)間內(nèi)快速構(gòu)建神經(jīng)網(wǎng)絡(luò)模型。數(shù)據(jù)并行,模型并行和流水線并行的并行計(jì)算模式加速了神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,使我們可以快速找到合適的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。
圖8 節(jié)點(diǎn)數(shù)對(duì)于訓(xùn)練誤差的影響
圖9 節(jié)點(diǎn)數(shù)對(duì)于預(yù)測(cè)時(shí)間的影響
TensorFlow具有編程簡單,算法集成度高和靈活的優(yōu)點(diǎn),使其能夠提升建模、分析的效率。使用TensorFlow框架設(shè)計(jì)并實(shí)現(xiàn)了用于股票預(yù)測(cè)的深度學(xué)習(xí)流程以及算法框架,并得到了有較高準(zhǔn)確率的預(yù)測(cè)模型。根據(jù)TensorFlow的平臺(tái)特性和在深度學(xué)習(xí)中的優(yōu)勢(shì),我們進(jìn)行了相關(guān)實(shí)驗(yàn)。
本文通過實(shí)驗(yàn)驗(yàn)證了TensorFlow構(gòu)建神經(jīng)網(wǎng)絡(luò)的優(yōu)勢(shì)并分析了隱含層層數(shù)和節(jié)點(diǎn)數(shù)對(duì)網(wǎng)絡(luò)模型的影響,結(jié)果表明,合適的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)有助于提高模型的預(yù)測(cè)效果。通過與其他平臺(tái)構(gòu)建的神經(jīng)網(wǎng)絡(luò)方法對(duì)比,顯示出本文所構(gòu)建的MLP神經(jīng)網(wǎng)絡(luò)模型不僅能夠取得較好的預(yù)測(cè)效果,而且耗時(shí)更少??梢娀赥ensorFlow設(shè)計(jì)的神經(jīng)網(wǎng)絡(luò)模型具有較大的應(yīng)用潛質(zhì)。由于影響
股票變動(dòng)的因素很多,未來的工作計(jì)劃是為股票預(yù)測(cè)的神經(jīng)網(wǎng)絡(luò)模型增加更多指標(biāo),并且隨著指標(biāo)維度的增加,下一步將采用更加強(qiáng)大的卷積神經(jīng)網(wǎng)絡(luò)建立分析模型。
[1] 陳星, 武麗芳, 王福明. 基于GA-BP神經(jīng)網(wǎng)絡(luò)的股票預(yù)測(cè)研究[J]. 山西電子技術(shù), 2014(1):93- 94.
[2] 郝知遠(yuǎn). 基于改進(jìn)的支持向量機(jī)的股票預(yù)測(cè)方法[J]. 江蘇科技大學(xué)學(xué)報(bào)(自然科學(xué)版), 2017, 31(3):339- 343.
[3] 楊君岐, 孫少乾, 樂甲. 基于Elman網(wǎng)絡(luò)的股價(jià)預(yù)測(cè)模型及在浦發(fā)銀行股票預(yù)測(cè)中的應(yīng)用[J]. 陜西科技大學(xué)學(xué)報(bào), 2007, 25(6):127- 130.
[4] 佚名. 谷歌推出TensorFlow機(jī)器學(xué)習(xí)系統(tǒng)[J]. 電信工程技術(shù)與標(biāo)準(zhǔn)化, 2015,28(11):92- 92
[5] 黃文堅(jiān),唐源. TensorFlow實(shí)戰(zhàn)[M]. 北京:電子工業(yè)出版社,2017:2- 3.
[6] Rampasek L, Goldenberg A. TensorFlow: Biology’s Gateway to Deep Learning?[J]. Cell Systems, 2016, 2(1):12.
[7] Abadi M. TensorFlow: learning functions at scale[J]. Acm Sigplan Notices, 2016,51(1):1- 1.
[8] 張俊, 李鑫. TensorFlow平臺(tái)下的手寫字符識(shí)別[J]. 電腦知識(shí)與技術(shù), 2016, 12(16):199- 201.
[9] 劉帆, 劉鵬遠(yuǎn), 李兵, 等. TensorFlow平臺(tái)下的視頻目標(biāo)跟蹤深度學(xué)習(xí)模型設(shè)計(jì)[J]. 光學(xué)學(xué)報(bào), 2017, 54(9):1- 1.
[10] 邱啟榮, 于婷. 基于主成分分析的BP神經(jīng)網(wǎng)絡(luò)對(duì)房價(jià)的預(yù)測(cè)研究[J]. 湖南文理學(xué)院學(xué)報(bào)(自科版), 2011, 23(3):24- 26.
[11] Sokouti B, Haghipour S, Tabrizi A D. A framework for diagnosing cervical cancer disease based on feedforward MLP neural network and ThinPrep histopathological cell image features[J]. Neural Computing & Applications, 2014, 24(1):221- 232.
[12] 李文鵬,高宇菲,錢佳佳, 等. 深度學(xué)習(xí)在量化投資中的應(yīng)用[J]. 統(tǒng)計(jì)與管理,2017(8):104- 106.
[13] 吳微, 陳維強(qiáng), 劉波. 用BP神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)股票市場(chǎng)漲跌[J]. 大連理工大學(xué)學(xué)報(bào), 2001, 41(1):9- 15.
[14] Li Z X, Wu W, Gao W D. Prediction of Stock Market by BP Neural Networks with Technical Indexes as Input[J]. Journal of Mathematical Research & Exposition, 2003, 23(1):83- 97.