ADX 指標在台股的正確用法:量趨勢強度,不量方向
先用一張表回答你搜尋「ADX 指標」時最想知道的事(資料截至 2026-09-30):
| 你想知道的 | 本文用真實台股回測的回答 |
|---|---|
| ADX 指標是什麼 | DMI 體系的趨勢強度指標;ADX 是 DX 的平滑平均,只量趨勢「強度」,方向由 +DI/-DI 判斷 |
| ADX 高就該買嗎 | 不該直接買。選 ADX 最高 30 檔會把強勢下跌股也買進,全期最大回撤 -44.1% |
| ADX 該怎麼搭方向 | 配 +DI > -DI 方向濾網,研究段(2015–2021)月夏普 1.04 升到 1.17;但 2022 年起 1.06 對 1.00,沒有改善 |
| ADX 最有用的位置 | 當風控:可交易股票池內「強勢上升趨勢股佔比」當清倉開關,最大回撤 -41.9% 壓到 -31.3% |
| 完整策略效果 | 全期年化 23.2%、最大回撤 -31.3%,兩項勝過含息 0050(21.2%、-34.0%);月夏普 0.97 低於 0050 的 1.07 |
| 首發之後的新資料 | 2026-06-09 到 09-30 策略下跌 14.0%,同期 0050 上漲 8.9%;7 月單月 -22.3% |
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重現這篇文章,請讀:https://finlab.finance/setup?relatedUrl=/blog/adx-dmi-indicator-taiwan
若想比較ADX以外的選股規則,可看營收篩選創新高策略,核對股價新高、RSI 與營收條件如何形成持股。

本文所有數字皆出自 finlab 套件抓取的上市櫃真實價量資料(
price與etl:adj_close含息還原股價),回測區間 2015-01-30 至 2026-09-30,基準為同一天起算的含息 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:
逐個符號拆開來看:
- (正方向移動量)是今日高點比昨日高點多出的部分,(負方向移動量)是昨日低點比今日低點多出的部分;兩者只保留較大且為正的那一邊,另一邊歸零。它們各自衡量「向上」與「向下」的原始推力。
- 是 Wilder 平滑法,等同於平滑係數 的指數移動平均; 是用同一種平滑算出的 日平均真實區間(average true range)。把 +DM/-DM 除以 ,不同價位、不同波動的股票才能放在同一把尺上比較。
- 、 就是標準化後的上漲力道與下跌力道(乘 100 變成百分比刻度)。 代表多方占上風,反之空方占上風;方向資訊全藏在這兩條線的相對位置。
- 是 與 的「差距」除以「總和」。分子是絕對值 :上漲力道遠大於下跌、或下跌力道遠大於上漲, 都會很高。這是 ADX「不分方向」的數學根源。
- 是 再做一次 日平滑。多一層平滑讓讀數穩定,也讓它對轉折反應更慢,本質偏落後。
總結來說, 只用到 與 的差距大小,丟掉了誰大誰小的方向資訊。要把方向找回來,就得回頭看 、 本身,這也是下面所有用法的共同起點。
在台股看 ADX 的訊號長相:以台積電為例
公式抽象,圖更直觀。下面這張圖把台積電(2330)2023-07 到 2024-06 約一年的走勢攤開:上半部是股價、標出兩個教科書派別的進出場點,下半部是同期的 ADX(青色)、+DI(粉紅)與 -DI(淺綠)三條線,虛線是 ADX = 25 的趨勢門檻。

圖上兩個派別的買賣點規則不同(向上三角是進場、向下三角是出場;外框藍色是趨勢派、紫色是裸高 ADX 派):
- 趨勢派:要
ADX > 25(趨勢夠強)且+DI > -DI(方向偏多)同時成立才算持有,任一條件失效就出場。這一年進場 8 次、出場 8 次。 - 裸高 ADX 派:只看
ADX > 25、完全不看方向。同一段進場 6 次、出場 6 次。
這張圖呈現三件事。第一,ADX 高的時候不一定該買:裸高 ADX 派 6 次進場裡,2023-08-15 那一次進場當天 -DI 30.2、+DI 13.3,ADX 衝高來自下跌力道,股價從 542 元續跌到 9 月 26 日的 519 元,趨勢派那天沒有進場。第二,訊號相當頻繁:一年內進出各 6 到 8 次,門檻附近反覆穿越就會產生來回甩動(whipsaw)的假訊號;2024 年 4 月 19 日到 5 月 2 日,趨勢派兩週內出場三次、進場兩次。第三,ADX 反應偏慢:它是 DX 再平滑一次,2024 年 1 月 19 日股價從 588 元跳空到 626 元,ADX 到 1 月 24 日才站上 25。
想自己畫這張圖,可以用 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"
trend_hold = (adx[sid] > 25) & (plus_di[sid] > minus_di[sid]) # 趨勢派
naked_hold = adx[sid] > 25 # 裸高 ADX 派:不問方向
def entries_exits(hold, start="2023-07-01", end="2024-06-30"):
"""持有狀態 0 → 1 為進場、1 → 0 為出場,只取示意窗內的日期。"""
flips = hold.astype(int).diff().loc[start:end]
return flips[flips == 1].index, flips[flips == -1].index
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))執行會印出「趨勢派 進場 8 出場 8」與「裸高 ADX 進場 6 出場 6」。把進出場日標在股價上、三條線畫在下方副圖,就是上面那張示意圖。單股、單窗就能看出訊號之密與「沒搭方向會誤判」的問題;下一段把它放大到整個股票池、跑 11 年回測。
直接選「ADX 最高的股票」,台股 11 年會發生什麼事
我們在可交易宇宙(60 日均成交金額前 300 大、收盤 > 10 元、60 日均量 > 100 萬股,排除 ETF、金融保險股、處置與全額交割股,代號須為 4 碼數字)裡,把幾種「ADX 選股」用法各跑一次月再平衡回測,每種都等權持有 30 檔、不做擇時:
| ADX 用法 | 研究段年化 | 研究段月夏普 | 2022 年起年化 | 2022 年起月夏普 | 全期最大回撤 |
|---|---|---|---|---|---|
| ADX 最高 30 檔(教科書用法) | 21.9% | 1.04 | 29.2% | 1.06 | -44.1% |
| ADX 最低 30 檔(賭盤整反彈) | 3.8% | 0.29 | 4.2% | 0.37 | -46.5% |
| ADX 5 日變化量最大 30 檔 | 10.3% | 0.57 | 23.5% | 0.93 | -41.7% |
| ADX 加速度最大 30 檔 | 12.9% | 0.62 | 22.7% | 0.98 | -38.5% |
| ADX 60 日 z-score 最高 30 檔 | 12.3% | 0.65 | 17.7% | 0.79 | -43.1% |
| 含息 0050 買進持有 | 15.1% | 1.00 | 30.5% | 1.21 | -34.0% |

