韓山杰 談世哲(中國海洋大學信息科學與工程學院 山東 青島 266100)
股票市場是國民經濟發展變化的“晴雨表”,股票價格的漲跌也是政治、經濟、社會等諸多因素的綜合反映[1]。所謂“凡事預則立,不預則廢”。對股票投資者來說,對股市的變化趨勢預測與利潤的獲取有著直接的聯系,預測越準確,對風險的防范就越有把握;對上市公司來說,股票指數反映了該公司的經營情況以及未來發展趨勢,影響著整個公司的效益,是分析和研究該公司的主要技術指標;對國家的經濟發展而言,股票預測研究同樣具有重要作用。因此對股市的內在價值及預測的研究具有重大的理論意義和應用前景。目前,股票預測的方法已經有很多種,大致可以分為兩類:統計學方法和人工智能方法。統計學方法有Logistic回歸模型、ARCH模型等;人工智能方法有多層感知器神經網絡、支持向量機[2-3]等。
TensorFlow是谷歌第二代分布式機器學習系統,最初設計的意圖是加速機器學習的研究并快速地將原型轉化為產品。與原來的系統相比,TensorFlow更快,更加智能化,也更加靈活,因此可以更加輕松地適應新產品和研究工作[4]。除了執行深度學習算法,TensorFlow還可以實現很多其他算法,包括線性回歸、邏輯回歸、隨機森林等。TensorFlow建立的大規模深度學習模型的應用場景非常廣泛,包括語音識別、自然語言處理、計算機視覺、機器人控制、信息抽取、數據分析及預測等[5]。TensorFlow提供了很多構建神經網絡的API接口,便于構建MLP神經網絡模型,也簡化了編程工作,與傳統平臺構建的模型相比,極大地提高了效率。
TensorFlow既是一個實現機器學習算法的接口,同時也是執行機器學習算法的框架[6]。它前端支持Python、C++、go等多種開發語言,后端使用C++、CUDA(Compute Unified Device Architecture)等寫成。TensorFlow使用數據流式圖來規劃計算流程,它可以將計算映射到不同的硬件和操作系統平臺。無論是個人的PC還是大規模GPU集群,TensorFlow都能在這些平臺上良好運行。TensorFlow中的計算可以表示為一個有向圖,或稱為計算圖,其中每一個運算操作將作為一個節點,節點與節點之間的連接稱為邊[7]。圖1描述了數據的計算流程[8],其中每個運算操作都代表了一種類型的抽象運算,比如矩陣乘法或者向量加法。這些運算還負責維護和更新狀態,用戶可以對計算圖的分支進行控制或循環操作。

圖1 TensorFlow計算示例
本文通過在Linux操作系統上安裝TensorFlow,并基于TensorFlow構建MLP神經網絡模型,在此基礎上使用Python語言實現股票的預測程序。并且采用多項指標對比了傳統MATLAB平臺構建的BP神經網絡,驗證基于TensorFlow構建的深度學習模型的優越性能。
1.2.1 Anaconda 簡介
Anaconda是一個用于科學計算的Python發行版,支持 Linux、Mac、Windows系統,提供了包管理與環境管理的功能,可以很方便地解決多版本Python并存、切換以及各種第三方包安裝問題。Anaconda利用工具/命令conda來進行package和environment的管理,并且已經包含了Python和相關的配套工具。
1.2.2 TensorFlow 安裝
1) 首先到Anaconda官網(www.continuum.io/downloads)下載電腦所對應版本的Anaconda,這里下載的是最新的Linux版本。
2) 到下載完成的路徑執行:
bash Anaconda3-4.4.0-Linux-x86_64.sh
3) 創建一個conda運行環境,我們起名tensorflow,Python版本采用Python3.6:
conda create -n tensorflow python=3.6
4) 激活TensorFlow環境:
source activate tensorflow
TensorFlow程序可以分為構建圖和執行圖兩個階段[9],如圖2所示。

