2024年10月20日 星期日

[網站開發] 新增GPT投資助手美股選擇權估值分析頁面 (Norn-StockScreener投資網站開發)

接前篇:
[網站開發] 新增GPT投資助手美股公司分析頁面 (Norn-StockScreener投資網站開發)


上次用GPT幫忙分析整理美股公司資料, 這次想到也可以用GPT幫忙分析美股選擇權估值, 畢竟之前做了不少美股選擇權估值的模型, 如果能把這些資料交給GPT來幫忙分析, 或許可以在做選擇權交易之前看下分析報告, 讓GPT幫忙簡單整理買賣方建議這樣。

關於之前寫的選擇權估值模型的文章, 有興趣的可以也可以參考下:
[網站開發] 美股選擇權定價模型 - 新增隱含波動率計算凱利公式

做好的功能如下:


Norn-StockScreener投資網站: 

https://norn-stockscreener.zmcx16.moe/gpt-investing-assistant/

Github: 

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

https://github.com/zmcx16/Norn-Finance-API-Server

這個頁面的功能參數如下:

  1. Symbol: 美股選擇權合約的股票代號

  2. GPT Model Name: 選要使用的GPT的model name, 預設是目前CP值最高的gpt-4o, 如果選gpt-3.5-turbo的話產出的報告就會簡單不少, 另外也支援使用者自己輸入OpenAI其他支援的model, 不過不一定能用, 只有ChatGPT相關的model才能跑。

  3. OpenAI API Key: 考慮到自己的錢包, 有想使用的人得輸入自己的OpenAI API Key, 我想會有人擔心輸入了API Key會不會被我偷偷拿去用, 我說不會也拿不出證明, 所以真的有想用這功能的話, 建議申請5美元免洗帳號的API Key, 或是用自己帳號新產生的key, 用完就趕緊銷毀吧~  申請API Key可以參考這個文章: 如何免費申請ChatGPT (OpenAI) 的API Key

  4. Expriation Date: 選擇權合約到期日

  5. Strike Price: 選擇權合約履約價

  6. Call / Put Option: 選擇Call or Put合約

  7. Valuation Data: 選擇權估值模型參數選擇, 在使用GPT模型之前, 會先用自己做的估值模型跑估值結果, 使用者可以決定要不要讓GPT模型也參考這些估值結果, 目前總共有以下參數:
  8. 'Black Scholes Merton EWMA Historical Volatility', 'Monte Carlo EWMA Historical Volatility', 'Binomial Tree EWMA Historical Volatility', 'Kelly Criterion', 'Probability of Exercise of Option', 'Delta', 'Gamma', 'Vega', 'Theta', 'Rho'

使用以上參數輸入給GPT模型的Prompt範例如下, 其中大部分的資料都是從Norn-Finance-API-Server取得:

{{"model":"o1-preview","messages":[{"role":"user","content":"Please analyze the option contract for the company with the symbol DIS. Provide a detailed and comprehensive analysis, focusing on the risks—particularly the impact of the earnings date and ex-dividend date—and valuation for both the buyer and the seller. Your task is to thoroughly evaluate the data and generate a report in Markdown format (No need to wrap in code blocks). Here’s the data:\n```\n{\r\n  \"symbol\": \"DIS\",\r\n  \"currentDate\": \"2024-10-20\",\r\n  \"stockPrice\": 97.27999877929688,\r\n  \"stockExtraInfo\": {\r\n    \"earningsDate\": \"2024-11-14\",\r\n    \"exDividendDate\": \"2024-07-08\"\r\n  },\r\n  \"EWMA_historicalVolatility\": 0.18602714460634165,\r\n  \"contract\": {\r\n    \"lastTradeDate\": \"2024-10-18\",\r\n    \"strike\": 95.0,\r\n    \"lastPrice\": 2.95,\r\n    \"bid\": 2.91,\r\n    \"ask\": 2.99,\r\n    \"change\": -0.45000005,\r\n    \"percentChange\": -13.235294,\r\n    \"volume\": 2330,\r\n    \"openInterest\": 7064,\r\n    \"impliedVolatility\": 0.3794007373046875,\r\n    \"valuationData\": {\r\n      \"KellyCriterion_buy\": -10.09725610723297,\r\n      \"KellyCriterion_sell\": 0.8934698360970385,\r\n      \"KellyCriterion_MU_0_sell\": 0.8250604590273701,\r\n      \"KellyCriterion_MU_0_buy\": -5.0543039713639955,\r\n      \"KellyCriterion_IV_buy\": null,\r\n      \"KellyCriterion_IV_sell\": null,\r\n      \"exerciseProbability\": 0.33397,\r\n      \"delta\": -0.3079163039792361,\r\n      \"gamma\": 0.06899611538229457,\r\n      \"vega\": 0.09640010958844103,\r\n      \"theta\": -0.10826790796879611,\r\n      \"rho\": -0.024593911487068514,\r\n      \"Black Scholes Merton EWMA Historical Volatility\": -1.0,\r\n      \"Monte Carlo EWMA Historical Volatility\": -1.0,\r\n      \"Binomial Tree EWMA Historical Volatility\": 1.0371441540237885\r\n    },\r\n    \"expiryDate\": \"2024-11-15\",\r\n    \"optionType\": \"put\"\r\n  }\r\n}\n```"}]}}