三個結論。
第一,選 ADX 最高的股票,報酬看似不差(研究段年化 21.9%),代價是全期 -44.1% 的最大回撤。 ADX 不分方向,「ADX 最高」這個排序會把處於強勢下跌段的股票一起選進來。月底換股時剛好接到正在加速下跌的股票,回撤自然深;這個籃子最深的一段跌在 2025 年 4 月。
第二,反過來選 ADX 最低的股票、賭盤整後反彈,研究段年化只有 3.8%、月夏普 0.29,2022 年起也只有約 4%。 台股的報酬集中在強趨勢端,弱趨勢均值回歸這條路在 ADX 上走不通。
第三,把 ADX 的變化量當訊號,研究段月夏普只有 0.57 到 0.65。 ADX 本身已經是 DX 的平滑值,再對它取差分或標準化,主要是在放大雜訊。2022 年起這三種用法的月夏普升到 0.79 到 0.98,仍低於 0050 的 1.21,最大回撤都比 -38% 更深。ADX 適合拿「水準值」當濾網,不適合拿「變化量」當主因子。 各技術指標的用法比較,也可參考RSI、MACD、KD 比較。
圖上「強度×方向×廣度擇時」那兩根,是本文後面要組出來的完整策略:研究段月夏普 1.08,比任何把 ADX 單獨當選股因子的用法都高;但 2022 年起只有 1.02,反而低於最單純的 ADX 最高 30 檔(1.06)與 0050(1.21)。它的優勢主要在回撤,後面幾段會逐層拆開。
ADX 的第一個正解:永遠搭 +DI/-DI 方向濾網
問題出在「ADX 不分方向」,最直接的修正就是把方向補回來,這也是 DMI 體系原本的用法:ADX 看「強不強」、+DI/-DI 看「往哪走」。
我們在選股端加一道方向濾網:只在 ADX > 20(確認有趨勢)且 +DI > -DI(確認方向偏多)的股票裡,選 ADX 最高的 30 檔。研究段年化從裸版的 21.9% 提升到 26.1%、月夏普從 1.04 升到 1.17,全期最大回撤由 -44.1% 小幅改善到 -41.9%。但 2022 年起,年化 27.4% 對裸版 29.2%、月夏普 1.00 對 1.06,方向濾網沒有帶來改善。

兩個檢查:
- 跨門檻:把強度門檻從 20 換成 25、30,研究段月夏普分別是 1.17、1.09、1.01,2022 年起是 1.00、0.99、0.95。門檻越高越差,沒有哪一格特別突出,20 是三者中最好的一格,但差距不大。
- 同源方向訊號比外掛動能好一些:改用「20 日報酬 > 0」當方向濾網(外掛一個動能因子),研究段月夏普 1.09、全期回撤 -43.5%、2022 年起月夏普 0.92,三項都比 DMI 自身的 +DI/-DI(1.17、-41.9%、1.00)差。
方向濾網解決了「買到強勢下跌股」的問題,全期最大回撤仍有 -41.9%:整個大盤系統性下跌時,強勢上漲股也會一起被拖下水。要把回撤壓下來,得換一個層次來用 ADX。延伸閱讀:技術面與基本面選股的差異、動能策略。
ADX 最有用的位置:用「ADX-DI 廣度」當清倉開關
單看一檔股票、甚至單看大盤指數的 ADX,雜訊很大。改問一個橫截面的問題:「現在股票池裡,有多少比例的股票同時處於強勢『且』向上的趨勢?」 就得到一個比較平滑的多空力道度量。我們稱它為 ADX-DI 廣度:可交易宇宙內「ADX > 25 且 +DI > -DI」的個股家數佔比(宇宙每天約 174 到 260 檔,中位數 228 檔)。廣度高,代表多數股票結構偏多;廣度崩落,代表強勢上漲股集體消失。

把這個廣度做成開關:每月最後一個交易日,廣度 > 0.15 就持有前面那籃「強趨勢且向上」的 30 檔股票;廣度 ≤ 0.15 就整籃清空、持現金。全期最大回撤從方向濾網版的 -41.9% 壓到 -31.3%,從裸選高 ADX 的 -44.1% 少了 12.8 個百分點。

