
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,在我的美股策略上加 QQQ 200 日均線濾網,比較加之前和加之後的回撤,請讀:https://finlab.finance/setup?relatedUrl=/blog/200-day-moving-average-market-filter
200 日均線大盤濾網能讓好策略更好嗎?我們把站上兩支美股策略加上這條經典的趨勢規則:QQQ 收盤跌破均線(100、150 或 200 日,緩衝 0 到 4%)就全部賣出,收回均線以上再買回。2016 年 5 月到 2026 年 11 月,盈餘驚喜廣度策略的最大回撤從 -21.1% 降到 -15.3%,日夏普從 1.46 變 1.48,但扣掉 BIL 之後的夏普只有 4 組參數贏原策略;自由現金流廣度策略的日夏普從 1.47 降到 1.45。兩支加濾網後的週報酬跟原策略相關 0.97,等於同一支策略少持有一點。兩支都沒有通過開跑前寫定的條件,每月波動度控管的結果更差。
原因是兩支策略本來就在看同一個訊號:QQQ 站上 200 日均線、6 個月動能為正才會轉多頭,否則只持有 IEF、GLD、SHY 裡最強的一檔。濾網空手的那 15.3% 交易日,兩支策略年化只有 5.5% 與 9.9%,日夏普 0.40 與 0.74,遠低於其他日子的 1.61 與 1.58。QQQ 本身在那些日子年化仍有 18.2%,只是波動是平常的兩倍。均線濾網要有用,前提是底下的策略在大盤跌破均線時會賠錢或幾乎不賺。
200 日均線濾網回測關鍵數字
| 盈餘驚喜廣度 | 自由現金流廣度 | QQQ 含息 | |
|---|---|---|---|
| 原策略:年化/日夏普/最大回撤 | 31.6%/1.46/-21.1% | 31.8%/1.47/-21.1% | 19.7%/0.92/-35.1% |
| 加 QQQ 150 日均線濾網(緩衝 2%) | 30.7%/1.48/-15.3% | 30.0%/1.45/-18.4% | |
| 加波動度控管(63 日、1.0 倍) | 23.9%/1.43/-17.7% | 23.4%/1.42/-17.7% | |
| 扣 BIL 夏普:原策略/濾網/波動度控管 | 1.35/1.36/1.29 | 1.36/1.33/1.28 | 0.82 |
| 9 組參數贏原策略(濾網/波動度控管) | 4/1 | 2/2 | |
| 週報酬跟原策略相關(濾網/波動度控管) | 0.97/0.97 | 0.97/0.97 | |
| 過關 | 否 | 否 |
200 日均線大盤濾網是什麼
均線是過去 N 個交易日收盤價的平均。200 日均線大約是 10 個月,「QQQ 跌破 200 日線」是美股最常見的空頭判斷之一。當成大盤濾網時,它不負責選股,只決定整個組合要不要持有:指數收盤跌破均線就全部賣出,回到均線以上就買回策略當時的持股。
這個做法因 Faber(2007) 的 10 個月均線研究而普及:用在美股與其他資產類別上,報酬接近買進持有、回撤小很多。本文用兩條線:QQQ(含息)收盤低於 N 日均線 ×(1 − 緩衝)才出場,收盤回到均線以上才進場,介於兩條線之間維持前一天的狀態,避免指數在均線附近來回時一直進出。原參數是 150 日、緩衝 2%,鄰近參數是 100、150、200 日乘上 0、2%、4%,共 9 組。

