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

量化投資實戰:用 Python 打敗 0056,
年化 19%

用 finlab 把高股息量化策略在台股實測 16 年(2010–2026):CAGR 19.04%、Sharpe 1.34,贏過含息 0056 的 12.41%。純買 0056 是把報酬留在桌上,加上滾動年化股息率、均線趨勢分數與最小回撤三道濾網,17 個年度裡有 13 年跑贏,附可下載 Python 程式與互動式回測報告。

打敗0056秘訣 CAGR 19.0% Sharpe 1.34

高股息量化策略 vs 0056 含息累積淨值對數圖

「買 0056 存股領息,長期就會贏。」這是台股最普遍的存股信仰之一。我們用 finlab 把 0056 的選股邏輯拆開重做,在台股實測 16 年(2010 年 6 月至 2026 年 7 月),結論很直接:純買 0056 是把報酬留在桌上。

先講數字。同樣以高股息為出發點,加上三道量化濾網篩出殖利率最高的 20 檔、季度換股,這個策略 16 年 CAGR 達 19.04%、日夏普 1.34,贏過含息 0056 的 12.41% 約 6.6 個百分點;總報酬 +1526.26%,而 0056 含息是 +550.39%。17 個年度裡有 13 年跑贏 0056。代價是波動更大:策略最大回撤 −30.23%,比 0056 的 −26.89% 更深。這篇文章把三道濾網、逐年勝負與真實方法口徑全部攤開,程式碼可下載自行重跑。

真實績效對照表:策略 vs 0056 含息

下表是同一段視窗(2010-06 至 2026-07)、finlab 預設交易成本(手續費 0.1425%、證交稅 0.3%)下,高股息量化策略與含息 0056 買進持有的完整對照。0056 的報酬含還原股利,是把股息再投入的口徑,並非只看價格。

指標 高股息量化策略 0056 含息(基準)
總報酬率 +1526.26% +550.39%
年化報酬(CAGR) 19.04% 12.41%
夏普比率 1.34 0.92
索提諾比率 1.53 1.09
最大回撤 −30.23% −26.89%
卡爾瑪比率(Calmar) 0.63 0.46

三個重點先標出來。第一,CAGR 19.04% 對 12.41%,六個百分點的差距在 16 年複利下放大成總報酬近三倍的落差。第二,風險調整後的表現同樣勝出:夏普 1.34 對 0.92、索提諾 1.53 對 1.09、卡爾瑪 0.63 對 0.46,代表策略每承擔一單位風險換回的報酬更高。第三,策略最大回撤 −30.23% 比 0056 的 −26.89% 更深,多出來的三個百分點回撤,就是換取更高報酬要付的波動成本。

為什麼純買 0056 會把報酬留在桌上

0056 追蹤台灣高股息指數,設計上有兩個先天限制。其一,成分股數量固定、且需要足夠流動性,能納入的高股息股票有限,選股範圍被框死。其二,高現金股息本身不保證股價表現,很多高殖利率股是因為股價已經跌深、殖利率才被動墊高,這類「殖利率陷阱」在被動指數裡照樣會被納入。

高股息這個因子並非沒有價值,問題出在「只用殖利率排序」太粗糙。我們的做法是保留高股息的出發點,再疊上兩個過濾維度:股價是不是站在上升趨勢、以及這檔股票過去在壞行情裡跌得深不深。把「便宜(高殖利率)」「有趨勢」「抗跌」三件事同時要求,篩掉的正是那些殖利率好看、體質卻差的股票。

策略對 0056 的滾動一年超額報酬圖

上面這張滾動一年超額報酬圖,把「策略相對 0056 在每一個滾動 12 個月區間的領先或落後」畫出來。多數時間策略在零軸之上,代表過去一年跑贏 0056;但也有幾段落到零軸之下,那些就是策略階段性輸給 0056 的時期。這張圖的意義是:超額報酬在短期會有起伏,靠的是長期累積贏,每個月並不穩定發生,抱得住是拿到那 6.6 個百分點的前提。

三道濾網:策略邏輯講清楚