至於結果就像上面demo圖看到的, 照慣例我直接Google翻譯頁面了, 比較好解釋XD:


上面的資料是程式使用yfinance從Yahoo財經取得的選擇權合約資料, 包含報價資料以及隱含波動率等等, 其中只有歷史波動率不是Yahoo財經給的, 是Norn-Finance-API-Server用歷史股價計算出來的。



上圖的凱利公式也是Norn-Finance-API-Server透過蒙地卡羅模擬計算出來, 可以看出該put交易用凱利公式分析對賣方有利(不過該公式只單純用歷史波動率做蒙地卡羅模擬未來的股價變化, 並沒有考慮到消息面, 財報公布日, 除權息等等, 只能當作參考不能只看這個參數是決定交易與否), 至於風險分析這邊感覺有些廢話, 除了行權機率也是透過程式估算以外, 其他的文字敘述基本上看合約報價就懂的意思差不多...。



分析結果該合約簡單總結對賣方有利, 其他的文字敘述一樣有些雞肋就是..., 另外來看看, 如果選擇權履約日在財報日之後, GPT會怎麼回覆吧, DIS下次財報日是11/14, 我們挑11/15到期, 行權價90元的迪士尼賣權合約看看: 



可以看出因為是價外合約+離目前股票落差不小, 所以行權機率低(7.34%), 凱利公式算出來也是對賣方略為有利(不過也只有0.98%, 跟不建議交易基本上也差不多了), 可是這些公式都是透過歷史波動率計算, 如果加上考慮財報日的影響, 基本上是完全不建議做賣方交易的, 而因為我們在GPT prompt有註明要考慮行權日以及除息日的風險, 所以有特別敘述賣方的風險, 算是有達到我想要的警告這樣。

這次的結果感覺沒有上次的公司分析整理報告好, 給的建議大多數都是看我原本程式的數據就能得到, 這塊我可能要再思考一下, 繼續改進prompt是否可以得到更有價值的建議...。


2024年10月8日 星期二

[網站開發] 新增GPT投資助手美股公司分析頁面 (Norn-StockScreener投資網站開發)


好久沒新頁面的靈感了, 以前是有想過用GPT幫忙給投資建議的idea, 不過測試了一下發現意義不大, 基本上給的分數或建議都沒有參考價值, 畢竟GPT的model資料大概都是一兩年前的, 所以真的問GPT給一間公司是否適合投資, 他能回答你的也只有根據那一兩年前的資料生成的建議, 有種garbage in garbage out的感覺, 後來就放棄這個想法了...。

最近則是想到, 我最常用GPT做的事是修英文文法, 效果也很不錯 (不過還是得人工校稿, 有時會修出不得了的東西出來...), 就想到GPT如果單純問問題, 他會用他的知識庫回答你, 但如果我把所有需要的參考資料都給GPT, 讓GPT幫我生成投資分析報告的話那是不是就有參考價值了呢? 

這樣GPT提供的功能就像修英文文法一樣, 靠的不是GPT資料庫內過時的公司財報資料, 而是只要GPT提供過去到現在都適用的分析公司&投資方法就好, 由我這邊負責提供最新的資料, 讓GPT幫我整理結果, 感覺這個功能就有點價值~。

做好的功能如下:


上面跑的是gpt-4o model, 另外也有試著跑最新版的ol-preview model, 看起來功能真的更強:





Norn-StockScreener投資網站: https://norn-stockscreener.zmcx16.moe/gpt-investing-assistant/

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