這張拆解圖要看清楚兩件事:
- 廣度擇時降的是回撤,沒有提高全期月夏普。 加方向濾網後全期月夏普 1.01,再加擇時反而是 0.97,與裸籃相同。擇時讓策略在急跌段離場,也讓它錯過一部分反彈。
- 擇時也能單獨套在裸籃上:同一個開關套在沒有方向濾網的 ADX 最高 30 檔,全期最大回撤一樣從 -44.1% 壓到 -31.9%,代價是全期月夏普降到 0.86、研究段年化降到 16.4%。回撤控制來自開關本身,方向濾網負責選股品質,兩者分工。
這個開關每月只檢查一次。 廣度每天都算得出來,但回測和下載的程式碼都是月底讀一次。2015 年以來,日頻廣度 53 次跌到 0.15 以下,其中 35 次在月底前就回到門檻上方、從未執行;另外 18 次,從跌破到月底換股中位數隔 7.5 個交易日、最長 18 個交易日。全部 141 個換股月裡有 25 個月持現金(17.7%)。2026 年 7 月就是延遲的代價,下面的新資料段會拆開。
用市場結構決定曝險的想法,和 Moreira & Muir (2017) 在《Volatility-Managed Portfolios》的出發點相近:他們用前一個月的已實現變異數縮放股票曝險,發現能提高投資組合的夏普比率。ADX-DI 廣度量的是股票池裡強勢上升股的比例,和波動度是兩種訊號,本文也沒有驗證兩者等價;能借用的只是「風險升高時降曝險」這個方向,效果要看本文自己的回測。本文的開關提高了回撤控制,沒有提高全期夏普,這點和他們的結論不同。
我們也試過拿大盤自己的均線當開關:同一籃股票改成「0050 含息價站上自身 200 日均線才持股」,研究段年化只有 14.1%、月夏普 0.81,全期最大回撤 -42.8%,在 2015 到 2021 年的多頭裡經常空手;2022 年起年化 26.4%、月夏普 1.04,與廣度版相近。選股端用「買最強且向上的股票」,方向上接近 Jegadeesh & Titman (1993) 記錄的中期動能效應:過去 3 到 12 個月的贏家在之後幾個月傾向繼續贏。ADX(14) 反映的是大約一個月內的趨勢,比他們的形成期短,而文獻裡 1 個月形成期的報酬反而偏向反轉,所以這裡只是方向相近,不能拿他們的結果當本策略的證據。關於用大盤訊號降低回撤的其他做法,可參考市場濾網如何降低回撤。
完整策略:ADX 強度 × 方向 × 廣度擇時三層用法
把上面三個發現組成一套可執行、可重現的策略:
- 選股(強度 × 方向):可交易宇宙中,先取
ADX(14) > 20(強趨勢)且+DI(14) > -DI(14)(方向偏多)者,再從中選 ADX 最高的 30 檔,等權持有。 - 風控訊號(ADX-DI 廣度):每天計算宇宙內「
ADX > 25且+DI > -DI」的個股家數佔比。 - 擇時開關:每月最後一個交易日,廣度 > 0.15 → 持有上述 30 檔;廣度 ≤ 0.15 → 整籃清空、持現金。月中跌破門檻不會立刻出場。
- 月再平衡:月底產生訊號、下一個交易日收盤換股。
擇時開啟的月份,宇宙內同時符合 ADX > 25 且 +DI > -DI 的股票至少有 30 檔,所以選出的 30 檔一定都高於強度門檻 20。換句話說,在完整策略裡強度門檻設 15、20、25 結果完全相同,真正決定曝險的是廣度門檻。
選股與擇時訊號的核心程式碼如下(可直接交給你的 AI 助理改寫)。這裡的宇宙是簡化版:沒有均量門檻,也沒有排除金融股與處置股,選出的持股與廣度數值會和完整版不同,例如 2026-07-14 簡化版廣度 0.166、完整版 0.130。完整條件與回測在文末可下載的 strategy.py:
顯示程式碼
import numpy as np
from finlab import data
close = data.get("price:收盤價")
amount = data.get("price:成交金額")
# 可交易宇宙(簡化版):60 日均成交金額前 300 大、收盤 > 10 元,
# 只留代號剛好 4 碼數字、不是 00 開頭的股票
liquidity = amount.rolling(60, min_periods=20).mean()
common_cols = [
s for s in close.columns
if len(str(s)) == 4 and str(s).isdigit() and not str(s).startswith("00")
]
universe = (liquidity.is_largest(300) & (close > 10))[common_cols]
# DMI 體系:ADX 量強度,+DI/-DI 量方向
adx = data.indicator("ADX", timeperiod=14)[common_cols]
plus_di = data.indicator("PLUS_DI", timeperiod=14)[common_cols]
minus_di = data.indicator("MINUS_DI", timeperiod=14)[common_cols]
# 選股籃: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 廣度:宇宙內「ADX > 25 且 +DI > -DI」的股票比例
strong_up = ((adx > 25) & (plus_di > minus_di)).where(universe).astype(float)
breadth = strong_up.sum(axis=1) / universe.sum(axis=1).replace(0, np.nan)
risk_on = breadth > 0.15 # 換股日廣度 > 0.15 才持股,否則整籃清空持現金三段績效與同一天起算的含息 0050 並列如下(資料截至 2026-09-30):
| 區間 | 策略年化 | 策略月夏普 | 策略月索提諾 | 策略最大回撤 | 0050 年化 | 0050 月夏普 | 0050 月索提諾 | 0050 最大回撤 |
|---|---|---|---|---|---|---|---|---|
| 研究段 2015-01~2021-12 | 20.8% | 1.08 | 1.59 | -31.3% | 15.1% | 1.00 | 1.47 | -28.2% |
| 2022-01~2026-09 | 26.9% | 1.02 | 1.58 | -29.2% | 30.5% | 1.21 | 2.44 | -34.0% |
| 全期 2015-01~2026-09 | 23.2% | 0.97 | 1.46 | -31.3% | 21.2% | 1.07 | 1.85 | -34.0% |
讀法:研究段年化多出約 5.7 個百分點,月夏普與月索提諾領先,最大回撤比 0050 深約 3 個百分點;2022 年起年化 26.9% 落後 0050 的 30.5%,月夏普與月索提諾都輸,最大回撤則淺 4.8 個百分點。全期加總後,策略勝在年化報酬(23.2% 對 21.2%)與最大回撤(-31.3% 對 -34.0%);月夏普、月索提諾與年化波動(24.8% 對 19.8%)都輸給 0050。它是一套「回撤比 0050 淺、長期年化略高,但風險調整後不如 0050,2022 年以後報酬也落後」的趨勢策略。年換手約 7.45 次,低於裸選 ADX 最高 30 檔的 9.0 次,因為持現金的月份不換股。
完整互動式回測(月報酬熱力圖、權益曲線、年度績效):
參數最佳化:找一片站得住的高原,避開單一孤峰
策略最值得檢查的兩個參數,是 ADX 的計算週期和廣度擇時的門檻。把所有組合都跑一遍、挑研究段最漂亮的那一格,是過度最佳化(overfitting)最常見的陷阱:挑到的很可能只是雜訊湊出來的單一峰值,換到沒見過的資料就垮。
我們把 ADX 週期(10/14/20)和廣度門檻(0.10/0.15/0.20/0.25)做成 3×4 網格,每一格都用該設定重算選股籃與廣度、重跑回測,色溫填研究段月夏普:

看研究段,分辨「高原」和「孤峰」:
- 週期 14 那一欄最穩:四個門檻的研究段月夏普是 1.27、1.08、1.38、1.19,都在 1.0 以上。週期 10 與 20 兩欄 8 格裡有 7 格低於 1.0,Wilder 原始建議的 14 日落在研究段表現最好的那一欄。
- 左上角是孤峰:
週期 10 × 門檻 0.25研究段月夏普 1.34,但同欄 0.20 只有 0.67、同列週期 14 是 1.19。它在 2022 年起的月夏普只有 0.68、年化 11.6%,是整張網格 2022 年起最差的一格。
同一張網格換成看 2022 年起,排序幾乎翻過來:週期 20 那一欄四格是 1.02、1.03、1.24、1.13,是 2022 年起最好的一欄,研究段卻只有 0.73 到 0.97;週期 14 那一欄 2022 年起是 0.88、1.02、0.91、1.07。研究段挑出的最佳區域,在後來的資料裡沒有維持領先。
依首發時的規則(只在網格內部格取 3×3 鄰域中位數最高者),穩健格是週期 14、門檻 0.20:研究段月夏普 1.38,比預設的 1.08 高;2022 年起卻是 0.91,低於預設的 1.02;最大回撤 -31.9% 與預設的 -31.3% 幾乎相同。把參數「調得更漂亮」沒有換到 2022 年起的提升,本文維持 6 月定案的週期 14、門檻 0.15。
下圖把其餘參數固定、一次只動一個,與預設值並排,藍色是研究段、紫色是 2022 年起:

10 個單參數變化(週期 10/20、強度門檻 15/25、持股 20/40 檔、廣度用的 ADX 門檻 20/30、廣度門檻 0.10/0.20)的研究段月夏普落在 0.88 到 1.38,2022 年起落在 0.86 到 1.03,只有 3 個在 2022 年起站上 1.0(週期 20,以及結果與預設完全相同的強度門檻 15、25)。研究段越高的設定,2022 年起往往越低:廣度門檻 0.10、0.20 與廣度用的 ADX 門檻 20、30,研究段都在 1.24 以上,2022 年起都在 0.91 以下。如果你看到某個最佳化「換個參數夏普就從 0.9 跳到 1.4」,那通常是踩到過擬合的地雷。延伸可看策略最佳化會不會過擬合。
回測方法與口徑
量化結論的可信度取決於方法,以下逐項交代:
- 交易成本:策略使用 finlab
sim(),台股預設已內扣手續費(本文以 0.1425% 打三折計)與賣出證交稅 0.3%。 - 滑價:未額外假設滑價,實際成交衝擊取決於資金規模與流動性。
- 股票池:上市櫃普通股,60 日均成交金額前 300 名、收盤 > 10 元、60 日均量 > 100 萬股,每天依當時資料篩選,約 174 到 260 檔。
- 排除類別:排除 ETF(代號 00 開頭)、代號不是剛好 4 碼數字者(權證、特別股、6 碼代號)、金融保險股、處置與全額交割股。KY 股的代號也是 4 碼數字,沒有被排除。
- 生存者偏差:價格資料保留了後來下市或停止交易的股票(2015-01-30 有收盤價、2026-09-30 已無收盤價的 4 碼代號個股共 142 檔,含本來就不在股票池內的金融股),沒有只用今天還存在的股票回推。
- 前視偏差:ADX、+DI/-DI 與廣度均只使用當日(含)以前的價格;月底產生訊號、下一個交易日收盤換股。月營收搭配只用已公布的資料,見後面的月營收段。
- 擇時執行頻率:廣度只在每月最後一個交易日讀取(53 次跌破、35 次未執行、18 次中位數延遲 7.5 個交易日),實際交易若改成每日檢查,結果會不同,本文沒有回測日頻版本。
- 權重與持股數:選股籃等權,單一個股不另設上限;擇時開啟的 116 個月每月都滿 30 檔,另 25 個月整籃持現金,無槓桿。
- 周轉率:年換手約 7.45 次(月再平衡加擇時切換),清倉與回場的月份會集中換手。
- 基準口徑:含息 0050 用
etl:adj_close還原價買進持有純算術計算,不含交易成本,從策略第一個淨值日 2015-01-30 起算;2022 年起那一段兩者都從 2022 年第一個交易日起算。本文所有對照組(教科書用法、方向濾網、網格、鄰格)的第一個淨值日都是 2015-01-30。 - 樣本內外:研究段 2015-2021、2022-01 至 2026-09 分開回報。參數在 2026 年 6 月定案,當時的篩選同時看了研究段與 2022 年以後的成績,所以 2022 年起這段嚴格來說是「選參數時看過的驗證段」;完全沒看過的資料只有 2026-06-09 之後的近四個月,結果見下面的新資料追蹤。
穩健度
下面說的「過門檻」,指研究段年化 ≥ 25%、月夏普 ≥ 1.2,且 2022 年起年化 ≥ 15%、月夏普 ≥ 1.0,這是 2026 年 6 月定案時整個技術指標系列用的同一組標準。完整策略的研究段年化 20.8%、月夏普 1.08,從首發起就沒有通過研究段門檻;2022 年起年化 26.9%、月夏普 1.02,剛好站在 1.0 之上。
- 廣度門檻 0.10 到 0.30:5 個門檻的研究段月夏普 1.08 到 1.38,2022 年起 0.88 到 1.15,全期最大回撤 -26.1% 到 -37.9%。門檻越高回撤越淺,但年化也跟著降(0.30 全期年化 16.0%)。
- 持股檔數:20 檔研究段年化 24.3%、月夏普 1.16,2022 年起月夏普 0.98;40 檔研究段年化掉到 16.1%、月夏普 0.90。持股越集中研究段越好,2022 年起差異不大。
- 廣度用的 ADX 門檻:從 25 改成 20 或 30,研究段月夏普升到 1.24、1.28,2022 年起降到 0.88、0.90。
- 方向濾網的選擇:DMI 自身的 +DI/-DI(研究段 1.17、回撤 -41.9%)在三項指標上都優於外掛 20 日動能(1.09、-43.5%)。
- 10 個單參數變化沒有一個四項門檻全過。
ADX 強趨勢池再疊月營收 YoY,有沒有加值?
技術面選股池再加一道基本面濾網,會不會更好?我們在完整策略的選股池裡疊上月營收年增率(YoY),試兩種做法:
- 選股前多一道「當期月營收 YoY > 0」過濾,再選 ADX 最高 30 檔。
- ADX 排名百分位與 YoY 排名百分位各占一半,合成複合分數後選前 30 檔。
月營收以法定公布截止日(次月 10 日)生效,公布日若落在非交易日就順延到下一個交易日(2015 年以來的資料沒有這種情況),只用當時已公布的資料,避免前視偏差。

