mfi 指標在台股的正確用法:拆成資金流出濾網加廣度擇時
散戶最熟的 mfi 用法是「mfi 高於 80 超買就賣、低於 20 超賣就買」。但把這個規則放進台股做 11 年回測(2015-2026),低 mfi 超賣抄底的研究段年化報酬只有 1.1%,幾乎等於沒賺;連教科書版的「mfi 由 20 向上金叉買進」研究段都是負的(年化 -7.3%)。問題不在 mfi,而在方向用反了——在台股橫截面上,低 mfi 代表「資金正在棄守」,不是「超賣即將反彈」。把方向反轉後,mfi 真正有價值的是拆成兩個各司其職的零件:第一個零件是「資金流出負面濾網」,在多窗動能選出的強勢股裡剔掉 mfi 最低(資金正在流出)的一群當選股因子;第二個零件是「全市場站上 mfi 中位的廣度」,當大盤資金流入急轉差時整籃減碼的擇時開關。把這兩個零件疊上多窗動能與趨勢閘(站上季線、半年線、剔波動高的一半),組成一套完全不含基本面的純技術策略:可交易宇宙裡選多窗動能前 12 強、剔資金流出最弱 20%,廣度轉差時砍到半倉防禦。這套「mfi 雙核心純技術策略」研究段(2015-2021)年化 25.3%、月 Sharpe 1.20,樣本外(2022-2026)年化 31.7%、月 Sharpe 1.06,全期(2015-2026)年化 27.7%、月 Sharpe 1.08,全期最大回撤 -36.3%——把 mfi 裸用 -74% 級的回撤砍掉超過一半,三段都勝過含息 0050(全期年化 21.0%、Sharpe 1.05、回撤 -34.0%),代價是全期回撤略深一點。
先用一張表回答你搜尋「mfi 指標」時最想知道的事:
| 你想知道的 | 本文用真實台股回測的回答 |
|---|---|
| mfi 指標是什麼 | 帶成交量的 RSI;綜合價格與量能算出 0-100 的資金流量強弱,預設回看 14 日 |
| mfi 低於 20 超賣抄底有效嗎 | 台股 11 年回測研究段年化僅 1.1%,接近無效;高 mfi 追資金流入反而有 10.8% |
| mfi 能拿來選股嗎 | 當主排序很弱。它最強的角色是「負面濾網」:在動能強勢股裡剔掉資金正在流出的個股 |
| mfi 還能怎麼用 | 算全市場站上 mfi 中位的廣度,當大盤資金流入急轉差時整籃減碼的擇時開關 |
| 正確用法的效果如何 | 雙核心純技術策略研究段年化 25.3%、Sharpe 1.20,樣本外 31.7%、1.06,全期 27.7%、1.08,三段都勝含息 0050 |

