
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重跑美股公司行動事件回測,請讀:https://finlab.finance/setup?relatedUrl=/blog/us-corporate-actions-event-backtest
我們把六種公司行動寫成交易規則,在美股普通股上測 2016 年 7 月到 2026 年 11 月:配息調升、首次或恢復配息、除息捕捉、正向拆股、納入 S&P 500、剔除出 S&P 500。六種都沒有贏含息的 QQQ。日夏普最高的是除息捕捉 0.75,QQQ 是 0.93,收每邊 0.1% 成本後掉到 0.29。配息調升年化 12.4%、夏普 0.72,和等權 S&P 500 的 RSP 打平,離 QQQ 的年化 20.0% 還很遠。54 組參數只有 1 組扣成本前贏 QQQ,收每邊 0.1% 成本後夏普變成 -0.51。
站上的美股研究多半是用因子排序股票,或替大盤擇時。公司行動是另一種訊號:公司或指數委員會公布的事件,有明確日期,學術研究也累積了幾十年。這篇只問一個實際的問題:用當時真的查得到的日期,在事件之後買進,結果有沒有比直接買 Nasdaq 100 好?
公司行動訊號關鍵數字
| 訊號 | 原參數 | 日夏普 | 年化報酬 | 最大回撤 | 贏 QQQ | 前後兩段夏普 | 每邊 0.1% 夏普 | 扣 BIL 夏普 |
|---|---|---|---|---|---|---|---|---|
| 配息調升 | 持有 120 日、$20M | 0.72 | 12.4% | -41.6% | 0 / 9 | 0.79 / 0.64 | 0.68 | 0.60 |
| 首次或恢復配息 | 持有 120 日、$5M | 0.33 | 4.1% | -26.0% | 0 / 9 | 0.41 / 0.24 | 0.31 | 0.17 |
| 除息捕捉 | 除息前 3 日、殖利率 1% | 0.75 | 8.6% | -30.1% | 1 / 9 | 0.70 / 0.86 | 0.29 | 0.57 |
| 正向拆股 | 持有 120 日、$20M | 0.56 | 5.0% | -17.6% | 0 / 9 | 1.01 / 0.32 | 0.54 | 0.33 |
| S&P 500 納入 | 持有 60 日、單檔 10% | 0.47 | 6.0% | -25.3% | 0 / 9 | 0.57 / 0.39 | 0.44 | 0.32 |
| S&P 500 剔除 | 持有 60 日、單檔 10% | 0.52 | 5.4% | -27.9% | 0 / 9 | 0.79 / 0.20 | 0.50 | 0.32 |
| QQQ 含息 | 基準 | 0.93 | 20.0% | -35.1% | 1.27 / 0.60 | 0.92 | 0.83 | |
| SPY 含息 | 參考 | 0.86 | 14.8% | -33.7% | ||||
| RSP 等權 S&P 500 | 參考 | 0.72 | 12.0% | -39.0% |
QQQ、SPY、RSP 的區間是 2016-07-05 至 2026-11-06。首次配息的第一筆事件在 2018 年 1 月,剔除規則的第一筆交易在 2016 年 11 月,兩者各自和同一段日期的 QQQ 比(QQQ 夏普分別是 0.79 和 0.91)。參數裡的金額是日均成交值下限,單位美元。

