RSI 指標在台股怎麼用:當動能選股因子,配廣度風控
RSI 台股回測的關鍵數字:
| 你想知道的 | 本文用真實台股回測的回答 |
|---|---|
| RSI 是什麼 | 相對強弱指標,0 到 100 的動量振盪指標,衡量近期上漲幅度占總漲跌幅的比例 |
| RSI 低於 30 買進有效嗎 | 每月買 RSI(14) 最低的 30 檔,研究段(2015–2021)年化 1.5%;月底 RSI 低於 30 的股票全部持有是 -5.1%。同期含息 0050 是 15.1% |
| 那 RSI 該怎麼用 | 反過來買強勢股:先篩出站上 60 日與 120 日均線的股票(趨勢池),再挑 RSI(28) 最高的 13 檔;月底若站上 60 日均線的股票比例(廣度)不到 0.40,整籃只留一半部位 |
| 效果如何 | 資料延長到 2026-09-30,全期年化 26.5% 勝含息 0050 的 21.2%,月夏普 1.07 打平;但 2022 年起年化 27.7% 落後 0050 的 30.5% |
| 最大的保留 | 這套規則在每月最後一個交易日換股。換股日改到每月 5、10、15、20、25 日,全期年化只剩 17.3% 到 21.9%,研究段更從 25.7% 掉到 14.3% 到 20.1% |
| 最近發生什麼事 | 6 月 30 日換股時廣度 0.646,維持滿倉;7 月中廣度跌破 0.40,但要等月底才減碼,13 檔有 11 檔虧損,策略 7 月 -23.4% |
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重現這篇文章,請讀:https://finlab.finance/setup?relatedUrl=/blog/rsi-indicator-taiwan-momentum

本文所有數字皆出自 finlab 套件(2.2.17)抓取的上市櫃真實價量資料(
price與etl:adj_close含息還原股價),RSI 以 TA-LibRSI計算,回測從 2015-01-30 起算、資料截至 2026-09-30,基準為同日起算的含息 0050。2026-10-26 用延長後的資料重跑,參數一個都沒改:2022 年起月夏普由首發版(資料截至 2026-06-09)的 1.23 降到 1.07,仍在我們設的 1.0 門檻之上。這次重跑另外補做了換股日、風控檢查頻率、逐層拆解與參數逐格掃描,結論比首發版保守很多,首發版的幾個錯誤也在對應段落更正。文末附可下載的strategy.py與data.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼;想釐清技術面與基本面選股的差別,可參考技術面與基本面選股的差異。
RSI 是什麼
RSI(Relative Strength Index,相對強弱指標)由 Wilder (1978) 在《New Concepts in Technical Trading Systems》提出,是一個動量振盪指標。它把一段期間(常用 14 日)內的上漲幅度與下跌幅度相比,換算成一個 0 到 100 的數值:
RSI = 100 −(100 /(1 + RS)),其中 RS = 該期間平均上漲幅度 / 平均下跌幅度。
直覺上,RSI 衡量「近期的上漲幅度占總漲跌幅的比例」。連續上漲時 RS 變大、RSI 趨近 100;連續下跌時 RSI 趨近 0。技術指標的基礎名詞可參考名詞詞彙表。
RSI 的數學定義:兩個平均,一個壓縮
把上面那句白話寫成公式,RSI 只用兩個量、再做一次壓縮:
逐項拆解每個符號:
- 是過去 日(常用 )每日漲幅的平均;某日收盤比前一日高多少,就把那個正的差額計入,下跌日記為 0。
- 是同一段期間每日跌幅的平均(取正值);上漲日記為 0。
- (相對強弱比,Relative Strength)就是這兩個平均相除:近期漲多於跌時 ,跌多於漲時 。 本身範圍從 0 到無限大,不好讀。
- 後面那條 是一個壓縮函數,把 到 的 映射回 到 。當 (全是跌日)時 ;當 (全是漲日)時 ;漲跌力道相當()時 。
從公式可以直接讀出一件事:RSI 反映的是近期漲跌幅的相對比例,和股價的絕對位置無關。一檔一路小漲、很少下跌的股票,RSI 可以長時間停在 60 到 80,不會因為「漲多了」就自動掉回 30。後面的回測會看到,台股裡 RSI 高的股票拿來選股,比 RSI 低的股票好很多。
教科書對 RSI 的標準解讀是兩條水平線:RSI 高於 70 算「超買」(暗示該賣)、低於 30 算「超賣」(暗示該買)。這套解讀背後的假設是均值回歸:價格漲多了會回檔、跌多了會反彈。台股吃不吃這一套,直接回測。
RSI 的兩種算法:Wilder 平滑與簡單平均
上面公式裡的「平均」有兩種做法,算出來的 RSI 差很多:
- Wilder 平滑(TA-Lib 與 finlab 採用):前 天的漲跌幅先取簡單平均當起點,之後每天更新 ,跌幅同理。每一天的漲跌都會留在平均裡,只是權重越來越小。
- 簡單平均:漲幅、跌幅各取最近 天的算術平均,第 天以前的漲跌完全不算。部分教學文章與軟體用這種。
我們手算 Wilder 版的台積電 RSI(14),和 finlab data.indicator("RSI", timeperiod=14) 自 2015-01-30 起逐日比對,最大差 0.0,兩者完全相同。換成簡單平均版,在 2023 年 7 月到 2024 年 6 月這一年,台積電的兩種 RSI 平均差 6.4 點、最大差 24.4 點;用簡單平均版會出現 4 次跌破 30 的超賣買點,Wilder 版一次都沒有。拿看盤軟體的 RSI 對照本文數字之前,先確認軟體用的是哪一種。另外,finlab 的 RSI 預設用未還原收盤價計算,除權息造成的價格缺口會被當成當天的下跌。
教科書的「RSI 低於 30 買進」,在台股 11 年都輸給 0050
我們在可交易宇宙(流動性前 300 名,定義見回測方法)裡,把九種 RSI(14) 用法各跑一次月底換股的回測,全部等權、不擇時。研究段(2015–2021)與 2022 年起分開列:
| RSI(14) 用法 | 研究段年化 | 研究段月夏普 | 2022 年起年化 | 2022 年起月夏普 |
|---|---|---|---|---|
| RSI 最低 30 檔(超賣接刀) | 1.49% | 0.18 | 13.70% | 0.70 |
| 月底 RSI < 30 的股票全部持有 | -5.09% | -0.03 | 9.41% | 0.45 |
| RSI 最高 30 檔 | 17.04% | 0.91 | 17.79% | 0.77 |
| 月底 RSI > 70 的股票全部持有 | 13.53% | 0.67 | 10.57% | 0.54 |
| 月底 RSI > 50 的股票全部持有 | 12.15% | 0.72 | 17.97% | 0.78 |
| 月底當天 RSI 剛上穿 50 | -6.32% | -0.19 | 6.55% | 0.46 |
| RSI 5 日變化最高 30 檔 | 6.88% | 0.42 | 10.68% | 0.59 |
| RSI 5 日變化的變化(加速度)最高 30 檔 | 7.71% | 0.48 | 16.99% | 0.77 |
| RSI 60 日 z-score 最高 30 檔 | 10.38% | 0.61 | 15.18% | 0.69 |
| 含息 0050(同日起算) | 15.09% | 1.00 | 30.51% | 1.21 |

