跳至主要內容
台股研究 約 17 分鐘閱讀

MACD 怎麼用才對?台股 11 年回測:柱狀圖是反轉訊號,
不是動能訊號

MACD 怎麼用才對?台股 11 年回測發現和教科書相反:柱狀圖 hist 最低、剛超賣的一籃,長期反而贏過 hist 最高的一籃——hist 是反轉訊號不是動能訊號,金叉死叉沒獨立優勢。把 hist 反轉當小權重加分因子,疊在多窗動能加低波核心上,先用收盤站上 SMA60 與 SMA120 的雙均線趨勢閘縮池,再用 SMA120 廣度做純現金擇時,組成完全不含基本面的純技術策略:研究段年化 26.4%、月 Sharpe 1.43,樣本外 33.1%、1.26,全期 28.9%、1.21、最大回撤 -32.1%,風險調整後勝過含息 0050。附 Python 與可重現回測。

MACD 真用法 CAGR 28.9% Sharpe 1.21

MACD 在台股的正確用法:它是反轉雷達,不是金叉買進訊號

幾乎每一篇 MACD 教學都告訴你「金叉買、死叉賣」「柱狀圖(hist)翻紅就是多頭動能」。但把這套規則放進台股做 11 年回測(2015-2026),結論和教科書相反:在月頻橫截面上,hist 最低、剛被殺過頭的那一籃股票,長期反而贏過 hist 最高、已經漲一波的那一籃。換句話說,MACD hist 在台股是「反轉/均值回歸」訊號,不是動能訊號;事件式金叉持有 20 日的全期月 Sharpe 只有 0.33,沒有獨立優勢。那 MACD 到底該怎麼用?用真實價量資料攤開來看,它真正能發揮的位置是「複合策略裡的小權重反轉加分因子」。本文把這個洞見組成一套完全不含基本面的純技術策略:先用「收盤同時站上自身 SMA60 與 SMA120」的雙均線趨勢閘把選股池縮到結構偏多的個股,再以綜合分(0.65 多窗動能分位 + 0.20 低波分位 + 0.15 MACD hist 反轉分位)每月選前 15 檔等權,最後疊一層「全市場站上 SMA120 比例 > 0.5 才持倉、否則純現金」的廣度擇時。這套策略研究段(2015-2021)年化 26.4%、月 Sharpe 1.43,樣本外(2022-2026)年化 33.1%、月 Sharpe 1.26,全期(2015-2026)年化 28.9%、月 Sharpe 1.21、最大回撤 -32.1%——三段都把風險調整後表現拉到含息 0050(全期年化 21.0%、Sharpe 1.05、回撤 -34.0%)之上,回撤也略低。

先用一張表回答你搜尋「MACD」時最想知道的事:

你想知道的 本文用真實台股回測的回答
MACD 是什麼 快線 DIF(12 日 EMA 減 26 日 EMA)、慢線 DEA(DIF 的 9 日 EMA)、柱狀圖 hist(DIF 減 DEA)三者組成的趨勢動能指標
柱狀圖越高越該追多嗎 相反。台股月頻 hist 最高的一籃研究段年化僅 3.2%,hist 最低(剛超賣)的一籃反而有 8.2%
金叉買、死叉賣有效嗎 沒有獨立優勢。事件式金叉持有 20 日全期月 Sharpe 僅 0.33,跑輸被動持有
那 MACD 該怎麼用 當複合策略裡的小權重反轉加分因子(佔綜合分 0.15),疊在多窗動能加低波核心上,不要當主訊號
效果如何 組成純技術策略(雙均線趨勢閘 + 多窗動能加低波加 MACD 反轉 + SMA120 廣度擇時):研究段年化 26.4%、月 Sharpe 1.43,樣本外 33.1%、1.26,全期 28.9%、1.21、最大回撤 -32.1%

MACD 反轉加分因子複合策略與含息 0050 買進持有的台股淨值對照圖,2015 到 2026 回測,策略線回撤明顯較淺

本文所有數字皆出自 finlab 套件抓取的上市櫃真實價量資料(priceetl:adj_close 含息還原股價),回測區間 2015-01 至 2026-06-09,基準為含息 0050。文末附可下載的 strategy.pydata.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼

MACD 是什麼:三條線與一個柱狀圖

MACD(Moving Average Convergence Divergence,指數平滑異同移動平均)是 Gerald Appel 在 1970 年代末提出的趨勢動能指標,由三個部分組成:

DIF(快線):12 日 EMA 減 26 日 EMA,反映短期相對長期的動能變化。

DEA(慢線/訊號線):DIF 的 9 日 EMA,把快線平滑掉短期雜訊。

