跳至主要內容
台股研究 約 4 分鐘閱讀

事件研究法教學:用 Python 分析除權息對股價的影響

用 FinLab 套件的事件研究模組,幾行 Python 就能從 dividend_announcement 抓取除權息公告、清洗資料後計算事件前後的異常報酬率,並以視覺化圖表呈現,快速判斷台股除權息該做多還是做空,附完整資料處理與回測程式碼可直接複製到 Colab 執行。

一行看除權息 CAGR 0.0% Sharpe 0.00

當台灣的上市公司宣布有關股票的特別消息,比如說要分紅或者調整股票的價值(這種情況我們稱之為除權或除息),這通常會對公司的股票價格造成一些波動。我們的研究就是要搞清楚,這些宣布到底對股票價格有什麼影響。

本例用 finlab package 取得除權息公告,包括公告日期、生效日與股票交易資料,再用事件研究比較除權息前後的股價表現。

將資料按日期和股票代號整理成表格。

然後我們用一種叫做事件研究的方法,來計算這些特別宣布前後,股票的價格變動情況。我們會比較這個變動和一般市場的變動有什麼不同,從而評估這個宣布的影響力度。

查看事件前後的異常報酬率

我們將用簡單的 Python 語法來分析:

  1. 從財務資料庫中提取除權息公告數據。
  2. 清洗和轉換數據,創建事件矩陣。
  3. 進行事件研究,計算異常收益率。
  4. 將結果以視覺化的方式呈現,分析事件對股價的影響。

只需要簡單的幾行,就能知道事件前後的異常報酬率了。舉例而言,如果想知道除權前後的異常報酬率,只需要執行下面的程式碼,就能輸出圖表了。

拿取財務資料

這裡把除權除息日期當作事件,檢查事件前後的股價變化。

用 finlab 讀取除權息公告,顯示前幾筆資料:

顯示程式碼
from finlab import data
 
data.get('dividend_announcement').head()
依本文重跑

執行這個策略

複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。

告訴你的AI:

幫我設定 FinLab,重現這篇文章,請讀:https://finlab.finance/setup?relatedUrl=/blog/event-study-usage

免安裝,開啟 FinLab Studio

除權息公告數據集範例

  • 從 finlab 庫導入 data 模組。
  • 調用 get 函數來檢索 dividend_announcement 數據集,這是一個包含公司除權息公告的數據集。
  • 顯示了包含多個欄位的 DataFrame,這些欄位包括股票代號、公告日期、基準日期、公司名稱、所屬期間、增資配股等資訊。

移除重複資料及缺少股票代號、除權交易日的列,再轉成以日期為索引、股票代號為欄位的事件表格。

顯示程式碼
from finlab import data
 
event = data.get('dividend_announcement')\
    .drop_duplicates(subset=['stock_id', '除權交易日'])\
    .dropna(subset=['stock_id', '除權交易日'])\
    .pivot(index='除權交易日', columns='stock_id', values='市場別')\
    .rename_axis('date')\
    .notna()
 
event.head()
  • 這段程式碼進一步處理上述提取的數據。
  • .drop_duplicates() 移除重複的行。
  • .dropna() 刪除含有空值的行。
  • .pivot() 將數據重塑成一個以除權交易日為索引,股票代號為欄位的新 DataFrame。
  • .rename_axis('date') 更改索引名稱為 date。
  • .notna() 將所有的 NaN 值轉換為布林值 False。

除權交易日事件矩陣

這樣就可以產生一張表格,True,對應到就是除權的股票和日期,我們可以用簡易的程式來驗證,來看除權息通常都是每年的夏天發生:

顯示程式碼
event.sum(axis=1).plot()

除權息事件時間分布圖

用以下函數計算除權息後五日、十日、二十日、六十日的報酬率:

顯示程式碼
from finlab.tools.event_study import create_factor_data
 
adj_close = data.get('etl:adj_close')
factor_data = create_factor_data(event, adj_close, event=event)
 
factor_data

除權息後各期報酬率數據

用 event_study 計算並呈現事件發生後的異常報酬率:

顯示程式碼
from finlab.tools import event_study
 
benchmark = data.get('benchmark_return:發行量加權股價報酬指數')
 
r = event_study.event_study(factor_data, benchmark, adj_close.ffill())
 
r.head()

事件研究異常報酬率結果

這樣就產生出一張表格,其中 y 軸是每一次除權息,x 軸是除權息的前後幾天的報酬率。我們可以用簡易的方式來將報酬率繪製出來:

顯示程式碼
r.mul(100).mean().plot.bar(use_index=False)
ax = r.mean().mul(100).cumsum().plot(use_index=False)

除權息事件前後異常報酬率與累計報酬率圖表:Y軸是報酬百分比,X軸是天數,第零天為事件發生日。直條圖為扣除大盤的報酬率,線段為累計報酬率。

Y軸是報酬百分比,X軸是天,第零天為事件發生日。直條圖為扣除大盤的報酬率,線段為累計報酬率。

執行完上面的程式後,就能把數據視覺化呈現出來,運用起來相當方便。更甚者,FinLab 已經提供完整的資料集了,不用自己再用爬蟲去慢慢爬資料了!

VIP 區域接著會示範除權息事件研究:比較事件後 5、10、20、60 日報酬,並用 OLS 檢查 PE、PB 因子對 10 日報酬的影響。

VIP 區域包含策略細節

登入後可看策略優化、完整程式碼與互動式回測報告

FinLab AI

想建立自己的策略?

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

免費開始

更多AI 與程式研究

查看全部