
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,回測美股 12-1 月動能的市場中性多空(做多前 30 名、放空後 30 名)並和 QQQ 含息比較,請讀:https://finlab.finance/setup?relatedUrl=/blog/long-short-equity-trend-following-backtest
**本文測了 4 種跟「QQQ 擇時」不同的美股持有方式:動能與毛利率的市場中性多空、大型股各自站上 200 日線才持有、股票債券黃金商品各自看趨勢的跨資產時序動能。2017 年 8 月到 2026 年 10 月、每種 9 組參數共 36 組,沒有一個設計成立:三個沒過三項驗證;跨資產時序動能三項都過,但輸給自己的固定配置,扣掉國庫券報酬後也輸 QQQ。**兩個多空組合的日夏普只有 0.34 與 0.50,9 組參數全輸 QQQ 含息的 0.89;大型股趨勢的回撤只有 -14.9%,但日夏普 0.85,9 組只有 2 組贏。跨資產時序動能 9 組全贏(日夏普 1.09),但同樣的資產用平均權重固定持有、不看趨勢,日夏普反而是 1.19,扣掉國庫券報酬後也輸 QQQ,所以本文判定它不成立。
同一批第 5 個設計是 QQQ 波動度目標,通過了三項驗證,另寫成美股波動度目標策略。
4 種持有方式的關鍵數字
| 設計(原始參數) | 日夏普 | 年化報酬 | 最大回撤 | 贏 QQQ 的參數組 | 前段/後段日夏普 | 結論 |
|---|---|---|---|---|---|---|
| 多空:12-1 月動能,每邊 30 檔 | 0.50 | 9.5% | -34.6% | 0/9 | 0.42/0.57 | 不成立 |
| 多空:毛利/總資產,每邊 30 檔 | 0.34 | 3.7% | -30.8% | 0/9 | 0.42/0.29 | 不成立 |
| 大型股前 100 大,各自站上 200 日線 | 0.85 | 8.9% | -14.9% | 2/9 | 0.77/0.95 | 不成立 |
| 跨資產時序動能(QQQ、IEF、GLD、DBC) | 1.09 | 6.4% | -9.9% | 9/9 | 1.10/1.09 | 不成立(見下) |
| QQQ 波動度目標 15%(參考) | 0.98 | 15.7% | -22.8% | 7/9 | 0.90/1.07 | 通過 |
| QQQ 含息買進持有 | 0.89 | 19.8% | -35.1% | 基準 | 0.87/0.91 | |
| SHY 短天期公債買進持有 | 1.11 | 1.8% | -5.7% |
回測從 2017 年 7 月底的第一次換股開始,到 2026-10-29;所有設計每個月最後一個交易日換股、隔天收盤成交。QQQ 與 SHY 是同一段日子的買進持有、股利再投入。前後兩段從 2022-03-14 切開。
三項驗證怎麼判
「贏」是指日夏普高於同一段日子的 QQQ 含息。日夏普=日報酬平均÷標準差×√252,不扣無風險利率。三項都要過:
- 鄰近參數:原始參數和上下各一個鄰近值,9 組至少 7 組贏。
- 前後兩段:原始參數在前段與後段各自贏。
- 交易成本:finlab 美股預設手續費與稅都是 0,所以另外每次買賣加收 0.1%,原始參數仍要贏。
這次多加兩個對照,用來分辨「贏」是來自持有方式本身,還是來自別的東西:
- 扣掉國庫券報酬的日夏普:不扣無風險利率時,持有短債的組合會被高估。光是買進持有 SHY,日夏普就有 1.11,高過 QQQ。
- 同平均權重的固定配置:把擇時規則平均下來的資產權重固定持有。擇時規則連自己的平均配置都贏不了,表示擇時沒有貢獻。
兩個對照只看原始參數,用在三項驗證都過的設計上。
一、市場中性多空:動能與毛利率都輸 QQQ
做法是每個月底從成交金額前 1,000 大的美股普通股(含後來下市的公司)裡,做多分數最高的 30 檔、放空最低的 30 檔,多空各占一半資金,各檔等權。finlab 的 sim() 直接接受負權重,負的部位就是放空。
動能來自 Jegadeesh 與 Titman(1993),本文用後來常用的 12-1 月報酬(過去 12 個月、跳過最近 1 個月)。原始參數日夏普 0.50、年化 9.5%、最大回撤 -34.6%,年化波動 24.3%,跟 QQQ 差不多高。報酬集中在 2022 年的 +58.4%;2023 年反彈時 -16.2%。回看 9、12、15 個月乘上每邊 20、30、50 檔,最好的是 9 個月、每邊 50 檔的 0.66,9 組全輸。這跟 Daniel 與 Moskowitz(2016)描述的動能崩盤一致:空頭反彈時,放空的輸家股會暴漲。
毛利率用 Novy-Marx(2013)的毛利÷總資產(近四季毛利),排除金融股。原始參數日夏普 0.34、年化 3.7%,前後兩段 0.42 與 0.29。每邊 20、30、50 檔乘上股票池 500、1,000、1,500 大,最好的 0.44。站上的美股學術因子回測已經發現毛利率只做多也輸 QQQ,多空版本把股市上漲的報酬也一起拿掉,日夏普更低。
兩個多空組合的回測都沒有扣放空的借券費,也沒有計入放空資金的利息,借券費會讓實際結果更差。用上千個財報指標挑多空因子的做法,另外在美股財報多空策略重跑過,同樣輸 QQQ。
二、大型股各自站上 200 日線:回撤小,但風險調整後仍輸
做法是每個月底取市值前 100 大的股票,每檔分配 1% 資金;站上自己 200 日均線的才持有,沒站上的那 1% 放現金。這個濾網看的是每檔股票自己的均線。Han、Yang 與 Zhou(2013)發現均線擇時在高波動的投資組合上效果最好,波動低的大型股效果較弱。
原始參數年化 8.9%、最大回撤 -14.9%、年化波動 10.7%,平均只有七成資金在股票。日夏普 0.85,輸 QQQ 的 0.89;前段 0.77 輸、後段 0.95 贏。前 50 大、用 200 或 250 日線的 2 組贏(0.913、0.912),其餘 7 組輸,大致上持股越多越差(前 200 大最好只有 0.83)。
回測中閒置的現金不計利息。如果把這部分改放 SHY,原始參數升到 0.890,仍略輸 QQQ 的 0.893,9 組變成 3 組贏,前段 9 組全輸。結論不變。

