
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重跑營收創新高優先的月營收動能策略並和原版比較,請讀:https://finlab.finance/setup?relatedUrl=/blog/revenue-new-high-stock-selection
營收創新高本身不是好的選股條件:只買營收創新高的股票,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 檔。

左邊是單獨版:創新高回看 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% | -1.97% | 44.0% |
| 沒有創新高 | 824 | 3.09% | -3.27% | 42.2% |
創新高的交易平均多賺 1.35 個百分點,勝率也高一點。兩組的報酬中位數都是負的,這是動能策略的典型:大部分交易小賠(觸發 10% 停損,或在下次換股時被換掉),靠少數大漲的股票賺錢。創新高那組的大漲股比較多。本文策略做的事,就是在候選股不只 10 檔時,優先買這一組。
策略規則與程式碼
- 候選股(和原版相同):收盤價同時站上 20、60、120 日均線,近 3 個月平均營收高於近 12 個月平均營收。
- 排序:候選股中單月營收創 12 個月新高的上市櫃普通股(排除金融保險與存託憑證)排前面;同一組內依 5 日平均漲跌幅由高到低。
- 選股:取前 10 檔,等權持有。
- 換股與停損:每月 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 含息 |
|---|---|---|---|
| 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,不扣無風險利率。本文在跑之前寫定三項驗證,另外加一條:組合版要比原版好,才算新策略。
- 鄰近參數:創新高回看 6、12、24 個月 × 持股 8、10、12 檔,9 組至少 7 組贏 0050。結果 9 組全贏。
- 前後兩段:原參數在兩段都要贏 0050。結果兩段都贏。
- 交易成本:
sim()預設手續費與證交稅。不扣成本時日夏普 1.85,扣了是 1.62。 - 比原版好:原參數日夏普高於原版 10 檔(1.62 對 1.42),9 組中至少 7 組高於同持股數的原版。結果 9 組都高於原版。

前段(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。
延伸閱讀
- 月營收動能選股:本文的基底策略,含原版的三項驗證,策略頁有淨值曲線與程式碼。
- 月營收進階訊號回測:營收加速、累計年增、由負轉正、連續年增、產業擴散等訊號的完整結果。
- 營收驚喜選股:同一批研究裡另一個成立的策略,和月營收動能幾乎不重疊。
- 可轉債選股:另一個加在月營收動能上的條件,避開可轉債發行公司。
- 用 Python 做月營收選股的三種方法:年增率、創新高與動能三種寫法的比較。
- 股票選股完整指南:基本面、技術面、籌碼面選股方法的總覽。
- 月營收資料:FinLab 月營收資料欄位說明。
下載資源
| 檔案 | 內容 |
|---|---|
| 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 自動驗證、回測、給你答案
免費開始