柱狀圖(hist):DIF 減 DEA,畫成零軸上下的長條。hist 為正代表快線在慢線之上(一般解讀為多頭動能),為負則相反。

最廣為流傳的兩種用法是:金叉死叉派主張「DIF 由下往上穿過 DEA(金叉)買、由上往下穿過(死叉)賣」;柱狀動能派則把 hist 當動能強弱計,「hist 越高、由負翻正就是多頭力道集結」。這兩派幾乎是所有 MACD 教學的標準答案。哪一派在台股站得住?這就是本文用回測要回答的問題。技術指標的基礎名詞可參考名詞詞彙表

MACD 的數學定義:三條線怎麼算出來

把上面的文字寫成公式,MACD 只有三條算式:

DIF=EMA12(C)EMA26(C),DEA=EMA9(DIF),hist=DIFDEADIF = EMA_{12}(C) - EMA_{26}(C),\quad DEA = EMA_{9}(DIF),\quad \text{hist} = DIF - DEA

逐項拆解每個符號:

  • CC 是每日收盤價。
  • EMA12(C)EMA_{12}(C)EMA26(C)EMA_{26}(C) 分別是收盤價的 12 日與 26 日指數移動平均(EMA,越近的價格權重越大)。兩者相減得到快線 DIF:當短期均線拉開長期均線越多,DIF 越大,代表近期動能相對長期在加速。
  • DEADEA 是 DIF 再取 9 日 EMA,也就是慢線(訊號線),把 DIF 的短期抖動再平滑一次。
  • hist\text{hist} 是 DIF 減 DEA 的差,畫成零軸上下的柱狀圖。hist 由負翻正、柱子變長,傳統解讀為「快線正在拉開慢線、多頭力道集結」;本文後面會用真實資料指出,在台股月頻橫截面上這個解讀的方向其實是反的。

12、26、9 這組參數是 Gerald Appel 最初的設定,也是各家看盤軟體的預設值。參數本身並不神聖,本文主策略改用反應更快的 8-17-9,後面的穩健度檢查會說明為什麼結論對這組數字不敏感。

看一張圖就懂:兩派訊號在個股上長什麼樣

把公式畫到真實個股上,最能看出兩派用法的問題。下面這張圖取台積電(2330)2023 年 7 月到 2024 年 6 月、約一年的窗,上半部是收盤價並標出兩派的買賣箭頭,下半部是 MACD(8-17-9)的 DIF、DEA 與 hist 柱:

台積電 2330 的 MACD 金叉死叉派與零軸派買賣訊號示意圖,一年內進出十餘次顯示訊號頻繁的 whipsaw 問題

圖上標了兩派教科書訊號:金叉死叉派(DIF 上穿 DEA 買、下穿賣)與零軸派(DIF 上穿 0 買、下穿 0 賣)。光是台積電這一檔、這一年,金叉死叉派就觸發了 15 次買、15 次賣,零軸派再加 8 次買、7 次賣,兩派合計 45 個進出訊號——平均每 5 個交易日就要你動一次手。聯發科(2454)同窗也有 29 個訊號:

聯發科 2454 的 MACD 金叉死叉派與零軸派買賣訊號示意圖,同樣呈現訊號頻繁來回的 whipsaw 特性

問題一眼可見:在橫盤整理的區段(例如 2023 年下半年台積電在 500 至 600 元之間來回),DIF 與 DEA 反覆糾纏、不斷交叉,每一次交叉都產生一個假訊號,買在小高、賣在小低,被巴來巴去(俗稱 whipsaw)。這種高頻來回正是事件式金叉死叉在台股做不出獨立優勢的根本原因:訊號太多、雜訊蓋過真正的趨勢,再扣掉每次進出的手續費與證交稅,報酬就被磨掉了。

想自己重畫這張圖、把任一檔股票的 MACD 與兩派訊號標出來,核心只有幾行。這段刻意寫成人類好讀的版本,照著貼給你的 AI 助理或直接執行即可:

顯示程式碼
import finlab
from finlab import data
 
finlab.login()  # 套件會在需要資料時引導你完成登入
 
# 1) 取收盤價,算 MACD(8-17-9)
close = data.get("price:收盤價")
dif, dea, hist = data.indicator("MACD", fastperiod=8, slowperiod=17, signalperiod=9)
 
# 2) 取單一檔、單一年的窗(太長會擠成一團看不清)
sid = "2330"
win = slice("2023-07-01", "2024-06-30")
d = dif[sid].loc[win]
e = dea[sid].loc[win]
 
