
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重跑美股 10 個學術因子組合並和 QQQ 含息比較,請讀:https://finlab.finance/setup?relatedUrl=/blog/us-academic-factors-backtest
**本文把 10 個學術論文提出的選股因子搬到美股,每個因子每月持有分數最高的 30 檔,從 2017 年 8 月跑到 2026 年 10 月。結果沒有一個因子的風險調整後報酬贏過 QQQ 含息:原始參數裡日夏普最高的是低特質波動的 0.75,QQQ 是 0.89;每個因子再各換 9 組鄰近參數,90 組裡最高的 0.83 也沒贏。**這 10 個因子是資產定價文獻引用最多的一批:價值、毛利獲利能力、資產成長、應計、庫藏股、52 週高點、低 Beta、低特質波動、Piotroski F-Score 與品質減垃圾(QMJ)。每個因子都要過三項驗證才算成立,結果全部卡在第一關。所以本文回答的是一個具體的問題:「過去九年,用單一學術因子挑美股,有沒有比直接持有 QQQ 好?」10 個因子的答案都是沒有。
10 個因子的關鍵數字
| 因子(論文) | 日夏普 | 年化報酬 | 最大回撤 | 9 組參數贏 QQQ | 前段/後段日夏普 |
|---|---|---|---|---|---|
| 價值 B/M(Fama & French 1992) | 0.33 | 5.7% | -70.9% | 0/9 | 0.24/0.47 |
| 毛利獲利能力(Novy-Marx 2013) | 0.51 | 9.9% | -45.0% | 0/9 | 0.48/0.54 |
| 低資產成長(Cooper, Gulen & Schill 2008) | 0.52 | 10.9% | -49.2% | 0/9 | 0.44/0.60 |
| 低應計(Sloan 1996) | 0.38 | 7.4% | -61.1% | 0/9 | 0.46/0.30 |
| 淨庫藏股收益率(Pontiff & Woodgate 2008) | 0.54 | 11.6% | -51.4% | 0/9 | 0.48/0.61 |
| 52 週高點(George & Hwang 2004) | 0.64 | 10.8% | -27.8% | 0/9 | 0.75/0.51 |
| 低 Beta(Frazzini & Pedersen 2014) | 0.60 | 9.3% | -31.9% | 0/9 | 0.71/0.46 |
| 低特質波動(Ang 等 2006) | 0.75 | 10.7% | -35.8% | 0/9 | 0.70/0.90 |
| Piotroski F-Score(Piotroski 2000) | 0.23 | 2.7% | -68.6% | 0/9 | -0.12/0.75 |
| QMJ 品質減垃圾(Asness, Frazzini & Pedersen 2019) | 0.69 | 12.3% | -35.9% | 0/9 | 0.59/0.79 |
| QQQ 含息 | 0.89 | 19.7% | -35.1% | 基準 | 0.90/0.88 |
| SPY 含息 | 0.84 | 14.8% | -33.7% | 參考 | 未切段 |
| 股票池等權 | 0.57 | 10.5% | -41.4% | 參考 | 0.57/0.59 |
所有組合都從 2017-08-01 起算到 2026-10-26;QQQ 與 SPY 是同一段日子的含息買進持有。QQQ 前半段日夏普 0.90、後半段 0.88。
三項驗證怎麼判
本文的「贏」只有一個意思:同一段交易日裡,日夏普值高於 QQQ 含息買進持有。日夏普=日報酬平均 ÷ 日報酬標準差 × √252,不扣無風險利率;FinLab 美股策略比較頁用的是月夏普(QQQ 在那裡是 1.09),兩者的數字不能直接相比。一個因子要三項都過才算成立:
- 換鄰近參數也要贏(要的是高原,不是單點):每個因子的兩個主要參數各取原值和上下各一個鄰近值,共 9 組,至少 7 組(七成)要贏 QQQ。五個純財報比率因子與 QMJ 的兩個參數是股票池大小(流動性前 500、1,000、1,500 檔)與持股數(20、30、50 檔);三個價格因子是回看天數與持股數,回看天數 52 週高點取 189、252、315 日,低 Beta 取 126、252、378 日,低特質波動取 10、21、42 日(原值是論文的一個月);F-Score 是便宜股範圍(B/M 前 20%、30%、40%)與分數門檻(7、8、9 分)。
- 前後兩段都要贏:回測期間在中點 2022-03-15 對半切,原始參數在兩段要各自贏 QQQ,避免只靠某一段行情。
- 含交易成本:全部用 finlab
sim()的美股預設成本(USMarket:手續費 0、無交易稅,對應美國主流的零手續費券商),沒有為了結果把任何成本關掉。
10 個因子全部卡在第一關:90 組參數裡,贏 QQQ 的是 0 組。
10 個學術因子的定義與做法
每個因子都用 finlab 的美股資料表計算。財報欄位來自 us_income_statement、us_balance_sheet、us_cash_flow,finlab 以 SEC 申報日對齊,10-Q、10-K 公開之後數字才會進入分數,不需要再手動遞延。每個月月底依分數取股票池裡最高的 30 檔,隔天收盤進場,等權持有。
- 價值(股價淨值比倒數,B/M):Fama & French (1992) 發現帳面價值相對市值高的股票,平均報酬較高。分數=最新一季股東權益 ÷ 每日市值,淨值為負的公司排除。
- 毛利獲利能力:Novy-Marx (2013) 指出「毛利 ÷ 總資產」預測報酬的能力不輸 B/M,而且和價值因子互補。分數=近四季毛利合計 ÷ 總資產。
- 低資產成長:Cooper, Gulen & Schill (2008) 發現資產擴張最快的公司,之後報酬明顯較差。分數=總資產年增率取負號,成長越慢分數越高。
- 低應計:Sloan (1996) 發現有現金支撐的盈餘比較持久,靠應計項目堆出來的盈餘容易反轉。我們採用 Hribar & Collins (2002) 建議的現金流量表算法:(近四季淨利-近四季營業現金流)÷ 平均總資產,越低越好。
- 淨庫藏股收益率:Pontiff & Woodgate (2008) 發現增發股票的公司後續報酬較差;Ikenberry, Lakonishok & Vermaelen (1995) 發現宣布買回庫藏股之後股價有正向漂移。分數=近四季普通股淨發行金額取負號 ÷ 市值,淨買回越多分數越高。
- 52 週高點:George & Hwang (2004) 發現股價越接近 52 週高點的股票,之後越容易續強。分數=還原收盤價 ÷ 過去 252 個交易日的最高還原收盤價。
- 低 Beta:Frazzini & Pedersen (2014) 的「押注低 Beta」是加槓桿做多低 Beta、放空高 Beta 的多空組合。只做多的投資人只能持有低 Beta 那一邊,所以本文測的是這一邊:個股日報酬對 SPY 的 252 日 Beta,由低到高取。
- 低特質波動:Ang, Hodrick, Xing & Zhang (2006) 發現特質波動高的股票,後續報酬反而特別低。分數=個股日報酬對 SPY 做單因子迴歸後,21 日殘差的標準差(論文用 Fama-French 三因子),由低到高取。
- Piotroski F-Score:Piotroski (2000) 在便宜股裡用九個財報訊號打分,在 B/M 最高的五分之一裡買 8 分以上的公司。我們的原始設定把便宜股範圍放寬到股票池中 B/M 最高的 30%(參數網格含 20%),F-Score 至少 8 分的全部等權持有,持股數隨符合家數浮動。九個訊號的細節可參考 F-Score 選股。
- 品質減垃圾(QMJ):Asness, Frazzini & Pedersen (2019) 把品質定義為獲利、成長、安全、配發四個面向。我們把六項獲利指標、它們的一年變化(論文用五年變化,我們的資料從 2016 年起,撐不起五年)、三項安全指標(低 Beta、低負債比、低盈餘波動)與淨庫藏股收益率各自排名後平均。
結果一:原始參數全部明顯落後 QQQ
文首的圖把 10 個原始參數組合依日夏普排序。最接近 QQQ 的是低特質波動(0.75)、QMJ(0.69)與 52 週高點(0.64),但都還差 QQQ 的 0.89 一大截。價值因子只有 0.33,最大回撤 -70.9%;集中在最便宜股票的 Piotroski F-Score 組合墊底,只有 0.23。
圖上橘色虛線是一個重要的對照:把整個流動性股票池等權持有、每月再平衡,日夏普是 0.57。10 個因子裡有 4 個高於這條線(52 週高點、低 Beta、低特質波動、QMJ),代表最強的幾個因子確實比「平均一檔美股」好;問題在於平均一檔美股和 QQQ 之間的距離,比任何因子能補的都大。
結果二:90 組鄰近參數沒有任何一塊高原

