3
機器學習是什么?
簡單說:機器學習算法是一類從數(shù)據(jù)中自動分析獲得規(guī)律,并利用規(guī)律對未知數(shù)據(jù)進行預測的算法。
用一張圖說明它所包含的內(nèi)容:
編者注:這張圖比較大,想看清晰的可以戳這里。其實看不清也沒有關系,這張圖是個基本的脈絡,本文的重點不是在這里,雷鋒網(wǎng)后續(xù)會出相關科普文章,屆時會有詳細解說。
我們把目光集中到上圖中的有監(jiān)督學習,它是指數(shù)據(jù)中包括了我們想預測的屬性,有監(jiān)督學習有以下兩類:
分類(Classification)——樣本屬于兩個或多個類別,我們希望通過從已標記類別的數(shù)據(jù)學習,來預測未標記數(shù)據(jù)的分類。例如,識別手寫數(shù)字就是一個分類問題,其目標是將每個輸入向量對應到有窮的數(shù)字類別。從另一種角度來思考,分類是一種有監(jiān)督學習的離散(相對于連續(xù))形式,對于n個樣本,一方有對應的有限個類別數(shù)量,另一方則試圖標記樣本并分配到正確的類別。
回歸(Regression)——如果希望的輸出是一個或多個連續(xù)的變量,那么這項任務被稱作回歸,比如用年齡和體重的函數(shù)來預測三文魚的長度。
scikit-learn
scikit-learn是一個基于NumPy、SciPy、Matplotlib的機器學習包,主要涵蓋了分類、回歸和聚類等機器學習算法。例如knn、SVM、邏輯回歸、樸素貝葉斯、隨機森林、k-means等等,簡言之:是一只強大的輪子。
有個很好耍的例子:安德森鳶尾花品種亞屬預測。
我們有一百五十個鳶尾花的一些尺寸觀測值:萼片長度、寬度,花瓣長度和寬度。還有它們的亞屬:山鳶尾(Iris setosa)、變色鳶尾(Iris versicolor)和維吉尼亞鳶尾(Iris virginica)。我們使用這些數(shù)據(jù),從中學習并預測一個新的數(shù)據(jù)。在scikit-learn中,通過創(chuàng)建一個估計器(estimator)從已經(jīng)存在的數(shù)據(jù)學習,并且調(diào)用它的fit(X,Y)方法。
代碼如下:
看不懂代碼沒關系,這里的輸出結果:array([0])。
即學習結果認為,萼片長度、寬度,花瓣長度和寬度觀測值分別為5.0, 3.6, 1.3, 0.25的安德森鳶尾花的亞屬為山鳶尾(Iris setosa)。
我的目標是親自實現(xiàn)驗證體會機器學習做市場預測這一構建過程,順帶瞧瞧這玩意兒是不是文獻或是研報中“傳說”的那么神或是然無卵。
那么,機器學習在量化金融方面怎么用?比如說,預測股票這件事兒靠譜么?
首先,我們得熟悉我們的數(shù)據(jù)。獲取過去十年CSI300指數(shù)原始數(shù)據(jù)(代碼開發(fā)環(huán)境 Ipython Notebook):df = rd.get_price('CSI300.INDX', '2005-01-01', '2015-07-25').reset_index()[['OpeningPx', 'ClosingPx']]
有了開收盤價格后,我們把原始數(shù)據(jù)這般那般后,有了下面三張圖。
圖一:
(過去近2500個交易日,當天是漲是跌天數(shù)的統(tǒng)計)
圖二:
(每日收益率隨時間序列的變化)
圖三:
(漲跌天數(shù)的頻率分布)
有興趣的盆友可以仔細看看圖,里面有很有趣的東西。熟悉了數(shù)據(jù)之后就可以正式開工了,我主要從以下三點來做些嘗試:
1、機器學習估計器的選擇,即我們使用何種方法進行我們的預測。
2、訓練集樣本數(shù)量的選擇,即我們每次預測結果之前使用多少條訓練集合的樣本。
3、漲跌時間窗口的選擇,即我們每個樣本中的特征個數(shù),我們訓練集每個單元包含連續(xù)多少個交易日的漲跌。
下面具體說:
1、根據(jù)手頭數(shù)據(jù)的情況及scikit-learn: machine learning in Python中下圖所示的引導:
我們選擇比較RandomForestClassifier、LinearSVC、KNeighborsClassifier,結果如下:
可以看出,KNeighborsClassifier表現(xiàn)明顯遜于RandomForestClassifier、LinearSVC,它的波動較大且勝率與另外兩者比也不理想。這結果與JMLR的一篇神奇文章有點類似:《 Do we Need Hundreds of Classifiers to Solve Real World Classification Problems?》,文章測試了179種分類模型在UCI所有的121個數(shù)據(jù)上的性能,發(fā)現(xiàn)Random Forests 和 SVM 性能最好。
2、訓練集樣本數(shù)制約了預測結果的準確性,理想情況下,我希望每次做預測的樣本數(shù)越多越好,但你知道理想很骨感的,訓練集樣本數(shù)一方面受實際總數(shù)據(jù)量限制。
另外,計算資源與時間也是制約因素。我們最終要形成某種程度的妥協(xié),即保證相當程度預測效果下選擇最小的訓練集樣本數(shù)量。于是我們計算樣本數(shù)從1~300范圍內(nèi)的勝率,結果如下:
可以看出,控制其它條件不變,隨著樣本數(shù)增多,勝率逐步提高結果更為穩(wěn)定并且最后維持在0.52~0.53左右波動。為了節(jié)約計算資源及考慮到歷史數(shù)據(jù)總量,我們可以選擇100個作為訓練樣本數(shù)。
3、漲跌時間窗口選擇。實際上反映了交易日歷史的漲跌對下一個交易日的影響。
這個動量是否客觀存在?我認為從交易心理上說還是有一定依據(jù)的,比如作為交易者如果過去一連10個交易日全部飄紅,對于后一天的走勢我更愿意謹慎看空。當然,這是個極端的臆想,歸根結底的表現(xiàn)怎么樣,還是要看數(shù)據(jù)給的答案:
這樣的結果讓人抓狂,有點看亂碼的感覺。后來我改變了每次回測的起點之后發(fā)現(xiàn),基本每次結果都差不多。一個共同點是:每次曲線的開端都會存在倒塌式下滑,而后穩(wěn)定震蕩于0.5扔硬幣的概率左右。
也就是說,動量是存在的,只不過很?。ńY合前面兩節(jié)的試驗結果其期望處于0.53這個位置),且時間窗口很短,超出這個時間窗口,預測問題就轉(zhuǎn)化為扔硬幣問題。
上面就是我對機器學習在金融市場的預測應用做的一個小試驗,綜合三張圖的結果來看。其實概率還能勉強說比純拋硬幣好那么一丟丟(低于0.5的情況并不多見,調(diào)試程序的時候發(fā)現(xiàn)0.53是個神奇的數(shù)字),但這畢竟是我快速自己實現(xiàn)的一個小Demo??梢韵胂?,如果有更優(yōu)秀的算法,更豐富的數(shù)據(jù),更合理的特征選擇,意想不到的結果也會是情理之中。
經(jīng)過自己的嘗試后我想機器學習在金融市場的預測應用既不會那么神,也不能說它無卵用,我相信圣杯的存在,在某一你未發(fā)現(xiàn)的細節(jié)之中。
【作者介紹】easunlu,數(shù)據(jù)工程師,愛好機器學習,在機器學習金融應用方面有一定的研究。關于機器學習更多談論,可以進入這里查看:Ipython Notebook Research Alpha下機器學習一瞥,關于跌跌漲漲的思考 。也歡迎機器學習愛好者積極留言,與作者進行探討。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。