| 做法 | 研究段月夏普 | 2022 年起月夏普 | 2022 年起年化 | 全期年化 | 最大回撤 |
|---|---|---|---|---|---|
| ADX 強度×方向×廣度(基線) | 1.08 | 1.02 | 26.9% | 23.2% | -31.3% |
| 加「月營收 YoY > 0」過濾 | 1.04 | 1.07 | 30.4% | 24.4% | -30.8% |
| ADX × YoY 等權複合 | 1.00 | 0.95 | 22.8% | 21.1% | -33.6% |
結果是「小幅、不一致」:
- YoY > 0 過濾:研究段月夏普從 1.08 降到 1.04,2022 年起從 1.02 升到 1.07、年化從 26.9% 升到 30.4%,最大回撤也從 -31.3% 微縮到 -30.8%。2022 年起小贏,研究段小輸,方向不一致。
- 等權複合:兩段都沒贏,研究段降到 1.00、2022 年起 0.95、回撤擴大到 -33.6%。把營收動能和趨勢強度直接相加,稀釋了原本的趨勢訊號。
月營收 YoY 對這套以趨勢為核心的策略不是穩定的加分項。最好的版本在 2022 年起有改善,但研究段變差,幅度與上面參數變化造成的差異同一個量級,不足以宣稱基本面在這裡帶來穩定優勢,所以本文主策略不加營收。想看基本面選股單獨怎麼發揮,可參考技術面與基本面選股的差異。
逐年表現:趨勢策略在哪種年份賺、哪種年份賠
ADX 是趨勢指標,這套策略也吃趨勢財。把每一個年度單獨結算、和同一天起算的含息 0050 對照(2015 年自 1 月 30 日起,2026 年截至 9 月 30 日):
| 年度 | 策略報酬 | 含息 0050 | 勝過 0050? |
|---|---|---|---|
| 2015(1/30 起) | -6.1% | -7.9% | 是 |
| 2016 | +17.5% | +19.6% | 否 |
| 2017 | +41.7% | +18.1% | 是 |
| 2018 | -6.0% | -4.9% | 否 |
| 2019 | +6.0% | +33.5% | 否 |
| 2020 | +50.3% | +31.1% | 是 |
| 2021 | +58.2% | +21.9% | 是 |
| 2022 | -27.2% | -21.4% | 否 |
| 2023 | +86.4% | +27.5% | 是 |
| 2024 | +8.9% | +48.6% | 否 |
| 2025 | +33.3% | +36.8% | 否 |
| 2026(截至 9/30) | +55.7% | +74.3% | 否 |
12 個年度區間有 5 個勝過 0050,領先集中在 2017、2020、2021、2023 四年(分別多 23.6、19.2、36.3、58.9 個百分點)。2019 年與 2024 年是多頭但個股分化,策略分別落後 27.5、39.7 個百分點;2022 年空頭策略跌 27.2%,比 0050 多跌 5.8 個百分點;同一籃不做擇時是 -30.1%,廣度擇時讓這一年少跌 2.9 個百分點,仍沒能跑贏 0050。擇時也有代價:2019 年不擇時的同一籃賺 23.7%,擇時版只有 6.0%。2024 年起連續三個年度區間落後。
全期年化 23.2% 不代表每年都賺 23%:它是被幾個強趨勢年拉上來的平均,碰到分化或空頭的年份會明顯落後。
首發後的新資料:2026-06-09 之後
本文首發版的資料截至 2026-06-09,參數也在那時定案。從那天到 2026-09-30,策略下跌 14.0%,同期含息 0050 上漲 8.9%。分段拆開如下:
| 區間 | 策略 | 含息 0050 |
|---|---|---|
| 2026-06-09~06-30 | +7.3% | +4.2% |
| 2026 年 7 月 | -22.3% | -4.0% |
| 2026 年 8 月 | +3.2% | +3.3% |
| 2026 年 9 月 | 0.0% | +5.5% |
四段連乘約等於上面的區間報酬,虧損集中在 7 月。6 月底廣度 0.272、在門檻之上,選出的 30 檔在 7 月 1 日買進、8 月 3 日出場,其中 26 檔虧損,逐檔報酬中位數 -17.7%,跌最深的國巨(2327)-51.6%。同一個月 0050 只跌 4.0%,虧損來自策略持有的那一群強勢股同步回檔。
這次虧損和擇時的執行頻率直接相關。廣度在 7 月 14 日收在 0.130,第一次低於 0.15,之後一路下滑,但回測要等到 7 月 31 日的月底訊號、8 月 3 日收盤才清倉。從跌破前一天 7 月 13 日收盤到 8 月 3 日出場,策略淨值下跌 15.5%,同期 0050 跌 3.2%;7 月 30 日的低點比 6 月 22 日的高點低 29.2%。8 月底廣度 0.12 仍在門檻下,9 月整月持現金,0050 同期上漲;9 月底廣度回到 0.222,10 月才重新持股。從出場到 9 月底,策略持平,0050 上漲 9.9%。研究段最差的單月是 2015 年 7 月的 -15.2%,2022 年起在此之前最差的是 2022 年 9 月的 -12.7%;2026 年 7 月的 -22.3% 是整段回測最差的單月。
延長資料後,2022 年起的月夏普由 1.22 降到 1.02、年化由 33.5% 降到 26.9%,仍在這類策略設定的 1.0 與 15% 之上,所以參數維持 2026 年 6 月的設定,數字全部換成新資料重跑的結果,並加上這段新資料追蹤。但真正沒看過的這近四個月,策略落後 0050 22.9 個百分點,2022 年起的月夏普只比 1.0 高 0.02,下一次季度重跑會把 2026 年第四季補進這張表。
2026-10 更新與更正:資料延長到 2026-09-30,2026-10-24 用 finlab 2.2.16 重跑。把資料截止日設回上一版的 2026-06-09 另外完整重跑一次,完整策略研究段 20.84%/月夏普 1.08、2022 年起 33.53%/1.22、全期 25.51%/1.06,與上一版的 20.81%/1.08、33.5%/1.22、25.51%/1.06 差距在 0.03 個百分點以內,本次的變化來自新增的資料。其餘對照組同截止日重跑多數只差 0.01 到 0.02;差距較大的包括 2015 年度報酬(-7.4% 變 -6.1%)、ADX 最高 30 檔的全期最大回撤(-43.4% 變 -44.1%)、ADX 最低 30 檔的研究段年化(3.6% 變 3.8%)與最大回撤(-46.2% 變 -46.5%)、裸籃加擇時的 2022 年起年化(28.2% 變 27.9%)、廣度門檻 0.25 的 2022 年起月夏普(1.28 變 1.40)、月營收 YoY 過濾的 2022 年起年化(37.1% 變 37.5%)與等權複合的最大回撤(-33.9% 變 -33.6%),可能來自套件版本更新或歷史資料修補,本文沒有逐項拆解。另有以下更正:
- 上一版的含息 0050 從 2015-01-05 起算,但策略的第一個換股淨值日是 2015-01-30,0050 在這中間上漲 2.2%;本版改為同一天起算,以 2026-06-09 為截止日,0050 全期年化由 20.98% 變為 20.89%、研究段由 15.29% 變為 15.09%。
- 上一版可下載的
strategy.py用最新版 finlab 執行會在計算廣度時因分母為零中斷;只修這一處後,它從 2007-05-31 就開始持股、一路跑到最新資料,宇宙也少了 60 日均量門檻;程式本身只印從 2007 年起算的全期統計(年化 17.25%),把它的淨值曲線切出 2015 至 2021 年段是 19.84%/月夏普 1.08,對不上文章。檔案說明寫裸選高 ADX「最大回撤一路探到 -70%」,是從資料起點 2007 年起算、含 2008 年金融海嘯的數字(以 2026-06-09 資料重算為 -70.6%),與文中從 2015 年起算的口徑不同。現在strategy.py與data.csv都與本文策略同一套邏輯,執行會印出三段績效、教科書用法對照、零件拆解、逐年報酬與 7 月起的逐月報酬。 - 上一版頁內第二段程式碼在最新版 finlab 也會因同一個分母為零而中斷,本版改用欄位篩選並避開除以零;第一段程式碼只用示意窗內的資料判斷進出場,執行印出的是 8/8 與 6/6,文章卻寫 9/8 與 7/6(文章數字來自另一支把窗口第一天算成進場的程式),本版兩者統一為完整歷史計算後的 8/8 與 6/6。
- 上一版寫可交易宇宙「排除 KY 股」,實際沒有排除;宇宙判斷代號只看前 4 碼是不是數字,特別股 2882A 曾出現在日頻選股籃,但從未落在月底換股日,回測數字不受影響,本版改為代號必須剛好 4 碼數字。
- 上一版寫廣度跌破門檻時「當日清空」持股、廣度是「全市場」的比例;回測其實每月只在換股日讀取一次,廣度也是可交易宇宙內的比例,本版改寫並補上月頻落差的統計。
- 上一版的限制段寫本策略沒通過「研究段年化 ≥ 35%」的門檻,實際用的門檻是研究段年化 ≥ 25%、月夏普 ≥ 1.2,以及 2022 年起年化 ≥ 15%、月夏普 ≥ 1.0。
- 常見問題裡「用 0050 均線擇時會踏空」的說法,上一版沒有附數字,本版補上 200 日均線版的回測。
三項穩健性驗證:重跑到 2026 年 10 月
這裡驗證本文的完整策略:ADX(14) 大於 20 且 +DI 大於 -DI 的股票裡取 ADX 最高 30 檔等權,股票池內 ADX-DI 廣度不到 0.15 時整籃清空,每月換股。我們在 2026-10-27 用本文附的 strategy.py(把 DATA_END 改成 None,finlab 2.2.20,資料截至 2026-10-27)重跑三項檢查,統一採 sim() 預設手續費 0.1425% 與證交稅 0.3%;原程式手續費三折的結果另列於成本對照表。「贏」指日夏普高於同期 0050 含息買進持有(etl:adj_close 還原價、純算術計算、不扣成本)。兩邊日夏普皆為日報酬平均除以標準差、乘上 √252,不扣無風險利率。
| 檢查 | 標準 | 結果 |
|---|---|---|
| 鄰近參數 | ADX/DI 週期(11、14、17)乘上持股檔數(25、30、35),9 組至少 7 組贏 | 0/9 組贏,不過 |
| 前後兩段 | 2015-01-30 到 2020-12-11、2020-12-14 到 2026-10-27 兩段都贏 | 前段 0.67 對 0.89,後段 1.10 對 1.24,不過 |
| 交易成本 | 原參數、sim() 預設成本 |
日夏普 0.91 對 1.08,不過 |

