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

營收創新高選股:月營收動能優先買營收創 12 個月新高,
年化 52.4%、夏普 1.62

營收創新高選股有用嗎?只買營收創新高的股票,9 組參數只有 4 組贏 0050;當成月營收動能的排序條件,優先買單月營收創 12 個月新高的候選股,2015 到 2026 年年化 52.4%、日夏普 1.62,原版 45.9%、1.42;但近 3 年落後原版,附程式碼與三項驗證。

免安裝,用 AI 重跑這篇的策略

在瀏覽器開啟 FinLab Studio,AI 依本文的條件重跑回測,接著可以改條件再測。

在 Studio 重跑
營收創新高優先 CAGR 52.4% Sharpe 1.62

營收創新高選股回測:營收創新高優先的月營收動能、原版月營收動能與 0050 含息 2015-2026 累積淨值,年化分別為 52.4%、45.9%、20.2%

依本文重跑

執行這個策略

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

告訴你的AI:

幫我設定 FinLab,重跑營收創新高優先的月營收動能策略並和原版比較,請讀:https://finlab.finance/setup?relatedUrl=/blog/revenue-new-high-stock-selection

免安裝,開啟 FinLab Studio

營收創新高本身不是好的選股條件:只買營收創新高的股票,9 組參數只有 4 組贏 0050。但把它放進月營收動能選股當排序條件,候選股裡單月營收創 12 個月新高的先買,其他規則一個字都不改,結果就不一樣了。 2015 年 2 月到 2026 年 10 月回測,年化報酬 52.4%、日夏普 1.62、最大回撤 -32.0%,原版是 45.9%、1.42、-35.6%,同期 0050 含息是 20.2%、1.06、-34.0%。

改善主要來自前半段。2020 年底以後,這個版本的日夏普 1.39 反而略低於原版的 1.47;近 3 年日夏普 1.54,原版和 0050 都是 1.87。全期與 9 組鄰近參數都過了研究前寫定的門檻,已放上策略頁每天更新。本文的原版數字是同一段期間重跑的結果(年化 45.9%、日夏普 1.42),和原版文章標題寫的期間不同。

關鍵數字:本文策略、原版與 0050

2015-02-11 至 2026-10-30 年化報酬 日夏普 最大回撤 年化波動 近 3 年日夏普 近 5 年日夏普
營收創新高優先(本文) 52.4% 1.62 -32.0% 29.8% 1.54 1.32
原版月營收動能 45.9% 1.42 -35.6% 30.9% 1.87 1.54
0050 含息買進持有 20.2% 1.06 -34.0% 19.8% 1.87 1.24

全期年化報酬、日夏普與最大回撤都比原版好,淨值成長約 140 倍,原版約 84 倍,0050 含息約 8.7 倍。所有數字都用 finlab 2.2.24、資料截至 2026-10-30 實際跑出,手續費 0.1425% 與證交稅 0.3% 用 sim() 預設值扣除。「近 3 年」指 2023-10-30 到 2026-10-30,「近 5 年」指 2021-10-30 到 2026-10-30。

營收創新高是什麼,為什麼單獨用不夠

營收創新高指的是這個月的營收比過去一段時間每個月都高。本文用「單月營收是近 12 個月最高」,也就是 當月營收 >= 近 12 個月最大值。這個條件很直覺:公司接單、出貨正在擴張,月營收才會一直刷新紀錄。

問題是營收創新高的公司很多。2015 年以來每個月平均約 225 檔上市櫃普通股符合,裡面有真正在成長的,也有只是因為季節性(例如年底旺季)剛好創高的。我們照研究紀錄先測了單獨版:每月 11 日在流動性門檻內,從營收創新高的股票裡挑營收年增率最高的 n 檔。

營收創新高 9 組鄰近參數日夏普:只看營收創新高的單獨版 9 組中 4 組贏 0050 含息 1.06;加在月營收動能上的組合版 9 組介於 1.46 到 1.68,全部高於 0050,也全部高於同持股數的原版

左邊是單獨版:創新高回看 6、12、24 個月,持股 20、30、50 檔,9 組裡只有 4 組贏 0050 的 1.06,原參數(12 個月、30 檔)是 1.07,後段 1.21 對 0050 的 1.22 也沒贏,三項驗證不成立。持股越少越差,20 檔的三組最高只有 0.96。

