ADX 指標在台股的正確用法:量趨勢強度,不量方向
幾乎所有中文 ADX 教學都跳過一個致命細節:ADX 只量「趨勢有多強」,完全不量「往哪個方向」。一檔正在「強力下跌」的股票,ADX 一樣很高。所以把教科書那句「選 ADX 高的股票」放到台股做 11 年回測(2015-2026),會把一堆強勢下跌股也買進來——研究段(2015-2021)年化雖有 21.9%,最大回撤卻一路探到 -34.9%,全期更達 -43.4%。問題不在 ADX,而在沒搭方向。把 ADX 和 +DI/-DI 一起用(這才是 DMI 體系的完整用法),只留「強趨勢『且』向上」的股票,研究段月夏普就從 1.04 升到 1.17。而 ADX 真正的殺手級用法是風控:用全市場「強勢上升趨勢股的家數佔比」當大盤多空溫度計,在選股籃外套一層清倉開關,把全期最大回撤從裸用的 -43.4% 壓到 -31.3%,全期年化 25.5%、月夏普 1.06,風險調整後與回撤都優於含息 0050(年化 21.0%、夏普 1.05、回撤 -34.0%),樣本外(2022-2026)也不衰退(年化 33.5%、夏普 1.22)。
先用一張表回答你搜尋「ADX 指標」時最想知道的事:
| 你想知道的 | 本文用真實台股回測的回答 |
|---|---|
| ADX 指標是什麼 | DMI 體系的趨勢強度指標;ADX 是 DX 的移動平均,只量趨勢「強度」,方向由 +DI/-DI 判斷 |
| ADX 高就是該買嗎 | 不是。裸選 ADX 最高 30 檔會把強勢下跌股也買進,全期最大回撤 -43.4% |
| ADX 該怎麼搭方向 | 配 +DI > -DI 方向濾網,只留「強趨勢且向上」者,研究段月夏普 1.04→1.17 |
| ADX 最強用法是什麼 | 當風控:用全市場「強勢上升趨勢股佔比」當清倉開關,最大回撤砍到 -31.3% |
| 效果如何 | 全期年化 25.5%、月夏普 1.06、回撤 -31.3%,風險調整與回撤都優於含息 0050 |

本文所有數字皆出自 finlab 套件抓取的上市櫃真實價量資料(
price與etl:adj_close含息還原股價),回測區間 2015-01 至 2026-06-09,基準為含息 0050。文末附可下載的strategy.py與data.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼。
ADX 指標是什麼:DMI 體系裡量「強度」的那條線
ADX(Average Directional Index,平均趨向指數)是技術分析大師 J. Welles Wilder 在 1978 年《New Concepts in Technical Trading Systems》提出的趨向指標,屬於 DMI(Directional Movement Index)體系。這套體系由三條線組成:
+DI(正趨向指標):量上漲方向的力道。
-DI(負趨向指標):量下跌方向的力道。
ADX:先由 +DI 與 -DI 算出 DX(兩者差距相對總和的比值),再對 DX 取移動平均,得到的就是 ADX。它衡量的是「趨勢有多強」,數值越高代表趨勢越明確。
這裡有一個被大量教學忽略、卻是整篇文章關鍵的事實:ADX 是用 +DI 和 -DI 的「差距」算出來的,所以它對上漲與下跌一視同仁。 一檔猛烈下跌的股票,-DI 遠大於 +DI,差距很大,ADX 一樣會衝很高。換句話說,ADX 高只告訴你「現在有強趨勢」,不告訴你「趨勢往上還是往下」。方向,要交給 +DI 與 -DI 的相對位置:+DI > -DI 偏多、-DI > +DI 偏空。
教科書常用的讀數門檻是:ADX < 20 代表盤整無趨勢、20-25 趨勢成形、> 25 趨勢明確。常用參數是 14 日(Wilder 原始建議),本文也沿用。技術指標的基礎名詞可參考名詞詞彙表;ADX 的計算屬於 TA-Lib 內建函式之一,實作可參考用 Python 計算 158 種技術指標。
ADX 的數學定義:從 +DM/-DM 到 DX 再到 ADX
把文字講的「強度不分方向」翻成公式,就一目了然。DMI 體系從每日的方向移動量(DM)出發,先算 +DI 與 -DI,再由兩者算 DX,最後對 DX 取移動平均得到 ADX:
逐個符號拆開來看:
- (正方向移動量)是今日高點比昨日高點多出的部分,(負方向移動量)是今日低點比昨日低點低的部分;兩者取較大的那一邊,另一邊歸零。它們各自衡量「向上」與「向下」的原始推力。
- 是 日平均真實區間(average true range),把 +DM/-DM 除以它做標準化,讓不同價位、不同波動的股票可以放在同一把尺上比較。
- 、 就是標準化後的上漲力道與下跌力道(乘 100 變成百分比刻度)。 代表多方占上風,反之空方占上風——方向資訊全藏在這兩條線的相對位置。
- 是 與 的「差距」除以「總和」。注意分子是絕對值 :不管是上漲力道遠大於下跌、還是下跌力道遠大於上漲, 都會很高。這正是 ADX「不分方向」的數學根源。
- 是 再取一次 日指數移動平均。多一層平滑讓讀數穩定,但也讓它對轉折反應更慢,本質偏落後。
一句話: 只用到 與 的差距大小,丟掉了誰大誰小的方向資訊。要把方向找回來,就得回頭看 、 本身——這也是下面所有用法的共同起點。
在台股看 ADX 的訊號長相:以台積電為例
公式抽象,圖更直觀。下面這張圖把台積電(2330)2023-07 到 2024-06 約一年的走勢攤開:上半部是股價、標出兩個教科書派別的進出場箭頭,下半部是同期的 +DI(綠)、-DI(黃)與 ADX(藍)三條線,並畫出 ADX = 25 的趨勢門檻。