# 3) 兩派訊號:用「今天條件成立、昨天不成立」抓穿越的那一天
golden = (d > e) & (d.shift(1) <= e.shift(1))   # 金叉:DIF 上穿 DEA → 買
death = (d < e) & (d.shift(1) >= e.shift(1))     # 死叉:DIF 下穿 DEA → 賣
zero_up = (d > 0) & (d.shift(1) <= 0)            # 零軸派:DIF 上穿 0 → 買
 
# 4) 數一數一年內各派觸發幾次(就能感受到 whipsaw 有多嚴重)
print("金叉次數:", int(golden.sum()))
print("死叉次數:", int(death.sum()))
print("零軸上穿次數:", int(zero_up.sum()))

sid 換成任一檔代號、win 換成你想看的區間,就能驗證「訊號頻繁」這件事不是個案。看懂了個股上的雜訊,下一步就把 hist 攤到全市場、用回測量化兩派到底有沒有用。

教科書方向是反的:hist 最高的一籃,輸給 hist 最低的一籃

我們在可交易宇宙(成交金額前 300 大、收盤大於 10 元,排除 ETF、金融股、KY 股、處置股)裡,把 MACD hist 當橫截面選股因子,每月挑一籃、等權持有、月再平衡。把「教科書方向」(挑 hist 最高、動能最強的)和「反向」(挑 hist 最低、剛超賣的)各跑一次,研究段(2015-2021)結果如下:

MACD hist 選股方向 研究段年化報酬 樣本外年化報酬 研究段月 Sharpe
hist 最高(教科書動能方向) 3.2% 14.5% 0.25
hist 最低(剛超賣、反轉方向) 8.2% 31.5% 0.46

MACD 柱狀圖最高與最低分位選股的台股年化報酬對照長條圖,hist 最低的反轉方向明顯勝出

結論很反直覺,但很乾淨:在台股月頻橫截面,hist 最低的一籃穩定贏過 hist 最高的一籃。 我們進一步測了「做多低 hist、放空高 hist」的多空價差,跨 raw hist、hist 除以股價、z-score 三種正規化方式,以及每籃 20/30/50 檔的組合,研究段 9 組裡 9 組價差為正、樣本外 9 組裡 8 組為正,而且樣本外的價差比研究段更大。方向是穩的,不是某一組參數湊出來的。

為什麼教科書方向會反?機制其實不難理解:在月頻這個時間尺度上,當一檔股票的 DIF 已經遠遠拉開 DEA、hist 衝到全市場最高時,那一波動能多半已經反映在價格裡,接下來更可能是均值回歸;反過來,hist 最低時往往是剛被殺過頭、即將反彈的候選。所以「hist 越高越多方」這個直覺,把訊號的方向用反了。這也和事件式金叉的弱表現一致——金叉發生時動能早已反映在價格,且台股金叉假訊號特別多,我們實測「hist 翻正後持有 20 日」全期月 Sharpe 只有 0.33,跑不贏被動持有。各擺盪指標的正確用法差異,可延伸看 RSI vs MACD vs KD:三大技術指標台股實測

MACD 真正該放的位置:複合策略裡的小權重反轉加分因子

知道「hist 是反轉訊號」之後,下一個問題是:反轉因子單獨用夠不夠?答案是不夠。hist 最低的反轉腿雖然方向對,但裸用的研究段 Sharpe 只有 0.46,純逆勢接刀的波動太大,沒辦法單獨拿出來用。

真正可發揮的用法,是把 MACD 反轉因子當「加分項」疊到一個已經成立的選股核心上。本文的核心是台股最經得起回測的兩個因子組合:多窗動能(取 20/60/120 日報酬三個橫截面分位的平均,過去一段時間最強的股票傾向繼續強,這和 Jegadeesh & Titman (1993) 的動能效應一致)加上低波動(用 NATR 衡量,波動越低越好,對應 Ang, Hodrick, Xing & Zhang (2006) 記錄的低波動異象)。綜合分的配方是:

綜合分 = 0.65 多窗動能分位 + 0.20 低波分位 + 0.15 MACD 反轉分位(三者都是「分位越小=越好」),每月選綜合分前 15 檔等權持有。

MACD 反轉因子只佔 0.15 的小權重,但它和動能因子在「進場時點」上是互補的:動能因子偏好「已經漲一波」的股票,反轉分位則把「剛被殺、即將回補」的股票拉進來。兩者正交,而反轉腿剛好在動能腿最弱的高波動段貢獻最大。它的貢獻有多關鍵,後面拆解三個零件的表會直接量化:把 MACD 反轉因子整個拿掉,研究段年化從 26.4% 掉到 20.8%、跨不過 25% 的把關門檻。