三、跨資產時序動能:形式上全過,但贏的是債券
Moskowitz、Ooi 與 Pedersen(2012)的時序動能:每項資產只看自己過去 12 個月的報酬,論文在報酬為正時做多、為負時放空,並依波動倒數調整部位;本文只做多,轉負的那份放 SHY。本文用 QQQ(股票)、IEF(7–10 年美國公債)、GLD(黃金)、DBC(商品)四檔 ETF,依過去 63 日波動的倒數分配權重。站上的美股懶人配置回測已經測過 Faber 的 10 個月均線等權版本,這次用論文的報酬正負訊號加波動倒數加權(只做多)。
結果日夏普 1.09、年化 6.4%、最大回撤 -9.9%。回看 9、12、15 個月乘上 21、63、126 日波動窗口,9 組全贏,前後兩段 1.10 與 1.09,加 0.1% 成本 1.04。照本站規則,三項都過。
但兩個對照都指向同一件事:
| 組合 | 日夏普(不扣無風險利率) | 扣掉國庫券報酬後 | 年化報酬 |
|---|---|---|---|
| 跨資產時序動能 | 1.09 | 0.67 | 6.4% |
| 同平均權重固定持有(13% QQQ、27% IEF、14% GLD、10% DBC、36% SHY) | 1.19 | 0.75 | 6.7% |
| SHY 買進持有 | 1.11 | -0.40 | 1.8% |
| QQQ 含息 | 0.89 | 0.79 | 19.8% |

波動倒數加權讓低波動的公債占了大半:平均權重裡 IEF 加 SHY 超過六成,QQQ 只有 13%。整個組合的年化波動只有 5.9%,所以不扣無風險利率的日夏普很高。這跟 SHY 一檔就能「贏」QQQ 是同一個原因。拿掉趨勢訊號、改成固定持有平均權重,日夏普更高(1.19);扣掉國庫券報酬後,時序動能全期 0.67、後段 0.48,都輸 QQQ 的 0.79 與 0.74,9 組只有 3 組贏。
所以這個設計的「通過」來自低波動的資產配置,趨勢訊號沒有加分,本文不把它當成通過的策略,FinLab 策略庫不收錄。同一套對照用在波動度目標上結果相反:它贏過自己的固定配置(0.98 對 0.92),扣國庫券後全期與前後兩段也都贏,所以算通過;但扣國庫券後 9 組鄰近參數只有 6 組贏,低於門檻,優勢也幾乎全部來自 2022 年,幅度不大。

