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

RSI 指標台股 11 年回測:當動能選股因子+廣度風控的純技術策略

RSI 指標怎麼用?台股回測:買 RSI 最低 30 檔接刀研究段年化僅 1.5%,RSI 低於 30 全買 -5.1%;趨勢池內買 RSI(28) 最高 13 檔、配廣度風控,全期年化 26.5% 勝 0050 的 21.2%,但 2022 年起落後,換股日改到月中只剩 20.0%。

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

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

在 Studio 重跑
RSI 是動能不是抄底 CAGR 26.5% Sharpe 1.07

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 Studio

RSI 動能選股加廣度風控策略與含息 0050 的台股淨值對照圖,2015 年 1 月 30 日同日起算到 2026 年 9 月

本文所有數字皆出自 finlab 套件(2.2.17)抓取的上市櫃真實價量資料(price 與 etl:adj_close 含息還原股價),RSI 以 TA-Lib RSI 計算,回測從 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 只用兩個量、再做一次壓縮:

RS=U‾nD‾n,RSI=100−1001+RSRS = \frac{\overline{U}_n}{\overline{D}_n},\qquad RSI = 100 - \frac{100}{1 + RS}

逐項拆解每個符號:

  • U‾n\overline{U}_n 是過去 nn 日(常用 n=14n = 14)每日漲幅的平均;某日收盤比前一日高多少,就把那個正的差額計入,下跌日記為 0。
  • D‾n\overline{D}_n 是同一段期間每日跌幅的平均(取正值);上漲日記為 0。
  • RSRS(相對強弱比,Relative Strength)就是這兩個平均相除:近期漲多於跌時 RS>1RS > 1,跌多於漲時 RS<1RS < 1。RSRS 本身範圍從 0 到無限大,不好讀。
  • 後面那條 RSI=100−100/(1+RS)RSI = 100 - 100 / (1 + RS) 是一個壓縮函數,把 00 到 ∞\infty 的 RSRS 映射回 00 到 100100。當 RS→0RS \to 0(全是跌日)時 RSI→0RSI \to 0;當 RS→∞RS \to \infty(全是漲日)時 RSI→100RSI \to 100;漲跌力道相當(RS=1RS = 1)時 RSI=50RSI = 50。

從公式可以直接讀出一件事:RSI 反映的是近期漲跌幅的相對比例,和股價的絕對位置無關。一檔一路小漲、很少下跌的股票,RSI 可以長時間停在 60 到 80,不會因為「漲多了」就自動掉回 30。後面的回測會看到,台股裡 RSI 高的股票拿來選股,比 RSI 低的股票好很多。

教科書對 RSI 的標準解讀是兩條水平線:RSI 高於 70 算「超買」(暗示該賣)、低於 30 算「超賣」(暗示該買)。這套解讀背後的假設是均值回歸:價格漲多了會回檔、跌多了會反彈。台股吃不吃這一套,直接回測。

RSI 的兩種算法:Wilder 平滑與簡單平均

上面公式裡的「平均」有兩種做法,算出來的 RSI 差很多:

  1. Wilder 平滑(TA-Lib 與 finlab 採用):前 nn 天的漲跌幅先取簡單平均當起點,之後每天更新 U‾t=(U‾t−1×(n−1)+Ut)/n\overline{U}_t = (\overline{U}_{t-1} \times (n-1) + U_t) / n,跌幅同理。每一天的漲跌都會留在平均裡,只是權重越來越小。
  2. 簡單平均:漲幅、跌幅各取最近 nn 天的算術平均,第 n+1n+1 天以前的漲跌完全不算。部分教學文章與軟體用這種。

我們手算 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(14) 四種裸用法的台股年化報酬對照長條圖,超賣接刀與 RSI 低於 30 全買研究段近零或負報酬,RSI 最高 30 檔研究段 17.0%,2022 年起全部落後含息 0050

表上看得出三件事:

  • 超賣派兩種做法都很差。 每月買 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 兩條線:

台積電 2330 的 RSI 超賣派與動能派買賣訊號示意圖,2023 年 7 月到 2024 年 6 月超賣買點 0 次、超買賣點 9 次、動能派買 18 次賣 10 次

圖上標了兩派常見訊號:超賣派(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 個訊號:

聯發科 2454 的 RSI 超賣派與動能派買賣訊號示意圖,2023 年 7 月到 2024 年 6 月超賣買點 1 次、超買賣點 10 次、動能派買 10 次賣 7 次

兩張圖說明單看一檔股票的 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 檔,月底看廣度決定部位

策略分成選股與風控兩層,全部只用價量:

  1. 趨勢池:在可交易宇宙中,只留收盤同時站上 60 日均線(季線)與 120 日均線(半年線)的股票。
  2. 選股:趨勢池內取 RSI(28) 最高的 13 檔,每檔 1/13 權重。28 日週期比看盤軟體預設的 14 日更平滑。
  3. 廣度風控:可交易宇宙內收盤站上 60 日均線的股票比例,稱為廣度。廣度大於 0.40 持有滿倉;小於等於 0.40,整籃部位縮到一半,其餘放現金,不加碼、不放空、不開槓桿。
  4. 檢查時點:每月最後一個交易日換股,廣度也只在這一天讀取。月中廣度跌破 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 最高 13 檔、趨勢池不減碼、完整策略與趨勢池全部持有的研究段與 2022 年起月夏普及全期最大回撤

從這張表讀出的事:

  • 報酬主要來自 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 年卻沒有比較好。

下圖是最近一年的每日廣度與策略淨值,虛線是每個月底換股日:

可交易宇宙站上 60 日均線比例的每日廣度與 RSI 動能策略淨值雙軸圖,2025 年 10 月到 2026 年 9 月,標出門檻 0.40 與每個月底換股日

圖上看得到: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%

RSI 動能策略換股相位長條圖,每月 5 日到 25 日換股的全期年化 17.3% 到 21.9%,月底換股 26.5%,2022 年起年化 19.2% 到 33.1%

(月底那一列用「只在月底讀取部位」的寫法重算,全期年化與上面的主表差 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 週期與持股檔數各取四格,每一格都跑完整策略(趨勢池加廣度風控)。研究段月夏普:

RSI 週期與持股檔數四乘四網格的研究段月夏普色溫圖,最低 1.01、最高 1.24,RSI 28 搭 13 檔最高

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

同一張 RSI 週期與持股檔數網格的 2022 年起月夏普色溫圖,16 格中只有 3 格達到 1.0,最高 1.07

研究段 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 檔):

RSI 週期 20 到 36 逐格掃描的研究段與 2022 年起月夏普折線圖,週期 27 以上明顯較高,28 位在這一段的左緣附近

週期 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%

首發資料截止日 2026-06-09 之後 RSI 動能策略、每天依廣度調整的對照組與含息 0050 的淨值走勢圖,策略 7 月大跌後落後 0050

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 平滑,未還原收盤價(finlab data.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,不過

RSI 動能策略鄰近參數 9 組日夏普熱圖:0 組高於同期 0050 含息,原參數日夏普 0.93

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 自動驗證、回測、給你答案

免費開始

更多技術指標研究

查看全部