右邊是本文的組合版,9 組介於 1.46 到 1.68,全部贏 0050;原版月營收動能持 8、10、12 檔分別是 1.26、1.42、1.49,9 組也全部高於同持股數的原版。營收創新高需要股價趨勢與動能一起確認,才是有用的訊號。

這和Chan、Jegadeesh 與 Lakonishok(1996)在 Journal of Finance 的發現一致:股價動能和盈餘面的動能各自都能預測報酬,兩者並不互相取代。他們研究的是盈餘驚喜與分析師預估修正,本文用的是月營收;台股月營收每月公布,比季盈餘快得多。同一批研究另一個成立的營收驚喜選股,則是Jegadeesh 與 Livnat(2006)營收驚喜的台股月營收版。

原版的交易裡,營收創新高的比較好

為什麼加這一條會有幫助?把原版月營收動能 11 年多的 1,403 筆交易(兩次換股之間的每一檔持有算一筆,停損出場也算),依進場時營收有沒有創 12 個月新高分開:

原版月營收動能的交易依進場時營收是否創 12 個月新高分組:創新高的 579 筆平均報酬 4.44%、勝率 44.0%,沒有創新高的 824 筆平均 3.09%、勝率 42.2%

原版的交易 筆數 平均報酬 報酬中位數 勝率
進場時營收創 12 個月新高 579 4.44% -1.97% 44.0%
沒有創新高 824 3.09% -3.27% 42.2%

創新高的交易平均多賺 1.35 個百分點,勝率也高一點。兩組的報酬中位數都是負的,這是動能策略的典型:大部分交易小賠(觸發 10% 停損,或在下次換股時被換掉),靠少數大漲的股票賺錢。創新高那組的大漲股比較多。本文策略做的事,就是在候選股不只 10 檔時,優先買這一組。

策略規則與程式碼

  1. 候選股(和原版相同):收盤價同時站上 20、60、120 日均線,近 3 個月平均營收高於近 12 個月平均營收。
  2. 排序:候選股中單月營收創 12 個月新高的上市櫃普通股(排除金融保險與存託憑證)排前面;同一組內依 5 日平均漲跌幅由高到低。
  3. 選股:取前 10 檔,等權持有。
  4. 換股與停損:每月 11 日換股,單檔跌 10% 停損。

下面是核心程式,完整版(含統計與輸出檔案)在文末的 strategy.py,原版的對照數字由 research.py 產生:

顯示程式碼
import pandas as pd
from finlab import data
from finlab.backtest import sim
 
close = data.get("price:收盤價")
rev = data.get("monthly_revenue:當月營收")
categories = data.get("security_categories").set_index("stock_id")["category"]
 
# 1. 原版月營收動能的候選股與排序分數
rev_up = rev.average(3) > rev.average(12)
trend = (close > close.average(20)) & (close > close.average(60)) & (close > close.average(120))
momentum = (close / close.shift() - 1).rolling(5).mean()
score = momentum[trend & rev_up]
 
# 2. 單月營收創 12 個月新高(在月表上算),只看上市櫃普通股
excluded = {"金融保險業", "金融業", "存託憑證"}
stocks = [
    s for s in rev.columns
    if len(s) == 4 and s.isdigit() and not s.startswith(("0", "28", "91"))
    and categories.get(s) not in excluded
]
monthly = pd.DataFrame(rev).reindex(columns=stocks)
monthly.index = pd.to_datetime(monthly.index)
new_high = (monthly > 0) & (monthly >= monthly.rolling(12, min_periods=12).max())
 
# 3. 創新高的加 1 分:5 日動能遠小於 1,所以創新高的一定排在前面
bonus = new_high.astype(float).reindex(close.index, method="ffill")
bonus = bonus.reindex(columns=close.columns).fillna(0)
 
position = (score + bonus).is_largest(10).loc["2015-01-01":]
report = sim(position, resample="M", resample_offset="11D", stop_loss=0.1, upload=False)

rolling(12) 要在月表上做:先展開到每日再 rolling 就變成 12 個交易日。加分寫成 score + bonus:創新高的候選股分數是 1 加上 5 日平均漲跌幅,沒創新高的只有 5 日平均漲跌幅,而 5 日平均漲跌幅實際上都遠小於 0.5,所以創新高的一定排在前面,只有創新高的候選股不到 10 檔時才會補進其他候選股。