前後兩段

兩個多空組合在兩段都輸。大型股趨勢只在後段贏:2022 年空頭時越來越多股票跌破 200 日線,每月的股票部位在 12% 到 74% 之間、平均 44%(2019 到 2021 年平均 74%),全年 -9.0%(QQQ -32.6%);但 2019、2020 年它只賺 10.7% 與 13.1%,不到 QQQ(39.0%、48.6%)的三成。
這個結果說明了什麼、沒說明什麼
- 2017 到 2026 年這段 QQQ 的強勢期,美股的市場中性多空很難跟持有 QQQ 比風險調整後報酬。多空組合拿掉了大盤上漲的報酬,剩下的因子溢酬不夠大。
- 個股層級的趨勢濾網可以大幅降低回撤(-14.9% 對 -35.1%),代價是多頭時曝險不足,風險調整後仍略輸。
- 用不扣無風險利率的夏普比較,持有大量短債的組合會被高估。跨資產配置類的策略要多看「扣國庫券」與「固定配置」兩個對照。
- 本文沒有測:放空借券費、槓桿版的多空、其他因子的多空、比 2017 年更早的資料。結論只限這 4 個設計與這段期間。
程式碼
下面是市場中性動能多空的核心:算 12-1 月動能、在流動性股票池裡排名、做多前 30、放空後 30。sim() 會把多空各自的權重加總絕對值縮到 100%,所以多空各占一半資金。
顯示程式碼
import finlab
from finlab import data
from finlab.backtest import sim
finlab.login() # finlab 會自動引導登入
data.set_market("us")
# 1. 股票池:股價高於 5 美元、近 60 日平均成交金額前 1,000 大的普通股
close = data.get("us_price:close")
dollar_volume = (close * data.get("us_price:volume")).rolling(60).mean()
profile = data.get("us_company_profile")
common = profile.loc[profile["security_type"] == "common_stock", "stock_id"]
liquid = dollar_volume[close > 5].reindex(columns=common).is_largest(1000)
# 2. 12-1 月動能:過去 12 個月的報酬,跳過最近 1 個月
adj_close = data.get("us_price:adj_close")
momentum = adj_close.shift(21) / adj_close.shift(252) - 1
score = momentum.reindex(columns=liquid.columns)[liquid]
# 3. 做多前 30 名、放空後 30 名
longs = score.rank(axis=1, ascending=False) <= 30
shorts = score.rank(axis=1, ascending=True) <= 30
position = (longs.astype(float) - shorts.astype(float)) / 30
# 4. 每個月最後一個交易日換股,隔天收盤成交
report = sim(position.loc["2017-07-31":], resample="M", trade_at_price="close", upload=False)
# 5. 日夏普(不扣無風險利率)
returns = report.creturn.pct_change().dropna()
print(round(returns.mean() / returns.std() * 252 ** 0.5, 2))用到 2026-10-29 的資料,這段印出 0.49;research.py 的原始參數是 0.50,差別來自這段省略的單日漲跌 50% 剔除、同公司只留一種股份、排除 ADR 與基金這些條件。完整的 research.py 包含全部 5 個設計、45 組鄰近參數、前後兩段、成本重跑、扣國庫券與固定配置對照,以及大型股趨勢的閒置現金改放 SHY 的版本。
不想自己寫程式,可以透過 AI 輔助安裝流程把 FinLab skill 裝進 Claude Code、Codex 或 Gemini CLI,用中文說「把動能多空改成做多前 50、放空後 50」或「跨資產時序動能加上 TLT 重跑,和固定配置比較」,AI 會寫好程式並跑出回測。
回測方法與限制
| 項目 | 做法 |
|---|---|
| 回測期間 | 2017-07-31(第一次換股)到 2026-10-29。FinLab 美股價格從 2016 年起,這是有一年股價與一年季報可用的第一個月底。 |
| 股票池 | FinLab 美股公司資料中的普通股,含後來下市的公司;同公司只留一種股份;排除 ADR、ETF、基金。股價高於 5 美元、近 60 日平均成交金額高於 500 萬美元、過去一年沒有單日漲跌 50% 以上;每月取成交金額前 1,000 大(毛利率多空另排除金融股,並測 500 與 1,500 大)。大型股趨勢在這個池子裡取市值前 50/100/200 大。 |
| 前視偏差 | 財報以 SEC 申報日納入,股價與市值都是當時的數字;訊號用月底以前的資料,隔天收盤成交。 |
| 權重 | 多空:多空各 50%、各檔等權。大型股趨勢:每檔 1/N,沒站上均線的部分放現金(不計利息;另附放 SHY 的版本)。時序動能:波動倒數加權,趨勢向下的部分放 SHY。不用槓桿。 |
| 成本 | finlab sim() 美股預設:手續費 0、稅 0。原始參數另用每邊 0.1% 重跑。沒有扣放空借券費,也沒有估滑價。 |
| 基準 | QQQ 含息買進持有,同一段日子,不扣成本。日夏普不扣無風險利率;另附扣掉 BIL 報酬的版本。 |
| 樣本 | 全部是約 9 年的樣本內結果;前後兩段只是穩定度檢查,未做樣本外驗證。 |
| 軟體版本 | finlab 2.2.24、pandas 3.1。美股公司資料(證券類型、市值)每天更新,隔天重跑股票類設計的日夏普可能差 0.01 左右;ETF 設計不受影響。 |
常見問題
美股多空策略是什麼?
同時做多與放空股票的策略。市場中性多空讓多空金額相等,報酬主要來自做多的股票比放空的股票表現好,跟大盤漲跌的關係較小。本文用動能與毛利率兩個因子決定多空。
市場中性多空為什麼贏不了 QQQ?
多空組合把大盤的報酬抵銷掉,剩下的是因子溢酬。2017 到 2026 年 QQQ 的風險調整後報酬很高,動能與毛利率的多空價差不夠大;動能還在 2023 年反彈時大幅回吐。
趨勢跟隨用在個股上有用嗎?
能降低回撤:大型股各自站上 200 日線的組合最大回撤 -14.9%,QQQ 是 -35.1%。但平均有三成資金在現金,日夏普 0.85 仍略輸 QQQ,9 組參數只有 2 組贏。
時序動能和橫截面動能有什麼不同?
橫截面動能是在一群資產裡比誰漲比較多,做多強的;時序動能是每項資產只跟自己過去比,過去漲就持有、跌就不持有。本文的多空動能是橫截面,跨資產動能是時序。
跨資產時序動能 9 組都贏,為什麼還算不成立?
它的高夏普來自大量低波動的公債與短債:同樣的資產用平均權重固定持有,日夏普更高;扣掉國庫券報酬後輸 QQQ。趨勢訊號沒有加分,所以不算通過。
放空的成本有算嗎?
手續費用每邊 0.1% 重跑過,借券費沒有算。熱門放空股的借券費一年可能好幾個百分點,實際結果會更差。
可以自己重跑嗎?
可以。透過 AI 輔助安裝流程裝好 FinLab,下載下方的 research.py 直接執行,約 5 分鐘。
延伸閱讀
- 美股量化策略總覽:FinLab 美股策略的績效比較與入門方式。
- 美股因子投資總覽:價值、品質、動能等因子在美股的研究整理。
- 美股類股輪動回測:用成分股訊號挑類股 ETF 的 20 個設計。
- 選股方法完整指南:基本面、技術面、籌碼面選股的做法與工具總覽。
- 前視偏差:財報要用申報日、不能用季底的原因。
下載資源
| 檔案 | 內容 |
|---|---|
| research.py | 完整研究:5 個設計、45 組鄰近參數、前後兩段、成本重跑、扣國庫券與固定配置對照、閒置現金放 SHY |
| data.csv | 5 個設計原始參數、兩個固定配置,加上 QQQ、IEF、GLD、DBC、SHY 的每日淨值 |
| metrics.json | 本文引用的全部統計,包含每組參數、前後兩段與逐年報酬 |
**投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險。**本文所有回測均為全段樣本內結果;前後兩段只是穩定度檢查,未經樣本外驗證。
最後更新:2026-10|回測區間:2017-07~2026-10|基準:QQQ 含息|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