圖2 TensorFlow計算流程圖
1) 構建圖:TensorFlow在計算之前首先必須完成計算圖的構建,包括初始化節點、定義程序中所需的變量和常量。用戶可以通過session的Extend方法添加新的節點和邊,用以創建計算圖。
2) 執行圖:圖構建完之后就可以通過session對象的run方法執行計算圖,包括執行節點之間的相應操作并更新變量值,最后得到相應數據。
多層感知器(MLP)基于前向反饋人工神經網絡,含有多層節點,包括輸入層、隱含層和輸出層,每層節點與網絡的下一層節點完全連接[10]。輸入層節點代表輸入數據集,其他層的節點通過將輸入數據與層上節點的權重W以及閾值b組合且應用一個激活函數得到該層相應的輸出。MLP的學習規則是使用最速下降法,通過反向傳播來不斷調整神經網絡的權值和閾值,使網絡的均方誤差達到最小[11]。
三層MLP神經網絡模型如圖3所示,分為輸入層,隱含層和輸出層,神經網絡中的參數主要有:
W1:輸入層到第一個隱含層的權重。
W12:隱含層到輸出層的權重。
b1:隱含層的激活閾值。
b2:輸出層的激活閾值。
f1:隱含層激活函數采用sigmod型的激活函數:
(1)
f2:輸出層使用softmax方程:
(2)

圖3 MLP神經網絡模型
三層MLP神經網絡可以寫成矩陣形式如下:
a2=f2(w2f1(w1p+b1)+b2)
(3)
誤差函數:均方誤差函數MSE是:
(4)
式中:Yi是神經網絡預測輸出結果,Ti是期望輸出結果,n是樣本總量。
MLP算法的核心是依據梯度下降法,通過計算輸出層誤差,調整輸入層和隱含層,隱含層和輸出層之間的權值和閾值。通過反復修正,一直到MSE函數值最小或者達到指定訓練次數。圖4是MLP算法簡單流圖。

圖4 MLP算法流程
本實驗采用從互聯網上獲取的蘋果公司的股票價格作數據集,數據集包含240天的股票信息,分為每日開盤價格和收盤價格,存儲在本地并命名為apple.csv。將數據集中的70%作為訓練集,30%作為驗證集。以開盤價格作為訓練數據,收盤價格作為目標數據,使用Python語言和TensorFlow庫編寫算法程序,以此構建股票預測的神經網絡模型。
輸入層設計:將每日股票開盤價格作為訓練數據,收盤價格作為目標數據,輸入到神經網絡中作為輸入層:
x=tf.placeholder(″float″, [None, 1])
y=tf.placeholder(″float″, [None,1])
其中x是訓練數據,y是目標數據。
隱含層設計:n_input是輸入層神經元節點數,n_hidden_1是當前隱含層節點數。
weight_1是輸入層與隱含層之間連接權重,bias_1是隱含層的閾值。
weights_1=np.empty([n_input,n_hidden_1],
dtype=np.float32)
bias_1=np.empty(n_hidden_1,dtype=np.float32)
輸出層設計:輸出層采用softmax回歸函數。
y=softmax(wx+b)
(5)
softmax是tf.nn下面的一個函數,而tf.nn包含了大量神經網絡的組件[12],我們用一行簡單的代碼就定義了softmax regression,語法和直接寫數學公式很像。
誤差計算:訓練過程與MSE的作用類似,但是克服了MSE做誤差函數帶來的權重更新過慢問題。
pred=multilayer_perceptron(x, weights, biases)
cost=tf.reduce_mean(tf.square(pred-y))
其中pred是訓練過程中的網絡,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是網絡預測的結果,y_test是實際的股票價格。
在完成了網絡訓練后,使用訓練完成的網絡進行預測,需要對模型的準確率進行評測。計算根均方誤差RMSE,并作為網絡模型優劣的評判標準:
RMSE=math.sqrt(metrics.mean_squared_error(y_predicted, y_test))
訓練完成后,將測試樣本輸入至MLP神經網絡模型,得到預測的結果,如圖5所示。

圖5 收盤價格預測結果
其中,圓點表示的是預測結果,折線表示的測試樣本的價格,可以看出每個圓點幾乎都落在了折線的轉折點處,而轉折點處就是實際的每日收盤價格。這表明構建的股票預測神經網絡模型效果理想,能夠很好地應用到金融數據分析當中。
同時我們參考文獻[13-14]中使用BP神經網絡進行預測的方法,使用相同的數據集進行了對比試驗,試驗結果如圖6所示。

圖6 BP神經網絡預測結果
對比兩個預測結果圖明顯看出BP網絡預測點偏離期望輸出更大;而且從數據上來看,TensorFlow模型的RMSE=0.624 5,而BP神經網絡的RMSE=0.894 2,顯示出TensorFlow在預測準確度上更勝一籌。更有,我們在統計了50次試驗中每個神經網絡預測所用時間的平均值Tm之后,TensorFlow神經網絡模型的Tm=1.221 s而BP神經網絡的Tm=2.483 s,顯示了TensorFlow在并行計算模式的支持下,加速神經網絡訓練的效果十分明顯。
訓練誤差我們采用RMSE,隨著訓練迭代次數的增加,RMSE的變化如圖7所示。

