
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重跑美股營收成長類股輪動並和 QQQ 含息、XLK 比較,請讀:https://finlab.finance/setup?relatedUrl=/blog/sector-rotation-strategy-backtest
**本文每個月替 11 檔 SPDR 類股 ETF 打分數,分數來自各類股裡的股票:公司營收成長、自由現金流殖利率、12 個月股價動能的中位數,或站上 200 日線的股票比例等 10 個訊號,再持有分數最高的 2 或 3 個類股。2018 年 4 月到 2026 年 10 月,20 個設計只有 2 個在原始參數贏 QQQ 含息,沒有一個三項驗證全過。最好的是持有近四季營收成長最快的 2 個類股,日夏普 1.02,QQQ 是 0.90,前後兩段與含成本都過,但 9 組鄰近參數只有 6 組贏(要 7 組)。它 103 個月裡有 65 個月持有 XLK;拿掉 XLK 後只剩 0.65,還輸給其他 10 個類股直接等權(0.71)。**所以本文的類股輪動設計都不算成立。
類股輪動回測的關鍵數字
| 設計或基準 | 日夏普 | 年化報酬 | 最大回撤 | 贏 QQQ 的參數組 | 前段/後段日夏普 |
|---|---|---|---|---|---|
| 營收成長(近四季),持有前 2 名 | 1.02 | 21.3% | -30.5% | 6/9 | 0.80/1.32 |
| 12-1 月動能,持有前 2 名 | 0.95 | 18.8% | -34.2% | 2/9 | 0.76/1.27 |
| 其餘 18 個設計中最好的(12-1 月動能,前 3 名) | 0.89 | 16.4% | -36.4% | 未進入驗證 | 0.61/1.40 |
| QQQ 含息 | 0.90 | 20.3% | -35.1% | 基準 | 0.70/1.15 |
| XLK 買進持有 | 0.95 | 24.2% | -33.6% | ||
| SPY 含息 | 0.85 | 15.2% | -33.7% | ||
| 11 檔類股 ETF 等權,每月再平衡 | 0.76 | 12.6% | -36.1% |
所有曲線都從 2018-04-03 跑到 2026-10-28,QQQ、XLK、SPY 是同一段日子買進持有、股利再投入。前後兩段從 2022-07-14 切開。
三項驗證怎麼判
本文的「贏」只有一個意思:同一段交易日裡,日夏普高於 QQQ 含息。日夏普是每日報酬的平均除以標準差,再乘上 √252 年化,不扣無風險利率(夏普比率怎麼算)。站上的美股量化策略比較用的是月夏普,QQQ 在那個口徑下分數較高,兩邊數字不能直接比。每個設計先用原始參數跑一次,贏 QQQ 的才進入三項驗證,標準和美股 10 個學術因子回測相同:
- **換鄰近參數也要贏:**兩個主要參數各取包含原始值在內的 3 個相近設定,共 9 組,七成以上(7 組)要贏 QQQ。
- **前後兩段都要贏:**回測期間從中點切開,原始參數在兩段都要各自贏 QQQ。
- **含交易成本:**全部用 finlab
sim()的美股預設成本(手續費 0、沒有交易稅);原始參數改用每邊 0.1% 的成本重跑,也要贏 QQQ。
類股分數怎麼算
股票來自 FinLab 的美股公司資料:普通股,保留後來被併購或下市的公司,同一家公司只留一種股份,排除 ADR、ETF 與基金,金融股保留。每個月最後一個交易日,留下股價高於 5 美元、近 60 日平均成交金額高於 500 萬美元的股票,單日漲跌超過 50% 的股票剔除一年(多半是資料錯誤或代號重複使用),類股不在這 11 類裡的也剔除,再取成交金額最大的 1,000 檔。每檔股票的類股用公司資料裡的 sector 欄位,11 個名稱剛好一對一對應 SPDR 類股 ETF:科技 XLK、金融 XLF、醫療保健 XLV、非必需消費 XLY、必需消費 XLP、能源 XLE、工業 XLI、原物料 XLB、公用事業 XLU、不動產 XLRE、通訊服務 XLC。
類股的分數是該類股所有股票訊號的中位數;兩個均線訊號改用「站上均線的股票比例」。一個類股至少要有 5 檔股票算得出數值才給分。組合持有分數最高的 2 或 3 個類股 ETF,等權,隔天收盤成交,持有到下個月底再換。10 個訊號如下:
- **營收成長:**近四季營收對一年前的成長率。Jegadeesh & Livnat (2006) 發現個股的營收驚喜能預測後續報酬;本文要看的是,一個類股的典型營收成長能不能預測整個類股。
- **自由現金流殖利率:**近四季自由現金流除以市值。
- **12-1 月動能:**過去 12 個月報酬、跳過最近一個月,沿用 Jegadeesh & Titman (1993) 研究的動能,跳過最近一個月是後來的常見做法,取類股內的中位數。
- **站上 200 日線比例:**市場寬度指標,用在每個類股內部。
- **類股 ETF 6 個月動能:**ETF 本身的報酬。Moskowitz & Grinblatt (1999) 發現產業動能解釋了大部分的個股動能,Faber (2010) 把同樣的想法用在美股類股組合上。
- **營業利益率改善:**近四季營業利益率減去一年前。
- 站上 50 日線比例。
- **離 52 週高點:**股價除以 52 週最高價,出處是 George & Hwang (2004)。
- **盈餘成長:**近四季稀釋 EPS 對一年前的成長率。Chordia & Shivakumar (2006) 把價格動能和盈餘動能連在一起。
- **毛利率改善:**近四季毛利率減去一年前。Novy-Marx (2013) 證明的是毛利獲利能力的「水準」能預測報酬;毛利率的「變化」是另一個沒被驗證過的量,所以放進來測。
第 1 到 8 個訊號來自本研究之前的一輪初篩,第 9、10 個是之後依上面的出處加進來的。財報數字一律以 SEC 申報日納入,申報之前不會進入分數(前視偏差)。
結果一:20 個設計只有 2 個贏 QQQ,兩個都靠科技股
文首的圖列出全部 20 個設計。只有兩個超過 QQQ 的 0.90:營收成長持有前 2 名(1.02),以及 12-1 月動能持有前 2 名(0.95)。其他 18 個介於 0.40 到 0.89 之間。20 個裡有 14 個連 11 檔類股 ETF 直接等權(0.76)都沒贏;價格訊號裡最差的是短期寬度,持有站上 50 日線比例最高的類股,日夏普只有 0.43 與 0.47,換手也最多,一年大約換掉整個組合 8 次。
XLK 本身就是很高的門檻。買進持有 XLK 年化 24.2%、日夏普 0.95,比 QQQ 還好;其他 10 檔類股 ETF 介於 0.44(XLRE)到 0.72(XLV)之間。任何一條規則只要長時間沒拿科技股,起跑就落後很多。
結果二:兩個設計換鄰近參數都撐不住