不過光有選股核心還不夠:在系統性崩盤時,任何純選股籃子都會被一起拖下水。所以完整策略還疊了兩層純技術風控——雙均線趨勢閘(先把選股池縮到「結構偏多」的個股)與SMA120 廣度擇時(在市場結構轉弱時整個籃子改持現金)。下面兩節分別說明這兩層,再合起來看完整策略的真實回測。延伸閱讀:技術面與基本面選股的差異動能策略 18 年實測

用雙均線趨勢閘縮池、用 SMA120 廣度擇時壓回撤

選股核心定下來後,還有兩件事要處理:一是進一步把選股池限縮在「結構本來就偏多」的個股,二是在大盤系統性崩盤時整個籃子退場。這兩件事都用純價格訊號完成,完全不碰基本面。

第一層:雙均線趨勢閘。 在進綜合分排名之前,先把選股池限縮為「收盤同時站上自身 SMA60 與 SMA120」的個股(close > SMA60close > SMA120)。這道閘把短期與中期都還沒站上多頭結構的股票先擋在外面,讓動能與反轉因子在一個本來就偏多的池子裡選股。它的貢獻很實在:把這道閘拿掉、其他不變,研究段年化從 26.4% 掉到 22.4%,跨不過 25% 的把關門檻——趨勢閘是把研究段報酬拉起來的關鍵零件。

第二層:SMA120 廣度擇時。 所有純選股籃子在系統性崩盤時都會被一起拖下水。很多人會直覺想用 MACD 自己來擇時(例如「市場上 hist 為正的比例低就空手」),但實測這條路無效——hist 的符號翻轉太頻繁,當低頻的市場開關只會反覆甩巴掌、賣在底部。真正有效的降回撤機制,是一個和 MACD 無關、較平滑的訊號:計算「可交易宇宙裡,收盤站上自己 120 日均線(SMA120)的個股比例」,只有當這個比例大於 0.5(多數個股結構偏多)的交易日才持有選股籃子,否則當日純現金(不加任何槓桿)。

全市場站上 SMA120 的個股比例(市場廣度)與策略累積報酬的雙軸對照圖,廣度走低時對應策略空手避開下跌

廣度擇時的效果集中在壓回撤:把這層擇時拿掉、籃子全程持有,全期最大回撤一度惡化到 -42.4%;加上廣度擇時後,全期最大回撤收斂到 -32.1%,研究段月 Sharpe 也從 1.23 拉到 1.43。

無擇時全程持有與加上 SMA120 廣度擇時的研究段月 Sharpe、樣本外月 Sharpe 與全期最大回撤對照長條圖,廣度擇時把全期最大回撤由 -42.4% 收斂到 -32.1%、研究段月 Sharpe 由 1.23 拉到 1.43

這個「在市場結構惡化時降曝險」的邏輯,和學術上的波動度擇時一致:Moreira & Muir (2017) 在《Volatility-Managed Portfolios》證明,在風險升高時調降部位,能顯著提升投資組合的 Sharpe。市場廣度正是一個可操作、且比單一指數價格更平滑的市場健康度訊號。關於用大盤訊號降回撤,也可參考市場濾網如何降低回撤均線市場濾網

把這兩層風控擺在一起看:趨勢閘負責拉研究段報酬,廣度擇時負責壓回撤,兩者管的事不同,缺一就掉一塊。再加上前一節的 MACD 反轉因子(守住 25% 報酬門檻),三個零件各司其職,下一節用一張拆解表把每個零件的貢獻量化。

完整策略:雙均線趨勢閘 + 多窗動能低波核心 + MACD 反轉 + SMA120 廣度擇時

把上面的洞見組成一套可執行、可重現、完全不含基本面的純技術策略:

  1. 雙均線趨勢閘:在可交易宇宙裡,先只保留「收盤同時站上自身 SMA60 與 SMA120」的個股,把選股池縮到結構偏多的標的。
  2. 選股核心:在趨勢閘後的池子裡,依綜合分(0.65 多窗動能分位 + 0.20 低波分位 + 0.15 MACD 反轉分位,三者皆「分位越小越好」)排序,每月選前 15 檔,等權持有。多窗動能分位 = 20/60/120 日報酬三個橫截面分位的平均。
  3. MACD 反轉因子:用 8-17-9 參數算出 hist,做橫截面排名,hist 越低(越超賣)分位越好;它只佔 0.15 權重,是加分項不是主角。
  4. 市場廣度擇時:計算可交易宇宙裡收盤站上 SMA120 的個股比例,大於 0.5 才持有上面的籃子,否則當日純現金。
  5. 月再平衡。