表上看得出三件事:
- 超賣派兩種做法都很差。 每月買 RSI 最低的 30 檔,研究段年化 1.49%;月底 RSI 低於 30 的股票全部持有,研究段 -5.09%,全期最大回撤 -63.0%。後者每個月底符合的股票中位數只有 3 檔,141 個月中有 35 個月一檔都沒有、整籃空手。
- 買強勢股比買弱勢股好。 RSI 最高 30 檔研究段 17.04%,是九種用法裡唯一在研究段贏過 0050 的;2022 年起也是 17.79% 對最低 30 檔的 13.70%。這和 Jegadeesh & Titman (1993) 記錄的中期動能效應方向一致:過去一段時間的贏家,傾向繼續贏;Asness, Moskowitz & Pedersen (2013) 則發現動能效應在多個國家的股市與多種資產都存在。Jegadeesh & Titman 用過去 3 到 12 個月的報酬衡量動能,Asness 等人用過去 12 個月(跳過最近一個月),都比 RSI(14) 的觀察期長得多,這裡只是方向相同。
- 2022 年起九種裸用法全部落後 0050。 這段 0050 年化 30.51%,最好的裸用法只有 17.97%。單靠 RSI 讀數選股,不加任何篩選與風控,在近幾年的台股贏不了大盤。
把 RSI 再加工的花式用法(5 日變化、加速度、z-score)研究段落在 6.88% 到 10.38%,都比直接取 RSI 最高 30 檔差。把長週期 RSI 搭配基本面追漲的另一種做法見長週期 RSI 追漲策略;RSI 和 MACD、KD 的橫向比較見RSI、MACD、KD 三大指標台股實測。
首發版更正:首發版表格的「RSI 由下向上穿越 50」一列(研究段 16.68%),程式實際做的是「RSI 大於 50 的股票裡,取 RSI 最高 30 檔」,和「RSI 最高 30 檔」幾乎是同一籃股票,兩列數字才會幾乎相同。真正「月底當天剛上穿 50」的籃子研究段是 -6.32%,上表已改正,並補上「RSI > 50 全部持有」與「RSI > 70 全部持有」兩列。
把訊號畫在個股上:兩派買賣點
把公式畫到真實個股上,最能看出教科書兩派用法的問題。下面這張圖取台積電(2330)2023 年 7 月到 2024 年 6 月的窗,上半部是收盤價並標出兩派的買賣點,下半部是 RSI(14) 與超買 70、超賣 30 兩條線:

圖上標了兩派常見訊號:超賣派(RSI 跌破 30 買、突破 70 賣,三角形)與動能派(RSI 上穿 55 買、跌破 45 賣,圓點與叉號)。
- 超賣派整年沒有出手。 台積電這一年上漲 66.8%,RSI(14) 最低只到 32.0,沒有一天低於 30,超賣買點觸發 0 次;「突破 70 該賣」反而觸發 9 次。照超賣派操作,這一年在台積電上一張都不會買。
- 動能派訊號頻繁。 動能派同窗觸發 18 次買、10 次賣,兩派合計 37 個訊號,平均 6.6 個交易日一個。買進次數比賣出多,是因為 RSI 常在 45 到 55 之間來回,上穿 55 好幾次才會跌破 45 一次。
聯發科(2454)同窗上漲 102.6%,超賣買點 1 次、超買賣點 10 次、動能派買 10 次賣 7 次,合計 28 個訊號:

兩張圖說明單看一檔股票的 RSI 來決定進出的困難:強勢股上,超賣派幾乎等不到買點,超買訊號卻一再叫你下車。後面的策略因此把 RSI 拿來「同一天橫向比較誰最強」,每月換股一次。
想自己算任一檔股票的兩派訊號,可以用下面這段程式碼(RSI 用完整歷史計算後再取觀察窗,窗內第一天也用真實的前一天判斷穿越):
顯示程式碼
import finlab
from finlab import data
# 套件會在需要資料時自動引導登入
finlab.login()
# 用完整歷史計算 RSI(14),再取觀察窗
rsi = data.indicator("RSI", timeperiod=14)
sid = "2330"
r = rsi[sid]
# 超賣派:RSI 跌破 30(進入超賣)買、突破 70(進入超買)賣
oversold_buy = (r < 30) & (r.shift(1) >= 30)
overbought_sell = (r > 70) & (r.shift(1) <= 70)
# 動能派:RSI 上穿 55 買、跌破 45 賣
momentum_buy = (r > 55) & (r.shift(1) <= 55)
momentum_sell = (r < 45) & (r.shift(1) >= 45)
window = slice("2023-07-01", "2024-06-30")
signals = {"超賣買": oversold_buy, "超買賣": overbought_sell, "動能買": momentum_buy, "動能賣": momentum_sell}
for name, sig in signals.items():
print(name, int(sig.loc[window].sum()))台積電印出 0、9、18、10,把 sid 換成 "2454" 印出 1、10、10、7,與上面兩張圖相同。首發版把穿越判斷放在觀察窗內做,窗內第一天會被誤判成穿越,台積電動能派買點寫成 19 次、聯發科賣點寫成 8 次,這次一併更正。
完整策略:趨勢池內 RSI(28) 最高 13 檔,月底看廣度決定部位
策略分成選股與風控兩層,全部只用價量:
- 趨勢池:在可交易宇宙中,只留收盤同時站上 60 日均線(季線)與 120 日均線(半年線)的股票。
- 選股:趨勢池內取 RSI(28) 最高的 13 檔,每檔 1/13 權重。28 日週期比看盤軟體預設的 14 日更平滑。
- 廣度風控:可交易宇宙內收盤站上 60 日均線的股票比例,稱為廣度。廣度大於 0.40 持有滿倉;小於等於 0.40,整籃部位縮到一半,其餘放現金,不加碼、不放空、不開槓桿。
- 檢查時點:每月最後一個交易日換股,廣度也只在這一天讀取。月中廣度跌破 0.40,要等到月底才減碼;月中回升,也要等到月底才加回。
首發版更正:首發版寫成每日計算廣度、跌破門檻就把整籃縮到半倉、廣度回升次日恢復滿倉,回測其實是
sim(resample="M"),部位只在月底讀取,風控是每月檢查一次。這個落差的影響見後面「廣度風控只在月底看一次」一節。
可交易宇宙的程式碼如下:
顯示程式碼
import numpy as np
import pandas as pd
from finlab import data
# 套件會在需要資料時自動引導登入
import finlab
finlab.login()
close = data.get("price:收盤價")
volume = data.get("price:成交股數")
amount = data.get("price:成交金額")
# 可交易宇宙:60 日均量 > 100 萬股、收盤 > 10 元、60 日均成交金額前 300 大
liquid = ((volume.rolling(60, min_periods=20).mean() > 1_000_000)
& (close > 10)
& amount.rolling(60, min_periods=20).mean().is_largest(300))
# 只留代號剛好 4 碼數字的股票,排除 ETF(00 開頭)、金融保險股、處置與全額交割股
cat = data.get("security_categories")
financial = set(cat.loc[cat["category"].astype(str)
.str.contains("金融|保險|銀行", na=False), "stock_id"].astype(str))
common_cols = [
sid for sid in close.columns
if len(str(sid)) == 4 and str(sid).isdigit()
and not str(sid).startswith("00") and str(sid) not in financial
]
flagged = (data.get("etl:is_flagged_stock")
.reindex(index=close.index, columns=common_cols).fillna(False).astype(bool))
universe = liquid[common_cols] & ~flagged
close = close[common_cols]趨勢池與 RSI 選股:
顯示程式碼
# 趨勢池:收盤同時站上 60 日(季線)與 120 日(半年線)均線
ma60 = close.rolling(60).mean()
ma120 = close.rolling(120).mean()
above60 = close > ma60
trend_pool = universe & above60 & (close > ma120)
# RSI(28):指標輸出的欄位比收盤價少,先對齊欄位;趨勢池內取 RSI 最高的 13 檔
rsi28 = data.indicator("RSI", timeperiod=28).reindex(columns=common_cols)
basket = (rsi28.where(trend_pool).rank(axis=1, ascending=False) <= 13) & trend_pool廣度風控與回測:
顯示程式碼
from finlab.backtest import sim
# 廣度:宇宙內收盤站上 60 日均線的比例
breadth = above60.where(universe).sum(axis=1) / universe.sum(axis=1).replace(0, np.nan)
risk_on = (breadth > 0.40).fillna(False)
weights = basket.astype(float)
weights = weights.div(weights.sum(axis=1).replace(0, np.nan), axis=0).fillna(0.0)
scale = risk_on.map({True: 1.0, False: 0.5})
position = weights.mul(scale, axis=0)
# 每月最後一個交易日換股(風控也只在這天讀取),從 2015 年起回測
report = sim(position.loc["2015":], resample="M", fee_ratio=1.425 / 1000 * 0.3, upload=False)這四段程式碼我們在乾淨環境用 finlab 2.2.17 依序實跑,資料截止日設為 2026-09-30 時,淨值與本文 data.csv 的 2,842 個交易日逐日相同,廣度也逐日相同。要對上本文數字,在可交易宇宙那段程式碼的 from finlab import data 下一行加上 data.truncate_end = "2026-09-30";不加就會用到最新資料。首發版頁面上的選股骨架沒有排除 ETF、金融股與處置股,可下載的 strategy.py 從 2007 年起回測、也沒有固定資料截止日,跑出來的數字和文章不同;data.csv 則是 6 月定案前另一版策略(低波趨勢池加 ATR 停損)的淨值。三個檔案這次都換成與文章同一套邏輯。
完整策略的真實績效
所有數字從同一天(2015-01-30,策略第一個淨值日)起算:
| 指標 | 研究段(2015–2021) | 2022 年起 | 全期 | 含息 0050 研究段 | 含息 0050 2022 年起 | 含息 0050 全期 |
|---|---|---|---|---|---|---|
| 年化報酬 | 25.72% | 27.73% | 26.48% | 15.09% | 30.51% | 21.17% |
| 月夏普 | 1.24 | 1.07 | 1.07 | 1.00 | 1.21 | 1.07 |
| 月索提諾 | 2.12 | 1.71 | 1.69 | 1.47 | 2.44 | 1.85 |
| 最大回撤 | -30.44% | -35.01% | -35.40% | -28.22% | -33.96% | -33.96% |
研究段的年化、月夏普、月索提諾都勝過 0050,最大回撤略深。2022 年起年化落後 0050 2.8 個百分點,月夏普 1.07 對 1.21、回撤 -35.0% 對 -34.0% 也都輸。全期勝在年化,領先 0050 5.3 個百分點,月夏普 1.07 打平,月索提諾與最大回撤略差。全期年化波動 27.8%,0050 是 19.8%。年換手約 8.9 倍。
「2022 年起」這一段,首發時挑參數的門檻就包含它的表現,看過這段才定案,所以本文不把它稱為樣本外。真正選完參數才出現的資料,是首發資料截止日 2026-06-09 之後的四個月,見後面「2026-06-09 之後」一節。
完整互動式回測(月報酬熱力圖、權益曲線、年度績效):
逐層拆開:趨勢池、RSI 與廣度風控各自的作用
把策略的零件一個一個拿掉,其餘設定不變,同一天起算:
| 版本 | 研究段年化 / 月夏普 | 2022 年起年化 / 月夏普 | 全期年化 | 全期最大回撤 |
|---|---|---|---|---|
| 完整策略 | 25.72% / 1.24 | 27.73% / 1.07 | 26.48% | -35.40% |
| 全宇宙 RSI(28) 最高 13 檔(不篩趨勢、不減碼) | 29.96% / 1.19 | 33.86% / 1.13 | 31.47% | -42.36% |
| 全宇宙 RSI(28) 最高 13 檔,加廣度風控 | 26.67% / 1.23 | 25.69% / 1.03 | 26.21% | -37.03% |
| 趨勢池內 RSI(28) 最高 13 檔(不減碼) | 29.00% / 1.19 | 34.72% / 1.15 | 31.23% | -40.30% |
| 趨勢池只留 120 日均線 | 25.77% / 1.24 | 27.73% / 1.07 | 26.51% | -35.40% |
| 趨勢池只留 60 日均線 | 27.31% / 1.26 | 25.92% / 1.03 | 26.69% | -37.04% |
| 趨勢池全部持有(不看 RSI),加風控 | 12.52% / 0.81 | 11.57% / 0.68 | 12.05% | -38.73% |
| 趨勢池內改用 28 日報酬選 13 檔 | 23.58% / 1.02 | 18.90% / 0.78 | 21.56% | -47.31% |
| risk-off 時整籃清空(不留一半) | 21.77% / 1.13 | 20.35% / 0.91 | 21.15% | -40.47% |

