實作財報選股及回測 — Experiment
twquant 已發布囉! 在 terminal 輸入 pip install twquant 即可安裝
We’ve talked about how to retrieve clean data from free resource, and this topic is about how we extract diamond from data.
Let’s go.
Prepare Data For BackTesting
先前的文章中示範了將財務三表產生的指標整合在一起的方法,最後產生的結果如下圖
接下來我們要計算財務比率的年增長比率 (YOY),並結合「除權息資料」來計算「個股報酬率」
前述步驟的意義在於,取得所有所需要的 [X]->財務指標 / [Y]->報酬率,也就是說,整份資料終於開始像一個乾淨且邏輯關係清楚的資料,如常見的 Iris / Titanic / Boston House,可以被探討應變數與依變數的關係
Compute Indicator Annually Growth
財務數據的其中一項應用準則:增長(年增率)比當下的數據重要,現在我們要將歷年的資料合併運算,以取得「財務指標年增率」
- 計算年增率
這部分的邏輯很簡單,選擇欲計算的指標,取得當年與前一年的資料,加減乘除,之後寫入進表格
這裡進行運算是 add_indicator_growth 這 function,請注意 1st argument 放當年的資料,2nd argument 放前一年的資料
Compute Adjusted Price
每個人都知道年報酬率 = (隔年價格-當年價格)/當年價格,但理解「隔年價格」應該要用「還原除權息」及 「還原減資」 後價格來計算的人並不多。這部分詳細可以 google 或參考 何謂還原股價 / 為何要「現金減資」,總之這計算是有必要的,特別是在公司發放股票股利或進行過減資時,股價在還原前後會有巨大的差異,連財務比率都會有巨幅波動。
- Example of Capital Reduction
假設我們用 ROE 成長率>25%當條件挑選股票,2017 年的財報會挑出上圖這間公司 ,該公司在當年的股價從 7.7 上漲到 13.15,報酬率過70% — 這難道不是飆股嗎?- 但當你還原減資的比例後,實際上股價反而是只剩下6.58 ,報酬率根本是負數
上述事件在財報選股是個常見的誤區 —
某些財報數字要經過加工來還原企業真實的狀況,而當你沒有做這件事,就會用缺陷的資料推導出錯誤的結論
比如這個狀況,會讓人相信 ROE 成長率>25%是個挑出飆股的好指標,但事實上因為減資的股票很容易讓帳面上股價大幅上升,公司的價值(i.e. 100*1000=200*500)並沒有增加,所以當你真的拿這個指標去實戰就會賠得亂七八糟
這邊 code 請見 AdjPrice,因為邏輯滿複雜的就不細講
Download Data To Local Directory
BackTesting 處理 [財務指標 — 還原價格 — 計算報酬] 這一系列的邏輯,在呼叫前必須在同一層資料夾下準備好檔案,這邊有一個打包好的 function [download] 可以一次把需要的檔案都抓好
按上圖輸入即可,年份的部分,可以依需求去修改
Model — Rule Based
資料到位,接下來就可以做回測了。回測事實上就是定義「某種方式」來選出個股,類似自己組一隻ETF,之後比較清單內個股當年價格及次年還原價格,計算總加權報酬率
比如說先隨意抓幾個指標並訂條件
呼叫function,看這個條件上選出來的股票在 2014 年表現
感覺很廢 XD,那麼跨年份呢?
一樣滿爛的哈哈
Test For Common Indicators
讓我們來看看幾個常見指標實際上有沒有用
- 高 ROE
除了大多頭的2012–2013年賺錢,接下來的年度全都遜於台灣50
- 低本益比
一樣相當不理想
- 營收高成長
看起來也是不太妙
??? 咦難道財報看了半天還不如買台灣50?
This is seriously an interesting question.
如何找到高報酬的選股指標
回測揭露了一件殘忍的事情 — 許多大眾耳熟能詳的財務指標,選出後股票之報酬率,確實還不如閉著眼睛買台灣50
為什麼呢?
1. 台灣50 其實很不錯
巴菲特都開始買指數型基金(S&P 500),你絕對不該忽視被動 ETF 的效益。以歷史報酬率來說,台灣50 在過去2012–2019 的年化報酬率超過 9 %,雖然波動率大,部分年度報酬率呈負數,但長線來說是一個穩定的好選擇
2. 財務選股需要反覆的假設及驗證
今天有一(多)個指標,符合指標的公司平均經營狀況較好,故使用這(些)指標來篩選公司,符合的公司報酬率會較不符合的公司高
上面這句話聽起來滿合理的吧
如果你覺得合理的話就難怪會賠錢喔!而且也誤解了財報選股在做什麼
財報選股不是選出好公司,是選出被低估的公司
財報選股不是選出好公司,是選出被低估的公司
財報選股不是選出好公司,是選出被低估的公司
大部分人都認為財報能做的的是「反映現在經營狀況」(事實上財報是落後一年的資訊),並相信現在好的公司未來也會好,依此作為投資理由,但這種方式通常是不會成功的,久而久之就有「財報無用論」這樣說法
這種做法是錯的
財報的用法是辨認出「處於成長趨勢,並且體質優良足以對抗波動的公司」
上面短短的那句話其實蘊含很多資訊,白話點說,怎麼從財報的數字找到這這種類型的公司?
-> 就是做回測
[X]->財務指標 / [Y]->報酬率
不做回測的分析,相當於把自變數的分析與應變數脫鉤,怎麼能期待預測新一輪應變數時會準呢?這卻是很多基本分析者在做的事情
前述測試看起來成效都很爛,但他其實指引了方向,即在台灣這個市場,營收這個指標「可能」是較被看重的,另外就是 年增率 跟 當年度數字 比起來,與股價相關性較高
一個一個指標測下去,你慢慢就可以摸到出個輪廓,理解到什麼指標是「被市場重視的」,而這個理解不是來自主觀想法,也不是來自「老師」教導你要怎麼做,而是你自己科學化的實驗成果
Is This Workable?
回到這系列文一開始的出發點,能否找到「今天有一(多)個指標,符合指標的公司平均未來一年的股價報酬率較高…」的那(些)指標?Absolutely! 抓得好的話,你就有機會選得出這種績效
開發出屬於你自己的咒語,發大財吧!
結論
財報選股到此告一個段落,回顧我們做了哪些事? 通常一個資料科學的模型會經歷以下的步驟
1. 資料定義
2. 資料收集
3. 資料前處理
4. 資料儲存
5. 資料聚合
6. EDA
7. 建模
行文至此只摸到建模的邊邊,並沒有把 [x v.s y] 答案點出來
前面的步驟通常是最耗時的,而建模後的領域,更仰賴個人的創意了。其實並沒有標準答案,不管你是想用 rule based, machine learning, deep learning,能獲得好報酬的就是好方法,重點是這個報酬要是「可持續的」,不會說今年大賺隔年吐光光
若多方嘗試還是找不到答案,不需要氣餒,你已知道什麼是「錯的答案」,這可是非常重要的一件事。別忘了,如果你打不贏台灣 50,你可以直接買它,敲一遍代碼看看,8 年翻 1 倍可不是隨便講講