跳至主要內容
FinLab

讓 Machine Learning 幫你看財報!用隨機森林篩選股票

機器學習不是我很專攻的領域,但幸好現在很多強大的 package,可以直接使用,假如你不想深入開發 model 的話,只要把它當作黑盒子就好了,把它插上插頭,讓資料流進去、流出來。很簡單!

讓 Machine Learning 幫你看財報的縮圖

免費訓練資料

最下方免費有獲得 2 萬筆訓練資料的方式,在坊間一定是要賣錢的,甚至連課程一起賣,但我想說算了啦,反正我就是個草根碼農 XDD,希望大家可以一起互相切磋。

之前寫的策略,選股方式都是用條件拼湊的:

用條件拼湊的選股方式程式碼截圖

但是現在用 machine learning 的話,就會寫成這樣:

用 machine learning 的選股寫法程式碼截圖

這邊用的是分類(classification),假如覺得會上漲,就是 1,會下跌就是 0。 上面的 f 就是機器學習的 model,我們不太知道這個是個怎樣的函數,因為這個 model 不是一個公式,而是經過資料訓練而來的。這個簡單的範例只有 2 個 features:ROE、PB。只是一個例子而已,下面會有更多的 features:

資料

資料是從 2010 年底,到 2017 年,每次財報截止的隔天買入,並在下次財報截止前賣出。 至於 features 就是用之前寫文章,覺得好用的:

  • 月營收 買入前 12 個月
  • ROE 買入前 12 季財報
  • 本益比 買入前一天
  • 股價淨值比 買入前一天
  • 殖利率 最近一期
  • 股價是否大於季線
  • 股價是否大於半年線
  • 負債比率 買入前 12 季財報

可以到這裡下載歷史資料,假如有人訓練的比我的好的話(應該滿簡單的),歡迎一起討論,我們可以一起合作建構一個初版的平台,或是有人想要 train 不同的 feature,也歡迎留言給我。

除了上述的 features,每筆資料還包含:

  • stock_ID 股票的代號
  • buy_date 買入日期
  • buy_price 買入開盤價
  • sell_date 賣出開盤價
  • sell_price 賣出價格
  • gain 賣出價/買入價

不確定這些歷史數據,有沒有錯,假如不放心,可以幫我稍微檢驗一下,另外,關於買賣日期,我是參考 IFRS 制度上市前後不同的財報截止日,然而有些企業遲交財報,就沒辦法了…所以會包含一點未來數據。

這篇文章有講到財報遲交的公司,還是別買的好,而每年大約只有 100 家公司會遲交財報,以整體資料而言,未來數據應該不會太多(我覺得啦 XD,但不知道資料科學家們怎麼看就是了)。

資料僅供學術發展,請勿用於商業用途!

訓練 model 的方式

由於我想要弄一個快速的 prototype,所以先使用 random forest model,這樣就不用 pre-processing 了 XDD

Model

顯示程式碼
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=None, class_weight='balanced')

以上是用 sklearn 裡的模型,連參數什麼都沒給,這樣的效果還 OK 了。訓練時,training data 使用 2014 年以前的資料,而 test data 是 2015 年以後的資料

結果太好了,我不敢相信…

以下是還沒篩選前的獲利分佈圖,這邊的獲利是用倍數來衡量,也就是 賣出價格/買入價格。可以看到,這是一個對稱於 1 的分佈圖,大於 1(賺)跟小於 1(賠)其實很接近,其平均值是在 1.005 左右,你有看到一藍藍的地方嗎?那就是篩選後的標的:

篩選前的獲利倍數分佈圖

下面我們把藍色的地方直接畫一張圖,可以發現篩選後,發現結果好很多,分佈偏向大於 1,也就是很多的選擇是有獲利的!

篩選後的獲利倍數分佈圖

平均來到了 1.10 左右,代表每季買一群股票,平均來說會賺 10%左右。且勝率來到了 70.2%

對於這樣的結果,我感到有點難過,因為成果太好代表裡面一定有什麼問題,我還是抱著懷疑的態度,各位可以做最嚴格的檢驗,機器學習不是我的專長,願意虛心受教,或是你還希望有什麼額外的 features 呢?我幾乎都可以幫你生成客製的 test data 喔!

附註:免費取得訓練資料

取得資料的方法很簡單,幫冷清的寒舍小小宣傳一下:

  1. 按右下角分享於 FB
  2. 將分享截圖傳到 [email protected]
  3. 一兩天內即可獲得 data.csv!

依照本 blog 的含金量、data.csv 的完整程度,你一定不會後悔的!

詳細的 python 教學:利用 Machine-Learning 選股新手教學

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始