每一小格是一個因子的 3×3 參數組合,格內數字是該組的日夏普,顏色是和 QQQ 的差距。90 格全部低於 QQQ。單一組參數最接近的是低資產成長在 500 檔股票池、持有 20 檔的 0.83,而且它整排 500 檔的設定都落在 0.78 到 0.83。乍看像一塊高原,但橫著讀就不是了:股票池放大到 1,000 或 1,500 檔,同一個因子掉到 0.35 到 0.70,所以這個差一點的結果,靠的是把測試限縮在最大的公司,也就是 QQQ 本來就持有的那一塊。五個純財報比率因子,最好的一組都出現在 500 檔股票池。52 週高點與低 Beta 在網格裡最穩定(0.63 到 0.71、0.55 到 0.64),QMJ 也只在 0.59 到 0.72 之間;低特質波動隨回看天數在 0.47 到 0.75 之間變動。它們都穩定地落在門檻下方。
結果三:前後兩段也一樣

要通過這一關,點必須落在綠色區域:前半段高於 QQQ 的 0.90、後半段也高於 0.88。綠色區域是空的。52 週高點與低 Beta 是前半段最強的兩個組合(0.75、0.71),2022 年 3 月之後轉弱。低特質波動剛好相反:前半段 0.70、後半段 0.90,是唯一在任何一段贏過 QQQ(後半段 0.88)的原始參數組合。Piotroski F-Score 前半段日夏普是負的(-0.12),後半段 0.75,走的是價值因子在 2020 年崩跌與 2022 年類股輪動中的路線,只是幅度更大。
為什麼會輸:難的是基準

