2024年2月28日 星期三

[網站開發] 新增班佛定律頁面檢測美股財報 (Norn-StockScreener投資網站開發)

最近在看"為什麼我們會被騙?:破解金錢騙局、假新聞、政治謊言背後的詐騙機制"這本書, 書中其中一段有提到班佛定律, 這個定律可以用來檢測各種數據是否有造假的可能, 公式也很簡單, 只要將整份數據的所有數字, 取首位數並計算1~9的總數並計算分布就好, 如果計算後的分布近似於下面公式(wiki)的機率分布, 就代表數據受到操弄的可能性低:


要用班佛定律判斷數據是否造假有兩大前提:

(1) 數據的差距必須要夠大, 且樣本數要夠多

(2) 不能有人為操控


(1) 的說明我直接貼wiki, 最簡單明瞭XD


(2) 的部分則是你取樣的數據的類別不能是特殊被人為操控限制的, 例如電話號碼, 身份證字號開頭, 身高, 體重等等, 這些數字本身的範圍通常是固定的, 有些首位數也是固定值(例如成年人身高開頭通常會是1, 體重分布大多也侷限在特定範圍, 數據的差距太小等等)

關於班佛定律更詳細的說明, 有興趣可以參考下面兩個文章:

其中第二篇還有附Python程式碼, 並且用Fibonacci數列作為demo展示:


可以看到在N=10的時候, SSE (The sum of squares due to error, 和方差、誤差平方和) 非常高, 因為數據的差距太小 & 樣本數太少, 4, 6, 7, 9這四個數字連出現的機會都沒有, 所以SSE很高; 而隨著N越大取樣數字越多, SSE也越來越低, 最後跟班佛定律的公式分布幾乎一致。 


講解完班佛定律之後, 再來就是怎麼套用在投資上了, 看介紹班佛定律很適合用來分析財務報表上的數字, 如果SSE很高就代表財報受操弄的機率可能較高, 就決定來玩玩看, 並整合到自己寫的投資網站上, 做完的成果如下:


Norn-StockScreener投資網站: 
https://norn-stockscreener.zmcx16.moe/stock-benford-law/

Github: https://github.com/zmcx16/Norn-StockScreener


另外我以前也有實作另一套偵測財報造假的公式: Beneish M-Score模型, 有興趣的人也可以看看:

Blog文章: Beneish Model - 一個簡單識別公司財務報表是否造假的公式

公式網站: https://project.zmcx16.moe/?page=investment-formula


回歸正題, 這次整合班佛定律的財報來源是從Yahoo財經取得, 分析數據是標準的財報三表: 損益表, 資產負債表, 現金流量表。 而Yahoo的金融頁面的財報可以分別看季報跟年報, 並且最多可以分別看最近4期的財報, 所以這次整合班佛定律會分別計算以下SSE:

  • LastQ SSE (近一季財報)
  • LastY SSE (近一年財報)
  • AllQ SSE (近四季財報)
  • AllY SSE (近四年財報)
  • AllQY SSE (近四季+近四年財報)
其實要看的話最主要還是看AllQY SSE就好, 原因是只看這三大表數字的話, 取樣數字還是太少太少了, 看近四季+近四年, 才勉強達到取樣數字>1000的標準...。


另外前面有提到班佛定律的前提是數據類型差距要夠大 & 不能有人為操控, 所以我把財報三表中的: ["Diluted EPS", "Basic EPS", "Tax Rate For Calcs"] 特別過濾掉, 畢竟像這種ratio的數字本來就不適合套用在班佛定律上, 就決定把這種可能成為雜訊的數據類型事先過濾掉了。


首先來看看AAPL財報跑班佛定律的結果:



可以看到近一季 & 近一年的SSE特別高, 原因其實也不意外, 因為只看近一季或近一年的財報三表所有數字也才100多個, 取樣數字太少沒有鑑別性; 而近四季的SSE跟前面比就大幅降低, 代表隨著取樣數字增加SSE有降低, 是有符合班佛定律的; 而近四年的SSE跟前面相比雖然較低, 可是卻不顯著, 這是因為取樣數字還是不高導致的鑑別性太低, 還是有其他原因, 就需要再調查研究看看; 不過看近四季 + 近四年的SSE是最低的, 取樣數字有1240個, 看1~9的分布機率跟班佛定律也算接近, 從網站目前整合的4182檔個股來看, SSE排序大約在13XX/4182左右還算安全, 代表至少單從班佛定律看, AAPL的財報應該問題不太大。


另外雖然網站整合了這個功能, 可是可惜的是YAHOO財經有不少個股的財報三表數據還是不完整, 數據不完整導致樣本數低就沒辦法用班佛定律檢測, 不過只要不買股本小的冷門股基本上就不會遇到這問題, 對大多數人來說應該影響不大。


比較遺憾的是, YAHOO財經有整理的只有財報三表的資料, 可是一間公司完整的季報或年報, 其實是有更多數據資料的, 像是航運公司的財報就會說自己旗下有多少船, 以及這些船的營運成本跟收益如何; 礦產公司也會說明旗下有多少礦坑, 以及目前自己的原料庫存有多少等等..., 這些數據如果都能拿來計算的話, 班佛定律要求的樣本數要夠多就比較不是問題, 不過要我自己寫程式去parser SEC的財報數據太痛苦了, 也不一定能100%做到, 整理財報資料到財經網站這工作應該也有人工負責, 寫個一體適用的程式不太實際...。


最後總結一下, 班佛定律雖然可以用來辨識數據是否造假, 不過首先必須先確保數據是否適用(數據區間&差距夠大以及樣本數夠多; 並且數據類型不能有人為操控限制), 再來就是檢查出來就算不符合分布, 也不代表數據一定有造假, 只是這個可能性較高而已; 而就算完美符合班佛定律的公式分布, 也不代表一定沒有造假, 還是要用其他方式多加檢查(e.g. 使用Beneish M-Score模型檢查或是人工分析財報三表), 進行多種獨立性檢查才能更降低踩雷的風險...。

沒有留言:

張貼留言