
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重跑避開一字漲停打開的月營收動能策略,請讀:https://finlab.finance/setup?relatedUrl=/blog/limit-up-open-revenue-momentum
連續 2 天以上一字漲停的股票,第一次打開之後 20 個交易日,平均落後股票池 1.8%、中位數落後 4.4%,只有 38.9% 贏。我們把這件事當成排雷條件,加在站上已公開的月營收動能選股上:每月換股時,先把近 10 個交易日內打開過的股票剔除,其他規則一個字都沒改。 2015 年 2 月到 2026 年 10 月回測,年化報酬 46.8%、日夏普 1.46,原版是 45.9%、1.42,同期 0050 含息是 20.2%、1.06。
漲停是台股每天都有的事,一字漲停(開盤就漲停、整天沒有打開)通常跟在重大消息之後。本文回答一個實際問題:做動能選股時,要不要避開剛從一字漲停打開的股票?答案是要,但改善很小:近 12 年 1,403 筆交易只換掉 59 筆,日夏普多 0.04,最大回撤從 -35.6% 變成 -34.6%。這是 當沖、漲停、零股、鉅額交易 14 個設計的研究 裡唯一照規則過關的一個。
關鍵數字:本文策略、原版與 0050
| 2015-02-11 至 2026-10-30 | 年化報酬 | 日夏普 | 最大回撤 | 年化波動 | 最差單一年 | 最差單月 |
|---|---|---|---|---|---|---|
| 避開一字漲停打開(本文) | 46.8% | 1.46 | -34.6% | 30.4% | -2.5%(2022) | -27.4%(2021-05) |
| 原版月營收動能 | 45.9% | 1.42 | -35.6% | 30.9% | -2.7%(2022) | -30.2%(2021-05) |
| 0050 含息買進持有 | 20.2% | 1.06 | -34.0% | 19.8% | -21.4%(2022) | -14.1%(2020-03) |
本文策略在年化報酬、日夏普與最差單一年都勝過 0050 含息;最大回撤、年化波動與最差單月輸給 0050。約 11 年 8 個月下來淨值成長為 90.0 倍,原版 83.6 倍,0050 含息 8.7 倍。月營收動能原文寫的年化 46.5%、日夏普 1.44 算到 2026-10-27,本文多了 3 個交易日的資料。所有數字都用 finlab 2.2.24、資料截至 2026-10-30,在 2026-10-31 實際跑出,手續費 0.1425% 與證交稅 0.3% 用 sim() 預設值扣除。
一字漲停打開是什麼
台股個股每天漲跌幅上限 10%(2015-06-01 以前是 7%)。一字漲停是開盤價、最高價、最低價、收盤價都在漲停價,K 線畫出來只有一條橫線,代表整天買單排隊、賣方不願意賣。常見在併購、重大合約、轉機題材等消息之後,有時連續好幾天。「打開」指的是連續一字漲停之後,第一天盤中出現低於漲停價的成交,賣方開始出貨。
FinLab 沒有歷史漲停價,本文自己算:收盤價等於最高價、還原報酬至少 9.5%(2015-06-01 以前用 6.5%),上市未滿 6 個交易日不算;開盤、最高、最低、收盤四個價格相同,就是一字漲停。2015 年以來所有上市櫃普通股:
| 打開前至少連續一字漲停 | 2015 年以來次數 | 每年最少/最多 | 打開隔天那一天 | 之後 20 天平均 | 之後 20 天中位數 | 20 天後贏股票池 |
|---|---|---|---|---|---|---|
| 1 天 | 4,246 | 169(2019)/728(2026) | -0.05% | -0.79% | -3.0% | 41.1% |
| 2 天 | 1,101 | 35(2023)/212(2026) | -0.34% | -1.82% | -4.4% | 38.9% |
| 3 天 | 365 | 9(2023)/66(2020、2026) | -1.39% | -2.90% | -3.8% | 41.4% |
超額報酬是個股還原報酬減股票池(20 日平均成交金額 2,000 萬元以上的普通股)等權平均,從打開隔天收盤買進起算;股票停牌的日子報酬算 0,復牌第一天補上整段漲跌。「至少連續 1 天」的 4,246 次包含連續 2 天以上的 1,101 次。連續一字漲停的天數越多,打開之後平均落後越多。
這個平均值會隨股票範圍改變。同一批研究只看打開當天 20 日平均成交金額 2,000 萬元以上的股票,2008 年以來 785 次,之後 20 天平均反而多漲 0.98%,中位數仍是 -2.0%。兩種算法的中位數都是負的,多數股票打開之後落後,平均值則看少數大漲股落在哪一邊。