三個原因解釋了大部分的落差。
**這十年是超大型股的十年。**QQQ 年化 19.7%,SPY 年化 14.8%,流動性股票池等權只有 10.5%。30 檔等權的因子組合,起點是「平均一檔股票」,不是 QQQ。上圖兩個最強的組合說明了這件事:QMJ 每年比股票池等權多賺 1.8 個百分點(12.3% 對 10.5%),低特質波動報酬和股票池差不多、波動卻小很多(年化 15.2% 對 21.4%);但 1 美元最後只變成約 2.9 與 2.6 美元,QQQ 是 5.3 美元。
**因子溢酬本身很小。**我們在同一個股票池裡,每月把股票依因子分成十組,量最好一組減最差一組的報酬差。10 個因子裡有 6 個的最好組減最差組是正的,最大的是毛利獲利能力(年化 +6.5%)與低應計(+6.0%),但沒有一個的 t 值超過 1.4。價值因子的價差幾乎是零(-0.2%),低 Beta 是 -7.1%:Beta 最高的一組反而賺得比最低的一組多。完整的十分位分析在美股因子投資總覽。這和複製研究的結論一致:McLean & Pontiff (2016) 發現異常報酬在論文發表後平均少了 58%,其中約 32 個百分點可歸因於投資人照著論文交易;Hou, Xue & Zhang (2020) 發現多數異常在微型股不再主導平均數之後就不顯著。本文只取流動性前 1,000 檔、日成交額 500 萬美元以上的股票,同樣把微型股排除在外。
**低風險在多頭市場站錯邊。**低 Beta 與低特質波動是 10 個組合裡波動最低的兩個(年化 17.3% 與 15.2%,QQQ 是 23.3%),但在獎勵高 Beta 成長股的市場裡,少掉的報酬太多。Frazzini 與 Pedersen 的報酬有很大一部分來自放空高 Beta 股,而這段期間 Beta 最高的一組反而賺最多(十分位價差 -7.1%),所以只做多低 Beta 那一邊,連風險調整後都輸。
程式碼
核心流程只要幾步。下面這段建立股票池、計算一個因子(毛利獲利能力)、持有前 30 檔,再和 QQQ 比較;完整的 strategy.py 會跑完 10 個因子、90 組參數網格與十分位分析。
顯示程式碼
from finlab import data
from finlab.backtest import sim
data.set_market("us")
# 1. 股票池:60 日平均成交額前 1,000 檔、股價 > 5 美元
# (strategy.py 另外只留普通股、排除 ADR 與金融股,
# 並把單日漲跌超過 50% 的股票剔除一年)
close = data.get("us_price:close")
volume = data.get("us_price:volume")
dollar_volume = (close * volume).rolling(60, min_periods=20).mean()
universe = dollar_volume.is_largest(1000) & (dollar_volume > 5e6) & (close > 5)
# 2. 毛利獲利能力(Novy-Marx 2013):近四季毛利 ÷ 總資產
# 財報以 SEC 申報日對齊,不需要再手動遞延
gross_profit = data.get("us_income_statement:gross_profit").rolling(4).sum()
total_assets = data.get("us_balance_sheet:total_assets")
score = gross_profit / total_assets
# 3. 每月持有分數最高的 30 檔,等權
position = score[universe].is_largest(30)
report = sim(position.loc["2017-08-01":], resample="M", upload=False)
# 4. 和同一段日子的 QQQ 含息比較日夏普
qqq = data.get("us_fund_price:adj_close")["QQQ"].reindex(report.creturn.index).ffill()
for name, curve in [("strategy", report.creturn), ("QQQ", qqq / qqq.iloc[0])]:
daily = curve.pct_change().dropna()
print(name, round(daily.mean() / daily.std() * 252 ** 0.5, 2))這段在我們的環境跑出來是策略 0.50、QQQ 0.89,和完整版的 0.51 差在普通股篩選(排除 ADR、金融股)與異常漲跌過濾。把它交給裝好 FinLab 技能的 AI 助理,請它一次只改一件事(例如持股數、改成產業中性),每改一次都重跑三項驗證,再決定要不要相信某一條曲線。
回測方法與限制
| 項目 | 本文的處理 |
|---|---|
| 回測期間 | 2017-08-01 至 2026-10-26。美股價格與財報都從 2016 年開始,2017 年 8 月是每個因子都有一年財報、一年股價可用的第一個月。因子組合在 2017 年 8 月底第一次換股,之前持有現金,QQQ 則從 8 月 1 日起算(當月上漲 1.7%),對比較的影響很小 |
| 股票池 | 公司基本資料中的美股普通股,含已下市公司;排除 ADR、ETF、基金與金融業。每天取 60 日平均成交額前 1,000 檔、股價 5 美元以上、日成交額 500 萬美元以上 |
| 生存者偏誤 | 已下市股票保留在股票池裡。finlab 現成的 etl:us_common_stock_filter 只列出目前仍在交易的公司,所以我們改從公司基本資料自建普通股清單 |
| 資料異常 | 單日漲跌超過 50% 的股票往後一年不納入(只往回看,處理分割錯誤與代號重複使用) |
| 前視偏差 | 財報以 SEC 申報日進入分數;月底收盤產生訊號,sim() 在隔天收盤成交。產業別用目前的分類快照(只用來排除金融業) |
| 權重 | 每個因子前 30 檔等權;F-Score 組合持有所有符合條件的股票(平均 34 檔) |
| 交易成本 | finlab USMarket 預設:手續費 0、無交易稅,未另計滑價。零成本下已經沒有因子贏 QQQ,加上成本不會改變結論 |
| 周轉率 | 依月底權重計算的單邊年化周轉率:毛利獲利能力最低,每年 1.3 倍;52 週高點最高,10.6 倍;低特質波動 8.7 倍,低 Beta 1.9 倍,其他財報類因子在 2.1 到 3.2 倍之間 |
| 基準 | QQQ 含息(us_fund_price:adj_close)買進持有、不含成本;SPY 列為參考 |
| 樣本 | 全部是樣本內結果;前後兩段是穩定度檢查,不是樣本外驗證。未估算策略容量 |
這個結果代表什麼、不代表什麼
在本文設定下,2017 到 2026 年、美股流動性前 1,000 檔,10 個教科書級的只做多因子組合,風險調整後都比直接持有 QQQ 差,而且換鄰近參數也一樣。它不代表這些因子是假的:論文量的是多空價差,樣本多半從 1960 或 1970 年代開始,長達 25 到 50 年,股票池也更廣。它也不代表未來十年一定繼續輸:因子報酬有很長的循環,2022 年多數因子組合就大幅贏過 QQQ,逐年拆解見因子投資的逐年表現。
對想拿真錢跑這些選股條件的讀者,比較實際的解讀是:在美股大型股裡,單一學術因子、只做多,本身不夠。台股的情況不同,可以對照台股因子選股總綱與股價淨值比選股策略的實測;想從頭學怎麼在美股做回測,可以看美股回測教學。
常見問題 FAQ
美股因子投資還有效嗎?
以本文的方式(只做多、前 30 檔、對照 QQQ)來看,2017 到 2026 年 10 個因子全部輸在夏普值;在流動性股票池裡,十分位多空價差還是正的只有 6 個。
價值因子已死了嗎?
在這次測試裡它是表現最差的之一:日夏普 0.33、最大回撤 -70.9%,十分位多空價差 -0.2%。九年的視窗不足以替一個有近百年資料的因子下定論,但這段期間對價值因子確實非常不友善。
哪個因子最接近 QQQ?
原始參數裡是低特質波動,日夏普 0.75,其次是 QMJ 的 0.69。低特質波動在後半段甚至以 0.90 贏過 QQQ 的 0.88,但前半段落後 0.20,所以沒過「前後兩段都要贏」這一關。整個參數網格裡最接近的單一組是 500 檔股票池的低資產成長,0.83。
為什麼用 QQQ 當基準,不用 S&P 500?
QQQ 含息是 FinLab 所有美股策略共用的基準,方便跨文章比較。文首圖也列了 SPY 含息,它的日夏普 0.84 一樣高於所有因子組合。
F-Score 為什麼表現這麼差?
Piotroski 的規則只在最便宜的股票裡挑財報改善的公司,等於把價值因子的部位放大。價值因子在這段期間本身就弱,F-Score 組合前半段日夏普是負的(-0.12),後半段回到 0.75,但仍低於 QQQ。台股的 F-Score 實測可以參考 F-Score 選股。
低 Beta 加槓桿會不會就贏了?
本文沒有測。槓桿會改變報酬的大小,但在不計融資成本時不改變夏普值,而本文的判準就是夏普值。
有包含已下市的股票嗎?
有。股票池每天從當時有交易的普通股重建,之後被併購或下市的公司都在裡面。
可以自己改參數重跑嗎?
可以。先完成 AI 輔助安裝,下載文末的 strategy.py,加 --grid 會跑 90 組參數熱圖,加 --deciles 會跑十分位分析。
延伸閱讀
- 美股因子投資總覽:因子投資的定義、10 個因子的十分位價差與逐年表現
- 股票選股完整指南、量化交易完整指南
- 台股低波動選股實測、Information Coefficient(IC)是什麼
- 名詞:Beta
下載資源
| 檔案 | 內容 |
|---|---|
| strategy.py | 完整測試:10 個因子、90 組參數網格與十分位分析 |
| data.csv | 10 個原始參數組合、股票池等權、QQQ 與 SPY 的每日淨值 |
| metrics.json | 本文引用的全部統計,包含 90 組參數的結果 |
**投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險。**本文所有回測均為全段樣本內結果;前後兩段只是穩定度檢查,未經樣本外驗證。
最後更新:2026-10|回測區間:2017-08~2026-10|基準:QQQ 含息|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