圖上兩個派別的買賣點規則不同:
- 趨勢派(圖中藍三角/紫倒三角):要
ADX > 25(趨勢夠強)且+DI > -DI(方向偏多)同時成立才進場,任一條件失效就出場。在這段一年窗裡進場 9 次、出場 8 次。 - 裸高 ADX 派(圖中紅三角/粉倒三角):只看
ADX > 25、完全不看方向就進場。同段窗進場 7 次、出場 6 次。
從這張圖能直觀看到三件事。第一,ADX 高的時候不一定該買:在下半部 ADX 衝高的區段,要再回頭確認 +DI 是否壓過 -DI,裸高 ADX 派少了這道確認,遇到強勢下跌段就會接刀。第二,訊號相當頻繁:一年內進出各 7-9 次,月再平衡換股時每次都要重新判斷,門檻附近反覆穿越就容易產生來回甩動(whipsaw)的假訊號。第三,ADX 反應偏慢:因為它是 DX 再做一次平滑,趨勢已經走一段,ADX 才確認上來——這也呼應前面公式說的「本質偏落後」。
想自己畫這張圖、把訊號看清楚,可以用 data.indicator 直接取得 ADX 與 +DI/-DI,再用簡單的布林邏輯標出兩派的進出場日:
顯示程式碼
import finlab
from finlab import data
# finlab 會在需要資料時自動引導登入
finlab.login()
# 取 DMI 體系三條線(皆 14 日)
adx = data.indicator("ADX", timeperiod=14)
plus_di = data.indicator("PLUS_DI", timeperiod=14)
minus_di = data.indicator("MINUS_DI", timeperiod=14)
# 鎖定台積電與示意窗
sid = "2330"
window = slice("2023-07-01", "2024-06-30")
adx_s = adx[sid].loc[window]
plus_s = plus_di[sid].loc[window]
minus_s = minus_di[sid].loc[window]
# 趨勢派:ADX > 25 且 +DI > -DI 才算「持有狀態」
trend_hold = (adx_s > 25) & (plus_s > minus_s)
# 裸高 ADX 派:只看 ADX > 25,不問方向
naked_hold = adx_s > 25
# 進場 = 由不持有翻成持有的那一天;出場 = 反向翻轉的那一天
def entries_exits(hold):
flips = hold.astype(int).diff()
entries = flips[flips == 1].index # 0 → 1
exits = flips[flips == -1].index # 1 → 0
return entries, exits
trend_entries, trend_exits = entries_exits(trend_hold)
naked_entries, naked_exits = entries_exits(naked_hold)
print("趨勢派 進場", len(trend_entries), "出場", len(trend_exits))
print("裸高 ADX 進場", len(naked_entries), "出場", len(naked_exits))把 trend_entries/naked_entries 標在股價上、把三條線畫在下方副圖,就是上面那張示意圖。光是單股、單窗就能看出訊號之密、以及「沒搭方向會誤判」的問題;把它放大到全市場、跑 11 年回測,差別會更明顯——這正是下一段要做的事。
直接選「ADX 最高的股票」,台股 11 年會發生什麼事
我們在可交易宇宙(60 日均成交金額前 300 大、收盤 > 10 元、60 日均量 > 100 萬股,排除 ETF、金融股、KY 股、處置股)裡,把幾種「ADX 選股」用法各跑一次月再平衡回測。研究段(2015-2021)結果如下:
| ADX 用法 | 研究段年化報酬 | 研究段月夏普 | 全期最大回撤 |
|---|---|---|---|
| 裸選 ADX 最高 30 檔(教科書用法) | 21.9% | 1.04 | -43.4% |
| 選 ADX 最低 30 檔(賭盤整反彈) | 3.6% | 0.28 | -46.2% |
| ADX 變化「速度」最高 30 檔 | — | 0.55 | — |
| ADX「加速度」最高 30 檔 | — | 0.61 | — |