原參數從 2016 年 5 月到 2026 年 11 月出場 14 次,空手期間對應 2018 年底、2020 年 3 月、2022 年大部分時間、2025 年春天,以及 2026 年初的一小段。100 日不留緩衝會出場 57 次,200 日的三組在 11 到 21 次之間。
被加上濾網的兩支策略
兩支都在美股策略總覽裡(量化交易的整體框架見量化交易是什麼),加濾網之前就通過了對 QQQ 的三項驗證:
- 盈餘驚喜廣度:數最近 20 個交易日內,流動性前 500 檔美股有多少家 EPS 超出分析師預估 5% 以上、當天股價上漲。家數超過 1%,而且 QQQ 站上 200 日均線、6 個月動能為正,才轉多頭。
- 自由現金流廣度:流動性股票中,自由現金流為正、利潤率高於 5%、負債權益比低於 1.2 且站上 200 日均線的比例。超過 5%,加上同樣的 QQQ 趨勢條件,才轉多頭。
多頭月份兩支都持有約 25% TQQQ、25% TECL 與 50% 最強的防禦型 ETF,空頭月份只持有 IEF、GLD、SHY 裡最強的一檔;每月換股、8% 停損。TQQQ、TECL 是 3 倍槓桿 ETF,每天重設槓桿,盤整時會有耗損,槓桿 ETF 擇時回測裡 2017 到 2026 年單純持有 TQQQ 的最大回撤是 -81.7%。兩支都用策略頁的程式原封不動執行,資料截到 2026-11-06;在策略頁統計的同一段期間內,重跑的年化與策略頁差不到 0.2 個百分點、日夏普差不到 0.02。下文的「原策略」就是這兩支,圖表裡標為「底策略」。
加濾網時其他設定都不變:原策略每次換股的權重延用到下次換股,濾網切換那天,用原策略當天實際持有的部位(扣掉已停損出場的)乘上曝險,其餘放現金。曝險固定為 1 時,每天淨值都跟原策略相同,我們用這點檢查疊法沒寫錯。
波動度控管參考 Moreira 與 Muir(2017) 以及 Barroso 與 Santa-Clara(2015) 用在動能策略的版本:每月最後一個交易日,算原策略過去 L 天的實現波動 σ,下個月曝險設成 min(1, 目標 ÷ σ),目標是到那天為止 σ 的中位數乘上 m。參數 L 21、63、126 日乘上 m 0.8、1.0、1.2,原參數 63 日、1.0。
過關條件
條件在看到結果前寫在案件裡,之後沒改:
- 對 QQQ 含息的三項驗證:9 組至少 7 組日夏普贏;原參數前後兩段都贏;在 finlab 美股預設成本(0)與每邊 0.1% 下都贏。美股另外要扣 BIL 的夏普也贏、拿掉領先 QQQ 最多的那一年仍贏。
- 比原策略好:9 組至少 7 組、以及原參數的前後兩段,扣 BIL 之後的夏普都要高於原策略。回測裡的現金沒有利息,所以用扣 BIL 的夏普比較才公平。
- 是不同的策略:週報酬跟原策略、跟每支已上線策略的相關都要低於 0.95。
第 1 項在這裡很容易過,因為兩支原策略本來就大幅領先 QQQ;第 2 項才是這篇要回答的問題。
結果:均線濾網幾乎沒有改變結果
兩種濾網在兩支策略上都通過第 1 項:9 組參數的日夏普都贏 QQQ,原參數前後兩段、每邊 0.1% 成本、扣 BIL、拿掉最好的一年也都贏。每邊 0.1% 成本下,盈餘驚喜加濾網的日夏普仍有 1.41,QQQ 是 0.92;拿掉領先最多的 2020 年,1.26 對 0.87。但跟自己的原策略比,就是有贏有輸。