這個策略的核心是三個條件同時成立,最後再取殖利率最高的 20 檔。三道濾網分別是:

  • 滾動 520 日年化現金股息率。 把每次公告的現金股利除以當時收盤價得到單次殖利率,再用約兩年(520 個交易日)的滾動窗口累加,得到一個平滑後的年化股息率。用兩年窗口而非單一年度,是為了讓一次性配息不會過度放大或縮小殖利率評分。
  • 多條均線趨勢分數。 計算收盤價站上 10、30、50 一路到 130 日均線的個數,站上越多條、趨勢分數越高。這是把「股價是否處於上升趨勢」量化成一個 0 到多的分數,篩掉均線糾結、方向不明的股票。
  • 500 日滾動最小回撤。 用 500 個交易日的滾動窗口看每檔股票的最小回撤(相對前高的最深跌幅),取回撤表現最好的前段。這一步過濾掉在壞行情裡跌特別深的股票,留下抗跌能力較強的標的。

三個條件都通過後,再要求成交量大於 50000 張(確保實單買得到),最後在剩下的池子裡取滾動年化殖利率最高的 20 檔,每季換股一次。下面是這段選股邏輯的人類可讀版本,登入後即可重跑:

顯示程式碼
import finlab
from finlab import data
from finlab.backtest import sim
from finlab.dataframe import FinlabDataFrame
 
finlab.login()  # finlab 會自動引導登入
 
close = data.get("price:收盤價")
volume = data.get("price:成交股數")
 
# 股利以股東會日期對齊,用的是公告後才可得的資訊
div = data.get("board_dividend_announcement")
dates = div["股東會日期"].fillna(div["董事會決議(擬議)股利分派日"])
cash_dividend = (
    div.drop_duplicates(["stock_id", "股東配發之現金(股利)總金額(元)"], keep="first")
    .groupby([div.stock_id, dates])
    .first()["盈餘分配之現金股利(元/股)"]
    .dropna().reset_index()
    .pivot(index="股東會日期", columns="stock_id", values="盈餘分配之現金股利(元/股)")
)
 
# 濾網一:滾動 520 日年化現金股息率
dividend_yield = (cash_dividend / close).rolling(520, min_periods=1).sum()
 
# 濾網二:收盤價站上 10~130 日均線的個數(趨勢分數)
trend_score = sum([close > close.average(i) for i in range(10, 150, 20)])
 
# 濾網三:500 日滾動最小回撤(抗跌能力)
drawdown = close / close.cummax()
min_drawdown = drawdown.rolling(500, min_periods=200).min()
 
# 三道濾網取前 30%、成交量過濾,再取殖利率最高 20 檔
pool = FinlabDataFrame(dividend_yield)[
    (trend_score.rank(axis=1, pct=True) > 0.7)
    & (min_drawdown.rank(axis=1, pct=True) > 0.7)
    & (volume > 50_000)
]
position = pool.is_largest(20)
 
# 季度換股回測,finlab 預設已內含手續費與證交稅
report = sim(position, resample="Q")
report.display()

逐年報酬:不是每年都贏

一個策略平均贏,不代表每一年都贏。下面這張逐年報酬長條圖,把策略與 0056 每個年度的報酬並排,可以看出勝負分佈。

策略與 0056 逐年報酬長條圖

17 個年度(含 2026 年 YTD 未完整年)裡,策略在 13 年跑贏 0056。逐年報酬(策略/0056,單位 %)如下:2010 年 37.0/27.0、2011 年 −12.7/−12.8、2012 年 17.6/8.7、2013 年 40.5/4.9、2014 年 18.3/9.3、2015 年 −3.4/−5.4、2016 年 16.0/11.3、2017 年 21.9/12.4、2018 年 −2.3/1.5、2019 年 23.0/29.0、2020 年 16.8/9.3、2021 年 25.0/18.7、2022 年 1.9/−17.7、2023 年 64.9/56.9、2024 年 36.6/7.7、2025 年 1.2/12.0、2026 年 25.1/50.5(YTD)。

輸給 0056 的四個年度值得單獨看:2018、2019、2025 與 2026 年(YTD)。2019 與 2026 這兩年是大盤與 0056 走大多頭、權值股領漲,策略偏中小型高股息的選股在這種行情裡相對落後;2018 與 2025 則是策略小輸。最亮眼的兩年是 2022 與 2024:2022 年 0056 含息下跌 −17.7%,策略靠抗跌濾網守到 +1.9%,這一年是超額報酬的主要來源之一;2024 年策略 +36.6%、0056 只有 +7.7%,趨勢濾網在多頭裡選到對的股票。