測試的六條規則
- 配息調升。 公司的常規每股股利比上一次常規配息高出 1% 以上(已調整拆股)。持有 60、120 或 240 個交易日,流動性門檻 500 萬、2,000 萬或 5,000 萬美元。
- 首次或恢復配息。 公司在兩年沒有配息之後配息,且至少有兩年股價資料。持有 60、120 或 240 日,門檻 100 萬、500 萬或 2,000 萬美元。這類事件少,所以門檻放低。
- 除息捕捉。 除息日前 1、3 或 5 個交易日買進,除息日收盤賣出,只做單次股利佔股價至少 0.5%、1% 或 2% 的配息。細節見除息日價差與成本的實測。
- 正向拆股。 拆股比例至少 1 股拆成 1.5 股。持有 60、120 或 240 日,門檻 500 萬、2,000 萬或 5,000 萬美元。
- 納入與剔除 S&P 500。 兩條獨立規則,股票進入或離開指數時買進。持有 20、60 或 120 日,單檔上限帳戶的 5%、10% 或 20%。細節見指數成分變動前後的路徑。
每條規則是 3 × 3 的參數格點,中間那格是原設定,格點在看到任何結果前就寫好。持股等權,單檔上限 5%(格點另有設定者除外),符合的股票少於 20 檔時其餘留現金。
事件研究最難的是日期
公司行動要在你知道的那天才有用,規則的日期都用當時已公開的資訊來定。
| 事件 | 使用的日期 | 為什麼重要 |
|---|---|---|
| 配息 | 宣告日;來源沒有宣告日時用除息日 | 宣告日的涵蓋率依年份約 80% 到 90%。來源的 key_date 欄位都是 2026 年回補的時間,不能當作股利公開的日子 |
| 正向拆股 | 拆股日 | 來源沒有宣告日,所以規則沒辦法交易拆股公告本身 |
| S&P 500 變動 | 名單被觀察到的日子 | 2022 年 11 月以前快照間隔的中位數是 8 天,這個日子可能比實際公告晚好幾週 |
有三項清理對結果影響很大。來源的股利沒有調整拆股(蘋果 2020 年 1 拆 4 前後,每股股利從 0.82 美元變成 0.205 美元),所以比較前先用同一張表的拆股比例換算。特別股利不列入調升基準:距離上一次配息不到 20 天,或金額達到最近四次常規配息中位數的兩倍以上,都不算調升。代號變更(例如 Fiserv 的 FISV 變成 FI)不算真的納入,一週內就被改回的名單編輯也不算,我們從 S&P 500 名單刪掉這樣的 32 對。沒做這一步,納入規則的夏普是 0.41,做完是 0.47。
股票池是美股普通股,含下市股票,一家公司留一個股別,排除 ETF、基金與 ADR。事件當天收盤價要高於 5 美元,過去一年沒有單日漲跌 50% 以上,日均成交值用未還原的收盤價計算;用還原價會高估之後做過反向分割的股票的成交值。公司資料註明美國以外國家的公司不列入配息與拆股規則,因為它們的股利是換算成美元,股利沒變也可能看起來像調升。
策略怎樣才算過關
「贏」指同一段日期裡,日夏普高於含息的 QQQ,沒有扣無風險利率。以下條件都在看到結果前固定:
- 鄰近參數。 9 組參數至少 7 組贏 QQQ。
- 前後兩段。 原設定在前後兩段都要贏。
- 成本。 finlab 美股預設成本 0 和每邊 0.1% 都要贏。
- 現金。 扣掉短天期國庫券(BIL)後的報酬也要贏,因為有些規則大多時間留現金。
- 單一年份。 拿掉領先 QQQ 最多的那個日曆年後,還要領先。
六條規則五項全部沒過。54 組參數裡唯一贏 QQQ 的是除息前 1 日買進、殖利率下限 0.5% 的除息捕捉,扣成本前夏普 1.11。