兩個結論很清楚。
第一,裸選 ADX 最高的股票,報酬看似不差(年化 21.9%),代價卻是全期 -43.4% 的最大回撤。 原因正是前一段講的:ADX 不分方向,「ADX 最高」這個排序會把處於強勢下跌段的股票一起選進來。那些股票趨勢很強,只是方向朝下;月再平衡換股時剛好接到刀子,回撤自然深。
第二,反過來「選 ADX 最低的股票」想賭盤整後反彈,更是災難(年化僅 3.6%、夏普 0.28、回撤 -46.2%)。 台股的報酬集中在強趨勢端,弱趨勢均值回歸這條路在 ADX 上走不通。
我們也測了把 ADX 的「變化量」當訊號的角度——ADX 上升速度、加速度、z-score——研究段月夏普全落在 0.55-0.64 的弱區。道理是:ADX 本身已是 DX 的移動平均(二階平滑量),再對它取差分或標準化,只是放大噪音。ADX 適合拿「水準值」當濾網,不適合拿「變化量」當主因子。 各技術指標的正確用法與誤區,也可參考RSI、MACD、KD 比較。
對照之下,上圖最右邊那根才是本文後面要組出來的勝出策略:它把 ADX 強度、+DI/-DI 方向與廣度擇時三層疊起來,研究段月夏普約 1.08,明顯高於任何把 ADX 單獨當選股因子的用法——edge 不在「ADX 本身」,而在「怎麼把 ADX 擺對位置」。
ADX 的第一個正解:永遠搭 +DI/-DI 方向濾網
既然問題出在「ADX 不分方向」,最直接的修正就是把方向補回來——這也正是 DMI 體系本來就設計好的用法:ADX 看「強不強」、+DI/-DI 看「往哪走」。
我們在選股端加一道方向濾網:只在 ADX > 20(確認有趨勢)且 +DI > -DI(確認方向偏多)時,才從中選 ADX 最高的 30 檔。結果研究段年化從裸版的 21.9% 提升到 26.2%、月夏普從 1.04 升到 1.17,樣本外年化 31.1%。

