做者在自學機器學習的過程當中,嘗試開發了一個基於機器學習的A股選股工具。本文是在赤兔的「數據挖掘」小組分享的這次開發過程和心得體會的整理。python
股票價格的可預測性——工具的意義git
關於股票價格的可預測性,我想引入有效市場假說(EMH)。大體的意思就是像股市這樣的系統,全部的信息都應該反映在價格變化裏面了。github
基於此,由於基本面、政策面信息已經囊括在價格變化裏面了,單純從技術面作分析理論上是可行的。不過目前確實尚未任何一種工具或者技術能徹底預測和打敗市場。算法
就選股工具而言,由於股票的數目衆多,天天都有新的變化,其目的主要是替代一部分人工重複勞動,節約成本。沒有「磚家」能夠徹底預測股價,雖然工具也不太可能,可是隻要作到和人同樣好,甚至更好,就有價值。數據庫
A股選股器開發過程微信
數據來源網絡
就財經類的數據而言,如今各大門戶網站都有專門的頻道,信息不少,若是對實時要求高,經過爬蟲取其中有用的部分應該是一個辦法。
機器學習
另外,經過搜索引擎,能夠發現前輩們總結出的一些public的接口,也能夠取到一些數據。我在開發這個工具的時候用的是叫作tushare的一個python接口。它是免費的,提供結構化的數據,感受天天更新也挺快。函數
預處理工具
拿到數據後第一步是作預處理。我認爲股票的數據主要是作歸一化,使得不一樣股票具備可比性。好比漲幅百分比,復權等等。
「復權」的意思是:股票除權、除息以後,股價會發生較大幅度的躍變,這種看似價格變化,實際持股成本並不變化。復權就是對股價和成交量進行權息修復。
數據拿到後,由於只會有1張表,所以選擇了一個NoSQL數據庫來存儲。大概8年2000多隻股票,有300萬條數據左右。
傳統算法建模
建模的第一步嘗試是基於傳統的算法。首先是選取和計算特徵值,漲幅,交易量,boll指標,橫盤狀態等等。關於這些指標的含義,有興趣的朋友能夠去搜索一下,都不太難,用基本的統計學知識就能夠計算。
這些特徵值都有之後,能夠基於人爲經驗設計一些基本的過濾器,好比PPT中的圖片就描述了一種可能的篩選條件。
我相信證券專業人士必定有更好的基於經驗的篩選條件,但願也能夠分享出來我學習下。可是在個人實驗中,基於人的經驗來設計過濾器,準確率並不高,50%多一點,也就是比隨機的選股稍微好一點。
機器學習建模
接下來考慮選取合適的機器學習算法。機器學習的算法不少,對於算法選取,個人考慮主要是這樣的。
線性迴歸模型偏簡單,而股市不該該是線性的。
由於非線性,支持向量機(SVM)的核函數和參數的選取也會比較難。
對於神經網絡,確實是在財經領域用的不少的算法,當初沒有選擇由於本身的計算資源有限,擔憂訓練的難度較大。
最終選擇用決策樹的緣由是模型算法都比較成熟,訓練的計算複雜度也在本身可接受範圍內。
對算法有研究的朋友歡迎評論本文,一塊兒探討下。
決策樹建模
對決策樹算法,我沿用了傳統算法的特徵值,也就是對於描述模型的數據指標,和傳統算法是同樣的。
樣本訓練用了WEKA這個工具,具體算法選擇的是C4.5。決策樹的算法確實也有多種選擇,C4.5是其中一種比較成熟的算法。
上面截圖裏面是訓練出的其中一棵決策樹,python描述的,代碼有60000多行。
驗證模型
先說準確率。某一個交易日的準確率等於,工具預測的股票在下一個交易日確實上漲的個數佔總的推薦股票個數的比例。對若干個交易日的準確率取一個平均,能夠獲得模型的準確率。
而召回率在這裏是工具預測的股票在下一個交易日確實上漲的個數佔整個股市中股票上漲個數的比例。應該不難理解,對於選股工具咱們應該更關心準確率。
改進模型
爲了提升準確率,在開發過程當中,我作了下面這些改進嘗試:
一個是擴大樣本。最初是用了最近3年的數據,後來考慮到A股從2007年到2015年剛好走過了一個上漲到降低再到上漲的完整週期,所以擴大到了8年的數據。
再是對算法的改進,我嘗試引入了「推薦指數」的概念。由於原本決策樹只作分類,而利用推薦指數能夠看得出來哪些更好,哪些是通常好。
還有是考慮對樣本進行分類訓練,好比按照板塊,行業等等,由於有理由認爲同一類股票的價格變化規律會更爲接近。
請你們先看看上圖右邊的表格的黑色字體部分。大部分交易日的準確率在80%以上。所以相比於傳統算法,效果確實好了一些。
而後能夠注意一下表格紅色字體的日期。其實這些紅色的日期,有至關一部分是股災日。股災日常常是「千股跌停」,上漲的股票太少了…能夠看出在這些「股災日」的時候,模型也不太準確,出現了失真。
總結與心得
選股工具利用機器學習算法,通常狀況下比傳統的算法(或者人爲經驗)的準確率高。
推薦的股票雖然不必定都會上漲,可是其實人工再去看的話,也會發現他們的曲線和指標看起來是確實不錯的(儘管誰都不肯定下一個交易日是漲仍是跌)。
因此我認爲,本工具幫助人天天去海量的篩選股票應該是可行的,短線操做人員能夠基於本工具的推薦再作進一步的綜合決策。
最後是一些心得體會分享給你們:
第一,我以爲建模的特徵值選取其實挺關鍵的,若是之後要作進一步的改進或者開發別的系統,我會花更多時間來作這個。
第二,股災日的模型失真與數據顆粒度的關係。本工具旨在作短線推薦,即推薦下一交易日上漲機率較大的股票。
個人數據都是以交易日爲單位的,因此很難體現較短期內的信號變化,好比忽然的跟風拋售會形成放量下跌。若是提升顆粒度到小時或者分鐘,也許會更好些,不過那樣數據量也會multiply。
第三,股票天天都有新的數據進來,如何使用這些增量數據而不用從新訓練,這個多是將來須要考慮的問題。
我之前看到過有增量的決策樹以及增量學習的神經網絡,有可能更加適用。
第四,開發過程當中碰到了python的解析器的侷限,讀取決策樹的時候程序crash,後來想辦法繞開了。
因爲是工做之餘作的,我可以花在整個項目的時間仍是頗有限。邊學邊寫,比較倉促。
你們能夠去 https://github.com/josephzhong/stock 獲取源碼。
本文分享自微信公衆號 - 悅思悅讀(yuesiyuedu)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。