營收成長的兩個參數是成長的定義(最近一季年增、近兩季年增平均、近四季年增)與持有類股數(1、2、3 個)。9 組裡 6 組贏 QQQ,差一組才達標。規律很清楚:持有 1 個類股是 1.05 到 1.20,2 個是 1.02 到 1.08,3 個是 0.80 到 0.89,持有 3 個的版本全輸。
高原這一項只差一組。最接近的輸家是近兩季平均、持有 3 個類股,0.889 對 0.900。finlab 2.2.21 以前的版本,會把 ETF 價格表裡 55 個美國休市日當成沒有漲跌的交易日;用那份資料,QQQ 是 0.893,這一組也是 0.893,以 0.0007 勝出,網格變成 7/9。過不過關取決於休市日算不算交易日,稱不上換參數也穩定;後面幾節也會看到,這個結果主要靠 XLK 和 2022 這一年,所以兩種版本下我們都不把它算成立。
原始參數另外兩項都過了:前段 0.80 對 QQQ 0.70,後段 1.32 對 1.15;每邊扣 0.1% 成本後還有 1.00,年化 20.9%。換手不高,一年大約換掉 1.6 個組合。
12-1 月動能的兩個參數是回看月數(9、12、15 個月,都跳過最近一個月)與持有類股數。9 組只有 2 組贏 QQQ,兩組都是 12 個月;15 個月的版本只有 0.61 到 0.73。它前後兩段(0.76、1.27)與成本測試(0.91)都過,但 2/9 談不上穩定。
營收成長輪動是不是只是在持有 XLK?

