
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重跑三率三升、毛利率創新高等 8 個財報品質訊號,和 0050 含息比較,請讀:https://finlab.finance/setup?relatedUrl=/blog/financial-quality-signals-backtest
三率三升、毛利率創新高、營益率由負轉正、存貨營收比下降、資本支出不暴增、合約負債成長、EPS 連續年增、ROE 高且穩定,是台股投資人最常拿來篩財報的 8 個條件。我們用 finlab 把它們照字面做成選股策略,從 2016 年 4 月回測到 2026 年 10 月:單獨選股時每個訊號換 9 組參數,72 組沒有一組的日夏普贏過同期含息 0050;疊在已驗證的月營收動能策略上,有 3 個訊號過了三項驗證,但沒有一個能穩定比月營收動能單獨更好。
最接近的是「毛利率創近 8 季新高」。月營收動能候選股裡,毛利率創新高的優先買,原參數年化 51.4%、日夏普 1.60,月營收動能單獨是 49.8%、1.49。其餘 8 組(4/8/12 季新高 × 持股 8/10/12 檔,扣掉原參數)只有 4 組比同持股數的月營收動能單獨好,9 組合計 5 組,不到事先定的 7 組。
同一批研究另外驗證了 4 篇舊文:F-Score 改良版(股價淨值比最低的 500 檔、F-Score 至少 7 分、月營收年增)三項驗證都過,新增 策略頁;另外 3 篇沒過,整理在文末「同批驗證的 4 篇舊文」。
關鍵數字
單獨選股(每月底依訊號取前 30 檔、等權):
| 訊號(原參數) | 年化報酬 | 日夏普 | 最大回撤 | 前/後半段日夏普 | 9 組參數贏 0050 |
|---|---|---|---|---|---|
| 三率三升,連續 2 季 | 14.1% | 0.64 | -51.1% | 0.85/0.46 | 0 組 |
| 毛利率創近 8 季新高 | 12.7% | 0.64 | -43.8% | 0.74/0.55 | 0 組 |
| 營益率由負轉正,連續 2 季年增 | 21.9% | 0.90 | -49.5% | 1.21/0.63 | 0 組 |
| 存貨營收比比 4 季前下降最多 | 5.5% | 0.35 | -54.6% | 0.60/0.15 | 0 組 |
| 資本支出強度比 4 季前增幅最低 | 9.2% | 0.51 | -39.7% | 0.63/0.42 | 0 組 |
| 流動合約負債比 2 季前成長最多(2019 起) | 28.2% | 1.20 | -38.0% | 0.76/1.59 | 0 組 |
| EPS 連續 4 季年增 | 12.6% | 0.60 | -46.6% | 0.66/0.56 | 0 組 |
| 近 8 季每季 ROE 至少 3.75%,波動最小 | 12.3% | 0.76 | -33.1% | 0.94/0.62 | 0 組 |
| 0050 含息(2016-04-29 起) | 23.8% | 1.20 | -34.0% | 1.23/1.20 | — |
合約負債那列從 2019-07-31 起算,同期 0050 年化 28.7%、日夏普 1.28,前後兩段 0.76/1.73。
疊在月營收動能上(月營收動能候選股裡,符合訊號的優先入選,持股 10 檔):
| 組合(原參數) | 年化報酬 | 日夏普 | 最大回撤 | 9 組贏 0050 | 9 組高於同持股數的月營收動能 | 三項驗證 |
|---|---|---|---|---|---|---|
| +三率三升 | 36.0% | 1.27 | -32.6% | 4 組 | 0 組 | 沒過 |
| +毛利率創新高 | 51.4% | 1.60 | -30.2% | 8 組 | 5 組 | 過 |
| +營益率轉正 | 36.3% | 1.30 | -31.3% | 9 組 | 4 組 | 沒過(後半段) |
| +存貨營收比下降 | 43.1% | 1.45 | -38.1% | 8 組 | 3 組 | 過 |
| 排除資本支出強度增幅前 20% | 48.4% | 1.50 | -34.8% | 9 組 | 6 組 | 過 |
| +合約負債成長(2019 起) | 34.6% | 1.37 | -26.2% | 7 組 | 0 組 | 沒過(前半段) |
| +EPS 連續年增 | 25.3% | 1.04 | -37.0% | 2 組 | 0 組 | 沒過 |
| +ROE 高且穩定 | 25.0% | 1.18 | -24.6% | 2 組 | 0 組 | 沒過 |
| 月營收動能單獨(2016-05-11 起) | 49.8% | 1.49 | -35.6% | — | — | — |
| 0050 含息(同期) | 24.2% | 1.21 | -34.0% | — | — | — |
月營收動能單獨持股 8、10、12 檔的日夏普是 1.37、1.49、1.52;合約負債那列從 2019-08-08 起,同期月營收動能單獨是 1.44、1.62、1.66,0050 是 1.30。
研究問題:8 個財報訊號與出處
| 訊號 | 說法 | finlab 資料 | 出處 |
|---|---|---|---|
| 三率三升 | 毛利率、營益率、淨利率同時比去年好,代表本業轉強 | fundamental_features:營業毛利率、營業利益率、稅後淨利率 |
— |
| 毛利率創新高 | 毛利率創近幾季新高,代表產品議價力上升 | fundamental_features:營業毛利率 |
Lev & Thiagarajan (1993) |
| 營益率轉正 | 本業由虧轉盈、而且持續改善,是轉機股 | fundamental_features:營業利益率 |
— |
| 存貨營收比下降 | 存貨增加得比營收慢,代表沒有庫存壓力 | financial_statement:存貨、營業收入淨額、資產總額 |
Abarbanell & Bushee (1998) |
| 資本支出不暴增 | 大舉擴廠的公司之後股價偏弱 | financial_statement:取得不動產_廠房及設備 |
Titman, Wei & Xie (2004) |
| 合約負債成長 | 預收款增加是營收的領先指標 | financial_statement:合約負債_流動 |
本站 合約負債選股 |
| EPS 連續年增 | 獲利連年成長的公司比較好 | fundamental_features:每股稅後淨利 |
— |
| ROE 高且穩定 | 長期高 ROE、波動小的公司是好公司 | fundamental_features:ROE稅後 |
— |
Lev & Thiagarajan (1993) 在 Journal of Accounting Research 整理分析師常用的 12 個財報訊號,包括存貨、毛利率、銷管費用與資本支出的變化,發現它們和當期股價報酬有關。Abarbanell & Bushee (1998) 在 The Accounting Review 把其中幾個訊號組成選股策略,存貨增加得比營收快是負面訊號之一。Titman, Wei & Xie (2004) 在 Journal of Financial and Quantitative Analysis 發現資本投資大幅增加的美國公司,之後幾年的報酬偏低。這三篇都是美股研究,本文檢驗的是同樣的想法在台股、2016 年以後、扣完交易成本是否還站得住。
各訊號的資料欄位說明在 FinLab 資料頁:毛利率、營業利益率、淨利率、存貨週轉率、ROE。
回測方法
| 項目 | 本文的做法 |
|---|---|
| 股票池 | 單獨版:上市櫃普通股(4 位數代號),含後來下市的股票;排除金融保險(28 開頭與金融類別)、存託憑證(91 開頭)與 0 開頭的 ETF,20 日平均成交金額至少 2,000 萬元。組合版:候選股沿用月營收動能(全部上市櫃,不排除金融股、沒有成交金額門檻),只有普通股、非金融股會被優先或排除。兩種都沒有另外排除 KY 股與全額交割股 |
| 訊號附加條件 | 三率三升要求本季淨利率 > 0;EPS 連續年增要求本季與去年同季 EPS 都 > 0;存貨訊號只看存貨至少占總資產 5% 的公司;合約負債訊號只看合約負債至少是近四季營收 10% 的公司 |
| 財報時點 | 損益與現金流量都用單季值。每家公司的財報從它實際公布那天才用得到(index_str_to_date()),晚交的公司以實際公布日為準;不符合條件的季別不會沿用上一季的結果,避免 前視偏差 |
| 單獨版 | 每月最後一個交易日,符合條件的股票依分數取前 n 檔(n=20、30、50),等權持有 |
| 組合版 | 底策略是 月營收動能:股價站上 20、60、120 日線,近 3 個月平均營收高於近 12 個月,取 5 日平均漲幅最大的 N 檔(N=8、10、12),每月 11 日換股、單檔 10% 停損。符合訊號的候選股排在前面,不符合的才補位;資本支出是反過來排除強度增幅最大的 20% |
| 期間 | 2016-04-01 起到 2026-10-30(近 12 季的條件要等 2015 年報在 2016-03-31 公布)。流動合約負債 2018 年 IFRS 15 上路後才普遍揭露(2017 年第 1 季約 550 家有值、2018 年第 1 季約 890 家),從 2019-07-01 起 |
| 交易成本 | sim() 預設:手續費 0.1425%(買賣各一次,未打折)、證交稅 0.3%(賣出) |
| 滑價 | 未另外假設,以 sim() 的收盤價成交 |
| 權重 | 單獨版與組合版都等權;組合版持股 10 檔時每檔約 10% |
| 周轉 | 單邊年周轉率(不含停損賣出):單獨版約 3.5 到 4.2 倍(ROE 穩定 1.6 倍);組合版約 9 到 11.5 倍,相當於每月換掉 77% 到 96% 的持股 |
| 樣本 | 全段都是樣本內,沒有樣本外測試;「前後兩段」是同一段期間對半切 |
| 容量 | 未估算。組合版每次只買 10 檔,實際衝擊取決於資金規模與成交量 |
| 基準 | 0050 含息(etl:adj_close 還原價)買進持有,不扣成本,和策略同一段日期 |
| 統計口徑 | 日夏普=日報酬平均÷標準差×√252,不扣無風險利率 |
三項驗證的「贏」都指日夏普高於同期 0050 含息:
- 參數高原: 訊號參數取 3 個值、持股數取 3 個值,共 9 組,至少 7 組要贏。
- 前後兩段: 原參數在前半段、後半段各自都要贏。
- 交易成本: 用
sim()預設的手續費與證交稅,不設成 0。
組合版另外要比底策略好才算新策略:原參數的日夏普要高於同持股數的月營收動能單獨,9 組裡也要至少 7 組高於同持股數的底。這些定義與參數在看到任何回測結果前就寫定,之後沒有改動。每個訊號 9 組、兩個版本總共 144 組參數,總會有幾組剛好贏,挑出來報告就是過度擬合,所以只看事先寫定的原參數與整片鄰近參數。日夏普的算法見 夏普比率怎麼算。
單獨選股:72 組參數,日夏普最高 1.20

