陳 磊,張曉濤
(1.汕尾市公安局,汕尾 516600;2.佳都科技集團股份有限公司,廣州 510000)
20世紀80年代,一些投資者開始利用計算機研究金融數(shù)據(jù),并初顯成效。20世紀末,投資者把計算機技術進一步應用在金融數(shù)據(jù)分析上,進行模型設計,構建股票投資組合[1]。隨著全球金融市場的繁榮發(fā)展,股票數(shù)據(jù)呈現(xiàn)海量化、密集化、多樣化的趨勢,基于大數(shù)據(jù)的數(shù)據(jù)挖掘技術,在股票趨勢分析領域開始廣泛應用,投資者對于投資、理財模型的接受度與認知度不斷提升。
基于時間序列的股票數(shù)據(jù)分析與推薦,可以調用多個數(shù)據(jù)源、多個數(shù)據(jù)內(nèi)容,爬取多個相關金融網(wǎng)頁的分析內(nèi)容,實現(xiàn)股票交易信息上的“多目多耳”,擺脫傳統(tǒng)股票交易過程中的信息獲取內(nèi)容少、信息獲取時間長、交易判斷單一、隨意等缺點,實現(xiàn)股票實時信息監(jiān)控、單股評分、單股走勢預測、各大證券機構持倉情況等功能,提供了一種科學的衡量機制。
本設計主要實現(xiàn)的是如何使用Python的GUI編程以及網(wǎng)絡爬蟲、時間序列等相關技術,開發(fā)一個實時的、分析內(nèi)容廣的股票分析與推薦系統(tǒng)。為了保證股票分析與推薦的準確性,在股票的分析預測上選擇了時間序列算法,在股票的推薦評測上選擇爬取國內(nèi)市場份額最大的同花順金融網(wǎng),在數(shù)據(jù)源的選擇上選擇國內(nèi)股票信息面最廣的Tushare模塊庫和實時更新最快的新浪端口,在GUI編程上選擇Python自帶GUI庫,也是事實上的標準GUI的Tkinter模塊。
本設計的主要內(nèi)容如下:
(1)爬取同花順金融網(wǎng)的大盤信息、股票評價、機構操作以視圖和表格情況展示給用戶。
(2)用時間序列算法對獲取的數(shù)據(jù)源進行分析與預測。
(3)將端口獲取的實時數(shù)據(jù)導入模板,以網(wǎng)頁的形式展示給用戶。
(4)設計合理化、人性化的操作界面,方便用戶對股票信息的獲取與分析。
Tkinter是Python標準GUI庫,支持跨平臺運行,可以在Windows/Linux/Unix/Macintosh等操作系統(tǒng)中使用。Tkinter繼承了Python語法簡潔、代碼易讀的基本特點,使用起來非常簡單。作為Python GUI開發(fā)工具之一,它具有GUI軟件包的必備常用功能,提供了不同類型的窗口控件、窗口布局管理器、事件處理機制等。
Matplotlib是一個用Python語言編寫的二維圖形庫,它充分利用了Python數(shù)值計算軟件包的快速精確的矩陣運算能力,具有良好的作圖性能[2]。Matplotlib在跨平臺交互環(huán)境和各種硬拷貝格式中發(fā)布高質量的圖形,可以快捷且高效地創(chuàng)建各種類型的二維圖表和一些基本的三維圖表,它是Python中最常用的可視化工具之一。Matplotlib繼承了Python簡潔優(yōu)雅的特點,有著十分出色的繪圖性能,并設計了大量類似于Matlab的字符函數(shù),所以這些功能很容易迅速使用,特別是對于熟悉或者精通Matlab繪圖功能的人來說更是如此。
時間序列分析是一種現(xiàn)代的統(tǒng)計分析預測方法,廣泛應用于自然科學和社會科學領域。ARIMA模型作為一種重要的時間序列模型,得到了廣泛的應用。時間序列是指根據(jù)有序排列得到的一列實際觀測值,這一組隨機數(shù)據(jù)通常反映同一觀察對象在不同時刻的數(shù)值。時間序列的特點主要表現(xiàn)為:①觀測值是有序排列的;②觀測值是隨機的;③觀測值之間存在依賴關系或相關關系;④在整體方面體現(xiàn)出一種明顯的趨勢[3]。
相鄰觀測值之間的相關性是時間序列最典型的特征之一,也被稱為相關性,它反映了其內(nèi)涵的大量信息和實際意義。時間序列本身可以表示多個隨機變量,是每個變量對應的唯一樣本觀測值,對于這些變量只有一個歷史觀測數(shù)據(jù)。數(shù)理統(tǒng)計方法是由一個總體,即一個隨機變量通過幾個樣本觀測來進行數(shù)據(jù)的推測,時間序列分析會以這些樣本為基礎,由于整體的性質,無法通過數(shù)理統(tǒng)計分析來處理。
如果時間序列不穩(wěn)定,則觀測值的平均值在任何時候都是不同的,而且每一個平均值只使用一個唯一的觀測值來計算,少量的數(shù)據(jù)來計算統(tǒng)計無法保證其準確性。當數(shù)據(jù)相對平穩(wěn)時,可以列出的幾個隨機變量,它們的平均值是相同的,它們被認為是相同的總體。數(shù)據(jù)可以被認為是來自同一總體的樣本,然后可以用數(shù)理統(tǒng)計的方法來分析序列。
在以實際值為基準來分析隨機過程的特征時,通常需要對該數(shù)據(jù)組的總體特征做出一些簡化假設,在這種假設下,穩(wěn)定性是能夠確保的最基本假設,該序列組是穩(wěn)定的統(tǒng)計特征,不易改變,因此在模型識別前應事先對這兩個特征進行檢查,如果要確定任何一組時間序列是否穩(wěn)定,就要對其進行檢查。檢查中,我們以均值方程、自協(xié)方差、ACF系數(shù)這三個特征值為基準[4]。
在觀測一個相對平穩(wěn)的時間序列時,平均值總是恒定在一定的范圍內(nèi),協(xié)方差函數(shù)只與記錄的時間長度有關,所以輸出時間序列圖在某個常數(shù)附近浮動,變化范圍很小,如果我們觀察平穩(wěn)序列的自相關圖,其平均值為0,出現(xiàn)的只能是拖尾狀態(tài)或者截尾狀態(tài),如果時間序列的自相關圖逐漸或有規(guī)律地減小,則可以得到信息:該數(shù)據(jù)集具有一定的趨勢或某種周期性。
本系統(tǒng)的開發(fā)模式為三層模塊漸進開發(fā),包括了界面模塊、邏輯模塊和數(shù)據(jù)模塊,系統(tǒng)體系架構圖如圖1所示。
圖1 系統(tǒng)體系架構圖
界面模塊是用戶與軟件的主要交互部分,收集用戶的請求。用戶提交請求后,根據(jù)請求內(nèi)容進行分類處理,提交給業(yè)務邏輯層,并將處理的數(shù)據(jù)傳遞給數(shù)據(jù)模塊。同時也將邏輯模塊傳遞上來的數(shù)據(jù)放置在對應的模板里,生成相關圖表。
邏輯模塊主要是業(yè)務邏輯的處理以及對用戶的各種需求的數(shù)據(jù)信息進行處理。邏輯模塊接收到源自界面模塊上用戶的請求之后,調用對應的業(yè)務邏輯進行處理,業(yè)務邏輯是具體的業(yè)務處理部分,并將處理的結果傳遞到界面模塊展示在用戶面前。邏輯模塊是對界面模塊傳遞來的參數(shù)進行處理,通過對應的業(yè)務邏輯方法提取對應的值,并將提取出的值傳遞給數(shù)據(jù)模塊,或直接調用對應的包[5]。邏輯模塊包括了對界面模塊傳遞下來的參數(shù)的判斷,如果其值不在處理范圍內(nèi),則會直接返回到界面模塊。
數(shù)據(jù)模塊是對所需數(shù)據(jù)的提取與反饋,業(yè)務邏輯處理時,會對相應的數(shù)據(jù)進行選擇與提取,在獲取頁面之后,會根據(jù)邏輯模塊的解析內(nèi)容來提取所需信息,指定的數(shù)據(jù)網(wǎng)讀取數(shù)據(jù),在讀取完成后將讀取的數(shù)據(jù)返回給邏輯模塊。
本系統(tǒng)的主要功能模塊包括股票分析模塊與股票推薦模塊,各模塊主要功能結構如圖2所示。
圖2 軟件功能結構圖
主界面是用戶分析股票的入口,通過輸入股票代碼來啟動股票分析模塊,隨后會反饋出該股票的評價。分析模塊包含三個內(nèi)容,股票走勢預測、大盤對比分析、近期機構操作。股票走勢分析包含有基于時間序列的模塊。
股票推薦模塊包含龍虎榜信息與實時股票信息,其中龍虎榜又包含昨日龍虎榜與個股上榜次數(shù)兩類。
本系統(tǒng)是基于時間序列的熱門股票的分析與推薦,展示模塊、邏輯處理模塊、數(shù)據(jù)模塊均部署在本地的Windows主機上,從金融網(wǎng)頁和股票API接口中的Tushare包獲取所需的數(shù)據(jù)與信息,并加以歸類與展示。本系統(tǒng)的邏輯處理模塊運行于Anaconda3內(nèi)的Python3.7環(huán)境下,使用Python語言進行設計與開發(fā),整體工作流程如圖3所示。
圖3 系統(tǒng)工作流程示意圖
用戶在本地的Windows打開系統(tǒng)后,用戶發(fā)出的請求會被展示模塊轉發(fā)至邏輯處理模塊,邏輯處理模塊會根據(jù)用戶在展示模塊的操作來對數(shù)據(jù)模塊傳遞請求,數(shù)據(jù)模塊接收到經(jīng)過業(yè)務邏輯處理模塊處理完畢后的用戶請求,會返回對應的數(shù)據(jù)給業(yè)務處理模塊,業(yè)務處理模塊收到對應的數(shù)據(jù)后會返回給展示模塊,展示模塊最終會生成相應的信息或圖表展示給用戶。
本系統(tǒng)的主頁面由用戶交互界面與三個主菜單組成,交互界面上有用戶輸入欄與開始分析按鈕。交互頁面可以顯示出用戶輸入的股票代碼的股票評價與股票分數(shù)、機構持倉情況。第一個主菜單是“股票分析”,其包含的功能依次為與深證成指對比、近期機構操作、股票預期,其中股票預期又含有股票近期趨勢和股票周期趨勢兩類。第二個主菜單是“龍虎榜”,其包含的功能為昨日龍虎榜與個股上榜,其中個股上榜又分為5日內(nèi)、10日內(nèi)、30日內(nèi)、60日內(nèi)。第三個主菜單為“實時數(shù)據(jù)”,其中含有股票看板功能。
主頁面的界面設計是通過Tkinter設計完成的,通過配置Tkinter的窗口部件來設置按鈕、文本、菜單、字體等屬性。主界面用到的窗口部件的描述與作用如表1所示。
表1 Tkinter使用項的描述與作用
本系統(tǒng)的功能切換是通過樹狀菜單來完成的,Menu窗口部件可以生成樹狀的多級菜單,每個菜單內(nèi)的選項可以指定與對應方法連接,單擊后會調用該方法,完成切換視圖與邏輯模塊的效果,Menu調用的方法及作用如表2所示。
表2 Menu調用項與其描述
在主界面上顯示的個股評價是由多個Label組件構成的,Label組件主要用于顯示文本,且Label組件使用雙緩沖,這樣可以隨時更新爬取內(nèi)容。Label調用的方法及描述如表3所示。
表3 Label調用項與其描述
圖4為交互設計流程圖,用戶在Entry定義的文本輸入框中輸入自己想分析的股票代碼,輸入完成后本系統(tǒng)會判斷用戶輸入的股票代碼是否存在。若不存在,則會彈出提示框提示用戶再次輸入;若存在,則會以Label的形式返回股票評分、股票趨勢、機構持倉情況三類信息展示給用戶,同時對股票評分進行判斷,高分的顯示紅色,低分的顯示綠色。
圖4 交互設計流程圖
與深證成指對比就相當于與大盤對比,通過與大盤的對比來判斷一個股票的走勢趨勢、股票質量。通過網(wǎng)絡獲取大盤數(shù)據(jù),與用戶指定的股票進行對比,用Matplotlib進行繪圖與展示,再通過爬蟲定向爬取金融網(wǎng)上對該股票與大盤對比的分析與評價,并輸入到圖表中。通常情況下,趨勢與大盤類似,且運行軌跡在大盤上方的股票一般質量都很高;趨勢與大盤類似且運行軌跡在大盤下方的股票一般相對穩(wěn)定,適合中長期操作;趨勢與大盤不一致的股票一般為高風險股票,適合短期操作且慎重考慮?!芭c深證成指對比”功能流程圖如圖5所示。
圖5 “與深證成指對比”功能流程圖
近期機構操作指的是近期各大證券、基金公司對該股票的操作,可以通過觀測近期機構操作來判斷一個股票的走勢趨勢、股票質量,“近期機構操作”功能流程圖如圖6所示。
圖6 “近期機構操作”功能流程圖
通過網(wǎng)絡獲取用戶指定的股票的近期機構操作,用爬蟲定向爬取金融網(wǎng)上各大機構近期對該股票的評級、時間等內(nèi)容,再用Matplotlib對數(shù)據(jù)內(nèi)容進行繪制與展示,把數(shù)據(jù)與信息傳遞給用戶。通常情況下,機構所掌握的信息與數(shù)據(jù)比普通的散戶股民要多很多,機構的總體操作是跟隨著大盤與宏觀經(jīng)濟的,相對而言,機構大量買入和增持的股票不一定會大幅增長,但一般都是質量較高的股票;機構大幅賣出或者減持的,那就需要謹慎,有可能大跌或者開始緩慢地走下坡路[6]。
該功能基于時間序列的ARIMA模型進行預測,股票預測功能中的“周期預測”功能流程圖如圖7所示。
圖7 “周期預測”功能流程圖
ARIMA模型可理解為AR+I+MA三個部分,以三個變量參數(shù)p、d、q為基準進行分析,是一種估計時間走向的模型。其中AR部分指的是Auto Regressive自回歸,描述當前值和歷史值之間的關系,AR部分用來確定p的取值,p表示滯后p階的AR模型,即當前時間點與前p個時間點的關系。在模型中通過PACF圖觀察進入置信區(qū)的數(shù)值,并以其為參考來判斷p參數(shù)的選取。I部分為確定d的取值,d表示差分的階數(shù),ARIMA模型的訓練需要相對穩(wěn)定的時間序列,所以需要將不穩(wěn)定的時間序列轉化為相對穩(wěn)定的時間序列,大部分情況下使用差分這種方式來進行轉換。差分的方法就是做差:一個數(shù)據(jù)序列中的前一項減去后一項來獲取差值序列,這是常用的一階差分。通常情況下,這種時間序列已經(jīng)趨于穩(wěn)定。MA部分指的是Moving av?erage滑動平均,描述誤差之間的關系,描述自回歸部分的誤差累計,MA部分用來確定q的取值,q表示前q個時間點的時間差,在模型中通過ACF圖觀察進入置信區(qū)的數(shù)值,并以其作為參考,來判斷p參數(shù)的選?。?]。
用戶輸入股票代碼后會獲取相關股票數(shù)據(jù),隨后對數(shù)據(jù)進行清洗與轉換,再對處理過的數(shù)據(jù)進行差分處理,將數(shù)據(jù)穩(wěn)定化后周期性提取數(shù)據(jù),接下來通過觀測周期數(shù)據(jù)的ACF圖與PACF進入置信區(qū)的數(shù)值來確定p與q,然后利用arima_model庫內(nèi)的ARIMA函數(shù)進行模型的訓練,最后用Matplotlib生成預測圖展示給用戶。
“龍虎榜”是指日價格漲幅偏離值7%、日換手率達到20%、日價格振幅達到15%、連續(xù)三個交易日內(nèi)漲幅偏離值累計達到20%的股票匯總,在龍虎榜上的股票并不全是優(yōu)質股,但這些股票最能直接反映整個市場的變化,通過分析龍虎榜上的股票可以間接地獲取當前市場變化趨勢,為下一次的投資獲取更多的信息。
5.6.1 “昨日龍虎榜”功能設計
該功能通過股票API接口進行數(shù)據(jù)獲取,用戶可以通過“昨日龍虎榜”來獲取昨天的龍虎榜信息。 “昨日龍虎榜”功能流程圖如圖8所示。
圖8 “昨日龍虎榜”功能流程圖
5.6.2 “個股上榜統(tǒng)計”功能設計
該功能通過股票API接口進行數(shù)據(jù)獲取,用戶可以通過“個股上榜統(tǒng)計”來獲取5日、10日、30日、60日中股票上榜次數(shù)前二十的股票信息。“個股上榜統(tǒng)計”功能流程圖如圖9所示。
圖9 “個股上榜統(tǒng)計”功能流程圖
股票看板對接的數(shù)據(jù)網(wǎng)接口是實時信息,實時獲取股票的各項數(shù)據(jù)指標,動態(tài)獲取股民最常觀測的數(shù)據(jù),如大盤信息、單股價格、股價漲幅等,經(jīng)過清洗與整理后存放在準備好的模板中,由模板頁生成視圖展示給用戶?!肮善笨窗濉惫δ芰鞒虉D如圖10所示。
圖10 “股票看板”功能流程圖
圖11為系統(tǒng)實現(xiàn)環(huán)境,本系統(tǒng)基于Ana?conda中的Python3.7環(huán)境下實現(xiàn),軟件界面設計友好、實用性強、可管理性與可維護性高。
圖11 軟件實現(xiàn)環(huán)境
在PyCharm Community Edition 2020.1平臺下完成系統(tǒng)的開發(fā)與設計,在該平臺工具下,可以實現(xiàn)Python相關程序的開發(fā)、優(yōu)化以及整合。Anaconda能夠兼容Python的開源代碼及各類的API接口和安裝包,降低了開發(fā)人員的工作量。通過采取優(yōu)化代碼、整合重復內(nèi)容等措施,能夠保證本系統(tǒng)在高效且平穩(wěn)的狀態(tài)下運行,具備較強的安全性、可拓展性和穩(wěn)定性。對于具體硬件的選擇,本系統(tǒng)對硬件配置的要求不高,但須保證軟件可以在MicrosoftWindows XP、Microsoft Windows 7、Microsoft Windows 8、Microsoft Windows 10及微軟下一代操作系統(tǒng)中運行。
通過ARIMA模型來預測股票三個月后的趨勢,從股票API庫Tushare中選擇2019年1月至今的數(shù)據(jù)為數(shù)據(jù)集,隨后將數(shù)據(jù)類型進行轉換,對轉換后的數(shù)據(jù)集進行一階差分穩(wěn)定化處理,然后以周二為基準點按周進行數(shù)據(jù)提取,提取完成后用auto_arima函數(shù)對數(shù)據(jù)集求導,得出最優(yōu)的q值與p值,接著用ARIMA進行模型訓練,生成預測值,最后以Matplotlib繪制成圖片展示給用戶。“股票周期趨勢”功能核心代碼如下:
本文設計與實現(xiàn)了基于時間序列的熱門股票分析與推薦系統(tǒng),利用各個金融網(wǎng)的各類股票數(shù)據(jù)、股票指標、股票分析評價等,先將所需的股票數(shù)據(jù)爬取下來,再配合Anaconda3中Python的科學分析庫,輔以Matplotlib生成可視化圖片,最后用Tkinter制作界面。主要內(nèi)容包括以下幾個方面:
(1)對現(xiàn)有的股票交易過程進行了分析,對系統(tǒng)設計的關鍵技術進行了研究。
(2)本設計的主要目標是完成一個股票分析與推薦的系統(tǒng),因此研究了大數(shù)據(jù)時代背景下的股民在股票交易過程中對股票買賣因素,并根據(jù)選取股票的場景設計開發(fā)出了具體的功能模塊。
(3)本設計實現(xiàn)了股票信息與數(shù)據(jù)的傳遞,簡化股民股票交易過程的信息攝取,為股民的投資決策提供了科學的依據(jù),達到了預期的目標。
同時也存在一些需要改進的方面:
(1)在股票數(shù)據(jù)分析的數(shù)據(jù)轉換過程中,并沒有對股票市場的所有技術指標進行數(shù)據(jù)轉換,只是提取了用戶最為關注的幾個分析點。因此,在股票數(shù)據(jù)分析未來的更新過程中,需要對各項分析指標進行更全面的更新與轉換。
(2)股票交易環(huán)節(jié)中存在著對交易環(huán)節(jié)影響很深的市場情緒因素,這一點需要進行觀測與捕捉,應嘗試分析輿論中的情緒因素與經(jīng)濟總體趨勢因素對股票的影響。
(3)在股票數(shù)據(jù)分析與推薦的功能中,還需對數(shù)據(jù)分析部分的算法進行進一步的優(yōu)化,或者提供更加優(yōu)秀且穩(wěn)定的算法,這樣才能夠提供給股民更加科學、合理的股票數(shù)據(jù)信息。