- 盈餘驚喜廣度:9 組有 4 組贏原策略,最多只多 0.015。原參數多 0.009,後半段 1.07 輸給原策略的 1.09。
- 自由現金流廣度:9 組只有 2 組贏原策略,都是 200 日。原參數少 0.03。
- 經典的 200 日不留緩衝:扣 BIL 夏普分別多 0.012(盈餘驚喜)與 0.011(自由現金流)。100 日的三組最差,最多少 0.11;100 日不留緩衝出場 57 次,原參數只有 14 次。
回撤確實變淺:盈餘驚喜從 -21.1% 到 -15.3%,自由現金流到 -18.4%;年化少 1 到 2 個百分點。這是要承擔多少風險的選擇,策略本身沒有變好,0.97 的週報酬相關也說明加濾網的版本幾乎每週都跟原策略同步。
為什麼濾網幫不上忙
濾網只會改變它空手的那些日子。那 15.3% 的交易日裡,兩支策略因為自己的規則也要求 QQQ 站上 200 日均線,常已轉成持有 IEF、GLD 或 SHY,年化 5.5%(日夏普 0.40)與 9.9%(日夏普 0.74),比其他日子的日夏普 1.61、1.58 低很多,但仍是正報酬。換成現金後少了這段報酬,也少了這段波動,兩者大致抵銷。
QQQ 本身就不一樣。濾網空手的日子,QQQ 年化仍有 18.2%,年化波動 37.1%;其他日子年化 21.1%、波動 18.5%。跌破均線之後,那斯達克 100 平均仍在漲,但波動變成兩倍,中間夾著 2020 年 4 月、2025 年春天這種急彈。濾網躲掉的是風險,不一定躲掉虧損。
波動度控管:年化少了四分之一
每月波動度控管讓兩支策略平均只持有 81% 到 82%,最大回撤都降到 -17.7%;年化從 31.6% 降到 23.9%、31.8% 降到 23.4%,扣 BIL 夏普從 1.35 與 1.36 降到 1.29 與 1.28。回看 21 日的版本接近原策略,63 日與 126 日都少 0.03 到 0.14。直接在 QQQ 上做波動度目標的結果在 QQQ 波動度目標策略。Cederburg 等人(2020) 用美股 103 個股票策略測試,也發現即時執行的波動度管理多半沒有穩定贏過原策略,跟這兩支的結果一致。
同一套濾網用在 31 支台股策略
我們也把同樣的方法用在站上 31 支台股選股策略,濾網換成發行量加權股價報酬指數的 120 日均線(半年線)、緩衝 2%。結果比美股分散:27 支回撤變淺、31 支年化全部變少、17 支日夏普上升,3 支全部過關(極小型股 30 檔、核心衛星 60/40、營業利益率三因子),細節在台股大盤濾網研究。