回測結果:全期勝過原版,最近幾年沒有

營收創新高選股每年報酬與原版月營收動能、0050 含息比較:12 個年度中 8 年勝過原版,2025、2026 年落後原版

年度 營收創新高優先 原版 0050 含息
2015(2 月起) 55.3% 31.2% -9.2%
2016 37.5% 3.3% 19.6%
2017 83.6% 81.8% 18.1%
2018 14.5% 11.1% -4.9%
2019 32.2% 1.7% 33.5%
2020 169.0% 180.4% 31.1%
2021 51.9% 29.2% 21.9%
2022 -9.8% -2.7% -21.4%
2023 51.5% 43.9% 27.5%
2024 88.3% 86.7% 48.6%
2025 35.6% 57.2% 36.8%
2026(到 10 月底) 65.1% 101.8% 63.2%

12 個年度裡 8 年勝過原版、10 年勝過 0050(2019 與 2025 年各少 1.3 個百分點)。勝過原版最多的是 2015、2016、2019 與 2021 年;2025 與 2026 年則落後原版 21.7 與 36.8 個百分點,是全期落後原版最多的兩年。

最大回撤 -32.0% 發生在 2018-06-25 到 2018-10-26,2019-11-27 回到前高;原版同樣從 2018-06-25 開始下跌,但一路跌到 2020-03-19 的 -35.6%。單月最差是 2020 年 3 月的 -20.8%,最好是 2020 年 8 月的 38.7%。每次換股約換掉 93% 的持股,原版是 96%;回測把兩次換股之間的每一檔持有算成一筆(停損出場也算),共 1,401 筆,其中 46.5% 賺錢。

和原版每天的持股平均有 41.5% 相同,日報酬相關係數 0.77。這仍是同一個策略家族,只是挑法不同;如果你已經在跑原版,換成這個版本的效果主要看候選股多於 10 檔的那些月份。

三項穩健性驗證:鄰近參數、前後兩段、交易成本

「贏」的意思是同一段交易日裡,日夏普高於 0050 含息;日夏普=日報酬平均 ÷ 日報酬標準差 × √252,不扣無風險利率。本文在跑之前寫定三項驗證,另外加一條:組合版要比原版好,才算新策略。

  1. 鄰近參數:創新高回看 6、12、24 個月 × 持股 8、10、12 檔,9 組至少 7 組贏 0050。結果 9 組全贏。
  2. 前後兩段:原參數在兩段都要贏 0050。結果兩段都贏。
  3. 交易成本:sim() 預設手續費與證交稅。不扣成本時日夏普 1.85,扣了是 1.62。
  4. 比原版好:原參數日夏普高於原版 10 檔(1.62 對 1.42),9 組中至少 7 組高於同持股數的原版。結果 9 組都高於原版。

營收創新高選股前後兩段日夏普:前段 2015-02 至 2020-12 本文策略 1.94、原版 1.38、0050 含息 0.87;後段 2020-12 至 2026-10 分別為 1.39、1.47、1.22

前段(2015-02-11 至 2020-12-18)本文策略 1.94、原版 1.38、0050 0.87;後段(2020-12-21 至 2026-10-30)分別是 1.39、1.47、1.22。後段兩個版本都贏 0050,但本文策略低於原版 0.08。研究前寫定的門檻比的是 0050 與 9 組鄰近參數,沒有要求每一段都贏原版,所以照規則算通過;但如果你在意的是最近五年,原版的表現比較好。

回測方法與限制

項目 本文做法
交易成本 sim() 預設手續費 0.1425%(買賣各一次)與證交稅 0.3%(賣出),未打折
滑價 未另外假設,以收盤價成交
股票池 finlab price:收盤價 裡有月營收的上市櫃股票,含已下市股票(和原版相同);營收創新高的加分只給上市櫃普通股
流動性過濾 沒有,沿用原版
排除類別 加分不給金融保險與存託憑證;候選股沒有另外排除 KY 股或全額交割股
前視偏差 月營收以每月公告期限日(10 日,遇假日順延)當可取得日,11 日換股、sim() 再隔一天成交;產業分類用目前的分類
權重 10 檔等權,沒有單檔上限,單檔跌 10% 停損
周轉率 每次換股約換掉 93% 的持股,10 檔中每月約 9 檔換新
樣本內外 全段樣本內;組合方式、參數與驗證條件在跑之前寫定,沒有樣本外測試