這個頁面的功能參數如下:

  1. Symbol: 美股股票代號

  2. GPT Model Name: 選要使用的GPT的model name, 預設是目前功能最強的gpt-4o, 如果選gpt-3.5-turbo的話產出的報告就會簡單不少, 另外也支援使用者自己輸入OpenAI其他支援的model, 不過不一定能用, 只有ChatGPT相關的model才能跑。

  3. OpenAI API Key: 考慮到自己的錢包, 有想使用的人得輸入自己的OpenAI API Key, 我想會有人擔心輸入了API Key會不會被我偷偷拿去用, 我說不會也拿不出證明, 所以真的有想用這功能的話, 建議申請5美元免洗帳號的API Key, 或是用自己帳號新產生的key, 用完就趕緊銷毀吧~  申請API Key可以參考這個文章: 如何免費申請ChatGPT (OpenAI) 的API Key

  4. Key Statistics: 你想讓GPT分析的公司基本資料, 有選到的參數會從我的DB直接撈出數據餵給GPT, 目前提供的Key Statistics如下:
  5. 'P/E', 'EPS (ttm)', 'Insider Ownership', 'Shs Outstand', 'Perf Week', 'Market Cap', 'Forward P/E', 'Insider Transactions', 'Shs Float', 'Perf Month', 'PEG', 'EPS next Q', 'Institutional Ownership', 'Short Float', 'Perf Quarter', 'P/S', 'EPS this Y', 'Institutional Transactions', 'Short Ratio', 'Perf Half Y', 'Book/sh', 'P/B', 'EPS next Y_%', 'ROA', 'Perf Year', 'Cash/sh', 'P/C', 'EPS next 5Y', 'ROE', 'Perf YTD', 'P/FCF', 'EPS past 5Y', 'ROI', '52W High', 'Beta', 'Quick Ratio', 'Sales past 5Y', 'Gross Margin', '52W Low', 'ATR (14)', 'Current Ratio', 'EPS Y/Y TTM', 'Oper. Margin', 'RSI (14)', 'Debt/Eq', 'Sales Y/Y TTM', 'Profit Margin', 'LT Debt/Eq', 'EPS Q/Q', 'Rel Volume', 'Sales Q/Q', 'Price', 'SMA20', 'SMA50', 'SMA200', 'Dividend %', 'Quarterly EPS Data'

  6. Investment Gurus: 可以輸入你想讓GPT參考的投資大師的建議, 不過GPT畢竟是生成式模型, 參考大師資料生成的建議有幾分胡謅幾分可信, 就自己判斷了XD  目前提供的投資大師清單如下:
  7. 'Warren Buffett', 'Peter Lynch', 'Ray Dalio', 'Jim Simons', 'Philip Fisher', 'George Soros', 'Carl Icahn', 'Bill Ackman', 'David Tepper', 'Michael Burry', 'Mohnish Pabrai'

    另外也可以讓使用者追加輸入自己的投資大師名單, 像是肯恩費雪或查理蒙格等等...。

使用以上參數輸入給GPT模型的Prompt範例如下:

{ "model":"gpt-4o", "messages":[ { "role":"user", "content":"Analyze the following stock data for company with the HPE. Focus on key areas such as P/E, EPS (ttm), Insider Own, Shs Outstand, Perf Week, Market Cap, Forward P/E, Insider Trans, Shs Float, Perf Month, PEG, EPS next Q, Inst Own, Short Float, Perf Quarter, P/S, EPS this Y, Inst Trans, Short Ratio, Perf Half Y, Book/sh, P/B, EPS next Y_%, ROA, Perf Year, Cash/sh, P/C, EPS next 5Y, ROE, Perf YTD, P/FCF, EPS past 5Y, ROI, 52W High, Beta, Quick Ratio, Sales past 5Y, Gross Margin, 52W Low, ATR (14), Current Ratio, EPS Y/Y TTM, Oper. Margin, RSI (14), Debt/Eq, Sales Y/Y TTM, Profit Margin, LT Debt/Eq, EPS Q/Q, Rel Volume, Sales Q/Q, Price, SMA20, SMA50, SMA200, Dividend %, eps_q_data and provide an overall analysis of the stock. Here is the data:\n```\n{\r\n \"P/E\": 14.62,\r\n \"EPS (ttm)\": 1.4,\r\n \"Insider Own\": 0,\r\n \"Shs Outstand\": 1300000000.0,\r\n \"Perf Week\": 0.0134,\r\n \"Market Cap\": 26510000000.0,\r\n \"Forward P/E\": 9.65,\r\n \"Insider Trans\": -0.1258,\r\n \"Shs Float\": 1290000000.0,\r\n \"Perf Month\": 0.157,\r\n \"PEG\": 4.54,\r\n \"EPS next Q\": 0.56,\r\n \"Inst Own\": 0.8270000000000001,\r\n \"Short Float\": 0.031000000000000003,\r\n \"Perf Quarter\": -0.023,\r\n \"P/S\": 0.92,\r\n \"EPS this Y\": -0.0889,\r\n \"Inst Trans\": -0.0075,\r\n \"Short Ratio\": 2.62,\r\n \"Perf Half Y\": 0.13390000000000002,\r\n \"Book/sh\": 17.0,\r\n \"P/B\": 1.2,\r\n \"EPS next Y_%\": 0.07980000000000001,\r\n \"ROA\": 0.0316,\r\n \"Perf Year\": 0.1999,\r\n \"Cash/sh\": 3.01,\r\n \"P/C\": 6.79,\r\n \"EPS next 5Y\": 0.032,\r\n \"ROE\": 0.08689999999999999,\r\n \"Perf YTD\": 0.20199999999999999,\r\n \"P/FCF\": 9.74,\r\n \"EPS past 5Y\": 0.0461,\r\n \"ROI\": 0.0618,\r\n \"52W High\": -0.10560000000000001,\r\n \"Beta\": 1.2,\r\n \"Quick Ratio\": 0.61,\r\n \"Sales past 5Y\": -0.0106,\r\n \"Gross Margin\": 0.3271,\r\n \"52W Low\": 0.41100000000000003,\r\n \"ATR (14)\": 0.6,\r\n \"Current Ratio\": 0.94,\r\n \"EPS Y/Y TTM\": 0.7161,\r\n \"Oper. Margin\": 0.0751,\r\n \"RSI (14)\": 63.4,\r\n \"Debt/Eq\": 0.53,\r\n \"Sales Y/Y TTM\": -0.0194,\r\n \"Profit Margin\": 0.0641,\r\n \"LT Debt/Eq\": 0.36,\r\n \"EPS Q/Q\": 0.0902,\r\n \"Rel Volume\": 0.46,\r\n \"Sales Q/Q\": 0.09330000000000001,\r\n \"Price\": 20.41,\r\n \"SMA20\": 0.09630000000000001,\r\n \"SMA50\": 0.09910000000000001,\r\n \"SMA200\": 0.1375,\r\n \"Dividend %\": 0.0255,\r\n \"Quarterly EPS Data\": {\r\n \"2024-07-31\": 0.39,\r\n \"2024-04-30\": 0.24,\r\n \"2024-01-31\": 0.3,\r\n \"2023-10-31\": 0.5,\r\n \"2023-07-31\": 0.36\r\n }\r\n}\n```" }, { "role":"system", "content":"Act as an Investors Group consisting of expert gurus such as Warren Buffet, Peter Lynch, Benjamin Graham. Your task is to analyze the stock data thoroughly and present a comprehensive analysis report in a visually appealing Markdown format (no need code block wrapped)." } ] }

至於結果就像上面demo圖看到的, DIS的分析資料整理得還蠻有條有理的, 前半段會根據我提供的數據資料做文字化摘要說明, 解讀數字代表的意義 (我直接Google翻譯頁面了, 比較好解釋XD):



後面則是輸入的投資大師意見跟總結, 感覺真有點像這幾位大師會說的話, 最後結論也總結得蠻有道理的, 不過老話一句畢竟這是生成式AI, 亂寫小說的成分有多少真的不好說XD


最後來看看最近宣告破產的Big Lots的分析報告吧:


這次沒有投資大師的個別建議了, 不過看最後的總結也很符合提供的數據, 投資風險很高, 透過GPT提供的投資建議值不值得參考不好說, 不過解讀數據方面我覺得做得還是不錯的, 個人是覺得有使用的價值。

在來的規劃打算繼續朝這方向開發, 提供更多Key Statistics資料給GPT幫忙做公司個股分析, 並且也想做其他的功能, 像是產業分析, 以及同產業的個股比較排序等等, 就慢慢一步一步做吧~。

2024年5月15日 星期三