31 支台股策略的日夏普變化,跟原策略在濾網空手日子的日夏普相關 -0.88。那些日子日夏普低於 0.5 的 9 支全部變好,高於 0.9 的 8 支全部變差,大多是大盤弱時還在漲的營收動能類策略。兩支美股策略落在中間:那段時間日夏普 0.40 與 0.74,加濾網後的變化也接近零,跟台股的趨勢一致。
用 finlab 重現
濾網本身只要幾行。market_exposure() 把 QQQ 與均線變成 0/1 的曝險,with_market_filter() 把任何一份回測報告的持股乘上曝險重跑。這是簡化版,完整的 research.py 另外處理停損出場的部位,並跑完所有參數。
顯示程式碼
import pandas as pd
from finlab import data
from finlab.backtest import sim
MA_DAYS = 150 # 均線天數
BUFFER = 0.02 # 跌破均線再低 2% 才出場
def market_exposure():
"""1 是照原策略持有,0 是空手;介於兩條線之間維持前一天的狀態。"""
data.set_market("us_fund")
qqq = data.get("us_fund_price:adj_close")["QQQ"].dropna()
average = qqq.rolling(MA_DAYS).mean()
state = pd.Series(float("nan"), index=qqq.index)
state[qqq >= average] = 1.0
state[qqq < average * (1 - BUFFER)] = 0.0
return state.ffill().fillna(1.0)
def with_market_filter(base_report, **sim_args):
"""原策略每次換股的權重延用到下次換股,再乘上曝險。"""
days = data.get("us_fund_price:adj_close").index
days = days[days <= base_report.creturn.index[-1]]
weights = base_report.position[base_report.position.index < days[-1] + pd.offsets.BDay()]
weights.index = days[days.searchsorted(weights.index, side="right") - 1]
weights = weights[~weights.index.duplicated(keep="last")]
days = days[days >= weights.index[0]]
exposure = market_exposure().reindex(days, method="ffill").fillna(1.0)
switches = exposure.index[exposure.ne(exposure.shift())][1:]
position = weights.reindex(days, method="ffill").fillna(0.0).mul(exposure, axis=0)
return sim(position, resample=weights.index.union(switches), upload=False, **sim_args)把原策略的回測報告和它自己的設定(例如 stop_loss=0.08)傳進去,再拿 report.creturn 跟原策略比較。
回測方法與限制
- 期間:2016-05-02 到 2026-11-06,與兩支策略頁的起點相同,資料截到 2026-11-06。
- 訊號:QQQ 含息收盤與同一天的均線比較,下一個交易日收盤成交;QQQ 還沒有 150 或 200 天資料的前幾個月,濾網維持持有。波動度控管只用每月底以前的報酬。
- 成本:finlab
sim()美股預設成本為 0,另外用每邊 0.1% 重跑一次;沒有另外估滑價與容量。 - 現金:回測裡現金沒有利息,所以另外報扣 BIL 的夏普。
- 槓桿:多頭月份持有 3 倍槓桿 ETF,耗損與跳空風險都在回測結果裡。
- 樣本內外:全段是樣本內回測,前後兩段與鄰近參數只是檢查穩定度,沒有另外留樣本外資料。
這個結果能說明什麼
在這段期間、這兩支策略上,加 QQQ 均線濾網是用 1 到 2 個百分點的年化換較淺的回撤,風險調整後沒有變好。這個結論只適用於本來就跟著趨勢走的策略;一直滿倉持股、大盤跌破均線時會賠錢的策略可能不一樣,台股就有幾支是這樣。要知道自己的策略適不適合,最直接的方法是把回測拆成「指數在均線上」與「均線下」兩段,看下面那段還賺不賺。
槓桿 ETF 直接搭配 200 日均線的結果在 TQQQ 200 日均線回測;突破型的趨勢跟隨在QQQ 突破策略與海龜交易法則回測。
常見問題
200 日均線大盤濾網是什麼?
只在大盤指數(本文用 QQQ)高於 200 日均線時持有策略,收盤跌破就全部換成現金的規則。它不負責選股,只決定整個策略要不要在場。
加 200 日均線濾網會讓報酬變好嗎?
在本文的測試裡不會。兩支策略的年化都少了 1 到 2 個百分點,最大回撤從 -21.1% 降到 -15.3% 到 -18.4% 之間。
200 日、150 日、100 日哪個比較好?
200 日稍好。自由現金流策略只有 200 日的兩組贏原策略,扣 BIL 夏普多 0.011 到 0.016;100 日最差,最多少 0.11。差距都不足以過關。
QQQ 用 200 日均線擇時是好的趨勢跟隨策略嗎?
那是另一個問題。TQQQ、QLD 搭配 200 日均線的回測在槓桿 ETF 均線擇時實測,TQQQ 那條規則也沒有通過三項驗證。
波動度控管是什麼?
策略最近波動變大時減碼、波動變小時加回,讓組合的波動比較穩定。在這兩支策略上,它讓年化少了約四分之一,日夏普也沒有變好。
什麼時候大盤濾網才有用?
底下的策略在大盤跌破均線時會賠錢或幾乎不賺的時候。31 支台股策略裡,加濾網後日夏普的變化跟原策略在那段時間的日夏普相關 -0.88;這兩支美股策略在那段時間的日夏普是 0.40 與 0.74,落在不好也不壞的區間,所以加了也沒什麼差。
可以自己重跑嗎?
可以。下載下方的 research.py,安裝 finlab 後執行 python research.py us,它會從官網下載兩支原策略的程式、疊上兩種濾網跑完所有參數。
下載資源
| 檔案 | 內容 |
|---|---|
| research.py | 原封不動執行原策略、疊上兩種濾網、跑完全部參數與三組檢查;python research.py us 跑兩支美股策略 |
| metrics.json | 本文表格與圖表的數字:9 組參數、前後兩段、成本重跑、相關係數、濾網空手與在場期間的統計 |
| data.csv | 兩支策略、加濾網版本與 QQQ 的每週淨值 |
| 台股的 metrics.json | 31 支台股策略的同一套統計 |
風險提示
本文所有策略與回測結果僅供教學與研究用途,不構成投資建議,也不推薦任何個股或 ETF。過去績效不代表未來表現,槓桿 ETF 可能損失大部分價值。投資一定有風險,請依自身風險承受能力審慎評估。
最後更新:2026-11|回測區間:2016-05 ~ 2026-11|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始