9 組參數的日夏普(括號內是年化報酬,粗體是原文參數):
| 持股檔數 \ ADX/DI 週期 | 11 | 14 | 17 |
|---|---|---|---|
| 35 | 0.72(年化 15.3%) | 0.85(年化 18.7%) | 0.83(年化 18.2%) |
| 30 | 0.75(年化 16.3%) | 0.91(年化 20.9%) | 0.85(年化 19.1%) |
| 25 | 0.69(年化 15.1%) | 0.88(年化 20.4%) | 0.86(年化 19.8%) |
前後兩段與全期:
| 期間 | 策略年化 | 策略日夏普 | 0050 含息年化 | 0050 日夏普 |
|---|---|---|---|---|
| 前段 2015-01-30 到 2020-12-11 | 12.0% | 0.67 | 13.5% | 0.89 |
| 後段 2020-12-14 到 2026-10-27 | 30.1% | 1.10 | 28.0% | 1.24 |
| 全期 2015-01-30 到 2026-10-27 | 20.9% | 0.91 | 20.5% | 1.08 |
前後兩段是把整段期間從中點對半切。上文的研究段與樣本外以 2022 年初為界,照這個切法,2015 到 2021 年日夏普 0.90 對 0050 的 0.96,2022 年起 0.95 對 1.22。上文多用月夏普,跟這裡的日夏普算法不同,數字不能直接比。
交易成本對照(原參數):
| 成本設定 | 年化 | 日夏普 | 最大回撤 |
|---|---|---|---|
| 不扣成本 | 26.4% | 1.10 | -29.0% |
sim() 預設:手續費 0.1425%、證交稅 0.3% |
20.9% | 0.91 | -32.5% |
| 原文設定:手續費打三折 | 22.7% | 0.98 | -31.3% |
| 0050 含息買進持有(同期) | 20.5% | 1.08 | -34.0% |
重跑到 2026-10-27,原參數年化 20.9%、日夏普 0.91、最大回撤 -32.5%;同期 0050 含息年化 20.5%、日夏普 1.08、最大回撤 -34.0%。9 組鄰近參數全部輸,原參數已經是 9 組裡最好的一格,ADX 週期縮短到 11 日時日夏普掉到 0.75 以下;前段(2015 到 2020 年)日夏普 0.67 對 0.89、後段 1.10 對 1.24,兩段都輸,三項都不成立。跟上文的結論一致:廣度清倉讓回撤比 0050 淺一點,風險調整後的報酬沒有勝過 0050。上文的年化 23.2% 是資料到 2026-09-30、手續費打三折的結果;照三折跑到 2026-10-27 是 22.7%,換成 sim() 預設成本是 20.9%。
策略的限制與取捨
- 勝點在回撤,風險調整後不如 0050:全期年化 23.2% 雖高於含息 0050 的 21.2%,但月夏普 0.97 低於 0050 的 1.07、年化波動 24.8% 高於 19.8%。它真正的作用是把 ADX 選股的最大回撤從 -44% 級壓到 -31%,這仍然比 0050 的 -34.0% 淺;如果你在意的是每單位風險的報酬,2022 年以後直接持有 0050 表現更好。
- 最大回撤仍有 -31%:廣度擇時是「整籃清倉」的大盤層級開關,沒有個股停損;而且每月只檢查一次,像 2026 年 7 月那樣月中急跌,要等到月底才出場。
- 2022 年起落後 0050:2022 年起年化 26.9% 對 0050 的 30.5%,月夏普 1.02 對 1.21,2024 年起連續三個年度區間落後。研究段的領先沒有延續到之後的資料。
- 崩盤型態涵蓋有限:回測從 2015 年起算。以 2026-06-09 資料、首發版宇宙口徑從資料起點 2007 年起算的對照,同一套策略含 2008 年在內的最大回撤仍是 -31.3%,但參數是在 2015 年後的資料上選的,不保證對沒見過的型態同樣有效。
- 容量與成本:選股籃 30 檔、宇宙限前 300 大;清倉與回場的月份會同向集中成交,大資金部署需重估流動性與滑價,本文未估算策略容量。
自己跑一次
把下面這句話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:
裝好之後,下載本文的 strategy.py 與 data.csv,即可在自己的環境重跑、改參數、換選股因子。strategy.py 的資料截止日釘在 2026-09-30,改成 None 就會用最新資料重跑;登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。同一套「指標選股加股票池廣度擇時」的做法,也可以對照OBV 能量潮與布林通道的季度重跑結果;想延伸成更完整的量化流程,可參考量化交易總覽與程式交易是什麼;想對照其他指標,見常用技術指標台股 11 年回測總覽。
常見問題
Q:ADX 指標到底是什麼?和 DMI 有什麼關係? ADX 是 DMI(趨向指標)體系裡的一條線。DMI 由 +DI(上漲力道)、-DI(下跌力道)、ADX(趨勢強度)三條線組成。ADX 由 +DI 與 -DI 的差距算出 DX 再做平滑,所以它只量「趨勢有多強」,方向要看 +DI 與 -DI 誰在上面。
Q:ADX 大於 25 就代表可以買進嗎? 不能直接這樣用。ADX > 25 只代表「現在有明確趨勢」,不分上漲或下跌,一檔強力下跌的股票 ADX 一樣會超過 25。本文回測顯示,選 ADX 最高的 30 檔股票全期最大回撤達 -44.1%,原因就是把強勢下跌股也買進來了。要判斷方向,必須再看 +DI 是否大於 -DI。
Q:ADX 參數要設多少?14 是最好的嗎? 14 日是 Wilder 的原始建議,也是本文用的設定。網格裡週期 14 那一欄的研究段月夏普四格都在 1.0 以上,週期 10、20 多數在 1.0 以下;但 2022 年起週期 20 反而表現較好,14 是研究段的最佳區域,2022 年起則由 20 領先。強度門檻 20/25/30 在不做擇時時研究段月夏普 1.17/1.09/1.01;加上廣度擇時後,強度門檻 15 到 25 結果完全相同。與其微調參數,不如先用對方法:搭方向濾網、再搭廣度風控。
Q:ADX 可以單獨拿來當選股因子嗎? 不建議。選 ADX 最高會買到強勢下跌股(最大回撤 -44.1%),選 ADX 最低賭盤整反彈研究段年化只有 3.8%,用 ADX 的變化速度、加速度或 z-score 研究段月夏普只有 0.57 到 0.65。ADX 比較適合當「方向確認的濾網」與「市場狀態的風控訊號」。
Q:為什麼要用「股票池廣度」,不改用大盤指數或 0050 的均線? 單一指數的訊號在盤整期雜訊大、來回甩動。本文測過同一籃股票改用「0050 站上 200 日均線才持股」,研究段年化只有 14.1%、月夏普 0.81,全期最大回撤 -42.8%,在 2015 到 2021 年的多頭裡經常空手;廣度版同期研究段年化 20.8%、最大回撤 -31.3%。2022 年起兩者的月夏普相近(1.04 對 1.02)。
Q:ADX 和 MACD、KD 一起用會更好嗎? ADX 和 MACD、KD 性質不同:ADX 量趨勢強度,MACD/KD 是擺盪或動能類。本文沒有回測 ADX 與 MACD、KD 的組合;比較有根據的搭法是讓不同性質的訊號各司其職,例如本文用 ADX 加方向選股、用 ADX-DI 廣度控制曝險。各指標的用法可參考RSI、MACD、KD 比較。
Q:這套策略適合誰? 適合想參與台股個股趨勢、但希望最大回撤比 0050 淺的人:全期最大回撤 -31.3%,0050 是 -34.0%。不適合追求最佳風險調整報酬的人,2022 年以後直接持有 0050 的年化與月夏普都更好;也不適合無法接受單月 -22% 的人,2026 年 7 月就是實例。
Q:ADX 是領先指標還是落後指標? ADX 經過兩層平滑(先平滑 DM 與真實區間,再平滑 DX),對價格變化反應偏慢,本質偏落後。這也是本文不拿它的「變化量」當主訊號的原因。它的價值在「水準值」:當前趨勢強不強、股票池裡強勢上升的股票多不多。
最後更新:2026-10|回測區間:2015-01-30 ~ 2026-09-30(2026-10-24 以 finlab 2.2.16 重跑)|作者:FinLab 量化研究團隊(經量化研究員審閱)
本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。ADX-DI 廣度風控策略全期最大回撤 -31.3%、2026 年 7 月單月 -22.3%,實際交易前請自行評估風險、滑價與交易容量。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