回撤比較:波動更大是換更高報酬的代價

策略與 0056 的回撤比較圖

上面這張回撤比較圖把兩者的水下曲線疊在一起。策略最大回撤 −30.23%,比 0056 的 −26.89% 更深。原因是策略持股集中在 20 檔、且偏向中小型高股息股,個股波動大於分散的指數,在系統性下跌時跌得更兇。這是必須正視的取捨:更高的 CAGR 不是免費的,它用更深的回撤與更大的帳面起伏換來。卡爾瑪比率(年化報酬除以最大回撤)0.63 對 0056 的 0.46,代表即使把更深的回撤算進去,策略每承擔一單位最大回撤換回的報酬仍然較高,但這不改變「你要抱得住 −30% 帳面浮虧」這個現實。

回測方法與限制

  • 回測區間與換股:2010 年 6 月至 2026 年 7 月,共約 16 年,季度換股(resample="Q"),每季選殖利率最高的 20 檔。2026 年為 YTD,非完整年度。
  • 交易成本與稅:使用 finlab sim() 預設,已內含手續費 0.1425% 與賣出證交稅 0.3%,未另外假設滑價。
  • 股利對齊與前視偏差:現金股利以「股東會日期」對齊(無股東會日期者用董事會決議股利分派日),用的是公告之後才可得的資訊,因此選股時點不會用到尚未揭露的股利資料,避免前視偏差。
  • 流動性過濾:要求成交量大於 50000 張,避免回測買得到、實單買不到的情況。
  • 集中度:只持有 20 檔且偏中小型高股息股,單一個股的漲跌對組合影響較大,最大回撤 −30.23% 深於 0056。
  • 樣本內結果:本文是單一視窗(2010–2026)的全段回測,未做樣本外切割(in_sample_only)。三道濾網的參數是在同一段歷史上選定,請把逐年勝負當成對這段資料的觀察,而非對未來的保證。過去績效不代表未來表現,13/17 年跑贏也意味著有 4 年會輸。

高股息因子的學術根據

用股利殖利率篩選股票有其學術基礎。Fama & French (1988) 發現股利殖利率對股票長期報酬有預測能力,高殖利率往往對應較高的未來報酬。這也是為什麼「高股息」值得當成選股的起點。但單看殖利率不夠,本策略把它和趨勢、抗跌兩個維度合起來用,正是為了避開那些殖利率被動墊高、基本面卻在惡化的殖利率陷阱。

結論

在 2010 至 2026 這 16 年、本文設定下,純買含息 0056 的 CAGR 是 12.41%,而在高股息基礎上疊加滾動年化股息率、均線趨勢分數與最小回撤三道濾網、季度換股選 20 檔的量化策略,CAGR 達到 19.04%,17 年裡 13 年跑贏。差距來自把「便宜」「有趨勢」「抗跌」三件事同時要求,篩掉了殖利率陷阱。代價是波動更大、回撤更深(−30.23% 對 −26.89%),且 2018、2019、2025、2026(YTD)這幾年會輸給 0056。想用最新資料即時重算、或換成自己的參數,跑下方的程式即可。

免費試用

用 AI 開始 FinLab

把這句話交給你的AI,它會帶你完成設定並做出第一個策略。

告訴你的AI:

幫我設定 FinLab,重現這篇文章用滾動年化股息率、移動平均趨勢與最小回撤選出 20 檔打敗 0056 的高股息策略回測,請讀:https://finlab.finance/setup?relatedUrl=/blog/python-finlab-optimization

延伸閱讀

VIP 區域接著提供完整可下載程式與互動式回測報告:strategy.pydata.csv 可自行重現本文 CAGR 19.04%、夏普 1.34、最大回撤 −30.23% 的全部數字,並附可逐年檢視持股與交易明細的互動式回測儀表板,跑一次即得當季持股清單。

本文內容僅供教學與研究參考,不構成投資建議或推薦。投資有風險,過去績效不代表未來表現,本策略最大回撤達 −30.23%,且並非每年都贏 0056。讀者應自行評估風險承受度,並在做出投資決策前諮詢專業顧問。

VIP 區域包含策略細節

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

FinLab AI

想建立自己的策略?

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

免費開始

更多動能與趨勢研究

查看全部