每張小圖是一條規則,列是持有天數(除息捕捉是提前買進的天數),欄是第二個參數:流動性、殖利率下限或單檔上限。結果一致低於 QQQ,看不到只在少數倒楣參數上輸的情況。
配息調升:持股很廣,結果和 RSP 打平
配息調升規則平均持有 256 檔,一直滿倉。這麼多檔,行為就像一個等權的大中型配息股組合:夏普 0.72,RSP 也是 0.72;年化 12.4%,RSP 12.0%。最大回撤 -41.6%,比 RSP 的 -39.0% 深一點。單邊週轉一年 3.1 次,成本影響小,每邊 0.1% 下夏普從 0.72 變成 0.68。
事件本身沒有帶來能量測到的優勢。配息調升後 120 個交易日,平均比 QQQ 少 4.87 個百分點,只有 38.6% 的事件領先。5,828 次調升幾乎涵蓋市場上大部分配息公司,所以這個比較多半是在比配息股和 Nasdaq 100。Benartzi、Michaely 與 Thaler(1997)發現股利調升反映的多半是過去的盈餘,對未來盈餘成長的訊息有限,和這裡看到的訊號比好消息晚到一致。相關的研究有美股知名選股公式回測裡的股利成長條件,它要求連續三年調升。台股類似的做法見現金股利調高選股,單獨買也輸 0050,要搭配月營收動能才有用。
首次或恢復配息
2018 年起,日均成交值 500 萬美元以上的股票有 220 次首次或恢復配息。組合平均持有約 12 檔,平均投入 58%,常常有一部分留現金。年化 4.1%、夏普 0.33,前後兩段 0.41 和 0.24,QQQ 同期是 0.57 和 1.06。
Michaely、Thaler 與 Womack(1995)發現首次配息後股價持續上漲。這裡 20 天後平均領先 QQQ 0.77 個百分點,120 天後落後 3.94 個百分點,120 天時只有 37.1% 的事件領先。只有 220 次事件,短天期的數字都在雜訊範圍內,樣本的市場環境也和他們當年研究的很不一樣。
正向拆股:看不到漂移
規則平均持有約 7 檔,平均投入 37%。前半段夏普 1.01,QQQ 是 1.27;後半段 0.32,QQQ 是 0.60。Ikenberry、Rankine 與 Stice(1996)和 Desai 與 Jain(1997)發現拆股後一年以上有正的異常報酬。這個樣本裡,拆股後 120 天平均落後 QQQ 1.61 個百分點,240 天落後 6.29 個百分點。中位數落後更多,120 天 -5.19 個百分點,少數大贏家把平均值拉高了。
事件之後平均發生什麼事
| 訊號 | 事件數 | 1 日 | 5 日 | 20 日 | 60 日 | 120 日 | 240 日 | 120 日贏 QQQ 的比例 |
|---|---|---|---|---|---|---|---|---|
| 配息調升 | 5,828 | +0.01% | -0.10% | -0.68% | -2.41% | -4.87% | -10.39% | 38.6% |
| 首次或恢復配息 | 220 | -0.14% | +0.39% | +0.77% | -1.76% | -3.94% | -9.09% | 37.1% |
| 正向拆股 | 164 | -0.33% | -0.11% | -0.18% | -1.43% | -1.61% | -6.29% | 41.7% |
| S&P 500 納入 | 201 | -0.02% | +0.39% | -0.71% | -1.09% | -0.85% | -9.98% | 36.4% |
| S&P 500 剔除 | 119 | +0.09% | -0.04% | -1.24% | -0.76% | +0.45% | -5.90% | 44.5% |
報酬從成交日(訊號隔天)起算,減同一段日期的 QQQ。之後價格不夠長的事件不列入較長天期的欄位。

表上看得出兩件事。第一,前一週的數字都很小,之後偏向負值,看不到舊論文裡的那種漂移。第二,QQQ 的門檻很高:年化 20.0%,到了 240 天,每一列只有 32% 到 38% 的事件領先它。
為什麼 2022 年是六條規則領先最多的一年
領先 QQQ 最多的日曆年,六條規則都是 2022 年。那年 QQQ 跌 32.6%,這些組合跌得少很多,或大致持平。拿掉這一年,QQQ 的夏普從 0.93 升到 1.26,配息調升從 0.72 升到 0.85。規則輸在 QQQ 快速上漲的年份,而這段時間裡這樣的年份佔了多數。