選股核心程式碼(可直接交給你的 AI 助理改寫,或下載完整版執行):

顯示程式碼
import pandas as pd
import finlab
from finlab import data
 
finlab.login()  # 套件會在需要資料時引導你完成登入
 
# 載入價量資料
close = data.get("price:收盤價")
amount = data.get("price:成交金額")
 
# 可交易宇宙:成交額前 300 大、收盤 > 10 元,排除 ETF 與權證、KY
liquidity = amount.rolling(60).mean()
is_common = pd.Series({sid: str(sid)[:4].isdigit() and not str(sid).startswith("00")
                       for sid in close.columns})
universe = liquidity.is_largest(300) & (close > 10) & is_common
 
# 雙均線趨勢閘:收盤同時站上自身 SMA60 與 SMA120
sma60 = data.indicator("SMA", timeperiod=60)
sma120 = data.indicator("SMA", timeperiod=120)
trend_gate = (close > sma60) & (close > sma120)
pool = universe & trend_gate
 
# 多窗動能分位:20 / 60 / 120 日報酬三個分位取平均(報酬越高分位越小 = 越好)
mom_rank = pd.concat([
    (-close.pct_change(w)).where(pool).rank(axis=1, pct=True) for w in (20, 60, 120)
]).groupby(level=0).mean()
 
# 低波分位:NATR 越低越好
natr = data.indicator("NATR", timeperiod=14)
vol_rank = natr.where(pool).rank(axis=1, pct=True)
 
# MACD 反轉分位:8-17-9 的 hist 越低(越超賣)越好
dif, dea, hist = data.indicator("MACD", fastperiod=8, slowperiod=17, signalperiod=9)
rev_rank = hist.where(pool).rank(axis=1, pct=True)
 
# 綜合分(越小越優先),每月選前 15 檔等權
score = 0.65 * mom_rank + 0.20 * vol_rank + 0.15 * rev_rank
picks = score.where(pool).rank(axis=1) <= 15

完整的廣度擇時 overlay 與回測請見文末可下載的 strategy.py

三個零件各管一件事,把任一個拿掉都會掉一塊。下表是逐一拆解的真實回測(其餘設定不變):

設定 研究段年化 研究段月 Sharpe 全期最大回撤 是否過 25% 門檻
完整策略 26.4% 1.43 -32.1% 通過
拿掉雙均線趨勢閘 22.4% 1.29 -35.8% 未過
拿掉 SMA120 廣度擇時 32.4% 1.23 -42.4% 通過但回撤失控
拿掉 MACD 反轉因子 20.8% 1.16 -37.1% 未過

加 MACD 超賣反轉因子前後的純技術核心對照長條圖,研究段年化由 20.8% 升到 26.4%、跨過 25% 門檻,樣本外年化由 26.7% 升到 33.1%

讀法很清楚:趨勢閘負責拉研究段報酬(拿掉跌到 22.4%、不過門檻),廣度擇時負責壓回撤(拿掉後 MDD 由 -32.1% 惡化到 -42.4%),MACD 反轉因子負責守住 25% 報酬門檻(拿掉跌到 20.8%、且樣本外年化由 33.1% 掉到 26.7%)。MACD 不是這套策略的引擎,但它是那個讓策略剛好跨過及格線的關鍵加分項。

這套策略研究段(2015-2021)年化 26.4%、月 Sharpe 1.43、月 Sortino 2.46、研究段最大回撤 -24.9%;樣本外(2022-2026)年化 33.1%、月 Sharpe 1.26、月 Sortino 2.43;全期(2015-2026)年化 28.9%、月 Sharpe 1.21、月 Sortino 2.05、全期最大回撤 -32.1%。三段都把風險調整後表現拉到含息 0050(全期年化 21.0%、Sharpe 1.05、回撤 -34.0%)之上,全期回撤也略低。

下面是完整互動式回測:月報酬熱力圖、權益曲線、年度績效都可以直接在文章裡操作:

回測方法與口徑

