毛利率的選股潛力:一種數據驅動的方法

毛利率是企業賺錢能力的一個指標。如果一家公司賣東西賺的比成本多,那麼它的毛利率就會較高。這個實驗的目的是用數據來確認:那些毛利率創新高的公司,它們的股票價格是否也會跟著水漲船高。我們發現當財報發布時,毛利率創新高的公司,在未來上漲比大盤多的機率會明顯上升。

準備工具

Google Colab是一個非常強大且方便使用的線上程式編輯器。它基於雲端平台,可以讓使用者在任何地方使用瀏覽器來運行和編寫程式碼。使用Google Colab,您可以建立並執行Python程式,並且可以輕鬆地存取和共享您的程式碼和資料。此外,Google Colab還提供了豐富的內建函式庫和工具,可以幫助您加速開發和分析過程。無論您是初學者還是專業開發人員,Google Colab都是一個非常有用的工具,可以提升您的程式編寫和資料分析效率。

首先,我們在Google Colab上安裝「finlab」的函示庫。這個函式庫是一個非常強大且多功能的工具,它包含了我們所需的各種數據和分析工具,能夠讓我們更方便地進行數據處理和分析。此外,這個 finlab 還提供了許多額外的功能,比如圖表生成、報告生成等,這些功能可以幫助我們更好地呈現和分享我們的數據分析結果,讓我們的工作更便利和效率。

!pip install finlab > log.txt

數據搜集

接下來,我們從「finlab」裡面搜集了「營業毛利率」這個重要的線索。在過去八個季度的數據中,找到毛利率達到創新高的時刻。意味著這些公司在經營方面表現出色,值得進一步觀察的原因可能包括:

  1. 提高利潤:高毛利率意味著這些公司能夠以比成本更高的價格出售產品或服務,從而提高利潤水平。
  2. 競爭優勢:高毛利率可能表明這些公司擁有獨特的產品或服務,能夠在市場上取得競爭優勢。
  3. 成本控制:這些公司可能能夠有效地管理成本,從而實現更高的毛利率。
  4. 市場需求:高毛利率可能反映了市場對這些公司產品或服務的需求強度,消費者願意為其支付更高的價格。

高毛利的公司,它們在利潤能力、競爭優勢、成本控制和市場需求等方面,有進一步提升的跡象。

from finlab import data

margin = data.get('fundamental_features:營業毛利率')
margin_new_high = (margin >= margin.rolling(8).max()).index_str_to_date().fillna(False).is_entry()

分析事件

現在,我們用這些找到的線索來做一個「事件研究」。這就像是把這些高峰時刻和過去的記錄對照,看看它們是否有相似的模式。我們想看的是,在毛利率達到新高之後的一段時間內,這些公司的股票表現如何。

from finlab.tools.event_study import create_factor_data

adj_close = data.get('etl:adj_close')
factor_data = create_factor_data(margin_new_high, adj_close, event=margin_new_high)
factor_factorfactor_factor_quantile5D10D20D60D
dateasset
2016-11-111101True4.0-0.006748-0.0013500.022942
2018-08-101101True4.0-0.0035590.027284-0.099644
2019-11-121101True4.00.0402440.0231710.028049
2020-08-111101True4.00.0817070.0756100.037805
2016-08-151102True4.00.0528110.028961-0.059438
2022-11-119960True4.0-0.011788-0.0019650.041257
2017-03-249962True4.0-0.0227270.0227270.009091
2021-03-249962True4.0-0.0092780.0298970.283505
2021-08-129962True4.0-0.1108250.0618560.041237
2022-08-109962True4.00.0353700.019293-0.022508

