跳至主要內容
美股研究 約 8 分鐘閱讀

200 日均線大盤濾網回測:疊在 2 支美股策略上,
幾乎沒有差別

200 日均線大盤濾網有用嗎?QQQ 跌破均線就空手,疊在兩支美股策略上,2016 到 2026 年回測:最大回撤從 -21.1% 降到 -15.3%,年化少 1 到 2 個百分點,扣 BIL 的夏普沒有贏原策略,波動度控管更差,附程式可重跑。

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

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

在 Studio 重跑
加了濾網幾乎沒差

200 日均線大盤濾網回測:兩支美股策略的原版、加 QQQ 均線濾網、加波動度控管與 QQQ 含息的累積淨值(log),2016 年 5 月到 2026 年 11 月

依本文重跑

執行這個策略

複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。

告訴你的AI:

幫我設定 FinLab,在我的美股策略上加 QQQ 200 日均線濾網,比較加之前和加之後的回撤,請讀:https://finlab.finance/setup?relatedUrl=/blog/200-day-moving-average-market-filter

免安裝,開啟 FinLab Studio

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 組。

QQQ 含息與 150 日、200 日均線,2016 到 2026 年,灰底是 150 日均線濾網(緩衝 2%)空手的期間,包括 2018 年底、2020 年 3 月、2022 年大部分時間與 2025 年春天

原參數從 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。

過關條件

條件在看到結果前寫在案件裡,之後沒改:

  1. 對 QQQ 含息的三項驗證:9 組至少 7 組日夏普贏;原參數前後兩段都贏;在 finlab 美股預設成本(0)與每邊 0.1% 下都贏。美股另外要扣 BIL 的夏普也贏、拿掉領先 QQQ 最多的那一年仍贏。
  2. 比原策略好:9 組至少 7 組、以及原參數的前後兩段,扣 BIL 之後的夏普都要高於原策略。回測裡的現金沒有利息,所以用扣 BIL 的夏普比較才公平。
  3. 是不同的策略:週報酬跟原策略、跟每支已上線策略的相關都要低於 0.95。

第 1 項在這裡很容易過,因為兩支原策略本來就大幅領先 QQQ;第 2 項才是這篇要回答的問題。

結果:均線濾網幾乎沒有改變結果

兩種濾網在兩支策略上都通過第 1 項:9 組參數的日夏普都贏 QQQ,原參數前後兩段、每邊 0.1% 成本、扣 BIL、拿掉最好的一年也都贏。每邊 0.1% 成本下,盈餘驚喜加濾網的日夏普仍有 1.41,QQQ 是 0.92;拿掉領先最多的 2020 年,1.26 對 0.87。但跟自己的原策略比,就是有贏有輸。

兩支美股策略扣 BIL 夏普減原策略的熱圖:均線濾網 200 日在正負 0.02 之間,150 日在 +0.01 到 -0.04 之間,100 日最多少 0.11;波動度控管回看 63 日以上全部為負

  • 盈餘驚喜廣度: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、營業利益率三因子),細節在台股大盤濾網研究。

33 支策略:橫軸是原策略在均線濾網空手那些日子的日夏普,縱軸是加濾網後日夏普的變化,空手期間還在賺的策略加濾網後變差,兩支美股策略落在中間、變化接近零

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

免費開始

更多風險與資產配置研究

查看全部