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