從這張表讀出的事:
- 報酬主要來自 RSI 排名。 趨勢池全部持有、不看 RSI,全期年化只有 12.05%;同一個池子挑 RSI(28) 最高 13 檔,加同一套風控是 26.48%。
- RSI(28) 比 28 日報酬好用。 同一個趨勢池改用 28 日漲幅選 13 檔,全期年化 21.56%、最大回撤 -47.31%。RSI 看的是漲幅占總漲跌幅的比例,同樣漲 30%,一路小漲的股票 RSI 會比大起大落的股票高。一種解讀是 RSI 排名偏向走勢較平穩的上漲股,本文沒有另外驗證這個機制。
- 趨勢池的作用很小,60 日均線那一半幾乎沒作用。 拿掉趨勢池(全宇宙加風控)全期年化 26.21%,與完整策略的 26.48% 接近,回撤 -37.03% 略深。只留 120 日均線的結果和完整策略幾乎一樣(全期 26.51%),2022 年起的數字完全相同、研究段只差 0.05 個百分點,60 日均線這個條件在這套策略裡幾乎沒有作用。
- 廣度風控用報酬換回撤。 趨勢池內不減碼全期年化 31.23%、最大回撤 -40.30%;加上風控後是 26.48%、-35.40%,每年少賺約 4.8 個百分點,換到回撤淺 4.9 個百分點。研究段月夏普 1.19 升到 1.24,2022 年起反而由 1.15 降到 1.07。首發版的原句是「廣度風控壓回撤的同時,研究段月 Sharpe 從趨勢池的 1.18 微升到 1.23,並未犧牲報酬」,用首發版自己的數字(趨勢池研究段 28.82% 對完整策略 25.51%)就不成立,這次更正。
- 不減碼的版本 2022 年起贏 0050。 趨勢池內不減碼 2022 年起年化 34.72%,高於 0050 的 30.51%,但這是拿掉風控後的事後觀察,本文策略的參數不因此更動。
廣度風控只在月底看一次
回測只在每月最後一個交易日讀取部位,日頻的廣度訊號和實際減碼之間有落差。2015 年起,廣度跌破 0.40 的區段共 71 段,其中 49 段在月底前就回升,從來沒有執行;有執行的 22 段,從跌破到第一個月底的交易日數中位數 3.5 天、最長 20 天。141 個月底換股日中,有 29 個(20.6%)判定減碼。
減碼的效果集中在少數幾個月。29 個減碼月份裡,不減碼的籃子下個月平均 +3.2%,比滿倉月份的 +2.5% 還高;虧損月份 11 個,滿倉的 111 個月份裡則有 38 個虧損。少賠最多的三次是 2020-02-27(不減碼 -15.0%,策略 -7.5%)、2018-09-28(-13.3% 對 -6.6%)與 2022-09-30(-12.1% 對 -7.2%)。不減碼籃最差的 8 個月裡,有 5 個月在月底判定滿倉,例如 2021-12-30 月底廣度 0.815,下個月籃子 -13.6%;2025-08-29 廣度 0.673,下個月籃子 -11.2%,同期 0050 +10.1%。
如果把同一個月底選出的 13 檔改成每天依廣度調整部位,全期年化 26.02%、最大回撤 -44.20%,2022 年起月夏普 0.98,三項都比月底檢查差。每天檢查在 2026 年 7 月少賠(-19.5% 對 -23.4%),拉長到 11 年卻沒有比較好。
下圖是最近一年的每日廣度與策略淨值,虛線是每個月底換股日:

圖上看得到:2025 年 11 月 21 日廣度跌到 0.33,月底回到 0.50,沒有減碼;2026 年 3 月 31 日換股那天廣度剛好是 0.389,4 月整月只持有一半部位,廣度 4 月初就回到 0.40 以上,4 月不減碼的籃子上漲 35.4%,策略只有 20.0%;7 月 17 日跌破後一路下探,7 月 30 日只剩 0.106,7 月 31 日換股時是 0.135,8 月才開始半倉。市場廣度的概念與更多用法,可延伸看用市場濾網降低回撤。
換股日挪到月中,結果差很多
同一套規則、同一個部位,只把讀取部位的日子從月底改到每月 5、10、15、20、25 日(遇假日取該月在這天以前的最後一個交易日;該月在這天以前沒有交易日就不換股,5 日有 3 個月、10 日有 1 個月因此沒換),其餘完全不變:
| 換股日 | 研究段年化 / 月夏普 | 2022 年起年化 / 月夏普 | 全期年化 | 全期最大回撤 |
|---|---|---|---|---|
| 每月 5 日 | 16.13% / 0.84 | 19.18% / 0.79 | 17.27% | -39.30% |
| 每月 10 日 | 14.62% / 0.76 | 25.27% / 0.91 | 18.77% | -47.92% |
| 每月 15 日 | 14.34% / 0.66 | 28.90% / 0.92 | 20.02% | -44.51% |
| 每月 20 日 | 14.26% / 0.70 | 33.11% / 1.05 | 21.51% | -42.65% |
| 每月 25 日 | 20.09% / 0.94 | 24.70% / 0.88 | 21.93% | -51.67% |
| 月底(本文) | 25.70% / 1.24 | 27.73% / 1.07 | 26.47% | -35.40% |

(月底那一列用「只在月底讀取部位」的寫法重算,全期年化與上面的主表差 0.01 個百分點以內、研究段差 0.02 個百分點,用來確認這個比較的做法沒有偏差。)
2022 年起各換股日互有高低,20 日甚至到 33.11%;差距集中在研究段:月底換股研究段年化 25.70%,其他五個日子只有 14.26% 到 20.09%,月夏普全部低於 1.0。全期年化也只有月底換股明顯贏 0050,20 日與 25 日的 21.51%、21.93% 和 0050 的 21.17% 差不多,5 日、10 日、15 日輸給 0050。
這叫換股時點運氣(rebalance timing luck)。Hoffstein, Faber & Braun (2020) 分析 smart beta 指數時指出,規則完全相同、只差換股日的組合,績效可以有明顯落差。本文的參數是在研究段用月底換股挑出來的,研究段的優勢又大半只出現在月底這一組,所以研究段 25.7% 應該看成「月底換股這一組」的結果。我們沒有找到月底換股特別有效的原因。同系列的 KD 指標回測也有同樣的問題,季底換股挪一個月,全期年化從 29.4% 掉到 7.7%。這個檢查是首發版沒有做的。
參數最佳化:RSI 週期與持股檔數
RSI 週期與持股檔數各取四格,每一格都跑完整策略(趨勢池加廣度風控)。研究段月夏普:

同一張網格的 2022 年起月夏普:

研究段 16 格在 1.01 到 1.24 之間,RSI 28 搭 13 檔最高。2022 年起只剩 3 格達到 1.0(RSI 28 搭 13 檔 1.07、RSI 35 搭 11 檔與 13 檔都是 1.02),RSI 14 那一列 0.71 到 0.83。
首發版把 RSI 週期 21 到 35、持股 11 到 20 檔描述成一片連續的穩健高原,但網格只跑了 14、21、28、35 四個週期,中間的週期沒有跑過。這次把 RSI 週期從 20 到 36 每一個都跑一次(持股固定 13 檔):