每個點是一組參數的日夏普,紅線是同期 0050。72 組裡最高的是合約負債成長的原參數 1.20,仍低於同期 0050 的 1.28;其他 7 個訊號的日夏普都在 0.91 以下,2016 年以來 0050 是 1.20。
前後兩段也一樣。營益率轉正的前半段 1.21,跟 0050 的 1.23 只差一點,後半段掉到 0.63;合約負債前半段 0.76 和 0050 打平(0.760 對 0.761),後半段 1.59 輸給 1.73。其他 6 個訊號兩段都輸。
不扣成本也只有合約負債小贏:日夏普 1.30 對 0050 的 1.28。其他 7 個訊號不扣成本的日夏普在 0.46 到 1.00 之間,輸給 0050 的原因不在成本。
回撤是另一個問題。三率三升、營益率轉正、存貨營收比、EPS 連續年增的最大回撤都在 -46% 到 -55% 之間,比 0050 的 -34.0% 深得多。只有 ROE 高且穩定的 -33.1% 和 0050 差不多,但年化只有 12.3%。
疊在月營收動能上:3 個過三項驗證,沒有一個穩定比底好

組合版的對手有兩個:0050 和月營收動能本身。月營收動能單獨 2016 年 5 月以來年化 49.8%、日夏普 1.49,本來就贏 0050 很多,所以 9 組贏 0050 不難,難的是比它更好。
- 過三項驗證的 3 個: 毛利率創新高(9 組贏 0050 8 組)、存貨營收比下降(8 組)、排除資本支出暴增(9 組),前後兩段都贏 0050,扣成本也贏。
- 比底好的檢查都沒過: 毛利率創新高原參數 1.60 比底的 1.49 高 0.11,9 組只有 5 組高於同持股數的底;排除資本支出原參數 1.50 對 1.49,只高 0.01,9 組有 6 組;存貨營收比原參數 1.45,比底還低,9 組只有 3 組。
- 反而變差的 5 個: 三率三升、EPS 連續年增、ROE 高且穩定、合約負債成長,9 組都沒有一組高於同持股數的底;營益率轉正 9 組都贏 0050,但後半段 0.75 輸給 0050 的 1.19,只有 4 組高於底。