[網站開發] 新增美股產業同業比較分析頁面 (Norn-StockScreener投資網站開發)

最近看書時想到, 當我們看到某個產業想要投資時, 往往會比較該產業的哪一間公司最值得投資, 其中會看本益比, 股價淨值比, 自由現金流, 股息殖利率, 空頭比率等等..., 可是比較的時候自己的量尺很多時候不是用一個慣例的數字(e.g. 本益比小於7.5~15, 股價淨值比小於2等等)就是靠直覺, 但是每個產業的這些指標適用標準卻不盡相同。

舉例來說, 目前軟體開發產業的平均本益比為73.52, 而大型銀行產業的平均本益比為10.1, 奢侈品產業的平均本益比為11.3, 如果單純用本益比小於7.5~15作為選股準則的話, 那軟體開發公司就幾乎進不到自己的選股清單, 也可能就錯失了投資優秀公司的好機會。

想到這邊就想說, 既然這樣就來做個同業比較頁面吧! 將各種個股指標除以產業指標, 看大於1或小於1就能比較是優於產業平均或是劣於產業平均, 在簡單做個投票加總, 就可以將個股在該產業上的優劣排序出來, 想投資該產業的話就可以從排序高的公司開始研究, 先做一次排序過濾也可以節省花費在各個公司的研究分析時間。


簡單做完的成果如下:



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

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


其中提供了以下個股/產業指標比較:

  • P/E Peer
  • Fwd P/E Peer
  • PEG Peer
  • P/S Peer
  • P/B Peer
  • P/C Peer
  • P/FCF Peer
  • Dividend % Peer
  • Float Short Peer
  • Recom Peer

還有一個欄位Better Than Average, 會統計有多少個指標優於產業平均, 其中綠色代表優於, 紅色則代表劣於, 以基本面投資來說, 會傾向選擇P/E, P/B低的公司, 可是股息殖利率則是會傾向越高越好, 所以上面的欄位判斷優於/劣於的公式只有股息殖利率大於1是綠色(優於), 其他都是小於1是綠色(優於)。


另外需要特別一提的是, P/E, P/B這類基本面指標並不是說一定越低越好, 還是得看該公司是處於什麼時期以及投資人是基於什麼目的想投資這間公司, 所以這些個股指標/產業指標也都有做開關, 可以將自己不想比較的指標關掉不要一起比較分析。


說明完後就來實際使用這頁面分析看看吧!  首先從上圖看, 表格總共有4206檔美股資料, 其中Better Than Average = 10全部優於產業平均的有19檔, 其中有一檔是TSM, 也就是我們的護國神山台積電 (抖抖), 既然這樣我們就來分析半導體產業吧, 表格的最後一行有一個Detail欄位, 點擊後可以直接過濾出該產業的所有個股, 以下是半導體產業的比較表格:



可以看到半導體產業只有TSM是所有指標都優於產業平均, 代表如果單純用同業比較選股的話, 那台積電就可以列為優先考量, 可是看了下發現台積電的ADR股價位於52週高點-5.7%, 如果現在選擇投資台積電, 是否可能買在高點溢價過高? 

如果我們繼續往下看, 可以看到排行前面的還有ASX (日月光), TSEM (高塔半導體), INTC (INTEL), 其中ASX, TSEM的股價也都是在近幾年高檔, 只有INTC的股價從52週高點已下跌近40%以上。 如果佔在撿便宜的角度, 可能就會想投資INTC了, 不過在做進一步研究後, 會注意到近期INTC大跌是從4/3開始:



查了下近期INTEL的新聞, 發現INTEL代工營收下滑, 虧損擴大, 導致股價4/3大跌並在後續的日子繼續下跌...。 


另外也找到下面這篇新聞, 最近INTEL的13, 14代CPU爆發災情:

畢竟上面的基本面指標是落後指標, 沒辦法即時呈現目前公司的營運狀況, 從歷史上看INTEL目前的股價是相對低點, 如果對公司未來營運有信心的話, 或許也是個低檔撿便宜的機會, 我自己是想再觀察一下, 如果有機會是想撿便宜看看~。


另外既然有看INTEL了, 那也來看看AMD吧, AMD的個股/產業指標同業比較結果如下:



優於同業的指標只有P/S, P/B 以及Recommand (分析師推薦), P/S優於同業代表單看營收相對於市值是便宜且優於同業的, 不過P/E卻是223特別高..., P/S低但是P/E高通常代表是高成長的公司, 不過Better Than Average相對低的情況, 粗略的看AMD跟同業比較的話, 溢價的可能性或許更大。


