論文導讀:機器學習與基因演算法選股

feature selection 是機器學習中非常重要的一環,尤其是財經領域的程式交易部分,因為財經領域有各式各樣的指標,又有財報、技術指標,這些指標高達尚千種,要如何選擇features,才能更有效預測股價?

今天介紹一篇論文,使用了基因演算法來幫忙選擇features,以下是更進一步的介紹:

thumbnail 1

對於machine learning的程式交易演算法來說,
首先要有features,features可以想像成是指標,每一支股票都會有其features。
另外還有labels,也就是我們希望能夠預測的數值,例如股價漲跌的幅度,或是sharp ratio。

只要有了features跟labels,剩下的就簡單了,只要把這些features跟labels都輸入到一個黑盒子裡面,讓它學習,學成之後,只需要每次給它新的features,它就會預判label是多少。這個黑盒子通常稱為model,model有很多種類,最常見的就是deep neural network或是 random forest ,這些我們待會會簡單的介紹。

本篇論文在選擇features的階段,使用了基因演算法,由於財報、技術指標的數字有上千種,該如何選擇呢?第一步驟就是就全部都選擇吧!反正基因演算法會找出有用的features並且刪除無用的,至於基因演算法是如何做到的?它是模仿達爾文物競天擇的方式來找出有用的features:

第一步:決定染色體

以數學的方式描述,染色體是一條一維向量,其長度為所有features的長度,其數值為0或1,0代表不選入該feature,1代表選入該feature。

一開始會隨機製作出100條染色體,想必效果就是很隨機的,不是很好。
然而生物是會進化的,適者生存、不適者淘汰,要怎麼定義要淘汰的染色體呢?

crossover bits

第二步:決定染色體的成績

每一種染色體都代表一組features的選擇,單一染色體拿出來,用染色體所選入的features進行機器學習,最後評估機器學習的成果。在論文中,是使用AUC來當作每個染色體的成績。

當然這時就可以進行適者生存、不適者淘汰的步驟,選出100個成績比較好的染色體,成績越好的染色體越有機會被選出來,但是也有可能成績很好但懷才不遇被篩選掉,這邊此文並沒有很明確的說明機制是什麼,實作上也有很多種方法,最簡單就是直接選成績最好的100個染色體。

selection

這個目的在於,基因演算法的最後,我們希望選出一條染色體,其AUC算出來是最高的,代表它能夠很有效的分別出會漲的股票跟會跌的股票。

第三步:交叉遺傳

我們會由現有的染色體,藉由排列組合,產生更多的染色體,具體的做法是:產生新的20條染色體,每條染色體皆由某兩條現有染色體的片段所組成,例如染色體的上半部和下半部是由不同染色體所提供的。

crossover

第四步:變異

這個步驟中,這120條染色體會稍微的被隨機修改,每條染色體有10%的機率,其當中的一個bit會被反轉(由0變成1,或是1變成0)

mutation

上圖是一個三個bit變異的例子,有很多種的變異方式,本文中一次只更動一個bit而已。

回到第二步,開始生物演化的循環

每經過一次2、3、4步驟,就像是完成了一個世代,隨著是帶的變遷,平均來說,AUC的成績應該會越來越好,直到AUC的成績不再進步,就可以停止演化的過程。而其成果就是步驟二中,選出擁有最高的AUC的染色體,代表這些被選到的features組合在一起,預測能力是最強的!

evolution

機器學習

我們剛剛有說的,機器學習的model就像是黑盒子一樣,文中主要使用兩種model:deep neural network和random forest,都是非常常見的model,兩種model都有其優缺點,不一定哪個比較好。所以本文也提出了stacking的方式,將這兩種黑盒子的結果取平均,得出最後的答案,結果發現比單獨使用這兩種model更好。

總結

我個人是滿好奇features沒有經過normalize就跑DNN不會有問題嗎?滿奇怪的,感覺DNN應該要額外再preprocessing一下,但是文中並沒有提到,就當作作者忘記說明好了。

我以前的做法是自己憑經驗找有效的features並且放進去測試,這篇文章使用了基因演算法來幫助大家篩選features,進行程式交易,大量的降低了人工feature engineering的時間,當然電腦也是要算很久,雖然我沒試過,但以普通單機電腦來說,估計要好幾天才能跑出最佳解。個人認為這篇論文實做起來是有效的。

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!