
月營收是台股更新最快的基本面數據:上市櫃公司每個月 10 日前就要公布上個月的營收,比季報快了一到兩個月。本文 2020 年的第一版示範了三種月營收選股法(均線法、成長法、創新高法)的 Python 寫法,當時的回測沒有計入手續費、也沒有跟大盤基準比較。2026 年我們把整套方法重做:同一個股票池、同一個公告節奏、內扣交易成本,讓三種方法加上 MoM、YoY 兩個傳統指標同場對決 14 年,並與 0050 含息買進持有對照。關鍵數字先攤開:
| 訊號(2012-01~2026-06,含交易成本) | 年化報酬 | 日夏普 | 最大回撤 | 總報酬 | 平均持股 |
|---|---|---|---|---|---|
| 均線法(近 3 月均 > 近 12 月均) | 18.95% | 0.95 | -35.68% | 1,119% | 234.8 檔 |
| 創新高法(24 個月新高) | 19.03% | 0.86 | -38.14% | 1,131% | 55.2 檔 |
| 成長法(4 月平滑線連漲 5 月) | 21.07% | 0.93 | -42.02% | 1,474% | 54.4 檔 |
| MoM > 0 | 9.77% | 0.56 | -38.33% | 283% | 203.9 檔 |
| YoY > 0 | 16.56% | 0.85 | -37.58% | 810% | 252.3 檔 |
| 0050 含息買進持有(不含成本) | 19.44% | 1.10 | -33.96% | 1,199% | 1 檔 |
三個重點:
- 2020 年的排名撐過了 14 年的檢驗:成長法年化報酬第一、創新高法與均線法接近打平、YoY 次之、MoM 墊底,與舊版結論一致。
- 三種方法的年化報酬都接近或超過 0050,但風險調整後全輸:最高的日夏普只有 0.95,0050 是 1.10;最大回撤也全部深於 0050 的 -33.96%。用更深的回撤換到差不多的報酬,這筆交易划不划算,要由你的風險承受度決定。
- MoM 大於零不適合單獨當選股條件:年化 9.77%,日夏普 0.56 只有 0050 的一半左右,主因是單月比較被季節性干擾太嚴重。
以下從定義、公式、實作到回測限制完整走一遍,所有數字都來自文末可下載的回測腳本,你可以自己重跑驗證。
三種看月營收的進階方法:定義與機制
許多看盤軟體與選股平台把月營收篩選列為付費功能,其實這三種條件用 Python 都只要一到三行。先把每一種方法的數學定義與背後邏輯講清楚,設 為某公司第 月的當月營收。
均線法:近一季優於全年
近 3 個月營收平均高於近 12 個月平均,代表公司最近一季的營運動能優於過去一年的常態,下一份季報開出好數字的機率比較高。這個條件門檻寬鬆,在我們的回測中平均一期會選出 234.8 檔,比較適合當「輔助確認」:你研究某檔股票時,用它檢查營收趨勢有沒有走壞。要留意的是,營建股認列工程收入時營收會單月暴增,容易被這類條件誤抓。
創新高法:24 個月新高
當月營收創近 24 個月新高。機制上接近行為財務學講的錨定效應:George & Hwang (2004) 發現股價接近 52 週高點時,投資人因為錨定在舊高點而反應不足,使「創新高」本身成為可獲利的訊號。要說明的是,該研究的對象是股價而非營收,「營收創新高也有同樣的反應不足」是一個合理但需要實證的延伸假設,這正是本文回測要驗證的事。
成長法:平滑後連續走高
先用近 個月平均把鋸齒狀的月營收曲線平滑,再要求平滑線連續 個月走高:
本文沿用 、,這組參數出自我們 2020 年發表的月營收平滑升冪指標,該文對單一指標的參數選擇與深入測試有完整討論,這裡只把它放進同條件對決。平滑的目的在過濾單月暴衝:一次性的業外進帳或低基期反彈推不動 4 個月平均線,能連續推高平滑線的,多半是訂單結構真的改變的公司。
對照組:MoM、QoQ、YoY 傳統指標
MoM 是月增率、YoY 是年增率,QoQ 則是近三個月加總與前三個月加總相比。三者的差別在「跟誰比」:MoM 完全暴露在季節性裡(二月工作天數少,幾乎全市場 MoM 轉負);YoY 跟去年同月比,天然消除季節性,是最常用的營收指標;QoQ 的平滑度介於兩者之間。本次回測納入 MoM > 0 與 YoY > 0 當基準線,讓三種進階方法有可比較的地板。
用一家公司的數字示範
以下用虛構的甲公司走一遍計算,數字是教學示例、非真實個股。甲公司近 12 個月營收(億元,由舊到新):
| 月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 營收 | 10 | 10 | 11 | 10 | 11 | 12 | 11 | 12 | 13 | 13 | 14 | 15 |
- 均線法:近 3 月平均 =(13+14+15)÷ 3 = 14,近 12 月平均 = 142 ÷ 12 ≈ 11.83,14 > 11.83,條件成立。
- 創新高法:本月 15 億元,若再往前推的 12 個月最高只有 13 億元,則 15 億元是 24 個月新高,條件成立。
- 成長法(M=4、N=5):最近 6 期的 4 個月平滑值依序為 11.0 → 11.5 → 12.0 → 12.25 → 13.0 → 13.75,平滑線連續上漲 5 次,條件成立。
- 傳統指標:MoM =(15-14)÷ 14 ≈ +7.1%;若去年同月營收 10 億元,YoY = +50%。
同一家公司可以同時觸發多個條件,三種方法的差別在於它們各自會放進來多少「別的」公司:均線法最寬鬆、成長法與創新高法嚴格得多,這個差異後面會直接反映在持股檔數與集中風險上。
換成真實資料長什麼樣?下圖以台泥(1101)為例,淺藍長條是逐月營收、深藍線是成長法使用的 4 個月平滑線。原始營收上下參差,平滑線把雜訊濾掉之後,2024 年中那段連續走高的區間清楚浮現,那正是成長法會把它納入名單的時點:

為什麼月營收有資格當選股因子
學術上最接近的證據是 Jegadeesh & Livnat (2006) 的營收驚奇研究:營收超出預期的公司,後續報酬有獨立於盈餘驚奇的漂移,而且營收比盈餘更難用會計手段修飾。要說明的是,該研究用的是美股的季營收,台股的月頻揭露在全球主要市場相當少見,頻率更高、資訊更即時,但「月營收訊號有效」仍需要用台股資料另行驗證,無法從美股研究照搬。
更早的 Bernard & Thomas (1989) 證明市場對盈餘公告反應不足、好消息公布後股價仍會持續漂移。同樣要劃清界線:他們研究的是盈餘公告,月營收公告是另一種(頻率更高、資訊量較少的)基本面事件,兩者機制相通但非同一件事。我們在月營收公告漂移的台股實測中用 15 年資料專門檢驗過「公告後買進還來不來得及」這個問題,可以搭配本文閱讀。
回測設定:同股池、同節奏,只換訊號
這次對決的設計原則是「除了訊號本身,其他全部一樣」,避免某個方法靠額外條件偷跑:
- 股票池:有公布月營收的台股上市櫃公司,加上流動性濾網(近 20 日成交金額中位數 > 5,000 萬元),排除回測買得到、實單買不到的低流動性股。ETF 與指數沒有月營收,自然被排除。
- 再平衡:跟隨月營收公告節奏。finlab 的月營收資料索引已對齊公告截止日,訊號變動後的下一個交易日換股,不存在偷看未公布資料的前視問題。
- 權重:訊號為真的股票全部等權持有(全持有版);另外跑一版「訊號池內 YoY 前 30 檔」處理持股數過多的問題,後面比較。
- 成本:使用 finlab
sim()台股預設成本,內扣手續費 0.1425% 與賣出證交稅 0.3%。 - 基準:0050 還原價(
etl:adj_close)買進持有,純指數算術、不含交易成本,基準算法對基準有利。
核心程式碼長這樣,三種訊號各只要一到三行:
顯示程式碼
from finlab import data
from finlab.backtest import sim
# 月營收資料:列是公告截止日、欄是股票代號
rev = data.get("monthly_revenue:當月營收")
# 1. 均線法:近 3 個月平均 > 近 12 個月平均
signal_ma = rev.average(3) > rev.average(12)
# 2. 創新高法:當月營收創近 24 個月新高
signal_high = rev == rev.rolling(24).max()
# 3. 成長法:4 個月平滑線連續 5 個月走高
smooth = rev.average(4)
signal_growth = (smooth > smooth.shift()).sustain(5)
# 加上流動性濾網後即可回測(完整版見文末可下載腳本)
report = sim(signal_growth, upload=False)第一次執行時 finlab 會自動引導你登入,不需要手動處理金鑰。如果想了解月營收資料的底層來源與欄位,可以參考用 Python 抓取每月營收的教學;想從零開始理解整個回測流程,程式交易入門指南有完整的環境設定與第一個策略示範。
回測結果:排名沒變,但沒人贏得了風險調整後的 0050