這次分享差不多就到這邊, 不過最後還是要提醒一下, 會做這頁最主要還是想要一個簡單快速比較同業的表格資料, 方便在分析公司前做最初步的過濾以及刪減, 節省分析太多公司花費的時間。 這表格本身還是很粗略的, 像是半導體產業也不是裡面的55間半導體公司都是做相同的業務, 並不是都能一體適用比較的, 像是TSM台積電是半導體製程, ASX日月光是做半導體封測, HIMX奇景光電則是做IC設計等等...。

如果真的想投資半導體產業, 是要直接在上面這55間半導體產業公司一起比較, 還是先決定好想投資的是製程還是封裝還是設計, 再更細分對應的公司後再一起比較, 而不是總是大雜燴的放一起比較就好。

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模型檢查或是人工分析財報三表), 進行多種獨立性檢查才能更降低踩雷的風險...。

2024年2月18日 星期日

[網站開發] 2023年最有價值品牌 (Norn-StockScreener投資網站開發)

接前篇:

[網站開發] 2022年最有價值品牌 (Norn-StockScreener投資網站開發)

最近發現Interbrand已經發表2023全球最有價值品牌TOP100了:

https://interbrand.com/best-global-brands/



Norn-StockScreener投資網站: https://norn-stockscreener.zmcx16.moe/ranking/

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



這次新入榜的有以下兩間公司:


很神奇的Oracle這麼大間的公司竟然是新上榜! 看了品牌價值趨勢圖, 發現Interbrand到2019年之前都是有納入品牌價值評估的, 至於中間為什麼斷了三年就不知道了, 不知道是不是Oracle一度不允許Interbrand評論的關係?

而另一間新上榜的公司是一間雀巢的子公司咖啡品牌, 加上這品牌雀巢目前總共有三個品牌在Interbrand Top100裡, 因為雀巢本來就在Interbrand Top100裡, 就不多加分析了。



這邊想額外分析的是, 因為有過去2022年的Interbrand Top100資料, 可以回測看看2022年的資料看品牌價值顯著上升/下降的公司, 看看對應的股價市值是否之後一年有隨之上漲/下跌, 2022年品牌價值變化超過+20%的有以下品牌:

Brand Value / 52-Week Stock Price Change
  • Microsoft (MSFT): +32% / +59.92%
  • Google (GOOG): +28% / +54%
  • Tesla (TSLA): +32% / +1.31%
  • Louis Vuitton (LVMUY): +21% / +2.31%
  • Adobe (ADBE): +23% / +57.68%
  • Chanel (-): +32% / None
  • Hermès (HESAY): +27% / +29.89%
  • Gucci (KER.PA): +23% / -27.58%
  • Allianz (ALV.DE): +23% / +13.17%
  • Mastercard (MA): +23% / +31.51%
  • Siemens (SIEGY): +21% / +18.47%
  • LEGO (-): +30% / None
  • Ferrari (RACE): +31% / +48.11%
  • Dior (CDI.PA): +27% / -3.05% 
  • Prada (PRDSY): +21% / 1.89%
也看看品牌價值負成長的品牌:
  • Facebook (META): -5% / +175.06%
  • Intel (INTC): -8% / +66.96%
  • Pampers (PG): -1% / +12.58%
  • H&M (HM-B.ST): -8% / +10.56%
  • Gillette (PG): -4% / +12.58%
  • Danone (BN.PA): -3% / +17.30%
  • Canon (CAJ): -15% / 美股ADR已退市

另外也順便看看2022新上榜的品牌:
  • Airbnb (ABNB): New / +18.43%
  • Red Bull (-): New / None
  • Xiaomi (XIACY): New / +6.67% 

而S&P500近一年的價格變化則是+25.22%, 品牌價值超過+20%並超過S&P500的有(6/13)間(扣掉未上市公司), 而不漲反跌的則有(2/13)間; 以這數字來說我覺得算合理, 至少有差不多快一半贏大盤, 而下跌的也只有兩間, 平均下來也有+22.12%, 只不過略輸大盤就是了 (看到這邊就會覺得是不是直接買大盤就好XDD)。