平均路徑前 10 天上下震盪,連續 3 天以上的一度多漲 0.9%,第 15 天之後一路往下。Seasholes 與 Wu(2007)在上海證交所看到類似的現象:漲停吸引散戶在隔天大量買進,股價短暫續漲後回落,獲利的是早一步買進、再賣給散戶的人。Barber 與 Odean(2008)也發現,散戶是新聞多、單日大漲大跌這類吸引注意股票的淨買方。連續一字漲停打開,正好是注意力最高、早期買家開始賣的時候。
為什麼要放在月營收動能上
月營收動能選股每個月挑 5 日平均漲跌幅最強的 10 檔,剛連續漲停的股票,5 日漲幅很容易排到最前面。原版近 12 年 1,403 筆交易裡,有 59 筆在進場訊號日前 10 個交易日內剛從連續一字漲停打開,這 59 筆平均每筆賺 2.5%、勝率 40.7%,其他 1,344 筆平均 3.7%。這些股票的動能是消息推出來的,打開之後常是消息反映完、開始回落。
策略規則:沿用原版,只加一條
基底是站上已驗證的 原版策略頁,參數在 2026 年初公開,這次完全不動:
- 近 3 個月平均營收高於近 12 個月平均營收。
- 收盤價同時站上 20、60、120 日均線。
- 5 日平均漲跌幅最強的 10 檔,每月 11 日(月營收公布期限後)換股,單檔跌 10% 停損。
唯一新增的是第 4 條:近 10 個交易日內,連續 2 天以上一字漲停後打開過的上市櫃普通股,換股時排除。 排除後空出來的名額,由動能排名下一檔遞補,持股維持 10 檔。
顯示程式碼
import pandas as pd
from finlab import data
from finlab.backtest import sim
close = data.get("price:收盤價")
rev = data.get("monthly_revenue:當月營收")
# 1. 月營收動能(原版):營收動能、站上三條均線、5 日平均漲跌幅
rev_up = rev.average(3) > rev.average(12)
trend = (close > close.average(60)) & (close > close.average(20)) & (close > close.average(120))
momentum = (close / close.shift() - 1).rolling(5).mean()
# 2. 一字漲停:開高低收同價,還原報酬至少 9.5%(2015-06-01 前用 6.5%),上市滿 6 個交易日
price = pd.DataFrame(close)
open_ = pd.DataFrame(data.get("price:開盤價"))
high = pd.DataFrame(data.get("price:最高價"))
low = pd.DataFrame(data.get("price:最低價"))
adj_close = pd.DataFrame(data.get("etl:adj_close")).reindex_like(price)
limit = pd.Series(0.095, index=price.index)
limit[limit.index < "2015-06-01"] = 0.065
limit_up = (
(price == high)
& adj_close.pct_change(fill_method=None).ge(limit, axis=0)
& adj_close.shift(5).notna()
)
one_word = limit_up & (open_ == high) & (low == high)
# 3. 打開:連續 2 天以上一字漲停之後,第一天不是一字漲停
total = one_word.cumsum()
streak = total - total.where(~one_word).ffill().fillna(0)
opened = ~one_word & (streak.shift(1) >= 2) & price.notna()
# 4. 近 10 個交易日打開過的普通股,換股時排除
avoid = opened.astype(float).rolling(10, min_periods=1).max() > 0
common = [s for s in avoid.columns if len(s) == 4 and s.isdigit() and not s.startswith(("0", "91"))]
avoid = avoid[common].reindex(columns=avoid.columns, fill_value=False)
position = momentum[trend & rev_up & ~avoid].is_largest(10).loc["2015-01-01":]
report = sim(position, resample="M", resample_offset="11D", stop_loss=0.1, upload=False)
report.display()用 report.creturn 算出的年化 46.8%、日夏普 1.46 與上表相同;report.display() 顯示的夏普扣了 2% 無風險利率,會略低一些。完整版 strategy.py 另外輸出淨值與統計,和 策略頁 用的是同一份程式。
回測結果:報酬與夏普小幅提高,回撤略淺