月營收用 FinLab 的鎖定版,數值以公告後第一個開盤前的最後一次寫入為準。少數公司晚於期限才公布,這幾筆在本文會被當成期限日就知道。每月只持有 10 檔,單一股票對結果影響很大,本文沒有估算策略容量。同一批研究測了 7 個月營收訊號的單獨版與組合版,只有這個組合版和營收驚喜單獨版過關;在同一段資料上測很多訊號,總有幾個會碰巧過關,這種風險可以看回測過度擬合的機率。前視偏差與周轉率的定義在名詞解釋頁。

適合誰、不適合誰

適合:已經在用月營收動能、想加一個簡單排序條件的人;能接受每月換股、單月可能跌兩成的人;想把營收創新高用在選股上,但不想只靠這一個條件的人。

不適合:特別看重最近幾年表現的人,2025 與 2026 年原版明顯比較好;要求回撤或波動比 0050 小的人,年化波動 29.8% 比 0050 的 19.8% 高很多;資金很大、需要分散到幾十檔的人。

常見問題

營收創新高的股票可以直接買嗎?

本文的單獨版說明不行:只從營收創新高的股票裡挑年增率最高的,9 組參數只有 4 組贏 0050,20 檔版本的日夏普最高只有 0.96。營收創新高要搭配股價站上均線與短期動能,才在 9 組參數都贏。

為什麼是 12 個月新高?

12 個月是原始設定,並且同時測了 6 與 24 個月。組合版三種回看長度的 9 組都贏原版,最好的是 12 個月持 12 檔的 1.68,最差的是 6 個月持 8 檔的 1.46。

和站上的「營收篩選創新高策略」有什麼不同?

創新高策略看的是股價創新高,再用營收(近 3 月平均創 12 個月新高)確認,跟著月營收公布日換股。本文的底是月營收動能,股價條件是站上三條均線、按 5 日動能排序,營收創新高只拿來排先後。兩者條件與換股方式都不同。

和「營收連續成長創新高」又有什麼不同?

AI 量化研究那篇的策略要求近 3 月平均營收創 12 個月新高、年增率連續兩個月高於門檻,而且股價創新高,條件是全部同時成立才買。本文不要求股價創新高,也不要求連續年增,只把營收創新高當成排序的優先權。

原版近幾年比較好,要選哪一個?

全期與鄰近參數都是本文版本比較好,後段與近 3 年是原版比較好。兩者有約四成持股相同,差異集中在候選股多於 10 檔的月份。本文無法告訴你未來哪一段會重演,本文策略頁與原版策略頁都會每天更新,可以並列追蹤。

最大回撤 -32.0% 為什麼比原版淺?

原版在 2018 年 6 月到 2020 年 3 月經歷了一段很長的回撤,最深 -35.6%;本文版本在 2019 年就回到前高,2020 年 3 月的疫情下跌沒有創新的最大回撤。這是這段期間的結果,不代表加了營收創新高就一定比較抗跌。

這個策略可以直接照做嗎?

這是研究與回測結果,不是投資建議。實際操作要考慮滑價、成交量與資金規模,本文沒有估算容量;每月只持有 10 檔,單一股票的影響很大。想自己重跑或修改,可以下載文末的 strategy.py。

延伸閱讀

下載資源

檔案 內容
strategy.py 本文策略的完整程式碼,會輸出 data.csv 與 metrics.json
data.csv 本文策略與 0050 含息的每日淨值
metrics.json 本文核心數字與每年報酬
research.py 原版對照、9 組鄰近參數、前後兩段、單獨版與原版交易拆分的驗證程式
report_strategy.html 本文策略的互動式回測報告
report_baseline.html 原版月營收動能的互動式回測報告

風險提示

本文所有策略與回測結果僅供教學與研究用途,不構成投資建議。過去績效不代表未來表現,本文策略最大回撤 -32.0%,2025 與 2026 年明顯落後原版月營收動能。投資一定有風險,請依自身風險承受能力審慎評估。

最後更新:2026-10|回測區間:2015-02 ~ 2026-10|作者:FinLab 量化研究團隊(經量化研究員審閱)

FinLab AI

想建立自己的策略?

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

免費開始

更多價值與基本面研究

查看全部