而更讓人驚訝的是品牌價值下跌的公司, 其中META可是爆漲了+175%, INTC也上漲+66.96%, 明明品牌價值是下跌的, 股價卻大幅上漲成這樣, 為什麼會這樣呢?  先來看一下META的資料:





可以看到META在2021年8月達到新高價379元之後, 之後一路下跌到最低93元, 下跌幅度高達-75%, 而之後上漲也很驚人, 目前已達到473元新高價。 而META會暴跌的原因主要是2022年開始營收跟獲利都大幅衰退, 後來是2023年恢復成長才大幅上漲, 而且2023Q4的財報又爆好, 過去一年績效才贏大盤這麼多。


再來看看INTC:




INTC的情形也跟META差不多, 從2022年開始營收跟獲利都大幅衰減, 可是到2023Q1最低點之後, 公司獲利開始轉虧為盈, 所以股價也隨著公司獲利改善上漲, 不過離以前的公司股價高點還有一段長遠的路...。


從META & INTC可以看出, 雖然品牌價值下跌但股價大漲甚至贏過大盤的原因, META是因為公司的獲利能力還是很強勁的, 而且公司也還有IG這個品牌(2022 brand value +14%), 再加上之前下跌太誇張, 所以之後回漲的幅度當然也更大, 會大幅超過S&P500也就不意外了。 而INTC的情況則是標準的轉虧為盈轉機股, 雖然獲利能力跟過去相比仍算差, 但也是之前下跌太深, 所以轉虧為盈後的上漲幅度才會相對大盤來得大得多。


至於從這些資料分析後得出的結論是什麼呢? 以我個人來說, 從上面的資料看來與其看品牌價值來決定投資標的, 那還不如買大盤就好, 勝率還會高一咪咪..., 可是我覺得重要的是, 投資不是看單一因素決定的, 我們必須評估各種因素, 建立自己的投資多因子模型, 來決定自己的投資標的&進出場策略。 

從品牌價值作為選股標的的最大好處, 我覺得第一個是踩雷的可能性大幅降低, 如果投資的標的是從品牌價值TOP100選, 選到地雷的可能性就會低不少; 而如果把品牌價值下跌的公司剃掉, 踩雷的機率則是又會更小得多 (當然也可能會錯過像META or INTC這種轉機股, 這就要投資者自行去判斷了)。 然後品牌價值也只是其中一個投資因子, 在透過其他各種不同的投資因子(e.g. 分析財報, 預測產業前景, etc...), 盡可能一點一點增加投資獲利的勝率就好。



最後在附上2023年的品牌價值數據, 至於股價會怎麼反應, 就觀察這一年看看結果如何了XD


2023年品牌價值變化超過+20% (跟2022年比超少, 如果想分析更多間公司也可以拉低門檻觀察):
  • Chanel (-): +32%
  • Hermès (HESAY): +27% 
  • Airbnb (ABNB): +22%
  • Porsche (POAHY): +20%
品牌價值負成長的品牌:
  • Disney (DIS): -4%
  • Facebook (META): -8%
  • Intel (INTC): -14%
  • UPS (UPS): -4%
  • Gucci (KER.PA): -2%
  • Nescafé (NSRGY): -2%
  • Goldman Sachs (GS): -2%
  • Budweiser (BUD): -16%
  • Philips (PHG): -12%
  • Nintendo (NTDOY): -2%
  • 3M (MMM): -7%
  • Danone (BN.PA): -4%
  • FedEx (FDX): -1%
  • Xiaomi (XIACY): -1%
  • Huawei (-): -2%

ABNB個人覺得是蠻有潛力的(2022年新上榜, 2023年品牌價值成長幅度也大, 不過之前疫情關係跌太慘, 疫情結束後已大幅上漲一波, 估值是否過高不好說...), 而DIS我覺得跟上面INTC一樣算是轉機股, 尤其是DIS最近的財報真的不錯, 我自己低檔也撿了不少, 等待並心懷希望了XD

2024年1月25日 星期四

MongoDB Atlas Auto-Scaling的神奇事

最近工作負責了改善產品系統使用Mongo DB的效能部分, 最主要做了把部分大流量的操作從Synchronous改成Asynchronous, 以及針對一些DB的寫入操作做Cache壓縮, 把一些暫態的寫入操作放到Cache keep住, 等Cache滿了或Schedule Timer時間到了在自動刷新Cache & 寫入到DB, 節省不必要的DB寫入。