大部分是。在有持股的 103 個月裡,它有 65 個月持有 XLK、43 個月持有通訊服務 XLC、41 個月持有能源 XLE;必需消費、工業、不動產從沒進過前 2 名。圖上可以看到幾段很長的持有:XLK 涵蓋 2020 到 2021 年大部分時間與 2025 年以後,XLE 從 2018 年持有到 2019 年,2021 年底又持有到 2023 年年中,金融 XLF 在 2023 到 2025 年。

我們在同一段日子跑了四個對照組,把它拆開來看:
- 選項裡拿掉 XLK,持有其他 10 個類股的前 2 名:日夏普 0.65、年化 11.6%。同樣 10 個類股直接等權是 0.71。沒有科技股時,用營收成長排名反而比不排名還差。
- 50% XLK+50% 其他 10 類等權,每月再平衡:0.92,跟 QQQ 差不多。
- 50% XLK+50% 其他類股中營收成長最快的一個:0.98,年化 20.8%。
- 只持有 XLK:0.95,年化 24.2%。
所以策略的 1.02,大致等於 XLK 的報酬,加上第二個類股把波動降下來(年化波動 21.2%,XLK 是 26.5%);營收訊號在挑第二個類股時有一點幫助,比等權搭配多了大約 0.07 的日夏普(0.98 對 0.92)。

1 美元成長圖看得出它的領先是哪裡賺來的。2022 年前 11 個月它完全沒持有 XLK,大多是能源與原物料,全年賺 16.3%,同年 QQQ 跌 32.6%、XLK 跌 27.7%。前段的領先全部來自這一年:2018 年 4 月到 2021 年底,策略日夏普 0.94,QQQ 是 1.17。其他年份它多半落後 XLK,最後 1 美元變成 5.22 美元,XLK 是 6.41 美元、QQQ 是 4.88 美元。2026 年到目前為止它只漲 3.9%,QQQ 漲 18.5%;第二個位置有一半月份放在今年跌了 11.6% 的 XLC。
為什麼持有越多類股越差

