機器學習可以預測股票走向,靠譜么?

jopen 9年前發布 | 24K 次閱讀 機器學習

機器學習可以預測股票走向,靠譜么?

機器學習是什么?

簡單說:機器學習算法是一類從數據中自動分析獲得規律,并利用規律對未知數據進行預測的算法。

用一張圖說明它所包含的內容:

機器學習可以預測股票走向,靠譜么?

編者注:這張圖比較大,想看清晰的可以戳這里。其實看不清也沒有關系,這張圖是個基本的脈絡,本文的重點不是在這里,雷鋒網后續會出相關科普文章,屆時會有詳細解說。

我們把目光集中到上圖中的有監督學習,它是指數據中包括了我們想預測的屬性,有監督學習有以下兩類:

分類(Classification)——樣本屬于兩個或多個類別,我們希望通過從已標記類別的數據學習,來預測未標記數據的分類。例如,識別手寫 數字就是一個分類問題,其目標是將每個輸入向量對應到有窮的數字類別。從另一種角度來思考,分類是一種有監督學習的離散(相對于連續)形式,對于n個樣 本,一方有對應的有限個類別數量,另一方則試圖標記樣本并分配到正確的類別。

回歸(Regression)——如果希望的輸出是一個或多個連續的變量,那么這項任務被稱作回歸,比如用年齡和體重的函數來預測三文魚的長度。

scikit-learn

scikit-learn 是一個基于 NumPy、SciPy、Matplotlib 的機器學習包,主要涵蓋了分類、回歸和聚類等機器學習算法。例如 knn、SVM、邏輯回歸、樸素貝葉斯、隨機森林、k-means 等等,簡言之:是一只強大的輪子。

有個很好耍的例子:安德森鳶尾花品種亞屬預測。

我們有一百五十個鳶尾花的一些尺寸觀測值:萼片長度、寬度,花瓣長度和寬度。還有它們的亞屬:山鳶尾(Iris setosa)、變色鳶尾(Iris versicolor)和維吉尼亞鳶尾(Iris virginica)。我們使用這些數據,從中學習并預測一個新的數據。在 scikit-learn 中,通過創建一個估計器(estimator)從已經存在的數據學習,并且調用它的 fit (X,Y)方法。

代碼如下:

機器學習可以預測股票走向,靠譜么?

看不懂代碼沒關系,這里的輸出結果:array ([0])。

即學習結果認為,萼片長度、寬度,花瓣長度和寬度觀測值分別為 5.0, 3.6, 1.3, 0.25 的安德森鳶尾花的亞屬為山鳶尾(Iris setosa)。

我的目標是親自實現驗證體會機器學習做市場預測這一構建過程,順帶瞧瞧這玩意兒是不是文獻或是研報中“傳說”的那么神或是然無卵。

那么,機器學習在量化金融方面怎么用?比如說,預測股票這件事兒靠譜么?

首先,我們得熟悉我們的數據。獲取過去十年 CSI300 指數原始數據(代碼開發環境  Ipython Notebook):df = rd.get_price ('CSI300.INDX', '2005-01-01', '2015-07-25') .reset_index ()[['OpeningPx', 'ClosingPx']]

有了開收盤價格后,我們把原始數據這般那般后,有了下面三張圖。

圖一:

機器學習可以預測股票走向,靠譜么?

(過去近 2500 個交易日,當天是漲是跌天數的統計)

圖二:

機器學習可以預測股票走向,靠譜么?

(每日收益率隨時間序列的變化)

圖三:

機器學習可以預測股票走向,靠譜么?

(漲跌天數的頻率分布)

有興趣的盆友可以仔細看看圖,里面有很有趣的東西。熟悉了數據之后就可以正式開工了,我主要從以下三點來做些嘗試:

1、機器學習估計器的選擇,即我們使用何種方法進行我們的預測。

2、訓練集樣本數量的選擇,即我們每次預測結果之前使用多少條訓練集合的樣本。

3、漲跌時間窗口的選擇,即我們每個樣本中的特征個數,我們訓練集每個單元包含連續多少個交易日的漲跌。

下面具體說:

1、根據手頭數據的情況及 scikit-learn: machine learning in Python 中下圖所示的引導:

機器學習可以預測股票走向,靠譜么?

我們選擇比較 RandomForestClassifier、LinearSVC、KNeighborsClassifier,結果如下:

機器學習可以預測股票走向,靠譜么?

可以看出,KNeighborsClassifier 表現明顯遜于 RandomForestClassifier、LinearSVC,它的波動較大且勝率與另外兩者比也不理想。這結果與 JMLR 的一篇神奇文章有點類似:《 Do we Need Hundreds of Classifiers to Solve Real World Classification Problems?》,文章測試了 179 種分類模型在 UCI 所有的 121 個數據上的性能,發現 Random Forests 和 SVM 性能最好。

2、訓練集樣本數制約了預測結果的準確性,理想情況下,我希望每次做預測的樣本數越多越好,但你知道理想很骨感的,訓練集樣本數一方面受實際總數據量限制。

另外,計算資源與時間也是制約因素。我們最終要形成某種程度的妥協,即保證相當程度預測效果下選擇最小的訓練集樣本數量。于是我們計算樣本數從1~300 范圍內的勝率,結果如下:

機器學習可以預測股票走向,靠譜么?

可以看出,控制其它條件不變,隨著樣本數增多,勝率逐步提高結果更為穩定并且最后維持在 0.52~0.53 左右波動。為了節約計算資源及考慮到歷史數據總量,我們可以選擇 100 個作為訓練樣本數。

3、漲跌時間窗口選擇。實際上反映了交易日歷史的漲跌對下一個交易日的影響。

這個動量是否客觀存在?我認為從交易心理上說還是有一定依據的,比如作為交易者如果過去一連 10 個交易日全部飄紅,對于后一天的走勢我更愿意謹慎看空。當然,這是個極端的臆想,歸根結底的表現怎么樣,還是要看數據給的答案:

機器學習可以預測股票走向,靠譜么?

這樣的結果讓人抓狂,有點看亂碼的感覺。后來我改變了每次回測的起點之后發現,基本每次結果都差不多。一個共同點是:每次曲線的開端都會存在倒塌式下滑,而后穩定震蕩于 0.5 扔硬幣的概率左右。

也就是說,動量是存在的,只不過很小(結合前面兩節的試驗結果其期望處于 0.53 這個位置),且時間窗口很短,超出這個時間窗口,預測問題就轉化為扔硬幣問題。

上面就是我對機器學習在金融市場的預測應用做的一個小試驗,綜合三張圖的結果來看。其實概率還能勉強說比純拋硬幣好那么一丟丟(低于 0.5 的情況并不多見,調試程序的時候發現 0.53 是個神奇的數字),但這畢竟是我快速自己實現的一個小 Demo。可以想像,如果有更優秀的算法,更豐富的數據,更合理的特征選擇,意想不到的結果也會是情理之中。

經過自己的嘗試后我想機器學習在金融市場的預測應用既不會那么神,也不能說它無卵用,我相信圣杯的存在,在某一你未發現的細節之中。

【作者介紹】easunlu,數據工程師,愛好機器學習,在機器學習金融應用方面有一定的研究。關于機器學習更多談論,可以進入這里查看:Ipython Notebook Research Alpha 下機器學習一瞥,關于跌跌漲漲的思考 。也歡迎機器學習愛好者積極留言,與作者進行探討。

來自: 雷鋒網
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!