改善完以後觀察Mongo Atlas Metrics, IOPS, CPU, Network, DB Update都降了不少, 可是唯獨Memory的使用量卻幾乎沒變, 用量一直維持在50%~60%左右, 而且不管是尖峰或離峰的情況都一直維持一個很平穩的狀態。

常理想應該是Mongo Atlas的DB Server在啟動時有預留一些記憶體當Cache使用, 所以照理說也不是什麼大問題。會覺得奇怪的地方是, 因為我們使用了Mongo Atlas Auto-Scaling服務, 在改善效能之前我們的DB Cluster Tier是M40, 這次改善的部分還不小, 對比過去的資料應該M30就夠用了, 為什麼沒有觸發Auto Scaling Down到M30呢?


後來就去查了一下Mongo Atlas的文件, 關於Auto-Scaling的文件可以參考這裡:

https://www.mongodb.com/docs/atlas/cluster-autoscaling/

其中關於Auto-Scaling的條件如下:



Scaling Up的條件是過去一小時內CPU or Memory > 75%; 而Scaling Down的條件則是過去24小時CPU and Memory < 50%, 看條件其實蠻合理的, 畢竟會需要Scaling Up的時候通常是系統忽然遇到高流量的情況, 不趕緊Scaling Up可能就要被打爆了; 而Scaling Down就比較寬鬆, 畢竟反反覆覆Scaling對系統也不太好, 系統穩定性相對Cost重要得多。


看上面的條件可以發現是因為M40的System Memory使用率一直都高於50%, 所以才無法觸發Auto Scaling Down, 可是我觀察過去系統在M30的Metrics, 發現記憶體用量卻是一直低於50%, 反而是Scaling Up到M40的瞬間就一直大於50%了, 相同流量下規格較差的DB Clusters反而記憶體整體用量比較小也太奇怪。


後來去查了下Mongo關於Atlas Cluster Sizing and Tier Selection的文件:

https://www.mongodb.com/docs/atlas/sizing-tier-selection/


M40或更高規格的Clusters, 會預設把50%的實體記憶體給WiredTiger Cache使用, M30或更低規格的Clusters則是預設把25%實體記憶體給WiredTiger用。 這也是為什麼會觀察到低規格的Clusters記憶體整體用量會比高規格小的關係。


然後問題就來了, 我要Auto Scaling Down就必須過去24小時CPU and Memory < 50%, 可是M40以上的Clusters又預設給WiredTiger 50%的實體記憶體, 這樣我這Auto Scaling Down的機制還能work嗎XD  後來就乾脆把上述的finding以及過去兩年Scaling Event整理一下, 敲Support Ticket Case請Mongo的人幫忙解答, Mongo Support的回覆如下:

for M40 or larger clusters, WiredTiger dedicates more than 50% of RAM - 1 GB for the WiredTiger cache in Atlas. Out which Atlas always tries to maintain 80% of the total allocated WiredTiger cache for performance optimisation. The main goal of WiredTiger cache is to avoid I/O operations to load the page from the disk while not reaching a fill ratio of over 80%. If the working set is bigger than the cache, the goal is to perform as few evictions as possible. Our internal article on How does MongoDB use memory? will provide you more insights.

...

Our product team is aware of the issues with auto downscaling based on memory utilisation for M40+ tier and they are working internally to improve this.


WiredTiger Storage Engine的文件中Memory Use的段落也有提到WiredTiger使用的預設記憶體大小:
https://www.mongodb.com/docs/manual/core/wiredtiger/


因為WiredTiger預設會吃50% - 1GB的實體記憶體, 所以只要M40 Clusters使用的記憶體扣掉WiredTiger超過1GB, 那就很難有機會Trigger到Auto Scaling Down, 尤其是對越高規格的Clusters來說更是如此。 而關於這問題Mongo Support也有回覆他們有注意到Auto Scaling Down在M40+會有這問題, 內部正在研究怎麼改善它, 而在Mongo改善這問題之前, 如果你遇到偶發的高流量事件或是寫出某個Bug導致Auto Scaling Up, 又或者你最近有Enhance Performance而且改善後目前的Cluster Tier太高的話, 可能就得自己手動降低Spec, 避免多花無謂的$$。


這次的分享大概就到這邊, 好久沒寫開發雜談了, 雖然工作上總會遇到各種神奇事, 不過會想要分享寫到部落格的卻很少, 畢竟寫部落格文章還蠻花時間的, 只想寫些印象深刻的事件並記錄下來XD