樣本後半段比較接近。QQQ 的夏普從 1.27 掉到 0.60,配息調升(0.64)和除息捕捉(0.86)在這一段贏 QQQ,但前半段都輸,所以沒過前後兩段檢查。這項檢查擋的就是只在一段時間有效的規則。
除息捕捉與指數變動:分開寫成兩篇
除息捕捉和 S&P 500 變動各有不少內容要交代,所以另外寫。重點如下:
- 美股除息日的價差:除息日股價跌幅小於股利,單次股利 0.5% 到 2% 的配息,每筆扣成本前約 0.17% 到 0.18%,比來回 0.2% 的成本還小。
- 納入 S&P 500 前後的股價:納入股在名單日期之前 20 天平均已經贏 QQQ 約 5.2 個百分點,120 天後大部分又吐回去。
和其他研究對照
台股也有同類研究。台股公司行動事件回測測股票股利、庫藏股、現金增資與減資,7 個訊號只有 1 個贏 0050,方向和本文接近。除權息全攻略則討論台股的棄息、抱息與稅務。
美股其他事件研究裡,盈餘驚喜策略用財報事件替大盤擇時,用法和本文買進持有事件股票不同。想看整體哪些規則有效,可以從美股量化交易策略比較和 QQQ、SPY、VOO、VTI 比較開始。剛接觸規則化投資,可以先看量化交易入門。
程式碼
這段是正向拆股規則,六條裡最短。用到 2026-11-06 的資料,它印出的日夏普是 0.56,FinLab 修訂資料時最後一位可能變動。research.py 包含六條規則、54 組參數和五項檢查。
顯示程式碼
import finlab
import numpy as np
import pandas as pd
from finlab import data
from finlab.backtest import sim
finlab.login()
data.set_market("us")
data.truncate_end = "2026-11-06"
adj_close = data.get("us_price:adj_close")
raw_close = data.get("us_price:close")
volume = data.get("us_price:volume")
days = adj_close.index
# 美股普通股,含下市股票,一家公司留一個股別
profile = pd.DataFrame(data.get("us_company_profile")).astype({"stock_id": str}).drop_duplicates("stock_id")
keep = (
(profile["security_type"] == "common_stock")
& ~profile["is_etf"].fillna(False).astype(bool)
& ~profile["is_fund"].fillna(False).astype(bool)
& ~profile["is_adr"].fillna(False).astype(bool)
)
stocks = profile.loc[keep, ["stock_id", "company_name", "country"]].astype(str).sort_values("stock_id")
stocks = stocks.drop_duplicates("company_name")
stocks = stocks[stocks["stock_id"].isin(adj_close.columns)]
us_stocks = set(stocks.loc[stocks["country"].isin(["US", "nan"]), "stock_id"])
columns = sorted(stocks["stock_id"])
# 事件當天可交易:收盤高於 5 美元、日均成交值 2,000 萬美元、一年內沒有單日漲跌 50%
dollar_volume = (raw_close * volume).rolling(60, min_periods=20).mean()
daily_return = adj_close.pct_change(fill_method=None)
wild = (daily_return.abs() >= 0.5).astype(float).rolling(252, min_periods=1).max().shift(1).fillna(0) > 0
tradable = (raw_close > 5) & (dollar_volume > 20e6) & ~wild
tradable = pd.DataFrame(tradable).reindex(index=days, columns=columns).fillna(False).astype(bool)
# 1 股至少拆成 1.5 股的正向拆股
actions = pd.DataFrame(data.get("us_corporate_actions")).astype({"symbol": str})
splits = actions[(actions["split_factor"] >= 1.5) & actions["symbol"].isin(us_stocks)]
events = pd.DataFrame(False, index=days, columns=columns)
rows = np.searchsorted(days.values, pd.DatetimeIndex(splits["date"]).values)
for row, symbol in zip(rows, splits["symbol"]):
if symbol in events.columns and row < len(days):
events.iloc[row, events.columns.get_loc(symbol)] = True
# 每次拆股持有 120 個交易日,單檔上限 5%
position = (events & tradable).astype(float).rolling(120, min_periods=1).max() > 0
position = position.loc["2016-07-01":"2026-11-06"]
position = position.loc[:, position.any()]
report = sim(position, resample=None, position_limit=0.05, upload=False)
returns = report.creturn.pct_change().dropna()
print("日夏普:", round(returns.mean() / returns.std() * 252 ** 0.5, 2))不想自己寫也可以。照 AI 輔助安裝流程裝好 FinLab skill,或直接到 FinLab Studio 用白話請 AI 重跑,例如「配息調升只測 S&P 500 成分股」或「拆股規則加上 20 日動能濾網,每邊收 0.05% 成本」。
回測方法
| 項目 | 做法 |
|---|---|
| 回測區間 | 2016-07-01 至 2026-11-06。FinLab 美股價格與股利資料從 2016 年 1 月開始;首次配息要求兩年沒配息,所以從 2018 年 1 月開始 |
| 股票池 | 美股普通股,含下市股票,一家公司留一個股別,排除 ETF、基金與 ADR。S&P 500 規則用當天的指數成分 |
| 流動性 | 60 日平均(未還原收盤價 × 成交量)在事件當天高於門檻;收盤價高於 5 美元,過去一年沒有單日漲跌 50% 以上。S&P 500 規則以指數成分取代 |
| 訊號日期 | 配息用宣告日(缺值用除息日),拆股用拆股日,指數變動用觀察日,見上表。在資料允許的範圍內控制前視偏差 |
| 成交 | 收盤算訊號,隔天收盤成交,使用還原價 |
| 權重 | 等權,單檔上限 5%(S&P 500 格點另有設定),名單變動的日子重新等權;現金沒有利息 |
| 成本 | finlab sim() 美股預設 0,另跑每邊 0.1%。未另估滑價。目標權重單邊週轉率一年 0.8 次(拆股)到 27.5 次(除息捕捉) |
| 稅 | 未計,除息捕捉的稅負見專文 |
| 資料 | 股利與拆股來自單一資料商,可能漏報。規則雖要求事件前有兩年股價,但沒有資料列不代表沒配息 |
| 樣本 | 全段都是樣本內,前後兩段只檢查穩定度,沒有做樣本外驗證 |
這個結果能說明什麼
在這段期間和這些規則下,配息調升、首次配息、正向拆股、S&P 500 變動之後買進,都沒有贏 QQQ;除息捕捉 9 組參數有 1 組扣成本前贏。配息調升組合的風險調整報酬和等權 S&P 500 相同,所以已經持有等權美股的人,偏向調升股在這裡看不出壞處,也看不出好處。
這篇無法告訴你原始的學術效果還在不在。我們的日期是資料裡最早能驗證的日期,S&P 500 變動還晚於實際公告。測試涵蓋的十年,QQQ 又特別強。如果你交易的是小型股的公司行動,或想交易公告而不是事件日,需要另外測。
常見問題
公司行動能預測股價嗎?
在這個測試裡不能。2016 到 2026 年,六條美股事件規則都沒贏含息的 QQQ,最接近的是除息捕捉,扣成本前夏普 0.75,QQQ 是 0.93。
買配息調升的股票是好策略嗎?
在這個測試裡和等權 S&P 500 打平:年化 12.4%、夏普 0.72,RSP 是 12.0% 和 0.72。9 組參數全部輸 QQQ 的 20.0% 和 0.93。
股票拆股後會漲嗎?
正向拆股後 120 個交易日,平均落後 QQQ 1.61 個百分點,中位數落後 5.19 個百分點。每次拆股持有 120 日的組合年化 5.0%、夏普 0.56。舊研究發現正的漂移,但樣本是另一段時間。
首次配息後股價會漲嗎?
這個樣本沒有。2018 年起日均成交值 500 萬美元以上的 220 次事件,組合夏普 0.33、年化 4.1%,事件後 120 天平均落後 QQQ 3.94 個百分點。
為什麼用 QQQ 比,不用 S&P 500?
站上所有美股策略都用 QQQ 當基準,結果才能互相比較。表上也列了 SPY 和 RSP:配息調升和 RSP 打平,輸 SPY 與 QQQ。
有任何參數贏 QQQ 嗎?
54 組有 1 組:除息捕捉,除息前 1 日買進、單次股利至少 0.5%,扣成本前夏普 1.11。每邊收 0.1% 後變成 -0.51。
可以自己重跑嗎?
可以。透過 AI 輔助安裝流程裝好 FinLab skill,下載下面的 research.py,執行 python research.py。
延伸閱讀
- 除息捕捉策略回測:31,843 次除息日,股價跌幅小於股利,但付不起成本。
- S&P 500 納入與剔除回測:18 組參數全輸 QQQ,事件前後的路徑分兩段期間列出。
- 道瓊狗股策略回測:另一種靠配息選股的美股規則。
- 美股知名選股公式回測:Magic Formula、CANSLIM 與股利成長。
下載資源
| 檔案 | 內容 |
|---|---|
| research.py | 完整研究:六條規則、54 組參數、前後兩段、成本重跑、五項檢查與事件研究 |
| data.csv | 六條規則原設定,加上 QQQ、SPY、RSP 的每日淨值 |
| metrics.json | 本文背後的統計,包含交易、持股數、事件後報酬與逐年報酬 |
投資警語:本文僅供教學參考,不構成投資建議,也不推薦任何個股。過去績效不代表未來表現,投資有風險。本文所有回測均為全段樣本內結果,前後兩段未經樣本外驗證。
最後更新:2026-11|回測區間:2016-07~2026-11|資料截至 2026-11-06,重跑日 2026-11-09|基準:QQQ 含息|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始