一個訊號如果真的會排類股,它和下個月類股報酬的排名相關係數(rank IC)應該長期為正。10 個訊號都差得很遠。平均最高的是 12-1 月動能的 0.045,t 值 1.3;營收成長平均 0.023(t=0.6),只有 51.5% 的月份是正的。盈餘成長最負,-0.043,和它在財報訊號裡墊底的成績(0.40 與 0.57)一致。
右圖顯示僅有的一點資訊在哪裡。營收成長排第 1 的類股,下個月平均比類股平均多賺 1.09%,第 2 名多 0.24%,第 3 名少 0.39%,第 4 到 11 名散落在 -0.4% 到 +0.4% 之間。動能也一樣:第 1 名多 1.01%,之後介於 -0.6% 到 +0.4%。每多持有一個類股,就把唯一有用的那一個稀釋成平均水準,這就是熱圖上那道斜坡。
那只持有第 1 名呢?它的日夏普是 1.05 到 1.20,但我們不把它算成立,原因有三。看完網格再挑這一格,正是 Harvey, Liu & Zhu (2016) 提醒的多重檢定問題:20 個設計加上各自的網格一路試下來,即使訊號無效,也可能有一格靠運氣明顯高於 QQQ。它是單押一個類股,最大回撤 31% 到 38%。而且成績靠幾段長期持有撐起來:用最近一季營收的版本持有 XLE 33 個月,2022 年賺 64.2%,選項裡拿掉 XLE 後掉到 0.86。
其他訊號的觀察
自由現金流殖利率(0.82 與 0.74)前段很弱(0.66 與 0.54)。站上 200 日線比例前後兩段最平均(持有 2 個類股時 0.78 與 0.75),但一年換手大約 4 次,全期沒贏 QQQ(後段 0.75 對 1.15)。類股 ETF 6 個月動能是最傳統的類股基金輪動,只有 0.67 與 0.70,低於類股等權,rank IC 只有 0.006。離 52 週高點是 0.61 與 0.71。利潤率改善與盈餘成長前段很弱(0.06 到 0.50,同期 QQQ 0.70),後段強很多(0.87 到 1.36),前後完全相反,不像是穩定的效應。
類股資料的限制
- **XLC 從 2018 年 6 月才有。**通訊服務類股 2018-06-19 之後才能持有。2018 年 9 月 S&P 與 MSCI 把 Alphabet、Meta 從資訊科技、把 Netflix、迪士尼從非必需消費移到新的通訊服務類;2023 年 3 月 Visa、Mastercard 從科技移到金融。本文所有月份都用今天的公司資料分類,所以 Alphabet 一直算通訊服務、Visa 一直算金融,即使當時 XLK 持有它們。這是分組上的一點前視。
- **計分的股票不等於 ETF 持股。**SPDR 類股 ETF 持有的是 S&P 500 成分股、按市值加權;本文的分數是最多 1,000 檔成交活躍股票的中位數,多數是規模較小的公司。2026 年 10 月科技類有 206 檔,通訊服務只有 28 檔。
- **財報從 2016 年才完整。**FinLab 美股季報在 2016 年以前涵蓋的公司很少(2015 年第 4 季只有 581 家申報,2016 年第 1 季是 3,634 家),近四季營收成長與利潤率變化在 2017 年 8 月只算得出 50 檔,到 2018 年 3 月底才超過 800 檔,所以回測從 2018-04-02 開始。盈餘成長會跳過一年前虧損的公司,檔數更少。改從 2017 年 8 月起算(前幾個月能計分的類股較少),結論相同:營收成長 1.02 對 0.90、9 組贏 6 組,動能 9 組贏 2 組。
- **公司資料每天更新。**類股與證券類型欄位每天都會更新,日後重跑
research.py,結果可能有些微差異。
程式碼
營收成長類股輪動的核心是五個步驟:算每檔股票的成長率、留下成交活躍的股票、取每個類股的中位數、持有前 2 名的類股 ETF、和 QQQ 比較。
顯示程式碼
import finlab
import pandas as pd
from finlab import data
from finlab.backtest import sim
finlab.login() # finlab 會自動引導登入
data.set_market("us")
SECTOR_ETF = {
"Technology": "XLK", "Financial Services": "XLF", "Healthcare": "XLV",
"Consumer Cyclical": "XLY", "Consumer Defensive": "XLP", "Energy": "XLE",
"Industrials": "XLI", "Basic Materials": "XLB", "Utilities": "XLU",
"Real Estate": "XLRE", "Communication Services": "XLC",
}
# 1. 近四季營收年增率(以 SEC 申報日納入)
revenue = data.get("us_income_statement:revenue").rolling(4).sum()
growth = (revenue / revenue.shift(4) - 1).index_str_to_date()
# 2. 股價高於 5 美元、成交金額前 1,000 大的股票,只有普通股會對到類股
close = data.get("us_price:close")
dollar_volume = (close * data.get("us_price:volume")).rolling(60).mean()
liquid = dollar_volume[close > 5].rank(axis=1, ascending=False) <= 1000
profile = data.get("us_company_profile")
common = profile[(profile["security_type"] == "common_stock") & ~profile["is_etf"].fillna(False)]
sector = common.set_index("stock_id")["sector"]
# 3. 每個月最後一個交易日,算每個類股的營收成長中位數
growth = growth.reindex(close.index, method="ffill").reindex(columns=close.columns)
month_ends = close.index.to_series().resample("ME").last().loc["2018-04":]
scores = pd.DataFrame({
day: growth.loc[day][liquid.loc[day]].groupby(sector).median()
for day in month_ends
}).T.rename(columns=SECTOR_ETF)
# 4. 持有成長最快的 2 個類股 ETF,等權,持有到下個月底
data.set_market("us_fund")
etf = data.get("us_fund_price:adj_close")
scores = scores.where(etf.reindex(scores.index)[scores.columns].notna())
position = (scores.rank(axis=1, ascending=False) <= 2).astype(float) / 2
days = etf.loc[month_ends.iloc[0]:].index
report = sim(position.reindex(days, method="ffill"), resample=position.index, upload=False)
# 5. 同一段日子和 QQQ 含息比較日夏普
equity = report.creturn
qqq = etf["QQQ"].reindex(equity.index).ffill()
for name, curve in [("Sector rotation", equity), ("QQQ", qqq)]:
daily = curve.pct_change().dropna()
print(name, round(daily.mean() / daily.std() * 252 ** 0.5, 2))用到 2026-10-28 的資料,這段會印出 1.0 與 0.89。它從 2018 年 4 月底開始,比研究晚一個月,也省略了單日漲跌 50% 剔除、每類股至少 5 檔、同公司只留一種股份、排除 ADR 與基金這些條件。完整的 research.py 包含這些條件與全部 10 個訊號,--grid 會重現本文所有熱圖、前後兩段、成本重跑與 XLK 對照組。
不想自己寫程式,可以透過 AI 輔助安裝流程把 FinLab skill 裝進 Claude Code、Codex 或 Gemini CLI,用中文說「用成分股營收成長中位數替 SPDR 類股 ETF 排名,持有前 2 名」或「拿掉 XLK 重跑類股輪動,和類股等權比較」,AI 會寫好程式並跑出回測。
回測方法與限制
| 項目 | 做法 |
|---|---|
| 回測期間 | 2018-04-02 到 2026-10-28,近四季營收與利潤率訊號第一次涵蓋 800 檔以上的月份。改從 2017-08 起算結論相同。 |
| 股票池 | FinLab 美股公司資料中的普通股,含後來下市的公司;同公司只留一種股份;排除 ADR、ETF、基金。股價高於 5 美元、近 60 日平均成交金額高於 500 萬美元、過去一年沒有單日漲跌 50% 以上;每月取成交金額前 1,000 大。 |
| 類股 | 今天的公司資料分類,對應 11 檔 SPDR 類股 ETF;XLC 從 2018-06-19 起。至少 5 檔股票有數值才給分。 |
| 前視偏差 | 財報以 SEC 申報日納入;股價與市值是當時的數字。類股分類是現在的快照(見上一節)。 |
| 組合 | 前 2 或 3 名類股 ETF,等權,每月最後一個交易日換股,隔天收盤成交,不用槓桿。 |
| 成本 | finlab sim() 美股預設:手續費 0、稅 0。原始參數另用每邊 0.1% 重跑。未估滑價。 |
| 換手率 | 單邊、每年:營收成長前 2 名 1.6、前 3 名 1.3;12-1 月動能前 2 名 4.0;站上 50 日線比例約 8。 |
| 基準 | QQQ 含息買進持有,不扣成本;XLK、SPY 與類股等權作為參考。日夏普不扣無風險利率。 |
| 樣本 | 全部是約 8 年半的樣本內結果;前後兩段只是穩定度檢查,未做樣本外驗證。 |
| 軟體版本 | finlab 2.2.21、pandas 3.1。更早的 finlab 版本保留了美國休市日的價格列,差異見結果二。 |
這個結果說明了什麼、沒說明什麼
它說明:2018 到 2026 年,用成分股的基本面或價格趨勢替美股類股排名,沒有穩定贏過 QQQ;看起來最好的版本,主要是持有科技股,2022 年前 11 個月換到能源與原物料,剛好避開科技股大跌。它沒有說明類股訊號完全沒有資訊:營收成長或動能排第 1 的類股,下個月確實平均比一般類股多賺約 1%,但優勢只停在第一名,8 年多的月資料也不足以分辨這是不是幾段好運氣。
對想拿真錢做類股輪動的人,比較實際的解讀是:基準比訊號更重要。這段期間科技是表現最強的類股,而且差距很大,QQQ 本來就重押它,多數輪動規則卻有很長一段時間不在科技股裡。FinLab 上三項驗證都過的美股策略,例如美股動能策略與 ETF 輪動策略回測,切換的是那斯達克曝險與防守部位,不是在類股之間換,而且用了槓桿 ETF,有它自己的風險。同一套資料的其他研究,還有美股 6 個知名選股法、槓桿 ETF 均線擇時與懶人資產配置組合。
常見問題
類股輪動策略是什麼?
依某個訊號(動能、獲利成長、景氣循環等)在類股基金之間移動資金的規則,例如在 11 檔 SPDR 類股 ETF 之間,持有排名最高的類股、賣掉其他的。
類股輪動能打敗大盤嗎?
本文的測試沒有。2018 到 2026 年,20 個規則化設計沒有一個對 QQQ 三項驗證全過,18 個連原始參數的日夏普都低於 QQQ,14 個還輸給 11 檔類股 ETF 直接等權。
2018 到 2026 年哪一檔 SPDR 類股 ETF 最好?
科技。XLK 年化 24.2%、日夏普 0.95,都高於 QQQ(20.3%、0.90)。日夏普第二高是醫療保健 XLV(0.72),最低是不動產 XLRE(0.44)。
類股動能有用嗎?
很弱。類股 ETF 自己的 6 個月動能只有 0.67 與 0.70,低於類股等權。改用各類股成分股的 12-1 月動能中位數好一些(持有 2 個類股 0.95),但 9 組鄰近參數只有 2 組贏 QQQ。
市場寬度(站上均線比例)適合拿來挑類股嗎?
在本文單獨使用時不適合。持有站上 200 日線比例最高的類股是 0.76 與 0.83;50 日線版本只有 0.43 與 0.47,是價格訊號裡最低的,一年還要換手約 8 次。台股的寬度指標可以參考騰落線 ADL 回測。
SPDR 的 11 檔類股 ETF 是哪些?
XLK(科技)、XLF(金融)、XLV(醫療保健)、XLY(非必需消費)、XLP(必需消費)、XLE(能源)、XLI(工業)、XLB(原物料)、XLU(公用事業)、XLRE(不動產)、XLC(通訊服務,2018 年 6 月成立)。
可以自己重跑嗎?
可以。透過 AI 輔助安裝流程裝好 FinLab skill,下載下面的 research.py,執行 python research.py --grid。
延伸閱讀
下載資源
| 檔案 | 內容 |
|---|---|
| research.py | 完整研究:10 個訊號、20 個設計、鄰近參數、前後兩段、成本重跑、XLK 對照與 rank IC |
| data.csv | 主要設計與對照組,加上 QQQ、SPY 與 11 檔類股 ETF 的每日淨值 |
| metrics.json | 本文引用的 research.py 統計,包含逐年報酬與每個月的持有類股 |
**投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險。**本文所有回測均為全段樣本內結果;前後兩段只是穩定度檢查,未經樣本外驗證。
最後更新:2026-10|回測區間:2018-04~2026-10|基準:QQQ 含息|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始