圖7 迭代次數對訓練誤差的影響
(6)
從圖7可以看出,隨著迭代次數的增加,神經網絡模型的準確度也在不斷提高,但當迭代次數達到1 000之后,準確度幾乎沒有明顯變化,說明此時神經網絡訓練的權值和閾值已經達到穩定,接下來的實驗將采用1 000為迭代次數進行訓練。
神經網絡的隱含層數量和隱含層節點數對于其模型準確度有很大影響。對于不是很復雜的問題,1個或2個隱含層就能達到不錯的效果,太多反而會增加訓練的和預測的時間。本實驗針對這兩種情況做了實驗,結論是當隱含層節點數相同的情況下,2個隱含層的RMSE最小,但訓練用時Tm稍大于一個隱含層的情況,鑒于該時間因素影響不大,所以后續實驗采用隱含層數為2。
對于隱含層節點數量,始終沒有一個非常權威而可靠的方式,一般在經驗公式的基礎上采用逐步實驗法找出最佳的節點數。
(7)
式中:m是隱含層節點數,n是輸入層節點數,l是輸出層節點數,a是1~10之間的常數。
當隱含層層數固定為2時,隱含層最大節點數對于預測效果的影響如圖8和圖9所示。
由圖可知,通過增加節點數可以在一定階段內提高預測準確度;但是當節點數量達到一定程度時,誤差幾乎不變,但是預測的時間會迅速增加。因此我們在實際應用中要根據具體要求,同時考慮到模型運行時間和準確度,找到最佳的網絡結構。
TensorFlow提供了一個很好的機器學習算法框架,可以幫助我們在極短的時間內快速構建神經網絡模型。數據并行,模型并行和流水線并行的并行計算模式加速了神經網絡的訓練,使我們可以快速找到合適的神經網絡結構。

圖8 節點數對于訓練誤差的影響

圖9 節點數對于預測時間的影響
TensorFlow具有編程簡單,算法集成度高和靈活的優點,使其能夠提升建模、分析的效率。使用TensorFlow框架設計并實現了用于股票預測的深度學習流程以及算法框架,并得到了有較高準確率的預測模型。根據TensorFlow的平臺特性和在深度學習中的優勢,我們進行了相關實驗。
本文通過實驗驗證了TensorFlow構建神經網絡的優勢并分析了隱含層層數和節點數對網絡模型的影響,結果表明,合適的神經網絡結構有助于提高模型的預測效果。通過與其他平臺構建的神經網絡方法對比,顯示出本文所構建的MLP神經網絡模型不僅能夠取得較好的預測效果,而且耗時更少。可見基于TensorFlow設計的神經網絡模型具有較大的應用潛質。由于影響
股票變動的因素很多,未來的工作計劃是為股票預測的神經網絡模型增加更多指標,并且隨著指標維度的增加,下一步將采用更加強大的卷積神經網絡建立分析模型。
[1] 陳星, 武麗芳, 王福明. 基于GA-BP神經網絡的股票預測研究[J]. 山西電子技術, 2014(1):93- 94.
[2] 郝知遠. 基于改進的支持向量機的股票預測方法[J]. 江蘇科技大學學報(自然科學版), 2017, 31(3):339- 343.
[3] 楊君岐, 孫少乾, 樂甲. 基于Elman網絡的股價預測模型及在浦發銀行股票預測中的應用[J]. 陜西科技大學學報, 2007, 25(6):127- 130.
[4] 佚名. 谷歌推出TensorFlow機器學習系統[J]. 電信工程技術與標準化, 2015,28(11):92- 92
[5] 黃文堅,唐源. TensorFlow實戰[M]. 北京:電子工業出版社,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]. 電腦知識與技術, 2016, 12(16):199- 201.
[9] 劉帆, 劉鵬遠, 李兵, 等. TensorFlow平臺下的視頻目標跟蹤深度學習模型設計[J]. 光學學報, 2017, 54(9):1- 1.
[10] 邱啟榮, 于婷. 基于主成分分析的BP神經網絡對房價的預測研究[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] 李文鵬,高宇菲,錢佳佳, 等. 深度學習在量化投資中的應用[J]. 統計與管理,2017(8):104- 106.
[13] 吳微, 陳維強, 劉波. 用BP神經網絡預測股票市場漲跌[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.