這個修正有兩個訊號告訴我們它不是運氣:
- 跨門檻穩健:把強度門檻從 20 換成 25、30,研究段月夏普分別是 1.17、1.09、1.01,全部站得住——edge 跨多個門檻一致存在,符合 DMI 體系「強度配方向」的設計本意,而非單點過擬合。
- 同源方向訊號比外掛動能更乾淨:我們也試過改用「20 日報酬 > 0」當方向濾網(外掛一個動能因子),研究段月夏普 1.09、回撤 -43.5%,都比用 DMI 自身的 +DI/-DI(夏普 1.17、回撤 -42.0%)差一截。同一套體系內的 +DI/-DI 和 ADX 本就搭配,硬接外部因子反而不如原配。
不過有一個問題方向濾網解不了:加了方向濾網,全期最大回撤仍有 -42.0%。方向濾網解決了「買到強勢下跌股」的問題,卻沒解決「整個大盤系統性下跌時,連強勢上漲股也會一起被拖下水」的問題。要把回撤真正壓下來,得換一個層次來用 ADX。延伸閱讀:技術面與基本面選股的差異、動能策略。
ADX 最強的用法:用「ADX-DI 廣度」當大盤風控開關
這是本文的重點,也是目前中文搜尋結果裡,還沒有人用真實回測講清楚的角度。
單看一檔股票、甚至單看大盤指數的 ADX 高不高,雜訊很大。但如果改問一個橫截面的問題——「現在全市場有多少比例的股票,同時處於強勢『且』向上的趨勢?」——就得到一個平滑、有意義的大盤多空力道度量。我們稱它為 ADX-DI 廣度:計算交易池內「ADX > 25 且 +DI > -DI」的個股家數佔比。廣度高,代表多數個股結構偏多、是健康的多頭環境;廣度崩落,代表強勢上漲股集體消失、市場系統性轉弱。

把這個廣度做成風控開關:廣度 > 0.15 時持有前面那籃「強趨勢且向上」的 30 檔股票(risk-on);廣度 ≤ 0.15 時當日清空、全部持現金(risk-off)。效果立刻不同——全期最大回撤從裸選高 ADX 的 -43.4% 壓到 -31.3%、月夏普維持 1.06,樣本外年化 33.5%、夏普 1.22。

這個「用市場波動結構決定曝險」的邏輯,和學術上的波動度擇時一致——Moreira & Muir (2017) 在《Volatility-Managed Portfolios》證明:在風險惡化、波動升高時調降曝險,能顯著提升投資組合的夏普。ADX-DI 廣度正是一個可操作的「市場內部趨勢結構」訊號,它衡量的是強勢上漲股的集體存亡,而非任何單一價格。
順帶一提,選股端我們刻意用「買最強且向上的股票」,這和 Jegadeesh & Titman (1993) 的動能效應一致:過去的贏家在中期傾向繼續贏。從頭到尾,ADX 扮演的角色都是「確認趨勢強度」與「判斷市場 regime」,不是自己當選股因子。關於用大盤訊號降低回撤,也可參考市場濾網如何降低回撤與均線市場濾網。
完整策略:ADX 強度 × 方向 × 廣度擇時三層用法
把上面三個洞見組成一套可執行、可重現的策略:
- 選股(強度 × 方向):可交易宇宙中,先取
ADX(14) > 20(強趨勢)且+DI(14) > -DI(14)(方向偏多)者,再從中選 ADX 最高的 30 檔,等權持有。 - 風控訊號(ADX-DI 廣度):每日計算全市場「
ADX > 25且+DI > -DI」的個股家數佔比,當成市場「強勢上升趨勢廣度」。 - 擇時開關:廣度 > 0.15 → risk-on,持有上述 30 檔;廣度 ≤ 0.15 → risk-off,當日清空全部持股、持現金。
- 月再平衡。
核心程式碼(可直接交給你的 AI 助理改寫,或下載完整版執行):
顯示程式碼
import numpy as np
import pandas as pd
from finlab import data
from finlab.backtest import sim
# 載入價量資料
close = data.get("price:收盤價")
amount = data.get("price:成交金額")
# 可交易宇宙:成交額前 300 大、收盤 > 10 元,排除 ETF 與權證 / KY
liquidity = amount.rolling(60).mean()
is_common = pd.Series({s: str(s)[:4].isdigit() and not str(s).startswith("00")
for s in close.columns})
universe = liquidity.is_largest(300) & (close > 10) & is_common
# DMI 體系:ADX 量強度,+DI / -DI 量方向
adx = data.indicator("ADX", timeperiod=14)
plus_di = data.indicator("PLUS_DI", timeperiod=14)
minus_di = data.indicator("MINUS_DI", timeperiod=14)
# 選股籃:強趨勢(ADX > 20)且方向偏多(+DI > -DI),選 ADX 最高 30 檔
strong_and_bull = (adx > 20) & (plus_di > minus_di)
basket = adx.where(universe & strong_and_bull).rank(axis=1, ascending=False) <= 30
# ADX-DI 廣度:全市場「強勢上升趨勢股」的家數佔比
strong_up = ((adx > 25) & (plus_di > minus_di)).where(universe)
breadth = strong_up.sum(axis=1) / universe.sum(axis=1)
risk_on = breadth > 0.15 # 廣度 > 0.15 才持倉,否則清空持現金完整的廣度擇時套用與回測流程,請見文末可下載的 strategy.py。
這套策略全期(2015-2026)年化 25.5%、月夏普 1.06、月索提諾 1.86、最大回撤 -31.3%,風險調整後與回撤都優於含息 0050(年化 21.0%、夏普 1.05、回撤 -34.0%);樣本外(2022-2026)年化 33.5%、月夏普 1.22、回撤 -28.0%,沒有「研究段漂亮、樣本外崩掉」的過擬合徵兆。 年換手約 7.3 次,比裸選股的 8.7 次更低——廣度擇時在 risk-off 清倉、不頻繁換股,反而壓低了換手。
下面是完整互動式回測:月報酬熱力圖、權益曲線、年度績效都可以直接在文章裡操作:
參數最佳化:要找的是一片高原,不是一座孤峰
策略有兩個關鍵參數:ADX 的計算週期,以及廣度擇時的持倉門檻。很多人做參數最佳化的方式,是把所有組合都跑一遍、挑研究段數字最漂亮的那一格——這是過度最佳化(overfitting)最經典的陷阱:你挑到的很可能只是噪音湊出來的單一峰值,換到沒見過的資料就垮。
正確的做法是看「整片地形」。我們把 ADX 週期(10/14/20)和廣度門檻(0.10/0.15/0.20/0.25)做成 3×4 網格,每一格都真跑一次回測,用研究段月夏普做色溫圖:

看色溫圖的關鍵,是分辨「一片高原」和「一座孤峰」:
- 高原(穩健):ADX 週期 = 14 那一整欄,四個門檻的研究段月夏普分別是 1.27、1.08、1.37、1.18,整欄都是綠的、沒有一格崩到 1.0 以下。一整片相鄰參數都站得住,代表 edge 來自訊號本身,換個鄰近設定不會翻車——這才是可以放心拿來當預設的區域。
- 孤峰(過擬合警訊):左上角
週期 10 ×門檻 0.25研究段月夏普衝到 1.33,看似漂亮,但它的左右鄰居(同欄 0.20 只剩 0.66、同列週期 20 只剩 0.73)都崩掉了,自己孤零零一格高。更致命的是它樣本外直接垮到月夏普 0.90、年化 16.3%。單格高、四周低 = 它是運氣不是訊號,挑它就是過擬合。 - 兩端崩落:ADX 週期 10(太短、訊號雜)和週期 20(太長、太鈍)兩欄整體偏紅,再次說明 Wilder 原始建議的 14 日落在穩健帶的正中央。
所以我們不挑全網格最高的那一格,而是取穩健高原內的合理設定:

- 預設(週期 14、門檻 0.15,本文全篇採用):研究段月夏普 1.08、樣本外月夏普 1.22、最大回撤 -31.3%。
- 穩健最佳(週期 14、門檻 0.20,刻意排除掃描邊界與角落孤峰後,鄰域中位數最高的格):研究段月夏普 1.37、樣本外月夏普 1.10、最大回撤 -31.9%。
兩組合起來看就懂了:研究段月夏普從 1.08 拉到 1.37 看起來進步不小,但樣本外反而從 1.22 略降到 1.10、回撤幾乎沒變。換句話說,把參數「調得更漂亮」並沒有換到樣本外的真實提升——這正是過度最佳化的典型樣貌:研究段的超額幾乎都還給了樣本外。對一個落在穩健高原上的策略,週期 14 配 0.15 或 0.20 都是合理預設,差別在統計噪音範圍內,沒有免費的午餐。真正值得追求的,是整片參數都能用,而不是某一格特別神。
ADX 強趨勢池再疊月營收 YoY,有沒有加值?
技術面選股池如果再加一道基本面濾網,會不會更好?這是讀者很自然的下一個問題。我們在「ADX 強度×方向×廣度」這個多方池子裡,疊上月營收年增率(YoY)試兩種做法,看 Sharpe 與回撤有沒有改善。
回測只用當期(含)已公布的營收,避免用到未來資料的前視偏差。