把文首的表格再往下拆,可以看到兩層結論。
第一層:訊號之間的相對排名,14 年來相當穩定。 成長法以年化 21.07%、總報酬 1,474% 居首;創新高法(19.03%)與均線法(18.95%)幾乎打平;YoY > 0 拿到 16.56%;MoM > 0 以 9.77% 墊底。這個排名與 2020 年舊版的結論一致,平滑與連續性條件確實比單點比較的傳統指標抓到更多資訊。
第二層:對上 0050,三種方法在絕對報酬上互有高下(成長法小勝,創新高法與均線法接近打平),風險調整後全輸。 0050 含息的日夏普比率是 1.10,五種訊號最高只有 0.95;最大回撤方面 0050 是 -33.96%,五種訊號全部更深,成長法甚至到 -42.02%。換句話說,月營收訊號賺到的超額報酬,主要是用更高的波動與更深的回撤換來的。另一個必須說的結構性因素:這些訊號等權持有大量中小型股,0050 是市值加權的權值股組合,兩者的市場曝險本來就不同,這部分差異無法完全歸功或歸咎於訊號本身。
與 2020 年舊結論逐條對照
| 2020 年版的主張 | 2026 年重跑結果 |
|---|---|
| 成長法第一 | 成立。CAGR 21.07% 仍居五種訊號之首 |
| 突破法(創新高法)第二,但靠 2015 年單一飆股 | 排名接近成立(與均線法打平)。「靠 2015 年單一飆股」在本次數據中對不上:加上流動性濾網後,2015 年除了 3 月公告日一檔都選不出來,其餘月份最少仍有 25 檔。整段回測的最低 3 檔出現在 2013 年與 2019 年的 3 月公告日,成因是 2 月營收的季節性,詳見下節 |
| 均線法第三,每期 400 多檔最平穩 | 成立。本次因加了流動性濾網,平均降為 234.8 檔;日夏普 0.95 是三種方法中最高、回撤 -35.68% 最淺,「平穩」的定性沒變 |
| MoM 最遜 | 成立。年化 9.77%,差距比 2020 年看到的更明顯 |
| (舊版未比較大盤) | 新增發現:五種訊號的風險調整報酬全部輸給 0050 含息買進持有 |
持股檔數:訊號越嚴格,集中風險越高

三種方法的持股檔數差了一個數量級:均線法平均 234.8 檔(最多 466 檔)、創新高法平均 55.2 檔、成長法平均 54.4 檔。這張圖透露兩件事:
- 均線法接近「中小型股的市場組合」:兩百多檔等權持有,個股訊號的成分被大幅稀釋,它的報酬更多反映「有營收動能的中小型股整體」的表現。把它當研究個股時的輔助確認比當策略合理。
- 創新高法與成長法的檔數深谷是日曆效應,每年 3 月準時報到:圖上創新高法那條線每年向下戳出的深谷,時間點全部落在 3 月公告日(公告的是 2 月營收)。2 月工作天數少、又常涵蓋農曆年假,絕大多數公司的單月營收都會下滑,能創 24 個月新高的自然寥寥無幾:14 年裡創新高法持股低於 10 檔的時點全部是 3 月公告日,最少 3 檔(2013 年與 2019 年),2015 年 3 月甚至一檔都選不出來。這與前面 MoM 段講的「二月工作天數少,幾乎全市場 MoM 轉負」是同一個季節性,只是換了一種症狀。成長法用 4 個月平滑再要求連漲 5 次,2 月的凹陷會讓條件連續失敗好幾期,所以它的個位數持股(最少 5 檔)全部出現在 3 月到 7 月公告日之間,2019 年 3 到 7 月更連續五期都是個位數。檔數驟減量的是日曆,量不到景氣:2022 年空頭裡,創新高法除了 3 月公告日那次(7 檔)之外,全年最低仍有 46 檔。實際操作時要留意這段季節性窗口的集中持股,個位數持股的單一個股風險(地雷、處置、流動性)會遠高於回測曲線給人的印象。
全持有 vs YoY 前 30 檔:持股上限的代價與紅利
兩百多檔的組合實單難以執行,常見的解法是在訊號池內再用一個指標排序、只買前 N 檔。我們用 YoY 由高到低取前 30 檔再跑一次:

| 訊號 | 全持有 CAGR / 日夏普 / MDD | Top30 CAGR / 日夏普 / MDD |
|---|---|---|
| 均線法 | 18.95% / 0.95 / -35.68% | 16.80% / 0.74 / -43.22% |
| 創新高法 | 19.03% / 0.86 / -38.14% | 21.50% / 0.89 / -46.56% |
| 成長法 | 21.07% / 0.93 / -42.02% | 23.02% / 0.94 / -45.77% |
結果分成兩半:創新高法與成長法加上持股上限後 CAGR 上升(成長法 Top30 來到全場最高的 23.02%),但代價是最大回撤加深到 -45% 以上;均線法反而全面變差。解讀是:均線法的池子太寬鬆,用 YoY 排序等於從兩百多檔裡專挑年增率最暴衝的 30 檔,挑到的多是波動大、基期低的股票;而成長法的池子本來就經過連續性篩選,再用 YoY 排序是在好學生裡挑前段班。排序指標跟訊號的互動,比「要不要設持股上限」本身更重要。
分段檢視:優勢集中在 2018 年之後
把同一條淨值曲線切成三段看年化報酬:
| 訊號 | 2012~2017 | 2018~2021 | 2022~2026 |
|---|---|---|---|
| 均線法 | 12.02% | 23.97% | 24.23% |
| 創新高法 | 7.38% | 28.71% | 27.51% |
| 成長法 | 8.78% | 26.22% | 34.83% |
| MoM > 0 | 3.53% | 14.07% | 14.64% |
| YoY > 0 | 12.33% | 19.89% | 19.45% |
| 0050 含息 | 11.90% | 19.24% | 30.42% |
兩個觀察。第一,月營收訊號的超額報酬高度集中在 2018 年之後:2012~2017 年,三種方法不僅沒贏,創新高法(7.38%)與成長法(8.78%)還明顯落後 0050 的 11.90%。如果你在 2017 年底做這個回測,結論會是「月營收選股沒有用」。第二,成長法的 、 參數在 2020 年 7 月就公開發表,2022~2026 這段對該參數而言是真正的發表後樣本,年化 34.83% 還高於 0050 的 30.42%,至少到資料截止日為止,這組公開參數沒有失效。但 2022 年後台股本身就是強多頭,多頭市場對營收動能類訊號天然友善,這段領先能否延續到空頭,本文的數據回答不了。
回測方法與限制
| 項目 | 本文的處理 |
|---|---|
| 交易成本 | finlab sim() 預設內扣:手續費 0.1425%(未打折)、賣出證交稅 0.3% |
| 滑價 | 未另設滑價假設。持股數十到數百檔的等權組合,單檔部位小、衝擊有限,但實際衝擊取決於資金規模,本文未估算容量 |
| 股票池 | 有公布月營收的上市櫃公司,含 KY 股與金融股,未額外排除產業 |
| 流動性過濾 | 近 20 日成交金額中位數 > 5,000 萬元 |
| 生存者偏誤 | finlab 資料庫含已下市股票的歷史資料,回測期間下市的公司會留在當期樣本中 |
| 前視偏差 | 月營收索引對齊公告截止日(每月 10 日),訊號變動後下一個交易日才換股 |
| 權重 | 等權,未設單檔上限;Top30 版固定 30 檔等權 |
| 周轉率 | 每月跟隨公告換股;具體 turnover 數值未統計,創新高法與成長法的進出名單變動較大,成本敏感度高於均線法 |
| 樣本內外 | 全段為歷史回測(in-sample)。唯一例外是成長法參數(M=4、N=5)於 2020-07 公開,2020 年後的區間可視為該參數的發表後樣本。未做滾動樣本外測試 |
另外兩個使用上的提醒:其一,2012~2017 的分段結果說明這類訊號可能連續六年跑輸大盤,回測平均值不等於任何一年的體驗;其二,月營收暴增不必然是好事,認列時點、低基期、一次性訂單都可能製造假訊號,我們在營收暴增地雷股的分析中實測過「每 3 檔營收暴增股就有 1 檔是地雷」的現象,建議搭配閱讀。
下一步:把月營收訊號疊上其他因子
三種方法都是「單一維度」的訊號,實務上更常當作策略的一塊積木。幾個經過站內實測的疊加方向:
- 疊估值:用股價淨值比或市值營收比過濾,避免追到本夢比過高的營收成長股。
- 疊品質:用 ROE 等獲利能力指標排除「營收衝高、獲利沒跟上」的公司。
- 疊價格動能:月營收與股價動能的組合是站內測過風險調整報酬較好的方向之一,完整設計見月營收動能策略的介紹與回測,以及把營收動能用在法說會事件策略的變化型。
成長法(全持有版)的互動式回測報告可以在這裡操作,包含逐年報酬、持股明細與回撤曲線:
想系統性學習因子選股,可以從台股選股方法的完整指南入門;想理解回測、夏普比率這些名詞的嚴格定義,量化交易入門總覽與名詞解釋頁有完整整理。
常見問題
月營收什麼時候公布?去哪裡看?
台灣上市櫃公司依規定每月 10 日前公布上月營收(遇假日順延),公開資訊觀測站可以查詢。用 finlab 的話,data.get("monthly_revenue:當月營收") 一行就能取得全市場的歷史月營收,資料索引已對齊公告截止日。
月營收年增率(YoY)多少才算高?
沒有放諸四海皆準的門檻。本文的回測顯示「YoY > 0」這個最寬鬆的條件就有年化 16.56%,但個股層面要看產業基期:低基期反彈出來的 YoY +50% 與穩定成長股的 +20% 意義完全不同。比起絕對門檻,連續性(成長法的設計)在我們的測試中更有鑑別力。
月營收創新高的股票可以買嗎?
回測上「24 個月新高」這個單一條件 14 年年化 19.03%,與大盤相近但回撤更深,而且每年 3 月公告 2 月營收時,符合條件的公司會因季節性驟減到個位數(最少 3 檔,2015 年 3 月甚至掛零),集中風險高。把它當成研究清單的入口比直接照單全收合理。
為什麼 MoM 不適合單獨當選股條件?
月增率被季節性綁架:二月工作天數少、電子業有拉貨旺季,這些規律性波動跟公司基本面無關。回測也給出一致的答案,MoM > 0 年化只有 9.77%,是五種訊號中最差的。要用單點比較,至少用消除季節性的 YoY。
月營收公布後才買,會不會已經來不及?
本文的回測本來就是「公告後下一個交易日才進場」,上表所有數字都在這個前提下達成,所以答案是:歷史上來得及。關於公告後股價漂移的持續時間與衰退,月營收公告漂移的 15 年實測有更精細的事件研究。
三種方法哪一種適合新手?
如果你手動看盤選股,均線法最直觀、選出的名單最廣,適合當檢查清單;如果你寫程式跑策略,成長法的年化報酬與發表後樣本表現最好,但要接受 -42% 等級的歷史回撤。無論哪一種,都建議疊加估值或獲利品質條件再用。
這些回測數字可以重現嗎?
可以。文末的 strategy.py 包含全部五種訊號、Top30 版本與 0050 基準的計算,裝好 finlab 套件後執行即可重跑出本文所有數字(資料截止日設定為 2026-06-09,改成空字串可跑到最新)。
延伸閱讀
- 台股怎麼選股?四大面向完整指南
- 用月營收平滑升冪排列選出飆股:成長法的單指標深入測試
- 月營收動能策略的完整介紹與回測
- 營收暴增 50% 可以買嗎?地雷股實測
- 用 Python 抓取每月營收:30 行下載全台股月營收
下載資源
| 檔案 | 說明 |
|---|---|
| strategy.py | 三種月營收選股法、MoM/YoY 基準與 Top30 版本的完整回測程式碼,含 0050 基準計算 |
投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險,請審慎評估自身風險承受能力。
最後更新:2026-06|回測區間:2012-01~2026-06(資料快照 2026-06-09)|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