本文所有數字皆出自 finlab 套件抓取的上市櫃真實價量資料(
price與etl:adj_close含息還原股價),回測區間 2015-01 至 2026-06-09,研究段 2015-2021、樣本外 2022-2026 分開回報,基準為含息 0050。文末附可下載的strategy.py與data.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼。
mfi 指標是什麼
mfi(Money Flow Index,資金流量指標)是 Gene Quong 與 Avrum Soudack 提出、由 J. Welles Wilder 的 RSI 概念延伸出來的波動指標。它可以理解成「帶成交量的 RSI」:RSI 只看價格,mfi 則把每天的「典型價格(高+低+收 ÷ 3)」乘上成交量,分成上漲日的正資金流與下跌日的負資金流,再用近 N 日(預設 14 日)的正負資金流比值換算成 0 到 100 的讀數。讀數越高,代表近期帶量上漲的力道越強(資金流入);越低代表帶量下跌、資金流出。各技術指標的計算與比較整理可參考 TA-Lib 158 個技術指標總覽,名詞釐清見名詞詞彙表。
教科書最常見的兩個用法是:
超買超賣:mfi > 80 視為超買(該賣)、mfi < 20 視為超賣(該買)。
背離:股價創高但 mfi 沒跟上創高,視為上漲動能轉弱的警訊;反之亦然。
mfi 和 RSI、KD 一樣屬於擺盪指標,資訊高度重疊。問題是,「超買要賣、超賣要買」這個直覺在台股橫截面上到底是對是錯?直接回測。
mfi 指標的數學定義與計算
mfi 的計算分四步:
逐項拆開來看每個符號的意思:
- (typical price,典型價格):當日「最高價、最低價、收盤價」三者的平均,也就是 。它代表這一天大致成交在哪個價位。
- :當日成交量。
- (money flow,資金流量):把典型價格乘上成交量,得到當日的「資金流量」。直覺上它衡量的是「今天有多少錢以什麼價位換手」——量大且價高, 就大。
- 、:把回看 天(預設 )分成上漲日與下跌日。當天 比前一天高,就把它的 計入「正資金流」;比前一天低就計入「負資金流」。再分別把這 天的正、負資金流加總。
- (money flow ratio,資金流量比值):正資金流總和除以負資金流總和。流入越壓過流出, 越大。
- 最後一步把 用和 RSI 完全相同的方式壓縮到 0 到 100 之間: 趨近無限大時 趨近 100、(正負資金流相等)時 、 趨近 0 時 趨近 0。
和 RSI 對照就很清楚:RSI 是把「平均上漲幅」對「平均下跌幅」做同一個 的壓縮;mfi 只是把「漲跌幅」換成「帶量的資金流量」。所以 mfi 等於「成交量加權版的 RSI」——同樣的數學骨架,多吃了一層量能資訊。各指標的計算式整理可參考 TA-Lib 158 個技術指標總覽。本文所有 mfi 讀數都由 finlab 套件 data.indicator("MFI", timeperiod=14) 在真實價量上算出,與上式一致。
在單股上看兩派 mfi 訊號:超賣買越接越深、資金流訊號頻繁進出
公式講完,直接把訊號畫在真實股價上看一張圖會更直觀。下圖取台積電(2330)2023-07 到 2024-06 約一年的走勢:上半部是還原前的收盤價,標出兩個教科書派別的買賣點;下半部是 MFI(14) 讀數與 20/80 兩條超買超賣帶。

圖上畫的是兩派最常見的單股用法:
- 超賣派(藍色三角):mfi 跌破 20 視為超賣買進、升破 80 視為超買賣出。這一年台積電從約 580 元一路漲到 960 元,是明顯的多頭,但 mfi 跌破 20 的超賣買點在這段裡只觸發 3 次、升破 80 的超買賣點 2 次——而且每次「超賣」往往出現在短線續跌的途中,買在反彈之前還得再忍一段下跌,正是所謂「接還在下墜的刀」。在強多頭裡,等 mfi 跌到 20 才進場,等於把大半漲幅讓掉。
- 資金流入派(紫紅色三角):mfi 上穿 50 視為資金轉流入買、跌破 50 視為資金轉流出賣。它的訊號密集得多——這一年來回穿越 50 觸發的買賣各 11 次,等於平均每個多月就要進出一輪。在盤整段(如 2023 下半年),mfi 在 50 上下反覆穿梭,連續產生「買了又賣、賣了又買」的雜訊(whipsaw),來回的交易成本會把報酬磨掉。
聯發科(2454)同一段期間更誇張,兩派合計觸發 24 次訊號,資金流入派同樣是頻繁進出的主要來源:

兩張圖一起看,問題就浮出來了:單股上的 mfi 訊號,要嘛太稀疏(超賣買點在強多頭裡少得可憐、且常接刀),要嘛太頻繁(穿越 50 的進出雜訊很多)。 這正是後面回測會證實的——把這些單股直覺直接搬到全市場選股,超賣抄底幾乎沒賺、頻繁進出又被成本吃掉。想自己重畫這張圖,下面這段程式碼用 finlab 的 data.indicator 取 mfi、再用簡單的穿越邏輯標訊號即可:
顯示程式碼
import pandas as pd
import matplotlib.pyplot as plt
from finlab import data
# 登入(finlab 會在需要資料時自動引導完成登入)
import finlab
finlab.login()
# 取收盤價與 MFI(14),擷取 2330 約一年的窗
close = data.get("price:收盤價")
mfi = data.indicator("MFI", timeperiod=14)
sid = "2330"
px = close[sid].loc["2023-07-01":"2024-06-30"].dropna()
m = mfi[sid].loc[px.index]
# 超賣派訊號:mfi 由上跌破 20 = 買、由下升破 80 = 賣
oversold_buy = (m < 20) & (m.shift(1) >= 20)
overbought_sell = (m > 80) & (m.shift(1) <= 80)
# 資金流入派訊號:mfi 上穿 50 = 買、跌破 50 = 賣
moneyflow_buy = (m > 50) & (m.shift(1) <= 50)
moneyflow_sell = (m < 50) & (m.shift(1) >= 50)
# 上下兩個面板:上畫價格與買賣點、下畫 mfi 與 20/80 帶
fig, (ax_px, ax_mfi) = plt.subplots(
2, 1, figsize=(12, 7), sharex=True, gridspec_kw={"height_ratios": [2, 1]}
)
ax_px.plot(px.index, px, color="#333", label=sid)
ax_px.scatter(px.index[oversold_buy], px[oversold_buy], marker="^", label="超賣買")
ax_px.scatter(px.index[overbought_sell], px[overbought_sell], marker="v", label="超買賣")
ax_px.scatter(px.index[moneyflow_buy], px[moneyflow_buy], marker="^", label="資金流入買")
ax_px.scatter(px.index[moneyflow_sell], px[moneyflow_sell], marker="v", label="資金流出賣")
ax_px.legend()
ax_mfi.plot(m.index, m, color="#06b6d4", label="MFI(14)")
ax_mfi.axhline(80, ls="--", color="#888") # 超買帶
ax_mfi.axhline(20, ls="--", color="#888") # 超賣帶
plt.tight_layout()
plt.show()把單一檔股票看清楚之後,下一節改用全市場橫截面回測,量化驗證這些直覺到底賺不賺得到錢。
散戶最常見的 mfi 用法,在台股 11 年幾乎沒賺到錢
我們在可交易宇宙(60 日均量 > 100 萬股、收盤 > 10 元、成交金額前 300 大,排除 ETF、金融股、KY 股、處置股)裡,把幾種「mfi 訊號」用法各跑一次月再平衡的回測,研究段(2015-2021)結果如下:
| mfi 用法 | 研究段年化報酬 | 月 Sharpe | 對照含息 0050(15.3%) |
|---|---|---|---|
| 低 mfi 超賣抄底(bottom 30 檔,超賣買進) | 1.1% | 0.16 | 大幅落後 |
| 持有 mfi < 20 的超賣個股 | 1.6% | 0.19 | 大幅落後 |
| mfi 由 20 向上金叉買進 | -7.3% | -0.26 | 賠錢 |
| 高 mfi 追資金流入(top 30 檔) | 10.8% | 0.58 | 落後,但唯一有訊號 |