上面的 factor_data 是一個表格,它顯示了一系列股票在特定日期達到毛利率新高後,隨後不同天數的股票回報率。其中

  • dateasset:這些行是多重索引(multi-index),date 表示事件發生的日期,asset 則是股票的代碼。例如,2016-11-111101 代表在 2016 年 11 月 11 日,股票代碼為 1101 的股票達到了毛利率新高。
  • factor_factor:這一列顯示的是布林值(True 或 False),在這裡都是 True,表示這些數據點都是毛利率達到新高的事件。
  • factor_factor_quantile:這一列顯示數據點在其分布中的分位數,這裡顯示的是 4.0,可能表示這些事件在整體數據集中屬於較高的分位。
  • 5D, 10D, 20D, 60D:這些列分別代表自事件發生後的 5 天、10 天、20 天、和 60 天的累積回報率。這些數值是小數,表示百分比回報。例如,在 2016-11-11 這一天,股票代碼為 1101 的股票在 5 天後的回報率是 -0.6748%,在 20 天後的回報率是 2.2942%。
  • 正數值表示股價上漲的百分比,如 0.040244 表示股價上漲了 4.0244%。
  • 負數值表示股價下跌的百分比,如 0.006748 表示股價下跌了 0.6748%。
  • 數字的大小表示回報的幅度,正數越大表示越多的正回報,負數越小表示更大的損失。

這個表格幫助你了解,在股票毛利率創新高後的一段時間內,這些股票的價格是怎樣變動的。通过這樣的分析,投資者可以評估特定財務事件對股價表現的可能影響。

對比基準

最後,我們把這些公司的股票表現和「發行量加權股價報酬指數」的基準做比較。這能幫助我們了解,在毛利率創新高之後,這些股票是不是真的比市場上其他股票表現得好。

from finlab.tools import event_study

benchmark = data.get('benchmark_return:發行量加權股價報酬指數')
r = event_study.event_study(factor_data, benchmark, adj_close.ffill())
下載 1
毛利率創新高後,股價去除大盤報酬率的平均表現

該方法用於評估事件(在本案例中為股票達到新的毛利率高點)對公司價值的影響。圖表呈現了事件發生後股票的累積回報與基準的比較。

以下是圖表的組成部分:

  • 累積回報(藍色線): 這條線表示事件後股票在幾天內的累積回報。我們可以觀察到回報通常隨著時間增加而增加,這表明達到新的毛利率高點的股票在事件後的幾天中表現良好。
  • 回報(柱狀圖): 這些柱狀圖可能表示事件後股票的日回報。柱狀圖的高度表示每天的回報幅度,可能為正或為負。柱狀圖提供了事件後每日回報的變動性的概念。
  • 0.1 std(灰色區域): 圍繞累積回報線的這個陰影區域表示回報的標準差,縮放到一定水平(0.1倍標準差)。它提供了回報相關風險或波動性的視覺表示。帶寬越窄,波動性越低,反之亦然。

x軸顯示自事件以來的天數,y軸顯示累積回報的百分比。

從圖表中,我們可以推斷,在毛利率達到新高之後的20天內,累積回報呈現正向趨勢,暗示投資者可以考慮的潛在策略。波動性似乎保持在可接受的範圍內,如灰色區域所示,這意味著雖然回報在日常波動,但整體趨勢是向上的,且沒有極端的波動。

結論

這份Jupyter Notebook利用Python進行了一個股市分析的案例研究,重點關注企業的毛利率。通過安裝’finlab’這個Python套件來準備數據分析環境。接著,它從’finlab’提供的數據中提取了過去八個季度毛利率達到新高的股票數據。

分析的核心是一個事件研究,該研究生成了一個數據集,展示了這些股票在毛利率創新高後在不同時間範圍(5天、10天、20天和60天)內的表現。此外,該筆記本還包括了與市場基準指數的比較,以評估這些股票相對於整體市場的表現。

最終的圖表結果展示了股票在事件發生後的累積回報率,並用標準差範圍來表示回報的波動性。數據表顯示了不同股票在毛利率創新高後的具體表現,正數表示價格上漲,負數表示價格下跌。

這篇文章提供了一個基於財務指標毛利率的股票篩選方法。透過這種數據驅動的分析,投資者可以更有根據地判斷在毛利率創新高的股票是否可能會帶來正面的投資回報。這種數據所帶來的魔法,正是現代投資世界中的重要利器,讓我們能夠站在更高的位置,抓住更多的投資機會。

FinLab - 韓承佑

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