量化結論的可信度取決於方法,以下逐項交代:

  • 交易成本:策略使用 finlab sim(),台股預設已內扣手續費(本文以 0.1425% 打三折計)與賣出證交稅 0.3%。
  • 滑價:未額外假設滑價,實際成交衝擊取決於資金規模與流動性。
  • 股票池:上市櫃普通股,60 日均量大於 100 萬股、收盤大於 10 元、60 日均成交金額前 300 名,再經雙均線趨勢閘(收盤同時站上 SMA60 與 SMA120)限縮。
  • 排除類別:排除 ETF(代號 00 開頭)、權證/KY/特別股(非 4 碼純數字)、金融保險股、處置與全額交割股,以降低生存者偏差與不可交易標的污染。
  • 前視偏差:多窗動能(20/60/120 日)、NATR、MACD hist、雙均線與廣度均只使用當日(含)以前的價格;月頻再平衡,訊號於當期可得。完全不使用財報或月營收等基本面資料,沒有財報公布日對齊問題。
  • 權重:選股籃等權、單檔約 6.7%(15 檔),不另設個股上限。
  • 周轉率:全期年換手約 7.1 次(月再平衡 + 趨勢閘進出 + 廣度擇時切換),屬中等。
  • 樣本內外:研究段 2015-2021、樣本外 2022-2026 分開回報,所有數字兩段都列,避免只報漂亮的一段。

穩健度

這套策略的優勢不是靠單一參數湊出來的:

  • 跨持股檔數與廣度門檻穩健:把持股檔數在 12/15/18/20 檔、廣度門檻在 0.45/0.48/0.50/0.52 之間排成 4×4 共 16 格、每格真跑一次,其中 13 格同時跨過「研究段年化 ≥ 25%、月 Sharpe ≥ 1.2」與樣本外把關——是一片穩定的高原,不是挑到某一格漂亮參數。
  • 反轉方向跨組合穩健:低 hist 減高 hist 的多空價差,研究段 9 組裡 9 組為正、樣本外 9 組裡 8 組為正,跨 raw/pct/z-score 與每籃 20/30/50 檔皆成立——「hist 是反轉訊號」這個方向是穩的。
  • 不靠單一年度:樣本外 2022-2026 共 5 年裡 4 年正報酬(僅 2022 為 -20.1%,而那一年正是廣度擇時把回撤救下來的年份;2026 為截至 6 月的部分年度),不是靠某一年的多頭撐場。

參數最佳化:找一片穩健高原,而不是一根孤峰

策略裡有兩個最關鍵、最容易被「調到漂亮」的旋鈕:持股檔數 N(選股籃要多集中)與廣度持倉門檻 thr(站上 SMA120 的個股比例要多高才進場)。我們對這兩個旋鈕做 4×4 的網格、每一格都真跑一次回測,把研究段月 Sharpe 畫成色溫圖。看色溫圖的正確方法,是找「一整片都偏綠的高原」,而不是「一格特別深綠的孤峰」——孤峰多半是過度最佳化的產物,換個資料區間就垮;高原才代表結論對參數不敏感、實單站得住。

持股檔數與廣度門檻的研究段月 Sharpe 參數最佳化色溫圖,多數格落在綠色高原,預設 15 檔、門檻 0.50 坐落於高原中段

色溫圖一眼可見的結論是:綠色高原連成一大片,沒有突兀的孤峰。 整片 16 格網格裡,有 13 格同時通過「研究段年化 ≥ 25%、月 Sharpe ≥ 1.2」與樣本外把關。橫看持股檔數軸,15 到 20 檔之間(研究段月 Sharpe 1.43-1.53)都站得住;縱看廣度門檻軸,0.48 到 0.52 那幾列普遍偏綠。這代表策略的優勢是一整片參數區域共有的,不是靠某一格運氣。

把「預設參數」和「在通過把關的格子裡、取鄰域中位數最高的穩健最佳格」擺在一起對照,可以看到優化幾乎沒有空間:

MACD 策略參數優化前後對照長條圖,預設參數與穩健最佳參數在研究段樣本外月 Sharpe 與最大回撤幾乎打平,顯示沒有自由午餐

參數組 研究段月 Sharpe 樣本外月 Sharpe 全期最大回撤
預設(N = 15、thr = 0.50) 1.43 1.26 -32.1%
穩健最佳(N = 20、thr = 0.50) 1.50 1.11 -32.7%

兩組數字方向一致、差距不大:所謂「穩健最佳」把研究段 Sharpe 從 1.43 抬到 1.50,但樣本外反而從 1.26 降到 1.11、最大回撤還略惡化到 -32.7%。換句話說,把選股放得更集中(20 檔)換不到實質的樣本外增益,反而樣本外略退步。過度最佳化的風險就在這裡:如果你照研究段 Sharpe 一路往最高那格調,很可能調到一個樣本外會讓你失望的設定。 我們刻意取 15 檔、門檻 0.50 當預設——它坐落在高原中段、樣本外表現最穩,而不是靠湊參數硬撐研究段的歷史最佳值。

加上月營收 YoY 會更好嗎:基本面是選配,不在主策略內