結論很清楚:最多人用的「mfi 低於 20 超賣就買」在台股研究段年化只有 1.1%,接近無效;改成等 mfi 金叉向上再買,研究段甚至賠錢(-7.3%)。 唯一明確有訊號的是反過來——買 mfi 最高、也就是資金正在流入的那批股票,研究段年化 10.8%。
原因不難理解。mfi 本質是帶量的 RSI,方向與動能一致。台股弱勢股「資金持續流出」有延續性:低 mfi 往往代表主力資金正在棄守、之後還會更弱,而非跌過頭即將反彈。把超賣當無腦抄底訊號,等於去接一把還在下墜的刀。這和動能效應的學理一致:Jegadeesh & Titman (1993) 發現過去的贏家在中期傾向繼續贏、輸家繼續輸;mfi 衡量的正是帶量的近期強弱,所以「追流入」比「抄棄守」合理。延伸閱讀:技術面與基本面選股的差異、RSI、MACD、KD 比較。
那高 mfi 追資金流入年化 10.8% 看起來像答案了嗎?還不夠。它裸用全宇宙的最大回撤高達 -74.2%,月 Sharpe 只有 0.58——報酬是用極深的回撤換來的,實務上幾乎抱不住。要把 mfi 變成可用的工具,得換個角色。
把 mfi 拆成兩個有用的零件
整個 mfi 當買賣訊號失效,但把方向反轉、再拆開來看,它有兩個各自有效的零件,本文的純技術策略就建立在這兩個零件上。
零件一:資金流出負面濾網(選股因子)
純粹拿高 mfi 當主排序去選股,問題在樣本外:它容易追到「已經過熱、即將回吐」的標的。但 mfi 有一個最可靠的資訊——它能告訴你哪些股票的資金正在離場。與其用它挑股票,不如用它踩煞車:選股交給動能,mfi 只負責剔掉「資金正在流出」的個股。具體做法是先用趨勢閘把選股母體限制在乾淨範圍(收盤站上季線 MA60、剔除池內 60 日報酬波動最高的一半、再要求站上半年線 MA120),在這個品質池內用多窗動能選出前 12 強,再剔掉這 12 檔中 mfi(21)橫截面最低 20%(資金正在流出)的個股。mfi 在這裡只扮演濾網角色,把它最可靠的資訊(資金流出等於危險)用在踩煞車的刀口上,選股主力仍是動能。順帶一提,選股端用「買最強的股票」而不是「買最弱想等反彈」,這和 Jegadeesh & Titman (1993) 的動能效應一致:過去的贏家在中期傾向繼續贏。
零件二:全市場 mfi 廣度當大盤擇時
單看一檔股票的 mfi 訊號太雜(前面兩張單股圖已經看到,穿越中位來回甩巴掌)。但如果改看「全市場有多少比例的股票站上 mfi 中位(mfi(21) > 50)」,就得到一個橫截面的、平滑的大盤資金流入力道度量,本文稱為 mfi 廣度。廣度高,代表多數個股資金仍在流入;廣度急轉差,代表系統性的資金正在退潮。把它做成擇時開關——當廣度的 20 日變化轉為負(資金流入廣度正在急轉差)時,把整籃曝險縮到 0.5 倉、其餘轉現金,全程不加任何槓桿;廣度未惡化就維持滿倉——就是整套策略的防禦腿。