12 個年度(2015 從 2 月、2026 到 10 月)裡,本文策略有 8 年高於原版,2016、2020、2024、2026 年低於原版;差最多的是 2025 年多 16.6 個百分點(73.8% 對 57.2%)與 2020 年少 21.4 個百分點(159.0% 對 180.4%)。跟 0050 含息比,只有 2016 年(-1.3% 對 19.6%)與 2019 年(7.5% 對 33.5%)輸。
最深的回撤從 2018-06-25 跌到 2020-03-19,跌幅 -34.6%,2020-06-08 回到前高;原版同一段跌了 -35.6%。最差的單月是 2021 年 5 月的 -27.4%,原版同月 -30.2%。
三項穩健性驗證:鄰近參數、前後兩段、交易成本
三項檢查的「贏」都是同一個意思:日夏普高於同一段期間的 0050 含息買進持有(用 etl:adj_close 還原價算報酬、不扣成本)。日夏普用日報酬平均除以標準差、乘上 √252,不扣無風險利率。條件與鄰近參數在看結果前寫定,之後沒有改。另外還要比原版好:原參數日夏普高於原版,而且 9 組至少 7 組高於原版。
| 檢查 | 標準 | 結果 |
|---|---|---|
| 鄰近參數 | 連續一字天數(1、2、3)乘上打開後排除天數(5、10、20),9 組至少 7 組贏 0050 | 9/9 組贏(日夏普 1.36 到 1.47,0050 1.06),過 |
| 前後兩段 | 2015-02-11 到 2020-12-18、2020-12-21 到 2026-10-30 兩段都贏 | 前段 1.40 對 0.87,後段 1.52 對 1.22,過 |
| 交易成本 | 原參數、sim() 預設成本 |
日夏普 1.46 對 1.06,過(成本設成 0 是 1.70) |
| 比原版好 | 原參數高於原版,9 組至少 7 組高於原版 | 1.46 對 1.42,7/9 組高於原版,過 |

9 組的日夏普都高於 0050,差異在比原版好多少。要求連續 2 天或 3 天以上一字漲停的 6 組,比原版高 0.038 到 0.051;只要求 1 天的 3 組,排除 5 天、10 天的比原版低 0.06、0.04,排除 20 天的只高 0.003。門檻降到 1 天,2015 年以來的事件從 1,101 次增加到 4,246 次,打開後 20 天的平均落後從 1.8% 縮小到 0.8%,排除的多半是落後不多的股票,反而換掉太多正常的強勢股。