本文的主策略是完全不含基本面的純技術策略:選股只用價量動能、低波與 MACD hist 反轉,風控只用雙均線趨勢閘與站上 SMA120 的廣度,沒有任何財報或月營收輸入。這是刻意的設計——純技術訊號每日可得、無財報公布延遲與對齊問題,回測口徑乾淨、可重現性高。

常見的延伸問題是:在選股端疊一層月營收年增率(YoY),績效會不會更好?這是一個合理的研究方向,但屬於「在純技術主策略之外的選配實驗」,不納入本文主策略的數字。我們用兩種搭法各跑一次真實回測(基線為純技術勝出策略),結果是中性的:

策略 研究段月 Sharpe 樣本外月 Sharpe 樣本外年化 全期最大回撤
純技術勝出策略(基線) 1.43 1.26 33.1% -32.1%
+ 月營收 YoY > 0 過濾 1.35 1.24 34.9% -33.8%
+ 月營收 YoY 分位(第 4 因子) 1.20 1.09 27.5% -37.0%

純技術勝出策略搭配月營收 YoY 的對照長條圖,研究段與樣本外 Sharpe 都沒有再升、最大回撤反而略增,顯示營收動能對純技術勝出策略無增益

讀法很清楚:月營收 YoY 並沒有讓這套純技術策略更好——研究段月 Sharpe 反而從 1.43 退到 1.35(YoY>0 過濾)甚至 1.20(當第 4 因子),樣本外 Sharpe 與年化也沒有再進步,最大回撤還從 -32.1% 略增到 -33.8% 與 -37.0%。合理的解釋是純技術面的多窗動能加低波核心,已經把這批股票的多數可用訊號吃下來了,月營收 YoY 帶來的增量資訊有限。所以主策略維持純技術面,月營收 YoY 只是文末程式碼裡可自行對照的選配,不硬塞進主策略——把沒有增益的因子加進去,只會增加過度最佳化的風險。想進一步了解基本面與技術面選股的分工,可參考技術面與基本面選股的差異

不同大盤狀態下,這套策略各自表現如何

同一套策略在多頭、盤整、空頭三種市況下的行為差很多,分開看才知道它的脾氣。把全期逐年報酬攤開(皆為真實回測):

年度 策略報酬 當年市況
2017 +54.1% 強多頭
2023 +60.1% 多頭回升
2020 +57.7% 強多頭(疫情後資金行情)
2026(截至 2026-06) +81.6% 多頭(部分年度)
2025 +27.1% 多頭
2019 +22.0% 緩漲盤整
2021 +22.6% 多頭但震盪加劇
2024 +19.8% 多頭
2015 +18.2% 震盪(年中股災)
2016 +17.1% 多頭回升
2018 -1.3% 盤整偏弱(年底急跌)
2022 -20.1% 空頭(升息殺估值)

三種市況各有重點:

  • 多頭年(2017/2020/2023) 策略火力全開,年報酬都在 50% 以上。多頭時廣度擇時幾乎全程持倉、雙均線趨勢閘留下的都是結構偏多的強勢股,動能核心也最吃香,這是策略賺主要報酬的時段。2026 截至 6 月的部分年度報酬偏高,是少數月份的結果,年化會隨後續月份收斂,不宜外推為全年預期。
  • 盤整年(2018/2019) 報酬從小負到中個位數正報酬不等。盤整時動能訊號最弱、個股輪動快,這也是純 MACD 金叉死叉派 whipsaw 最嚴重、最容易虧損的市況;本策略靠的是不依賴單一指標的綜合分加上趨勢閘與低波過濾,才把盤整年守在小幅波動。
  • 空頭年(2022) 是回撤最深的一年(-20.1%),但同年若把廣度擇時拿掉,全期回撤一度到 -42.4%,是廣度擇時在大盤結構轉弱時把曝險降下來,才把這一年的傷害壓住。空頭年正是這層擇時存在的理由。

結論是這套策略的個性是「多頭吃飽、盤整守住、空頭少賠」,而不是任何市況都穩賺。理解它在不同市況的脾氣,才能在真正進場時對報酬與回撤有合理的預期。關於用大盤訊號在不同市況降回撤,可延伸看市場濾網如何降低回撤