| 做法 | 研究段月夏普 | 樣本外月夏普 | 樣本外年化 | 最大回撤 |
|---|---|---|---|---|
| ADX 強度×方向×廣度(基線) | 1.08 | 1.22 | 33.5% | -31.3% |
| 加「月營收 YoY > 0」過濾 | 1.03 | 1.25 | 37.1% | -30.8% |
| ADX × YoY 等權複合 | 1.00 | 1.20 | 30.2% | -33.9% |
結果是「小幅、不一致」:
- YoY > 0 過濾:研究段月夏普從 1.08 略降到 1.03,但樣本外月夏普從 1.22 升到 1.25、樣本外年化從 33.5% 升到 37.1%、回撤也從 -31.3% 微縮到 -30.8%。樣本外那一段確實小贏,但研究段反而小輸,方向不一致。
- ADX × YoY 等權複合:兩段都沒贏,研究段月夏普掉到 1.00、樣本外回撤還擴大到 -33.9%。把營收動能和趨勢強度直接等權相加,反而稀釋了原本乾淨的趨勢訊號。
整體判讀:月營收 YoY 對這套以趨勢為核心的策略,不是顯著的加分項。最好的版本(YoY > 0 過濾)在樣本外有一點點改善,但幅度落在參數噪音的量級,不足以宣稱基本面在這裡帶來穩定 edge。趨勢強度本身就已經隱含了「市場資金正在追捧」的資訊,再疊一個方向相近的營收動能,邊際貢獻自然有限。這個結果以圖表與上表的真實數字為準,我們不調參硬湊一個漂亮的複合策略。想看基本面選股單獨怎麼發揮,可參考技術面與基本面選股的差異。
回測方法與口徑
量化結論的可信度取決於方法,以下逐項交代:
- 交易成本:策略使用 finlab
sim(),台股預設已內扣手續費(本文以 0.1425% 打三折計)與賣出證交稅 0.3%。 - 滑價:未額外假設滑價,實際成交衝擊取決於資金規模與流動性。
- 股票池:上市櫃普通股,60 日均成交金額前 300 名、收盤 > 10 元、60 日均量 > 100 萬股。
- 排除類別:排除 ETF(代號 00 開頭)、權證/KY/特別股(非 4 碼純數字)、金融保險股、處置與全額交割股,以降低生存者偏差與不可交易標的污染。
- 前視偏差:ADX、+DI/-DI 與廣度均只使用當日(含)以前的價格;月頻再平衡,訊號於當期可得。
- 權重:選股籃等權、單一個股不另設上限;風控層為「持有/清倉」二元開關,無槓桿。
- 周轉率:年換手約 7.3 次(月再平衡 + 廣度切換),屬中等;風控在 risk-off 切換時會集中換手。
- 樣本內外:研究段 2015-2021、樣本外 2022-2026 分開回報,所有數字兩段都列,避免只報漂亮的一段。
穩健度
這套策略的 edge 不是靠單一參數湊出來的:
- 方向門檻穩健:強度門檻 20/25/30 三檔,研究段月夏普分別 1.17/1.09/1.01,是一片穩定高原,不是孤峰。
- 廣度門檻穩健:把廣度門檻從 0.10 一路掃到 0.30 連續測,最大回撤一律壓在 -26% ~ -38%、研究段月夏普 1.08-1.37、樣本外月夏普 1.06-1.28,沒有懸崖、沒有單點最佳——edge 出自訊號本身,不依賴某個神奇門檻。
- 不依賴特定籃子:把同一套廣度風控套在「裸選高 ADX」這個沒加方向濾網的籃子上,全期最大回撤一樣從 -43.4% 壓到 -31.9%、樣本外年化 28.2%。風控的價值來自 overlay 訊號本身,不是某個籃子的特例。
- 方向用法選擇有依據:DMI 自身的 +DI/-DI 方向濾網(研究段夏普 1.17、回撤 -42.0%)一致優於外掛動能方向濾網(夏普 1.09、回撤 -43.5%),跨變體穩定。
逐年表現:趨勢策略在哪種年份賺、哪種年份賠
ADX 本質是趨勢指標,這套策略也吃趨勢財。趨勢策略最大的特性是「報酬不平均」:趨勢清楚的大多頭年份賺很多,方向反覆的盤整年份報酬平平,系統性下跌的空頭年份則靠廣度風控少賠。把全期逐年報酬攤開,這個性格一目了然:
| 年份 | 策略報酬 | 當年大盤性格 |
|---|---|---|
| 2015 | -7.4% | 盤整偏弱 |
| 2016 | +17.5% | 緩多頭 |
| 2017 | +41.7% | 趨勢多頭 |
| 2018 | -6.2% | 年底急殺 |
| 2019 | +6.0% | 多頭但個股分化 |
| 2020 | +50.3% | 疫後強趨勢 |
| 2021 | +58.2% | 資金行情強趨勢 |
| 2022 | -27.2% | 系統性空頭 |
| 2023 | +86.4% | AI 帶動強趨勢 |
| 2024 | +8.8% | 高檔震盪 |
| 2025 | +33.3% | 趨勢多頭 |
| 2026(至 6 月) | +81.0% | 強趨勢 |
三種大盤狀態的對應很清楚:
- 強趨勢多頭年(2017/2020/2021/2023)是策略的甜蜜區,這幾年報酬都在 +40% 以上,2023 更達 +86.4%。原因是趨勢明確時,「選最強且向上」與「廣度高、滿倉」兩個機制同時站在順風面。
- 盤整/分化年(2019/2024)報酬平平(+6.0%/+8.8%)。方向反覆時 ADX 訊號容易門檻附近甩動,前面示意圖講的 whipsaw 在這種年份最傷,賺不多但也沒大賠。
- 空頭年(2022)是廣度風控真正發揮的地方:當年策略 -27.2%,雖然仍是負的,但廣度門檻在強勢上漲股集體消失時把曝險切掉,避免和裸用版一起探到 -43% 級的深淵。
這也解釋了為什麼全期年化 25.5% 不該被當成「每年都賺 25%」:它是被幾個強趨勢年拉上來的平均值,遇到 2022 那種空頭仍會吃虧。理解這個分布,才能對策略的回撤與波動有正確預期。關於用大盤訊號在空頭年降低曝險,延伸閱讀市場濾網如何降低回撤。
策略的限制與取捨
- 這是風險調整型策略,勝點在夏普與回撤而非絕對報酬:全期年化 25.5% 雖優於含息 0050 的 21.0%,但領先幅度有限,本策略並未通過我們設的「研究段 CAGR ≥ 35%」高報酬門檻。它真正的價值在「用 ADX 自身把最大回撤從裸用的 -43% 級壓到 -31%」,同時月夏普 1.06 與 0050 的 1.05 相當。單一指標策略要衝出極高 CAGR 本就極難,這套策略的定位是控風險。
- 最大回撤仍有 -31%:雖從裸用的 -43.4% 大幅改善,但 -31.3% 仍是顯著回撤。廣度擇時是「整籃清倉」的 regime 風控,不是個股停損;單一強趨勢股自身的崩跌,在清倉訊號觸發前仍會吃到。
- 樣本外比研究段更好,不宜外推:樣本外(2022-2026)年化 33.5% 高於研究段,部分可能受惠於該段台股趨勢結構特別清晰,不應外推「未來必有 33% 報酬」。
- 崩盤型態涵蓋有限:廣度門檻 0.15 為固定值,雖跨 0.10-0.30 穩健,但資料起點 2015,未對更早期(2008/2011)的崩盤型態做滾動測試,不保證對沒見過的型態同樣有效。
- 容量與成本:選股籃僅 30 檔、宇宙限前 300 大;廣度擇時的「集中清倉日」可能造成同向出場的衝擊成本,大資金部署需重估流動性與滑價,回測未逐筆估算成交衝擊。
自己跑一次
把下面這句話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:
用 AI 開始 FinLab
把這句話交給你的AI,它會帶你完成設定並做出第一個策略。
告訴你的AI:
「幫我設定 FinLab,做一個動能策略:https://finlab.finance/setup」
裝好之後,下載本文的 strategy.py 與 data.csv,即可在自己的環境重跑、改參數、換選股因子。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽與程式交易是什麼。
常見問題
Q:ADX 指標到底是什麼?和 DMI 有什麼關係? ADX 是 DMI(趨向指標)體系裡的一條線。DMI 由 +DI(上漲力道)、-DI(下跌力道)、ADX(趨勢強度)三條線組成。ADX 由 +DI 與 -DI 的差距算出 DX 再取移動平均,所以它只量「趨勢有多強」,方向要看 +DI 與 -DI 誰在上面。
Q:ADX 大於 25 就代表可以買進嗎? 不行。ADX > 25 只代表「現在有明確趨勢」,但不分上漲或下跌。一檔強力下跌的股票 ADX 一樣會超過 25。本文回測顯示,裸選 ADX 最高的股票全期最大回撤達 -43.4%,正是因為把強勢下跌股也買進來了。要判斷方向,必須再看 +DI 是否大於 -DI。
Q:ADX 參數要設多少?14 是最好的嗎? 14 日是 Wilder 的原始建議,也是本文用的設定。本文的結論對 ADX 強度門檻(20/25/30)不敏感,研究段月夏普都落在 1.0 以上。與其在參數上微調,不如先用對方法:搭方向濾網、再搭廣度風控。
Q:ADX 可以單獨拿來當選股因子嗎? 不建議。無論是選 ADX 最高(買到強勢下跌股)、選 ADX 最低(賭盤整反彈,年化僅 3.6%),還是用 ADX 的變化速度/加速度(夏普 0.55-0.64),在台股回測都站不住。ADX 適合當「方向確認的濾網」與「市場 regime 的風控訊號」,不是自己當主排序因子。
Q:為什麼要用「全市場廣度」而不是只看大盤指數的 ADX? 單一指數的 ADX 在盤整期雜訊大、來回甩動。全市場「強勢上升趨勢股佔比」是橫截面、平滑的多空力道度量,能在保住報酬的同時把回撤砍下來。本文也測過用固定均線對單一 0050 做擇時,會在研究段牛市嚴重踏空,效果遠不如廣度訊號。
Q:ADX 和 MACD、KD 一起用會更好嗎? ADX 和 MACD、KD 性質不同:ADX 量趨勢強度,MACD/KD 是擺盪/動能類。把性質重疊的擺盪指標硬疊在一起通常是負貢獻;比較有效的組合是「不同性質」的訊號搭配,例如動能(選股)+ ADX-DI 廣度(風控)。各指標的正確用法可參考RSI、MACD、KD 比較。
Q:這套策略適合誰? 適合想參與台股、但受不了 -45% 等級回撤的人:它用 ADX 自身的風控把回撤壓到 -31%,換到優於含息 0050 的風險調整報酬。不適合只追求最高絕對報酬、且能忍受深度回撤的人——那種需求在強多頭直接買進持有 0050 反而更省事。
Q:ADX 是領先指標還是落後指標? ADX 經過多次平滑(DX 再取移動平均),對價格變化反應偏慢,本質偏落後。這也是本文不拿它的「變化量」當訊號的原因——對一個已經平滑的量再取差分只會放大噪音。它的價值在「水準值」:當前趨勢強不強、市場廣度健不健康。
最後更新:2026-06|回測區間:2015-01 ~ 2026-06-09|作者:FinLab 量化研究團隊(經量化研究員審閱)
本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。ADX-DI 廣度風控策略全期最大回撤 -31.3%,實際交易前請自行評估風險、滑價與交易容量。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