這個「在資金退潮時調降曝險」的邏輯,和學術上的波動度擇時一致——Moreira & Muir (2017) 在《Volatility-Managed Portfolios》證明:在波動升高、風險惡化時主動降低曝險,能顯著提升投資組合的 Sharpe。mfi 廣度正是一個可操作的市場資金結構訊號。關於用大盤訊號降低回撤,也可參考市場濾網如何降低回撤與均線市場濾網指標。
把 mfi 同時當「選股的資金流出濾網」與「擇時的廣度來源」,是這套策略的核心:兩個零件用的都是同一個指標、卻分別放在選股與風控兩個位置,各取它最可靠的那一面。
完整策略:mfi 雙核心純技術選股
把上面兩個零件疊上多窗動能與趨勢閘,組成一套可執行、可重現、完全不含基本面的純技術策略:
- 可交易宇宙:60 日均量 > 100 萬股、收盤 > 10 元、成交金額前 300 大,排除 ETF、金融股、KY 股、處置股。
- 趨勢閘(品質池):收盤站上季線 MA60、剔除池內 60 日報酬波動最高的一半(至少保留 150 檔)、再要求站上半年線 MA120。
- 主排序(多窗動能):20、60、120 日報酬各自橫截面百分位排名後等權平均,取品質池內前 12 檔。
- mfi 資金流出濾網:剔除這 12 檔中 mfi(21)橫截面最低 20%(資金正在流出)的個股,餘下等權、月頻換股。
- 大盤擇時(mfi 廣度):每日算全市場站上 mfi 中位(mfi(21) > 50)的比例,當這個廣度的 20 日變化轉負時,整籃砍至 0.5 倉、其餘轉現金;廣度未惡化維持滿倉,全程不加槓桿。
選股端的核心程式碼(可直接交給你的 AI 助理改寫、或下載完整版執行):
顯示程式碼
import numpy as np
import pandas as pd
from finlab import data
# 載入價量資料
close = data.get("price:收盤價")
amount = data.get("price:成交金額")
# 趨勢閘:站上季線 MA60、剔 60 日報酬波動最高一半、站上半年線 MA120
ma60 = close.rolling(60).mean()
ma120 = close.rolling(120).mean()
vol60 = close.pct_change().rolling(60, min_periods=30).std()
uptrend = (close > ma60) & (close > ma120)
lowvol_half = vol60.where(uptrend).rank(axis=1) <= 150 # 池內波動最低一半
pool = uptrend & lowvol_half
# 多窗動能合成:20 / 60 / 120 日報酬各自橫截面百分位後等權平均,取前 12 檔
r20 = (close / close.shift(20) - 1).where(pool).rank(axis=1, pct=True)
r60 = (close / close.shift(60) - 1).where(pool).rank(axis=1, pct=True)
r120 = (close / close.shift(120) - 1).where(pool).rank(axis=1, pct=True)
mom_multi = (r20 + r60 + r120) / 3
top12 = mom_multi.where(pool).rank(axis=1, ascending=False) <= 12
# mfi(21)資金流出濾網:剔掉這 12 檔中 mfi 池內百分位最低 20%(資金正在流出)
mfi = data.indicator("MFI", timeperiod=21)
mfi_pct = mfi.where(pool).rank(axis=1, pct=True) # 池內百分位,越大=資金越流入
basket = top12 & (mfi_pct > 0.20)完整的等權配置、mfi 廣度擇時與回測請見文末可下載的 strategy.py。
這套策略研究段(2015-2021)年化 25.3%、月 Sharpe 1.20、月 Sortino 2.18,研究段最大回撤 -30.6%;樣本外(2022-2026)年化 31.7%、月 Sharpe 1.06、月 Sortino 2.04;全期(2015-2026)年化 27.7%、月 Sharpe 1.08、月 Sortino 2.04、全期最大回撤 -36.3%。三段都勝過含息 0050(研究段年化 15.3% / Sharpe 1.0;樣本外 30.4% / Sharpe 1.18;全期 21.0% / Sharpe 1.05 / 回撤 -34.0%),用全期年化高出約 7 個百分點換到略深一點的回撤。和裸用 mfi 全宇宙 -74% 級的回撤相比,整套組合把尾部風險砍掉超過一半。
下面是完整互動式回測:月報酬熱力圖、權益曲線、年度績效都可以直接在文章裡操作:
回測方法與口徑
量化結論的可信度取決於方法,以下逐項交代:
- 交易成本:策略使用 finlab
sim(),台股預設已內扣手續費(本文以 0.1425% 打三折計)與賣出證交稅 0.3%。 - 滑價:未額外假設滑價,實際成交衝擊取決於資金規模與流動性。
- 股票池:上市櫃普通股,60 日均量 > 100 萬股、收盤 > 10 元、60 日均成交金額前 300 名。
- 排除類別:排除 ETF(代號 00 開頭)、權證 / KY / 特別股(非 4 碼純數字)、金融保險股、處置與全額交割股,以降低生存者偏差與不可交易標的污染。
- 前視偏差:多窗動能、mfi 選股因子與 mfi 廣度均只使用當日(含)以前的價量;月頻再平衡,訊號於當期可得。完全不使用財報或月營收等基本面資料,自然沒有財報公布日對齊問題。
- 權重:選股籃 12 檔等權,單一資產不另設上限;mfi 廣度擇時層乘上整體曝險係數(滿倉或 0.5 倉,不加槓桿)。
- 周轉率:年換手約 7.2 次(月頻換股 + 廣度擇時切換),屬中高,已含成本估計。
- 樣本內外:研究段 2015-2021、樣本外 2022-2026 分開回報,所有關鍵數字兩段都列,避免只報漂亮的一段。
穩健度
這套策略的 edge 不是靠單一參數湊出來的,對三個關鍵參數同時穩健:
- mfi 週期 × 資金流出門檻:把 mfi 週期(9/14/21/28)與資金流出濾網門檻(剔池內最低 10%/20%/30%)排成二維網格、每格真跑一次完整策略,12 格的研究段月 Sharpe 全部落在 0.98 到 1.20,沒有任何一格塌陷——是一片穩定的高原,不是孤峰。勝出格 mfi 21、剔 20%(研究段 1.20)四周的鄰格都很高(mfi 21 剔 10% 為 1.19、剔 30% 為 1.12),不是孤立的單點。
- 資金流出門檻:固定 mfi 21、只動門檻,剔最低 10% / 20% / 30% 的研究段月 Sharpe 為 1.19 / 1.20 / 1.12,樣本外為 1.06 / 1.06 / 1.03,整段平滑、沒有懸崖;門檻在 10% 到 30% 之間怎麼挑結論都成立。
- mfi 廣度減碼係數:廣度急轉差時把曝險縮到 0.5 倉是預設,把這個係數在合理區間內微調,研究段與樣本外的 Sharpe 都只在小數點後一兩位移動——廣度擇時對報酬與回撤是平滑過渡,不是單點甜蜜點。
- 逐年分解:報酬分布在多個年份、不是靠單一年僥倖——2017 +30.6%、2019 +24.2%、2020 +56.0%、2021 +62.9%、2023 +67.7%、2025 +10.4%、2026(截至 6 月)+104.5%;空頭的 2022 年靠廣度擇時把虧損緩衝到 -16.6%(裸用級回撤更深)。
參數最佳化:找一片穩健高原,不是挑單一孤峰
mfi 有兩個和它最直接相關的參數:mfi 的計算週期(回看幾天)與資金流出濾網的排除門檻(剔掉 mfi 橫截面最低的百分之幾)。把這兩個參數排成網格,每一格都用 finlab 真跑一次完整回測,記下研究段(2015-2021)的月 Sharpe,畫成色溫圖:

讀色溫圖的關鍵,是看它呈現「一片高原」還是「單一孤峰」。一片高原代表相鄰參數的表現都差不多好——這個 edge 不是靠某一組巧合的數字湊出來的,把參數推到旁邊一格也不會崩,這才是可以放心上線的訊號。單一孤峰則相反:只有正中那一格特別亮、四周都暗,多半是過度最佳化(overfitting)的警訊,換一段資料或微調參數就會破功。
這張圖整片都落在研究段月 Sharpe 0.98 以上:4 個 mfi 週期(9/14/21/28)× 3 個排除門檻(剔最低 10%/20%/30%)共 12 格,最低 0.98、最高 1.20,沒有任何一格塌陷,是一片實打實的高原。正因為是高原,本文主策略取的就是研究段月 Sharpe 全網格最高、又位在高原正中央的那一格:mfi 週期 21、剔最低 20%(研究段 Sharpe 1.20)。 它四周的鄰格(mfi 21 剔 10% 的 1.19、剔 30% 的 1.12,以及上下相鄰的 mfi 28、mfi 14 列)都很高,不是孤立的單點。
要驗證「高原」而不是「孤峰」,最直接的測試是把參數推到旁邊一格、看會不會崩。下圖把主策略(mfi 21、剔 20%)與網格內相鄰、研究段 Sharpe 同樣落在高原帶的另一格(mfi 9、剔 30%)並排比較:

| 組態 | 研究段 Sharpe | 樣本外 Sharpe | 全段最大回撤 |
|---|---|---|---|
| 主策略(mfi 21、剔 20%) | 1.20 | 1.06 | -36.3% |
| 相鄰高原格(mfi 9、剔 30%) | 1.16 | 0.82 | -39.1% |
兩格在研究段 Sharpe 幾乎打平(1.20 對 1.16),證明把參數推到旁邊一格、研究段表現不會崩——這正是高原該有的樣子。差別出現在樣本外:主策略守在 1.06,相鄰格掉到 0.82。這反而支持把 mfi 21、剔 20% 當預設——它不只研究段最高,樣本外也比這個鄰格更穩。這也是過度最佳化最該警惕的地方:如果你硬挑網格邊角某個只在單一段落好看的格、再宣稱它是「最佳參數」,多半只是在對歷史雜訊過度配適,換段就回吐。 本文寧可用站在高原正中央、研究段與樣本外都站得住的 mfi 21、剔 20%。
搭配月營收 YoY:是選配,不在主策略內
本文的主策略是完全不含基本面的純技術策略:選股只用價格動能與 mfi 資金流出濾網,擇時只用 mfi 廣度,沒有任何財報或月營收輸入。這是刻意的設計——純技術訊號每日可得、無財報公布延遲與對齊問題,回測口徑乾淨、可重現性高。
常見的延伸問題是:mfi 本身就是帶量指標,量能往往和基本面動能同向,那在選股端疊一層月營收年增率(YoY)過濾,績效會不會更好?這是一個合理的研究方向,但屬於「在純技術主策略之外的選配實驗」,不納入本文主策略的數字。原因有二:其一,主策略選股只取 12 檔、集中度已高,再加營收過濾會大幅縮小可選池,反而犧牲動能的爆發力;其二,月營收是領先指標、公布有時間落差,要正確對齊「當期(含)以前已公布」的資料才不會前視,這會把乾淨的純技術口徑複雜化。想實驗的讀者可在下載的程式碼裡,於選股前加一層 monthly_revenue 的 YoY 過濾自行對照。基本面與技術面如何分工,可延伸看技術面與基本面選股的差異。
多頭、盤整、空頭:這套策略在不同大盤狀態下的表現
把這套策略放到不同的大盤環境裡逐年攤開,最能看出它的性格。下面用逐年報酬把 2015-2026 分成三種大盤狀態,數字皆出自同一份回測:
- 強多頭年(大盤明顯走升):2017 +30.6%、2019 +24.2%、2020 +56.0%、2021 +62.9%、2023 +67.7%、2026(截至 2026-06)+104.5%。多窗動能在多頭裡能咬住領漲股,mfi 廣度幾乎不轉差、不拖累複利,是策略賺最多的環境。
- 盤整/弱勢年(大盤橫向或小幅震盪):2015 +11.3%、2016 +2.7%、2018 -1.1%、2024 +6.8%、2025 +10.4%。表現分化——多數年份策略仍守住小幅正報酬,但震盪年裡 mfi 廣度容易在淺回檔轉負、又在反彈前留半倉,少賺一點(whipsaw 的代價)。
- 空頭年(大盤深度回檔):2022 -16.6%。這正是 mfi 廣度擇時發揮作用的場景:2022 台股大跌,廣度急轉差時把整籃砍到半倉,把策略虧損緩衝到 -16.6%,明顯淺於裸用級的回撤。代價是它只砍到半倉、不會像現金一樣完全避開下跌,空頭年仍會虧,只是虧得比裸用淺。
一句話總結這套策略的性格:它在多頭年放手讓動能跑、在空頭年靠 mfi 廣度擇時止血,最怕的是盤整震盪年的 whipsaw。 由於樣本外(2022-2026)涵蓋一次完整的空頭與強反彈,廣度擇時的保護與動能的爆發都用得上,所以樣本外年化(31.7%)甚至高過研究段(25.3%)。關於用大盤訊號控制回撤的更多做法,可參考市場濾網如何降低回撤與均線市場濾網指標。
策略的限制與取捨
- mfi 是配角不是主角:策略的選股動力主要來自「多窗動能 + 趨勢閘」,mfi 的貢獻是「剔掉資金流出股」的負面濾網與「廣度擇時」的訊號來源,不是獨立可用的主因子。純 mfi 選股在台股只是弱訊號,這點本文不掩飾。
- 集中度帶來較深回撤:策略只持 12 檔、全期最大回撤 -36.3%,比含息 0050 的 -34.0% 略深。選股集中換到較高報酬,代價是單股與類股風險集中,承受得住這級回撤才適合。
- mfi 不能建多空:我們也測了「高 mfi 做多 / 低 mfi 做空」,研究段方向看似對,但樣本外完全翻轉(被棄守的弱勢股出現超跌反彈),多空價差樣本外為負。mfi 只能 long-only,不要拿去建多空對沖組合。
- 樣本外報酬偏亮可能有區段運氣:2023 / 2026 單年報酬偏高(+67.7% / +104.5%,2026 截至 6 月),樣本外 Sharpe 部分得益於 2023 後台股強勢。雖然逐年分解顯示非單一年份,但樣本外樣本仍只有約 4.5 年。
- 容量與成本:年換手約 7.2、持股 12 檔、宇宙限前 300 大,回測已含成本估計,但大資金部署的流動性衝擊與容量未做測試;實際衝擊取決於資金規模與成交量。
自己跑一次
把下面這句話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:
用 AI 開始 FinLab
把這句話交給你的AI,它會帶你完成設定並做出第一個策略。
告訴你的AI:
「幫我設定 FinLab,做一個動能策略:https://finlab.finance/setup」
裝好之後,下載本文的 strategy.py 與 data.csv,即可在自己的環境重跑、改參數、換選股因子。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽與程式交易是什麼。籌碼面的「資金動向」訊號還可以搭配三大法人買賣超與分點主力買超交叉驗證。
常見問題
Q:mfi 指標是什麼?和 RSI 差在哪? mfi(資金流量指標)是「帶成交量的 RSI」。RSI 只看價格漲跌,mfi 多算了成交量——把每天的典型價格乘上量,分成上漲日的正資金流與下跌日的負資金流,再換算成 0 到 100 的讀數。所以 mfi 同時反映「漲多少」和「帶了多少量」,比純價格的 RSI 多一層量能資訊。
Q:mfi 低於 20 真的代表超賣、會反彈嗎? 在台股橫截面上不一定。低 mfi 超賣抄底(持有最低 30 檔)研究段回測年化只有 1.1%,因為它無法區分「健康回檔」與「資金棄守」。台股弱勢股的資金流出有延續性,低 mfi 往往代表資金正在棄守、之後還會更弱,把超賣當無腦抄底訊號長期接近無效,甚至像在接還在下墜的刀。
Q:那 mfi 高於 80 超買就一定要賣嗎? 回測顯示方向恰恰相反:買 mfi 最高(資金正在流入)那批股票,研究段年化 10.8%,是裸用各種 mfi 用法裡唯一有訊號的。高 mfi 代表帶量上攻的動能,在中期傾向延續,而不是「漲過頭該賣」。當然裸用的回撤很深(-74% 級),所以本文把它降格成負面濾網來用。
Q:mfi 可以單獨拿來當買賣訊號嗎? 不建議。無論是超賣買、超買賣,還是 mfi 金叉、橫截面選股,裸用在台股回測都站不住(研究段年化 -7.3% 到 10.8%、回撤動輒 -70% 以上)。mfi 適合當「濾網」或搭配動能使用,剔掉資金正在流出的股票,而不是自己當進出場依據。
Q:mfi 的參數(timeperiod)要設多少?14 是最好的嗎? 14 是 TA-Lib 預設值,但本文主策略用的是 21。穩健度測試顯示把回看窗在 9 到 28 之間調整,研究段月 Sharpe 都落在 0.98 到 1.20、整片高原沒有塌陷,結論對參數不敏感;其中 mfi 21 在研究段與樣本外都最穩,所以選它當預設。用 14 或 21 結論都成立。
Q:mfi 和 KD、RSI 一起用會更好嗎? 不會。mfi、RSI、KD 都是擺盪 / 量價類指標,資訊高度重疊,硬疊在一起通常是負貢獻。比較有效的組合是「不同性質」或「同一指標的不同用法」搭配,例如動能(選股)+ mfi 資金流出濾網(剔除流出股)+ mfi 廣度(控風險)。各指標的正確用法可參考 RSI、MACD、KD 比較。
Q:這套 mfi 策略適合誰? 適合想主動參與台股動能、能接受 -36% 等級回撤與較高換手成本,追求明顯高於含息 0050 報酬的人:全期年化 27.7%、月 Sharpe 1.08,研究段與樣本外都勝過含息 0050。不適合受不了深度回撤、或偏好低周轉被動持有的人——那種需求直接買進持有含息 0050 更省心。
Q:為什麼擇時要用「全市場 mfi 廣度」,而不是看單一檔的 mfi? 單一檔的 mfi 穿越中位在盤整期雜訊太大、來回甩巴掌。把全市場「站上 mfi 中位的個股比例」做成廣度,是橫截面的、平滑的資金流入力道度量;用它的 20 日變化轉負當減碼訊號,能在資金系統性退潮時把曝險砍到半倉,比單檔 mfi 即時也更可靠。
最後更新:2026-06|回測區間:2015-01 ~ 2026-06-09|作者:FinLab 量化研究團隊(經量化研究員審閱)
本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。mfi 雙核心純技術策略全期最大回撤 -36.3%,實際交易前請自行評估風險、滑價與交易容量。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