前後兩段都比原版高,前段多 0.02、後段多 0.05。
換掉了哪些交易
本文策略與原版的差別,只在 59 筆被排除的交易與 61 筆遞補進來的交易(停損與換股時點會讓筆數差 2 筆)。被排除的 59 筆在原版裡平均每筆 2.5%、勝率 40.7%;遞補進來的 61 筆平均 3.5%。全期 1,405 筆交易,每年約 120 筆,勝率 43.0%,平均每筆 3.7%。
改善全部來自這一百多筆交易,數量不多,所以本文把它看成原版的一個小修正:如果你已經在用月營收動能,加這一條的代價很低;如果期待它大幅改變報酬或回撤,回測不支持。
同一批研究的其他濾網
同一批研究還把 6 個交易行為訊號當濾網疊在同一個原版上,都沒有通過「比原版好」的規則:
| 濾網 | 日夏普(原版 1.42) | 9 組高於原版 |
|---|---|---|
| 排除近 5 天剛漲停 | 1.34 | 0 組 |
| 排除當沖比率前 20%(2016-03 起) | 1.38 | 1 組 |
| 排除近 10 天當沖驟升(2016-03 起) | 1.40 | 1 組 |
| 排除近 20 天鉅額交易 | 1.40 | 1 組 |
| 排除近 10 天盤後零股暴增(2016-02 起,原版 1.43) | 1.26 | 0 組 |
| 只留近 20 天爆量過的 | 1.52 | 6 組 |
一般的漲停反而不該排除:原版有 45% 的交易在進場前 5 天內剛漲停,這些交易平均比其他交易賺得多。要排除的只有「連續一字漲停後打開」這種特定型態。各個訊號單獨做的結果,在 當沖、漲停、零股、鉅額交易回測。
回測方法與限制
| 項目 | 本文做法 |
|---|---|
| 交易成本 | sim() 預設手續費 0.1425%(買賣各一次)與證交稅 0.3%(賣出),未打折 |
| 滑價 | 未另外假設,以收盤價成交 |
| 股票池 | finlab price:收盤價 裡有月營收的上市櫃股票,含已下市股票;一字漲停只看上市櫃普通股(四碼數字,不含 ETF 與存託憑證) |
| 流動性過濾 | 沒有,沿用原版 |
| 排除類別 | 只排除近 10 個交易日內連續一字漲停後打開的股票,未排除金融股、KY 股或全額交割股 |
| 前視偏差 | 月營收用公布可取得日;一字漲停與打開都用當天收盤後的價格判斷,sim() 在訊號隔天收盤成交 |
| 權重 | 10 檔等權,沒有單檔上限,單檔跌 10% 停損 |
| 周轉率 | 1,405 筆交易,每年約 120 筆,平均持有約 24 個日曆天 |
| 樣本內外 | 全段樣本內;原版參數在 2026 年初公開,一字漲停條件的定義與鄰近參數在看結果前寫定,同一批還測了 13 個設計 |
FinLab 的漲停是自己算的,台股漲停價要捨去到最小跳動單位,少數股票漲停時的還原報酬會略低於 9.5%,可能漏算。每月只持有 10 檔,單一股票對結果影響很大,本文沒有估算策略容量。這類在同一段資料上測多個規則的風險,可以看 回測過度擬合的機率,前視偏差 與 周轉率 的定義在名詞解釋頁。
適合誰、不適合誰
適合:已經在用月營收或動能選股、想多一條簡單排雷條件的人;能接受每月換股、單月可能大跌的人(最差的一個月是 2021 年 5 月的 -27.4%);想用 K 線型態做研究、但需要可回測規則的人。
不適合:要求回撤比 0050 小的人,這個策略最深回撤 -34.6%,跟 0050 差不多深、年化波動 30.4% 比 0050 高很多;資金很大、需要分散到幾十檔的人;期待一條濾網大幅提高報酬的人,本文的改善只有日夏普 0.04。
常見問題
漲停打開要追嗎?
連續 2 天以上一字漲停後第一次打開,2015 年以來 1,101 次,之後 20 天平均落後股票池 1.8%、中位數落後 4.4%,只有 38.9% 贏。只看 20 日平均成交金額 2,000 萬元以上的股票、從 2008 年起,打開隔天收盤買進持有 5 天的策略,扣成本後日夏普 0.32,同期 0050 0.80。
一字漲停是什麼?
開盤價、最高價、最低價、收盤價都在漲停價,K 線只有一條橫線,代表整天買單排隊、沒有人願意在漲停價以下賣。通常出現在重大消息之後,有時連續好幾天。
漲停打開代表什麼?
一字漲停之後第一次出現低於漲停價的成交,表示有人願意賣了。連續一字漲停的天數越多,打開之後落後越多:連續 3 天以上的 365 次,之後 20 天平均落後 2.9%。
為什麼只排除連續 2 天以上的?
門檻降到 1 天,2015 年以來的事件從 1,101 次增加到 4,246 次,打開後 20 天的平均落後從 1.8% 縮小到 0.8%;這樣排除,排除 5 天、10 天的兩組日夏普反而比原版低。條件在看結果前就定為 2 天,鄰近的 1 天、3 天一起驗證。
月營收動能本來就會買到漲停股嗎?
會。原版 45% 的交易在進場前 5 天內剛漲停,這些交易平均每筆賺 4.1%,比其他交易的 3.3% 多,一般漲停不需要避開。被排除的只有 59 筆連續一字漲停後打開的交易,平均 2.5%。
這個策略可以直接照做嗎?
可以重跑,但數字是全段樣本內的回測。最大回撤 -34.6%,2021 年 5 月單月 -27.4%;改善來自一百多筆交易,未來不一定重現。實際下單前請先用 策略頁 的程式在自己的環境重跑。
參考文獻
- Seasholes, M. S., & Wu, G.(2007). Predictable behavior, profits, and attention. Journal of Empirical Finance, 14(5), 590–610。漲停吸引散戶隔天買進,股價短暫續漲後回落。
- Barber, B. M., & Odean, T.(2008). All that glitters: The effect of attention and news on the buying behavior of individual and institutional investors. Review of Financial Studies, 21(2), 785–818。散戶是吸引注意股票的淨買方。
延伸閱讀
- 月營收動能選股:本文的基底策略,含原版的三項驗證,原版策略頁有淨值曲線與程式碼
- 當沖、漲停、盤後零股、鉅額交易回測:同一批 14 個設計的完整結果
- 可轉債選股:月營收動能避開可轉債發行公司:同樣加在月營收動能上的另一條排雷條件
- 動能策略台股 18 年回測
- 台股選股完整指南
- 本文策略的策略頁:淨值曲線與程式碼,可直接帶到 FinLab Studio 重跑
下載資源
| 檔案 | 內容 |
|---|---|
| strategy.py | 本文策略的完整程式碼,輸出 data.csv 與 metrics.json |
| data.csv | 本文策略與 0050 含息的每日淨值 |
| metrics.json | 本文策略與 0050 含息的統計 |
| research.py | 鄰近參數、前後兩段、原版對照、一字漲停打開的事件統計 |
| report_strategy.html | 本文策略的互動式回測報告 |
風險提示
本文所有策略與回測結果僅供教學與研究用途,不構成投資建議。過去績效不代表未來表現,本文策略最大回撤 -34.6%,單月也可能下跌超過兩成。投資一定有風險,請依自身風險承受能力審慎評估。
最後更新:2026-11|回測區間:2015-02 ~ 2026-10|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始