毛利率創新高的 9 組拆開看:8 季新高持股 10、12 檔,以及 12 季新高持股 8、10、12 檔,日夏普 1.44 到 1.63,比同持股數的底高;4 季新高的 3 組(1.10、1.33、1.47)和 8 季新高持股 8 檔(1.30)比底低。12 季新高持股 10 檔是 1.492 對底的 1.491,幾乎打平。9 組只有 5 組高於同持股數的底,不到事先定的 7 組,所以本文不把它開成新策略;原參數的程式附在下面與 research.py,讀者可以自己換參數看。
為什麼財報品質訊號贏不了 0050
下面是幾個可能的原因,除了數字以外,本文沒有逐一驗證。
- 2016 年以後是 0050 很強的十年。 同期 0050 含息年化 23.8%、日夏普 1.20,台積電權重最大。單獨版原參數每次等權持有 30 檔,即使不扣成本,8 個訊號也只有合約負債的日夏普略高於 0050。
- 財報落後股價。 第 4 季財報最晚在隔年 3 月底才公布,第 1 到 3 季也要在季底後 45 天內;三率三升、EPS 年增這類訊號出現時,同一季三個月的營收早就在月營收裡公布過了。
- 跟月營收重疊。 月營收動能已經挑了營收成長、股價強勢的股票。組合版把符合財報訊號的候選股排在前面,等於讓出部分 5 日動能較強的股票;8 個訊號裡有 6 個原參數低於月營收動能單獨(合約負債比的是 2019 年起的底),看不出這些財報訊號帶來月營收以外的資訊。
- 穩定的好公司漲得慢。 ROE 近 8 季都高、波動最小的公司,單獨版最大回撤 -33.1% 和 0050 差不多,年化只有 12.3%;組合版把回撤從 -35.6% 降到 -24.6%,年化也從 49.8% 降到 25.0%。
- 轉機股波動大。 營益率由負轉正的單獨版年化 21.9%,是單獨版第二高,但最大回撤 -49.5%,2021 年下半年以後的日夏普只有 0.63。
同批驗證的 4 篇舊文
- F-Score 改良版(通過): 股價淨值比最低的 500 檔、F-Score 至少 7 分、最新月營收年增,每月換股。日夏普 1.26 贏 0050 含息的 1.05,年化 19.7% 和 0050 的 19.8% 差不多;9 組參數贏 8 組,前後兩段都贏,但後半段只領先 0.03。細節見 F-Score 選股,策略頁是 低股價淨值比+F-Score+營收成長。
- 合約負債建築工(沒過): 建材營造類股、合約負債佔股本 55% 以上的前 5 檔。2013 年 8 月以來日夏普 1.31 贏 0050 的 1.09,但 9 組只有 6 組贏,2020 年 3 月以後的後半段 1.18 輸給 1.44。見 合約負債選股術。
- 財報狗巴菲特選股(沒過): 負債比、ROE、自由現金流 27 種年數組合,2018 年 4 月以來每 60 個交易日換股,日夏普 0.70 到 0.93,全部輸給 0050 的 1.17。見 財報狗巴菲特選股回測。
- 高 ROE 全持有(沒過): 近四季 ROE 超過 10% 的股票全部持有,日夏普 0.78 輸給 0050 的 1.08,ROE 門檻越高日夏普越低。見 ROE 到底高或低才好。
用 finlab 重現:毛利率創新高疊在月營收動能上
本文的數字全部出自文末的 research.py。下面是表格裡最接近通過的那組,可以直接貼進 Python 或交給 AI 助理執行:
顯示程式碼
from finlab import data
from finlab.backtest import sim
close = data.get("price:收盤價")
revenue = data.get("monthly_revenue:當月營收")
gross_margin = data.get("fundamental_features:營業毛利率")
# 1. 月營收動能的候選股:站上 20、60、120 日線,近 3 個月平均營收高於近 12 個月
trend = (close > close.average(20)) & (close > close.average(60)) & (close > close.average(120))
revenue_up = revenue.average(3) > revenue.average(12)
momentum = (close / close.shift() - 1).rolling(5).mean()
# 2. 本季毛利率高於前 7 季(近 8 季最高),從各公司公布財報那天起才算數
new_high = gross_margin > gross_margin.shift(1).rolling(7).max()
preferred = new_high.astype(float).index_str_to_date().reindex(close.index, method="ffill").fillna(0)
# 3. 毛利率創新高的候選股排前面,再依 5 日動能取前 10 檔
score = momentum[trend & revenue_up] + preferred
position = score.is_largest(10).loc["2016-04-01":]
# 4. 每月 11 日換股、單檔 10% 停損,sim() 預設扣手續費與證交稅
report = sim(position, resample="M", resample_offset="11D", stop_loss=0.1)
report.display()這段讓所有上市櫃股票都能享有毛利率優先(候選股和 research.py 相同),2016-05-11 到 2026-10-30 年化 51.1%、日夏普 1.60;research.py 只讓普通股、非金融股享有優先,結果是 51.4%、1.60。把 rolling(7) 改成 rolling(3),就是 4 季新高、10 檔的版本(日夏普 1.33,低於月營收動能單獨的 1.49);把 preferred 拿掉,就是月營收動能單獨。finlab 需要資料時會自動引導登入,不需要在程式裡填 token。
這些訊號可以怎麼用
- 單獨選股都輸 0050。 本文唯一測過的排除用法是資本支出:排除增幅最大的 20% 後,日夏普 1.50 對月營收動能單獨的 1.49,幾乎沒有差別;拿其他財報訊號排除體質變差的公司是否有用,本文沒有測。
- 月營收比季報更即時。 台股每月 10 日前公布營收,季報要等 45 天到 3 個月。想看獲利是否轉強,可以先看 月營收動能 這類訊號,財報當事後確認。
- 組合要比底策略好才有意義。 疊在已經很強的策略上,贏 0050 不代表新資料有用,要和底策略本身比,而且換參數也要比得過。
- 轉機股的回撤很深。 營益率由負轉正的單獨版年化 21.9%,最大回撤卻是 -49.5%;停損或縮小部位的效果,本文沒有測。
- F-Score 搭配估值與營收比單用好。 三項驗證通過的是股價淨值比、F-Score、月營收三個條件一起用的版本,單用 F-Score 的結果見 F-Score 選股。
常見問題
三率三升是什麼?
三率是毛利率、營業利益率、稅後淨利率,三升指三個比率同時比去年同季高(有些人用比上一季高)。毛利率看產品賺不賺錢,營業利益率再扣掉營業費用,淨利率再扣掉業外與所得稅,三個一起變好代表本業與整體獲利同時改善。
三率三升的股票可以買嗎?
在本文設定下不建議單獨用。連續 2 季三率三升、營益率年增最多的 30 檔,2016 年以來年化 14.1%、日夏普 0.64,最大回撤 -51.1%;同期 0050 含息年化 23.8%、日夏普 1.20。疊在月營收動能上也比月營收動能單獨差。
毛利率創新高代表什麼?
代表產品售價相對成本上升,可能是漲價、產品組合變好或原料變便宜。單獨選毛利率創近 8 季新高、毛利率最高的 30 檔,日夏普 0.64;疊在月營收動能上原參數比底好,但換參數就不穩定。過去的事件研究見 毛利率創新高之後股價怎麼走。
存貨增加是壞事嗎?
要和營收一起看。存貨增加得比營收快,可能是賣不動,也可能是為了接單備貨。本文把「存貨營收比下降最多」當選股訊號,年化只有 5.5%,是 8 個訊號裡最差的;疊在月營收動能上雖然過了三項驗證,原參數仍低於月營收動能單獨。
資本支出增加,股價會跌嗎?
美股研究(Titman、Wei 與 Xie,2004)發現資本投資大增的公司之後報酬偏低。台股 2016 年以來,資本支出強度增幅最低的 30 檔年化 9.2%、日夏普 0.51;月營收動能排除增幅最大的 20% 後,日夏普 1.50 對 1.49,幾乎沒有差別。
合約負債是什麼?增加代表什麼?
合約負債是客戶先付的錢、公司還沒交貨的部分,例如預售屋款、設備訂金,交貨後才轉成營收。2018 年 IFRS 15 上路後,台股公司才普遍把它列在資產負債表。2019 年以來,合約負債成長最多的 30 檔日夏普 1.20,略輸 0050 的 1.28。
EPS 連續成長的股票比較會漲嗎?
本文的資料不支持。單季 EPS 連續 4 季比去年同季高、年增率最大的 30 檔,年化 12.6%、日夏普 0.60;疊在月營收動能上反而從 1.49 降到 1.04。EPS 公布時,同一季三個月的營收早已公布。
ROE 多少算好?高 ROE 的股票能買嗎?
常見門檻是年化 15%,換算成單季約 3.75%。近 8 季每季都超過這個門檻、波動最小的 30 檔,最大回撤 -33.1% 和 0050 差不多,年化只有 12.3%。高 ROE 篩出的是穩定的公司,不保證股價表現。
延伸閱讀
- 台股學術異常回測:10 個經典因子的三項驗證
- 杜邦分析:把 ROE 拆成淨利率、週轉率、權益乘數
- EPS 和 ROE 哪個選股比較好
- 台股選股完整指南:基本面、技術面、籌碼面
- FinLab 公開策略庫
下載資源
| 檔案 | 說明 |
|---|---|
| research.py | 完整研究程式:8 個訊號的單獨版與組合版、144 組參數、前後兩段、不扣成本對照、月營收動能單獨 |
| data.csv | 16 個版本原參數與月營收動能單獨的每日淨值(各自從 1 起算),以及 0050 含息 |
| metrics.json | 每組參數的回測結果,含重跑日與 finlab 版本 |
投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險。
最後更新:2026-10|回測區間:2016-04 ~ 2026-10(合約負債 2019-07 起,資料快照 2026-10-30,重跑日 2026-10-31)|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