週期 27 到 36 研究段月夏普 1.18 到 1.32、2022 年起 1.02 到 1.13,是一段連續偏高的區間;20 到 26 研究段降到 1.02 到 1.12,2022 年起 0.91 到 1.03。本文用的 28 在偏高區間的左緣附近(27 是這一段的第一格),26 與 27 之間有一個明顯的落差。持股檔數 9 到 17 檔逐一跑過(RSI 固定 28),研究段 1.07 到 1.24、13 檔最高;2022 年起只有 12、13、14、16 檔達到 1.0。
廣度門檻與減碼比例的鄰格:門檻改 0.35,全期年化 29.04%、2022 年起月夏普 1.12;改 0.45 是 28.38%、1.17、最大回撤 -32.04%,兩邊都比 0.40 好;risk-off 留 40% 部位是 25.46%,留 60% 是 27.48%。0.40 剛好落在兩個較好的鄰格中間。依季度刷新的規則,參數不因為事後看到鄰格比較好而更換,這些數字列出來,讓你判斷這組參數有多大的運氣成分。
2026-06-09 之後:首發後的新資料
首發版資料截止日 2026-06-09 之後的四個月,是這套參數選定後才出現的資料:
| 區間 | 策略 | 不減碼 | 每天依廣度調整(對照) | 含息 0050 |
|---|---|---|---|---|
| 2026-06-09 → 06-30 | +13.4% | +13.4% | +13.4% | +4.2% |
| 2026 年 7 月 | -23.4% | -23.4% | -19.5% | -4.0% |
| 2026 年 8 月 | +6.9% | +10.4% | +5.6% | +3.3% |
| 2026 年 9 月 | +1.6% | +2.1% | +2.1% | +5.5% |
| 06-09 → 09-30 合計 | -5.7% | -2.1% | -1.6% | +8.9% |

7 月發生的事:
- 6 月 30 日換股時廣度 0.646,判定滿倉。 7 月 1 日進場的 13 檔,持有到 8 月 3 日,11 檔虧損,中位數 -20.7%,最差的國巨(2327)-51.6%,最好的 +4.5%。
- 廣度 7 月 17 日跌破 0.40,策略要等到月底才減碼。 7 月 30 日廣度只剩 0.106,7 月 31 日月底讀到 0.135,8 月起才縮到半倉。同期 0050 從 7 月 1 日高點跌到 7 月 30 日 -14.0%,整月 -4.0%。
- 淨值從 7 月 6 日高點到 7 月 30 日回落 -32.0%。 2026 年 7 月是 2015 年以來策略最差的單月,研究段最差的月份是 2015 年 7 月的 -16.2%。到 9 月底,淨值仍比高點低 21.2%。
2022 年起的月夏普因此從首發版的 1.23 降到 1.07。同截止日比對:用新版程式與 finlab 2.2.17 把資料截到 2026-06-09,研究段 25.72%、2022 年起 31.66% / 1.23、全期 27.95%;首發版是 25.51%、31.66% / 1.23、27.84%,研究段的小差異可能來自資料修補、套件版本更新與第一個淨值日不同(首發版 0050 也從 2015-01-05 起算,早於策略),本文沒有逐項拆解。1.23 降到 1.07 是這四個月的新資料造成的。
回測方法與口徑
- 交易成本:finlab
sim(),手續費 0.1425% 打三折,賣出另扣證交稅 0.3%。首發版寫「手續費 0.1425%」,程式實際用的是三折後的費率。 - 滑價:未額外假設,實際成交衝擊取決於資金規模與流動性,本文未估算容量。
- 股票池:上市櫃普通股,60 日均量 > 100 萬股、收盤 > 10 元、60 日均成交金額前 300 名;代號必須剛好是 4 碼數字(排除權證、特別股與 6 碼代號),排除 00 開頭的 ETF、金融保險股、處置與全額交割股。KY 股的代號也是 4 碼數字,沒有排除,例如 2026-09-30 的持股就有騰輝電子-KY(6672);首發版寫「排除 KY」與程式不符。首發版的宇宙寫法(代號前 4 碼是數字就放行)跑出來的換股日持股與本文完全相同。
- 前視偏差:RSI、均線與廣度都只用當天(含)以前的收盤價,月底收盤後決定部位,下一個交易日成交。完全不用財報或月營收。
- RSI 計算:TA-Lib
RSI,Wilder 平滑,未還原收盤價(finlabdata.indicator預設)。 - 權重:每檔 1/13,risk-off 時整籃合計 50%,其餘現金;單一個股不另設上限。換股日持股一直是 13 檔。
- 周轉率:年換手約 8.9 倍,11 年共 1,830 筆交易。
- 研究段與 2022 年起:研究段 2015–2021;2022 年起這段在首發選參數時已經看過。選定後才出現的資料只有 2026-06-09 之後的四個月。
- 生存者偏差:宇宙每天依當時的資料篩選,2015-01-30 有收盤價、到 2026-09-30 已經沒有收盤價的 4 碼普通股共 142 檔,在當時都可能被選入。
- 首發後補做的檢查:換股日(每月 5 到 25 日)、每天檢查風控的對照組、逐層拆解、RSI 週期 20 到 36 與持股 9 到 17 檔逐格掃描、廣度門檻與減碼比例鄰格、月營收過濾。
不同年度的表現:12 年贏 6 年
| 年度 | 策略 | 含息 0050 | 不減碼 | 每天依廣度調整 |
|---|---|---|---|---|
| 2015(1/30 起) | 12.4% | -7.9% | 14.4% | 11.4% |
| 2016 | 15.7% | 19.6% | 13.0% | 5.4% |
| 2017 | 36.3% | 18.1% | 36.3% | 34.6% |
| 2018 | -6.5% | -4.9% | -8.0% | -7.2% |
| 2019 | 23.9% | 33.5% | 25.7% | 24.9% |
| 2020 | 59.7% | 31.1% | 83.1% | 72.4% |
| 2021 | 48.5% | 21.9% | 55.9% | 50.6% |
| 2022 | -34.1% | -21.4% | -31.3% | -27.4% |
| 2023 | 95.8% | 27.5% | 105.5% | 86.1% |
| 2024 | 14.7% | 48.6% | 16.9% | 0.2% |
| 2025 | 44.9% | 36.8% | 41.8% | 31.1% |
| 2026(至 9/30) | 48.3% | 74.3% | 75.2% | 76.0% |
策略 12 年裡贏 0050 的有 6 年。2022 年策略 -34.1%,比 0050 的 -21.4% 跌更多,也比不減碼的 -31.3% 差,廣度風控在這一年沒有幫上忙;2024 年 0050 上漲 48.6%,策略只有 14.7%。和不減碼相比,廣度風控只在 2016、2018、2025 三年多賺或少賠,2017 年打平,其餘 8 年都少賺;2026 年至 9 月底策略 48.3%、不減碼 75.2%,差距大半來自 4 月(3 月 31 日判定減碼,4 月不減碼籃 +35.4%、策略 +20.0%)。首發版把 2022 年描述成靠廣度風控壓住回撤,又說 2023–2024 年的反彈段是報酬的主力,2022 與 2024 兩年的逐年數字都不支持,這次改寫。
加上月營收 YoY 會更好嗎:實跑結果兩段都比較差
首發版這一段只有推論,沒有回測。這次實跑:選股前先限定月營收年增率大於 0 的股票(以月營收公布日對齊,只用當時已公布的資料),其餘不變。研究段年化 22.8%、月夏普 1.14,2022 年起 27.4%、1.05,全期 24.6%、最大回撤 -41.1%,兩段都比主策略差,回撤也更深。本文主策略維持純技術面。基本面與技術面如何分工,可延伸看技術面與基本面選股的差異。
三項穩健性驗證:重跑到 2026 年 10 月
這裡驗證本文的完整策略:站上 60 與 120 日均線的趨勢池裡取 RSI(28) 最高 13 檔等權,股票池站上季線的比例不到 0.4 時部位減半,每月換股。我們在 2026-10-27 用本文附的 strategy.py(把 DATA_END 改成 None,finlab 2.2.20,資料截至 2026-10-27)把它重跑到最新,再做三項檢查。三項檢查的「贏」都是同一個意思:日夏普高於同一段期間的 0050 含息買進持有(etl:adj_close 還原價、純算術計算、不扣成本)。兩邊的日夏普用同一個公式:日報酬平均除以標準差、乘上 √252,不扣無風險利率。三項都用 sim() 預設的手續費 0.1425% 與證交稅 0.3%;原文手續費三折的結果另列於成本對照表。
| 檢查 | 標準 | 結果 |
|---|---|---|
| 鄰近參數 | RSI 週期(22、28、34)乘上持股檔數(10、13、16),9 組至少 7 組贏 | 0/9 組贏,不過 |
| 前後兩段 | 2015-01-30 到 2020-12-11、2020-12-14 到 2026-10-27 兩段都贏 | 前段 0.85 對 0.89,後段 1.00 對 1.24,不過 |
| 交易成本 | 原參數、sim() 預設成本 |
日夏普 0.93 對 1.08,不過 |