策略的限制與取捨

  • MACD 不是降回撤的主角:要說清楚,把最大回撤從 -42.4%(無擇時)收斂到 -32.1% 的決定性機制是「SMA120 廣度擇時」這層 overlay,不是 MACD。MACD 反轉因子的真實貢獻,是守住 25% 的報酬門檻——拿掉它研究段年化從 26.4% 掉到 20.8%、跨不過及格線。它是讓策略剛好過關的關鍵加分項,不是引擎。
  • 集中度帶來較深回撤:策略只持 15 檔、全期最大回撤 -32.1%,雖略低於含息 0050 的 -34.0%,但並不算淺。選股集中換到較高報酬,代價是單股與類股風險集中,承受得住這級回撤才適合。
  • 擇時空手期有機會成本:廣度擇時在多頭段會有空手的日子,這些 0 報酬日會在強單邊多頭時少賺。這是用回撤換報酬的取捨,不是免費午餐。
  • 崩盤型態涵蓋有限:廣度門檻主要在 2018/2020/2022 幾次急跌上驗證,資料起點 2015,未對更早期(2008/2011)的崩盤型態做滾動測試,不保證對沒見過的型態同樣有效。
  • 容量與成本:選股籃僅 15 檔、宇宙限前 300 大,大資金部署需重估流動性衝擊;年換手約 7.1 次,報酬已在 sim() 內扣手續費與證交稅後計算,但實單滑價會進一步侵蝕;回測未逐筆估算滑價與借券成本,也未單獨估算策略容量。

自己跑一次

把下面這段話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:

免費試用

用 AI 開始 FinLab

把這句話交給你的AI,它會帶你完成設定並做出第一個策略。

告訴你的AI:

「幫我設定 FinLab,做一個動能策略:https://finlab.finance/setup」

裝好之後,下載本文的 strategy.pydata.csv,即可在自己的環境重跑、改參數、換因子。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽程式交易是什麼程式交易完整指南。想自己用 Python 算各種技術指標,可看 TA-Lib 158 種技術指標教學

常見問題

Q:MACD 的金叉、死叉到底能不能用來買賣? 就本文台股回測來看,把「金叉買、死叉賣」當獨立進出場訊號沒有優勢——事件式金叉持有 20 日的全期月 Sharpe 只有 0.33,跑不贏被動持有,因為金叉發生時動能多半已反映在價格、台股假訊號又多。MACD 比較有效的用法是當其他訊號的加分因子,不是自己當買賣依據。

Q:MACD 柱狀圖(hist)越高,是不是代表越該追多? 在台股月頻橫截面上剛好相反。hist 最高的一籃研究段年化只有 3.2%,hist 最低(剛超賣)的一籃反而有 8.2%,因為 hist 衝最高時動能多半已反映完、隨後均值回歸。把 hist 當動能計去追高,方向是用反的。

Q:MACD 參數要設多少?12-26-9 是最好的嗎? 12-26-9 是最常見的預設,本文主策略用的是 8-17-9。重點不在微調參數,而在用法:把 MACD 反轉因子疊到動能加低波核心上時,12-26-9、8-17-9、6-19-9、12-26-5 四組都能通過,結論對 MACD 參數不敏感。與其調參數,不如先用對方向。

Q:MACD 背離(價格創新高、hist 沒創新高)準嗎? 背離的直覺其實和本文發現一致——hist 走弱常領先價格反轉。但背離是逐檔、主觀判讀的訊號,難以系統化回測。本文把同一個「hist 領先反轉」的機制做成可量化、可重現的橫截面反轉因子,避免人眼判讀背離的主觀性。

Q:MACD 可以拿來做大盤擇時、判斷該不該進場嗎? 我們實測用「市場上 hist 為正的比例」當大盤開關無效——hist 符號翻轉太頻繁,當低頻擇時只會反覆甩巴掌、賣在底部。要降回撤,用「全市場站上 120 日均線的比例」這種較平滑的廣度訊號才有效,而不是用 MACD 本身。

Q:MACD 和 RSI、KD 一起用會更好嗎? 這些都是擺盪/動能類指標,資訊高度重疊,硬疊在一起通常是負貢獻。比較有效的組合是「不同性質」的訊號搭配,例如動能(選股)+ MACD 反轉(加分)+ 市場廣度(風控)。各指標的正確用法可參考 RSI vs MACD vs KD:三大技術指標台股實測

Q:這套策略適合誰? 適合想主動選股、追求明顯高於含息 0050 報酬,且能接受 -32% 等級回撤與較高換手成本的人:全期年化 28.9%、月 Sharpe 1.21,研究段與樣本外的風險調整後表現都勝過含息 0050,全期回撤也略低。不適合受不了深度回撤、或偏好低周轉被動持有的人——那種需求直接買進持有含息 0050 更省心。


最後更新:2026-06|回測區間:2015-01 ~ 2026-06-09|作者:FinLab 量化研究團隊(經量化研究員審閱)

本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。本策略全期最大回撤 -32.1%,實際交易前請自行評估風險、滑價與交易容量。

FinLab AI

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始

更多技術指標研究

查看全部