9 組參數的日夏普(括號內是年化報酬,粗體是原文參數):
| 持股檔數 \ RSI 週期 | 22 | 28 | 34 |
|---|---|---|---|
| 16 | 0.78(年化 18.2%) | 0.84(年化 20.2%) | 0.80(年化 19.4%) |
| 13 | 0.83(年化 20.2%) | 0.93(年化 23.8%) | 0.90(年化 23.3%) |
| 10 | 0.81(年化 20.3%) | 0.80(年化 20.4%) | 0.82(年化 21.4%) |
前後兩段與全期:
| 期間 | 策略年化 | 策略日夏普 | 0050 含息年化 | 0050 日夏普 |
|---|---|---|---|---|
| 前段 2015-01-30 到 2020-12-11 | 18.0% | 0.85 | 13.5% | 0.89 |
| 後段 2020-12-14 到 2026-10-27 | 29.4% | 1.00 | 28.0% | 1.24 |
| 全期 2015-01-30 到 2026-10-27 | 23.8% | 0.93 | 20.5% | 1.08 |
前後兩段是把整段期間從中點對半切。上文的研究段與樣本外以 2022 年初為界,照這個切法,2015 到 2021 年日夏普 0.95 對 0050 的 0.96,2022 年起 0.91 對 1.22。上文多用月夏普,跟這裡的日夏普算法不同,數字不能直接比。
交易成本對照(原參數):
| 成本設定 | 年化 | 日夏普 | 最大回撤 |
|---|---|---|---|
| 不扣成本 | 30.5% | 1.13 | -33.5% |
sim() 預設:手續費 0.1425%、證交稅 0.3% |
23.8% | 0.93 | -36.5% |
| 原文設定:手續費打三折 | 26.0% | 1.00 | -35.4% |
| 0050 含息買進持有(同期) | 20.5% | 1.08 | -34.0% |
9 組鄰近參數全部輸,原參數已經是 9 組裡最好的一格;RSI 週期改成 34 日還有 0.90,持股改成 10 或 16 檔就掉到 0.80、0.84。前段(2015 到 2020 年)日夏普 0.85 小輸 0050 的 0.89,後段 1.00 輸 1.24,三項都不成立。跟上文「換股日挪到月中,結果差很多」一樣,績效對持股檔數與換股日都很敏感。上文的年化 26.5% 是資料到 2026-09-30、手續費打三折的結果;照三折跑到 2026-10-27 是 26.0%,換成 sim() 預設成本是 23.8%。
策略的限制與取捨
- 換股日運氣:研究段的優勢大半只出現在月底換股,換到月中,全期年化只剩 17.3% 到 21.9%。
- 2022 年起落後 0050:年化 27.7% 對 30.5%,月夏普 1.07 對 1.21。全期勝 0050 的部分主要來自 2015 到 2021 年。
- 風控每月只看一次:月中崩跌時來不及減碼,2026 年 7 月就是例子;改成每天檢查,長期結果反而更差。
- 集中度高、回撤深:只持有 13 檔,全期最大回撤 -35.4%,年化波動 27.8%,都高於 0050。
- 參數有運氣成分:RSI 週期 28 在偏高區間的左緣,廣度門檻 0.40 兩側的鄰格都比較好。
- 容量與成本:年換手約 8.9 倍,宇宙限成交金額前 300 名;大資金需放寬檔數,並重估流動性衝擊與滑價。
自己跑一次
FinLab Skill 可以讓你的 AI 助理安裝環境、抓台股資料,並重現這篇回測。
裝好之後,下載本文的 strategy.py 與 data.csv。strategy.py 會印出本文的主表、三個逐層拆解版本與每天調整的對照、換股日比較、逐年報酬與 2026-06-09 之後的逐月報酬,資料截止日固定在 2026-09-30,改成 None 就用最新資料重跑。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽與程式交易是什麼。13 個常用技術指標的回測整理在技術指標台股 11 年回測總覽;用 ATR 估波動與通道突破的實測見肯特納通道與 ATR。
常見問題
Q:RSI 參數要設多少?14 是最好的嗎? 14 日是 Wilder 的原始建議,也是看盤軟體的常見預設。本文的選股策略用 RSI(28)。週期從 20 到 36 逐一跑過,27 到 36 這一段研究段月夏普 1.18 到 1.32、2022 年起 1.02 到 1.13,20 到 26 明顯較低;RSI 14 搭配同一套策略,2022 年起月夏普只有 0.71 到 0.83。換股日對結果的影響比週期更大,月底改到月中,全期年化就從 26.5% 掉到 20.0%。
Q:RSI 低於 30 真的不能抄底嗎? 在本文的設定下,每月買 RSI(14) 最低的 30 檔,研究段年化 1.49%;月底 RSI 低於 30 的股票全部持有,研究段 -5.09%、全期最大回撤 -63.0%,2022 年起兩者也都落後 0050。單看 RSI 低於 30 就買進,在台股回測站不住。
Q:那 RSI 高於 70 要賣嗎? 本文策略每個月底入選的股票,RSI(28) 中位數約 67,平均有 29.8% 高於 70;2026-09-30 入選的 13 檔,有 7 檔的 RSI(14) 高於 70。這套策略買的正是教科書說「超買」的股票。反過來說,「月底 RSI > 70 全部持有」研究段 13.53%、2022 年起 10.57%,也輸 0050,高 RSI 本身也不是買進理由,要在同一天橫向排名才有用。用事件回測檢驗「超買該不該賣」,見技術指標超買該賣股票嗎。
Q:為什麼月底換股和月中換股差這麼多? 策略只持有 13 檔,換股那天選到哪 13 檔、廣度讀數是高是低,決定接下來一個月的持股與部位。月底換股全期年化 26.47%,改到每月 5 到 25 日只有 17.27% 到 21.93%,差距集中在 2015 到 2021 年。我們沒有找到月底特別有效的原因,這個差距應該視為換股時點運氣,不能當成可以期待的報酬。
Q:廣度風控到底有沒有用? 它把全期最大回撤從 -40.3% 壓到 -35.4%,代價是全期年化從 31.2% 降到 26.5%,2022 年起月夏普也從 1.15 降到 1.07。12 年裡只有 3 年比不減碼好。它只在月底讀一次,2026 年 7 月這種月中急跌來不及反應;改成每天檢查,11 年下來回撤反而更深(-44.2%)。
Q:RSI 和 KD、MACD 有什麼差別?該用哪個? RSI、KD 都是擺盪類指標,資訊高度重疊,MACD 偏趨勢。三者在台股的實測比較見RSI、MACD、KD 三大指標台股實測。本文的拆解顯示,RSI 的價值主要在橫向排名:同一個池子用 RSI(28) 選股全期年化 26.48%,不看 RSI 全部持有只有 12.05%。
Q:這套策略適合誰? 適合想研究「指標怎麼當選股因子」、並願意自己檢查換股日與參數敏感度的人。不適合想直接照抄進場的人:它在 2022 年起落後 0050,換股日一動結果就差很多,單月可以跌超過兩成。只想參與台股長期報酬,直接買進持有含息 0050 更省事。
最後更新:2026-10|回測區間:2015-01-30 到 2026-09-30|作者:FinLab 量化研究團隊(經量化研究員審閱)
本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。策略全期最大回撤 -35.4%,換股日改到每月 5 到 25 日時全期年化只剩 17.3% 到 21.9%,實際交易前請自行評估風險、滑價與交易容量。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

