ATR 指標在台股的正確用法:拆成低波選股池、反波動加權與廣度風控
散戶最熟的 ATR 用法是「股價跌破最近高點減 2 倍 ATR 就停損」。但把這個規則放進台股、套在月頻選股籃子上做 11 年回測(2015-2026),結果是觸發率只有 0.1%、對最大回撤幾乎零貢獻——停損還沒碰到,下個月就已經重新選股了。問題不在 ATR,而在用錯地方:它本來就不是抓個股出場點的工具。用 finlab 套件抓的上市櫃真實價量資料攤開來看,ATR 真正有價值的角色是「風險底盤」,可以拆成三個各司其職的零件:第一個是「低波池」,用 NATR(ATR 除以收盤價)把波動最高的個股砍掉、只在低波的 58% 池裡選股;第二個是「反波動加權」,池內持股以 1/NATR³ 強反波動加權,讓低波股拿到極高權重;第三個是「ATR 廣度風控」,每天統計池內波動正在上升的個股比例,當多數股波動同步抬升(系統性風險升溫)時整體部位減碼。把這三個零件疊上多窗動能、集中持有 6 檔,組成一套完全不含基本面的純技術策略。這套「ATR 三重風控策略」研究段(2015-2021)年化 27.7%、月 Sharpe 1.26,樣本外(2022-2026,截至 2026-06)年化 26.0%、月 Sharpe 1.06,全期(2015-2026)年化 26.8%、月 Sharpe 1.13,全期最大回撤 -41.27%——三段報酬都明顯高於含息 0050(全期年化 21.0%、Sharpe 1.05、回撤 -34.0%),代價是集中 6 檔的回撤比 0050 深,已用 ATR 廣度減碼把樣本外回撤從 -44% 收到 -41%。
先用一張表回答你搜尋「ATR 指標」時最想知道的事:
| 你想知道的 | 本文用真實台股回測的回答 |
|---|---|
| ATR 是什麼 | Average True Range,平均真實波幅,衡量個股「最近一天大概震盪多少」的波動度指標,只看幅度、不看方向 |
| ATR 移動停損有用嗎 | 套在月頻低波籃子上幾乎無感:2 倍 ATR 停損在持有段觸發率僅 0.1%,對回撤零改善 |
| 高 ATR 的股票報酬比較高嗎 | 不是。最高波 40% 全期年化 16.62% 看似有,但 Sharpe 只 0.66、最大回撤 -47.23%——高 ATR 是風險 |
| 那 ATR 該怎麼用 | 反過來用:低 NATR 取低波池當選股濾網、1/NATR³ 反波動加權做部位控制、ATR 廣度當大盤風險開關 |
| 效果如何 | 低波池 + 1/NATR³ 加權 + ATR 廣度風控 + 多窗動能集中 6 檔,全期年化 26.8%、月 Sharpe 1.13,三段都勝含息 0050 |

本文所有數字皆出自 finlab 套件抓取的上市櫃真實價量資料(
price與etl:adj_close含息還原股價),回測區間 2015-01 至 2026-06-09,基準為含息 0050。文末附可下載的strategy.py與data.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼。
ATR 是什麼
ATR(Average True Range,平均真實波幅)是技術分析大師 J. Welles Wilder Jr. 在 1978 年的《New Concepts in Technical Trading Systems》中提出的波動度指標。它先算「真實波幅(True Range)」——取「今日最高減最低」「今日最高減昨收(絕對值)」「今日最低減昨收(絕對值)」三者的最大值,把跳空也納進來;再對 True Range 取 N 日(常用 14 日)平均,就是 ATR。技術指標的基礎名詞可參考名詞詞彙表。
關鍵認知:ATR 只衡量「波動幅度」,完全不含方向。 ATR 高,代表這檔股票最近一天震盪劇烈,可能漲很多、也可能跌很多;ATR 低,代表它走得溫吞。所以 ATR 本質上是一個「風險溫度計」,不是「報酬訊號」。這個性質決定了它該怎麼用,也是本文所有結論的源頭。
實務上要跨個股比較波動度,ATR 的絕對值會失真——一檔 500 元的股票 ATR 自然比一檔 20 元的大。所以我們用標準化後的版本:
NATR(Normalized ATR):NATR = ATR ÷ 收盤價,把波動度換算成「佔股價的百分比」。一檔股票 NATR = 3%,代表它平均一天波動約 3% 的股價。標準化後,不同價位的股票才能放在同一把尺上排序、選股。本文所有「低波 / 高波」的橫截面比較,用的都是 NATR。
ATR 的數學定義:三個式子看懂它在算什麼
把上面的白話寫成公式,ATR 一共只有三步:先算單日真實波幅(True Range),再對它取移動平均得到 ATR,最後除以收盤價標準化成 NATR。
逐個符號拆開來看:
- 、、 是當日的最高、最低、收盤價, 是前一日收盤價。
- 第一項 是當日盤中的高低振幅;第二、三項把「今日最高(或最低)對前一日收盤」的跳空也算進來。取三者最大值,就是把「開盤跳空」也計入波動,不會因為今天開高走平就低估了真實的震盪。這正是 Wilder 當年設計 ATR 的重點:傳統的「最高減最低」會漏掉跳空風險。
- :對 True Range 取 日指數移動平均(Wilder 原版用的是他自創的平滑法,效果接近 EMA), 預設 14。平均之後,單日的雜訊被抹平,留下的是「最近這段時間,這檔股票大約一天震盪多少元」。
- :把以「元」為單位的 ATR 除以股價,換算成百分比。一檔 600 元的股票 ATR 10 元、和一檔 30 元的股票 ATR 0.5 元,絕對值差 20 倍,但 NATR 都是約 1.7%——標準化後才能放在同一把尺上比較。本文所有橫截面選股一律用 NATR,原因就在這裡。
公式裡沒有任何「方向」變數: 只取絕對值與最大值,漲跌一視同仁。這從數學上再次說明 ATR 是純粹的波動幅度讀數,不帶多空訊號——這也是後面所有結論的出發點。
ATR 在市場上有幾派常見用法:停損派主張「跌破高點減 k×ATR 就出場」;部位控制派主張「波動越大、買越少」;選股派則想拿波動度當篩選因子。哪些在台股站得住?直接回測。
散戶最常見的兩個用法,在台股都站不住
我們在可交易宇宙(60 日均成交金額前 300 大、收盤 > 10 元,排除 ETF、金融股、KY 股、處置股)裡,把幾種「ATR 直覺用法」各跑一次月再平衡的回測。先看最反直覺的兩個結果。
用法一:買高 ATR 股票追波動——風險不是報酬
直覺上「波動大 = 機會大」,所以先測「每月選 NATR 最高的 40%」對上「選最低的 40%」:
| ATR 用法 | 研究段年化 | 研究段月 Sharpe | 全期年化 | 全期月 Sharpe | 全期最大回撤 |
|---|---|---|---|---|---|
| 選最低 NATR 40%(低波) | 10.37% | 0.75 | 11.51% | 0.75 | -33.04% |
| 選最高 NATR 40%(高波) | 12.27% | 0.56 | 16.62% | 0.66 | -47.23% |

高波組的全期年化(16.62%)確實高於低波組(11.51%),但這是用很深的回撤換來的:它的全期最大回撤 -47.23%、月 Sharpe 只有 0.66,實務上幾乎抱不住。低波組雖然 raw 報酬低,但月 Sharpe 0.75、最大回撤 -33.04% 都明顯較好。這正是學術上的「低波動異象(low-volatility anomaly)」——低波股的風險調整報酬反而較高,由 Ang、Hodrick、Xing & Zhang (2006) 在橫截面實證上首次系統化記錄。 它和 ATR 的本質完全吻合:高 ATR 是「風險」,不是「報酬」。
我們也測了把這個方向做成多空組合——做多低波、放空高波,結果全期年化 -6.28%、月 Sharpe -0.62,是負的。原因是 raw 報酬面高波贏,所以「低波減高波」的價差為負。結論:ATR 低波的好處只能用在單邊做多、看風險調整,不能拿來做多空價差。
用法二:ATR 移動停損——對月頻籃子幾乎零貢獻
再測最多人用的「ATR 移動停損」:把 2 倍 ATR 的追蹤停損套在一個低波動能籃子上(跌破持有段高點減 2×ATR 就出場),看它對月頻選股的影響:
| 設定 | 持有段觸發率 | 對回撤的影響 |
|---|---|---|
| 不加停損(基礎籃子) | — | — |
| 加 2 倍 ATR 移動停損 | 0.1% | 幾乎無改善(雜訊等級) |
ATR 移動停損在這個籃子上的持有段觸發率只有 0.1%——幾乎從來沒被觸發過,所以它對結果幾乎沒有貢獻。原因有兩個:① 低波選股已經先天排除了容易崩盤的高波個股,個股月內回檔極少超過 2 倍 ATR;② 月度換股本身就是一種隱含的時間停損,ATR 停損還沒觸發,下個月就已經重新選股了。ATR 的 edge 在「選股池 + 加權」,不在「個股出場停損」。 想看 ATR 停損在其他情境的完整實測,可參考ATR 停損實測。
把停損派的買賣點畫在單股上:一年被掃出場十幾次
上面是籃子層級的統計,可能不夠直觀。把「ATR 追蹤停損派」最經典的規則畫在單一個股上,問題就一目了然。停損派的訊號邏輯很單純:算一條動態停損線 = 近 20 日收盤高點 − 2.5×ATR,收盤一旦跌破這條線就出場。下圖把這條規則套在台積電(2330)2023 年 7 月到 2024 年 6 月這 12 個月上,倒三角就是每一次「收盤跌破停損線」的出場點。

這檔當年走的是一波大多頭(股價從約 550 元漲到近 1000 元),但 ATR 追蹤停損在這 243 個交易日裡照樣被掃出場 12 次——平均約一個月就被洗一次。每一次出場都發生在小回檔的低點附近,然後股價又繼續往上,等於「賣在阿呆谷、再追高買回」。這就是典型的 whipsaw(來回甩巴掌):訊號太頻繁,每次停損出場都是一次成本,累積下來把趨勢段的利潤切得稀碎。換一檔波動結構不同的鴻海(2317)也一樣:同一套規則在同期被掃出場 12 次,平均 NATR 約 2.15%。

注意鴻海下方面板:2024 年第二季它的 ATR(紫線,以元計)和 NATR(綠線,百分比)同步往上跳,停損線會隨之拉得更寬——這正是 ATR 停損「波動放大時自動放寬」的設計初衷。但即使如此,個股日線層級的雜訊還是足以反覆觸發。這跟前面籃子回測的結論完全一致:在月頻、已做低波濾網的選股籃子上,這種高頻訊號要嘛被月度換股提前蓋過(觸發率僅 0.1%),要嘛在真正單股當沖/波段操作上把你來回甩出場。ATR 適合當「波動讀數」,不適合當「逐日出場開關」。
想自己把這張圖畫出來、看看你關注的股票被洗幾次,核心程式碼如下(用 data.indicator 取 ATR,再用簡單的停損線邏輯標出場點):
顯示程式碼
import finlab
from finlab import data
import matplotlib.pyplot as plt
# 套件會在需要資料時自動引導登入
finlab.login()
# 取單股價量與 ATR(14)
close = data.get("price:收盤價")
atr = data.indicator("ATR", timeperiod=14)
stock_id = "2330"
px = close[stock_id].loc["2023-07":"2024-06"].dropna()
atr_s = atr[stock_id].loc[px.index]
# ATR 追蹤停損派:停損線 = 近 20 日收盤高點 - 2.5 倍 ATR
recent_high = px.rolling(20, min_periods=1).max()
stop_line = recent_high - 2.5 * atr_s
# 出場事件 = 由「未跌破」轉為「收盤跌破停損線」的那一根
below = px < stop_line
exit_days = px.index[below & ~below.shift(1).fillna(False)]
print(f"{stock_id} 一年內被掃出場 {len(exit_days)} 次")
# 把價格、停損線與出場點畫出來
plt.figure(figsize=(12, 5))
plt.plot(px.index, px, label=stock_id, color="#111111")
plt.plot(stop_line.index, stop_line, label="2.5×ATR 停損線", color="#9CA3AF")
plt.scatter(exit_days, px.loc[exit_days], color="#7C3AED", marker="v", label="停損出場")
plt.legend()
plt.show()把 stock_id 換成你自己的標的、調整 2.5 倍這個係數,就能直觀感受不同股票的停損頻率。完整可重現版本見文末可下載的 strategy.py。
那 ATR 到底該怎麼用?把它從「停損工具」翻轉成「風險底盤」,拆成三個各自有效的零件。
把 ATR 拆成三個有效的零件
整個 ATR 拿來當個股停損失效,但拆開來看,它有三個各自有效的零件,本文的純技術策略就建立在這三個零件上。每一個零件都對應 ATR「衡量波動」的本質。
零件一:用 NATR 取低波池當選股濾網
先示範 ATR 當「濾網」的價值。一個純多窗動能籃子(不靠 ATR、選 20+60+120 日報酬最強的前 30)研究段年化 18.41%、研究段月 Sharpe 0.85、全期月 Sharpe 0.81,但最大回撤高達 -46.7%、全期回撤一樣 -46.7%——報酬不錯,卻深得抱不住。
把 ATR 加進來當濾網:先用 NATR 砍掉波動最高的個股,只在低波池內挑動能股。動作很小,效果很實在——回撤被低波濾網明顯壓下來,因為「會崩盤的高波股」在選股前就被排除了。ATR 濾網的加分全部來自風險面:它降低的是回撤,幾乎不墊高報酬。 這也呼應了動能因子本身的學理——選「過去的贏家」延續強勢,由 Jegadeesh & Titman (1993) 提出;ATR 只負責把這籃動能股的尾部風險收乾淨。
零件二:用 1/NATR 反波動加權做部位控制
光選對池子還不夠,持股的「權重」也能用 ATR 控制。經典的「ATR 部位控制」主張:波動越大的部位、配越少資金。我們把它落實成 反波動加權——低波股拿到較高權重、高波股拿到較低權重。先看溫和的 1/NATR 加權對等權重的對照:
| 加權方式 | 研究段年化 | 研究段月 Sharpe | 全期年化 | 全期月 Sharpe | 全期最大回撤 |
|---|---|---|---|---|---|
| 等權重 | 14.37% | 1.05 | 16.56% | 1.01 | -32.42% |
| 1/NATR 反波動加權 | 13.66% | 1.09 | 15.8% | 1.04 | -29.05% |

反波動加權把全期最大回撤從 -32.42% 壓到 -29.05%、月 Sharpe 從 1.01 微升到 1.04,跨參數一致地往「Sharpe 升、回撤降」的方向走。把這個方向做到極致——改用 1/NATR³ 強反波動加權,並搭配更集中的持股——低波股會拿到更高的權重,是後面完整策略的核心配置。這層的學理對應「波動度擇時」:在波動升高時調降曝險能提升組合的風險調整報酬,由 Moreira & Muir (2017) 在《Volatility-Managed Portfolios》中證明;反波動加權正是在橫截面上對每一檔做這件事。
零件三:用 ATR 廣度當大盤風險開關
單看一檔個股的 ATR 變化太雜,但如果改看「整個低波池裡有多少比例的股票,波動正在上升」,就得到一個橫截面的、平滑的系統性風險度量,我們稱為 ATR 廣度。具體做法是:每天統計池內「當前 NATR 高於自身 60 日均」的個股比例。這個比例低,代表多數股波動收斂、市場平穩;這個比例衝高(本文取 > 0.55),代表多數股波動同步抬升——通常是風險盤的前兆。把它做成風險開關:廣度衝高時整體部位溫和減碼到 0.85(其餘 0.15 轉現金、不加槓桿),就是這套策略的防禦腿。
這個「用波動結構控風險」的邏輯,與前述 Moreira & Muir (2017) 的波動度擇時一致:在波動升高、風險惡化時調降曝險,能提升組合的風險調整報酬。ATR 廣度正是一個可操作的市場波動結構訊號。關於用大盤訊號降低回撤,也可參考用大盤濾網降低回撤與均線市場濾網。
順帶點出一個反例:用 ATR 自己當「大盤多空二元開關」會過擬合。 我們試過用 NATR 市場中位的 z-score 做大盤多空開關,研究段 Sharpe 衝到 1.10、但樣本外掉到 0.60——門檻 fit 到 2015-2021 的波動結構,2022 之後就失效。差別在於:ATR 廣度是「溫和減碼」而非「全進全出」,靠的是橫截面多數股的訊號而非單一門檻硬切,所以跨樣本外站得住。
完整策略:ATR 三重風控純技術選股
把上面三個零件疊上多窗動能,組成一套可執行、可重現、完全不含基本面的純技術策略:
- 低波池:可交易宇宙中,用 NATR = ATR(14)/收盤價 取波動度最低的 58%(約 135 檔)為低波池,先砍掉易崩盤的高波股。
- 多窗動能選股:池內以「20 + 60 + 120 日報酬的全市場百分位排名平均」為多窗動能分數,挑前 6 檔(高度集中)。
- 反波動加權:持股以 1/NATR³ 強反波動加權,低波股給極高權重(經典 ATR 部位控制的極端版)。
- ATR 廣度風控:每日計算池內「NATR > 自身 60 日均」的個股比例,當此廣度 > 0.55 時整體部位減碼到 0.85(其餘轉現金,不加槓桿)。
- 月再平衡。
選股端的核心程式碼(可直接交給你的 AI 助理改寫、或下載完整版執行):
顯示程式碼
import numpy as np
import pandas as pd
from finlab import data
# 套件會在需要資料時自動引導登入
finlab.login()
close = data.get("price:收盤價")
amount = data.get("price:成交金額")
# 可交易宇宙:成交額前 300 大、收盤 > 10 元
liquidity = amount.rolling(60).mean()
universe = liquidity.is_largest(300) & (close > 10)
# NATR = ATR(14) / 收盤價,把波動度標準化成佔股價的百分比
natr = data.indicator("ATR", timeperiod=14) / close
# 零件一:NATR 最低的 58%(約中位宇宙的 0.58)為低波池
pool_size = int(universe.sum(axis=1).median() * 0.58)
low_vol_pool = natr.where(universe).rank(axis=1, ascending=True) <= pool_size
# 零件二搭配多窗動能:20 / 60 / 120 日報酬的橫截面百分位排名平均
mom = sum((close / close.shift(w) - 1).rank(axis=1, pct=True) for w in (20, 60, 120)) / 3
# 池內挑多窗動能前 6 檔(高度集中)
basket = mom.where(universe & low_vol_pool).rank(axis=1, ascending=False) <= 6
# 零件二的權重:1/NATR³ 強反波動加權,逐列歸一
inv = (1.0 / natr ** 3).where(basket)
weights = inv.div(inv.sum(axis=1), axis=0).fillna(0.0)零件三的 ATR 廣度減碼 overlay 與完整回測,請見文末可下載的 strategy.py。
這套策略研究段(2015-2021)年化 27.68%、月 Sharpe 1.26、月 Sortino 2.66;樣本外(2022-2026,截至 2026-06)年化 25.96%、月 Sharpe 1.06、月 Sortino 1.61;全期(2015-2026)年化 26.8%、月 Sharpe 1.13、月 Sortino 2.0、全期最大回撤 -41.27%。三段報酬都明顯高於含息 0050(全期年化 21.0%、Sharpe 1.05、回撤 -34.0%)。 代價是集中 6 檔的回撤比 0050 深,後面的限制段會把這點講清楚。
下面是完整互動式回測:月報酬熱力圖、權益曲線、年度績效都可以直接在文章裡操作:
不同大盤狀態下的表現:研究段與樣本外都站得住
判斷一套策略是不是只靠某一段行情湊出來,最直接的方法是把回測切成兩段、各自結算。本文把 2015-2021 當研究段(涵蓋 2015 股災、2018 中美貿易戰急跌、2020 疫情崩跌與反彈),2022-2026 當樣本外(涵蓋 2022 升息熊市與其後的強多頭,2026 標示「截至 2026-06」資料):
| 區間 | 大盤背景 | 策略年化 | 策略月 Sharpe | 策略最大回撤 | 含息 0050 年化 |
|---|---|---|---|---|---|
| 研究段 2015-2021 | 多次急跌與反彈交錯 | 27.68% | 1.26 | -35.73% | 15.3% |
| 樣本外 2022-2026(截至 2026-06) | 升息熊市後轉強多頭 | 25.96% | 1.06 | -40.96% | 30.4% |
| 全期 2015-2026 | — | 26.8% | 1.13 | -41.27% | 21.0% |
兩段分開看的重點是:策略在研究段與樣本外的年化都落在 26%–28%、月 Sharpe 都在 1.0 以上,沒有出現「研究段漂亮、樣本外垮掉」的過擬合特徵。 研究段它大幅領先含息 0050(27.68% vs 15.3%),靠的是集中持有低波動能股在震盪市裡挑到相對強勢標的;樣本外它與含息 0050 的差距縮小(25.96% vs 30.4%),因為 2022 之後是台股強單邊多頭,ATR 廣度風控偶爾轉防禦會在順風段少賺一點。回撤端則是這套集中策略的代價:樣本外回撤 -40.96% 比 0050 的 -34.0% 深,ATR 廣度減碼把它從沒有風控時的約 -44% 收到 -41%,但集中 6 檔的尾部風險仍在。
把 ATR 放回波動指標家族:它跟布林、肯特納差在哪
ATR 不是唯一的波動工具,搞清楚它在家族裡的定位,才不會用錯。市面上常被混在一起的三個工具,本質差很多:
| 指標 | 波動怎麼量 | 輸出形態 | 在台股的合理用法 |
|---|---|---|---|
| ATR / NATR | True Range 的移動平均(含跳空) | 單一波動讀數(元或百分比) | 橫截面選股的低波濾網、1/NATR 反波動加權 |
| 布林通道(Bollinger Bands) | 收盤價的標準差 | 上中下三條軌道 | 均值回歸(觸軌)、帶寬擠壓後突破 |
| 肯特納通道(Keltner Channel) | 用 ATR 定義通道寬度 | 上中下三條軌道 | 趨勢通道突破、波動自適應的進出場 |
三者的關係其實很清楚:布林通道用標準差畫通道、肯特納通道以 ATR 畫通道、而 ATR 本身就是那個被肯特納拿去用的波動讀數。換句話說,ATR 是更底層的零件——它不畫通道、不給方向,只回答「最近一天大概震多少」。正因為它是純讀數,最適合做的事就是本文驗證過的:當橫截面的波動排序因子(選低波池)與部位控制的權重(1/NATR)。標準差類的布林通道則更適合做時間序列上的均值回歸進出場。
實務上常有人問「ATR 停損和布林通道停利哪個好」,但這其實是兩種不同思路:ATR 給的是「波動幅度」、布林給的是「相對位置」。把它們各司其職,比硬要二選一更有意義。三者的延伸實測可看肯特納通道與 ATR 指標與台股 ATR 波動率指標解析。
回測方法與口徑
量化結論的可信度取決於方法,以下逐項交代:
- 交易成本:策略使用 finlab
sim(),台股預設已內扣手續費(本文以 0.1425% 打三折計)與賣出證交稅 0.3%。 - 滑價:未額外假設滑價,實際成交衝擊取決於資金規模與流動性。
- 股票池:上市櫃普通股,60 日均成交金額前 300 名、收盤 > 10 元。
- 排除類別:排除 ETF(代號 00 開頭)、權證/KY/特別股(非 4 碼純數字)、金融保險股、處置與全額交割股,以降低生存者偏差與不可交易標的污染。
- 前視偏差:NATR、多窗動能、ATR 廣度均只使用當日(含)以前的還原價格;月頻再平衡,訊號於當期可得。完全不使用財報或月營收等基本面資料,沒有財報公布日對齊問題。
- 權重:以 1/NATR³ 強反波動加權、逐列歸一,單一資產不另設上限;ATR 廣度衝高時整體部位減碼到 0.85(其餘轉現金,不加槓桿)。
- 周轉率:年換手約 9.5 次,屬中等偏高(集中 6 檔 + 月頻換股 + 廣度減碼切換),已在
sim()內扣手續費與證交稅下計算。 - 樣本內外:研究段 2015-2021、樣本外 2022-2026 分開回報,所有數字兩段都列,避免只報漂亮的一段。
穩健度
這套策略的 edge 不是靠單一參數湊出來的:
- 持股數 × 低波池跨參數穩健:把集中持股數(5/6/7)與低波池比例(55%/58%/62%)各動一格共九組,固定 1/NATR³ 加權與 ATR 廣度(60 日 / 0.55)減碼到 0.85,研究段月 Sharpe 落在 0.89-1.26 的窄區間、樣本外年化 22.8%-29.9%——是一片高原,勝出設定(6 檔・58% 池)與鄰域穩健格幾乎打平。
- 加權冪次穩健:把反波動加權的冪次由 1/NATR³ 換成溫和的 1/NATR²,研究段月 Sharpe 仍在 1.20、樣本外年化維持 28% 級,低波加權的 edge 對冪次不敏感。
- ATR 廣度減碼穩健:把廣度風控的減碼檔位(0.85 / 0.9)與觀察窗(60 / 120 日)各換一組,三組樣本外月 Sharpe 都在 1.06-1.07、樣本外回撤收在 -40% 到 -42%——廣度減碼把樣本外回撤從沒有風控時的約 -44% 收到 -41% 不是單一擇時參數的僥倖。
- 負面穩健性同樣重要:ATR 自身 z-score 擇時、ATR 個股停損、低波多空價差三者在樣本外全部站不住或無感,反而確認了「ATR 的真實 edge 只在低波選股池 + 反波動加權 + 廣度減碼」這條邊界。
參數最佳化:要的是一片高原,不是一座孤峰
挑參數最容易踩的雷,是把網格掃一遍、選出研究段表現最好的那一格,然後宣稱「最佳參數」。問題是:如果那一格周圍的鄰居表現都很差,只有它特別好,那多半是剛好 fit 到歷史雜訊的孤峰(過擬合),換一段資料就垮。真正穩健的參數,應該坐落在一片表現都不錯的高原上——你選哪一格都差不多,代表這個 edge 不靠運氣。
我們對勝出策略的兩個關鍵參數做網格:集中持股數(5/6/7)× 低波池比例(55%/58%/62%),固定 1/NATR³ 加權與 ATR 廣度(60 日 / 0.55)減碼到 0.85,每一格都真跑回測,色溫看研究段月 Sharpe。

看色溫圖要看的是勝出格周圍的鄰居站不站得住,而非哪一格最綠。九格的研究段月 Sharpe 落在 0.89 到 1.26 的區間,集中 6 檔那一整行(55%、58%、62% 池)月 Sharpe 都在 1.2 上下、連成一片綠色高原;只有最角落的「5 檔・62% 池」掉到 0.89——低波池放太寬又選太少股,分散度不足。讀法是:這個 edge 對低波池比例不敏感(55%-62% 都行),對持股數則以 6 檔附近最穩。既然 6 檔那一行整片站得住,我們就取學理與分散度平衡的預設(58% 低波池、集中 6 檔),而不是去挑研究段數字最漂亮的那一格。
把「預設設定」和「網格中鄰域最穩的那一格(穩健格,7 檔、62% 池)」放在一起對照,更能說明問題:
| 參數組 | 研究段月 Sharpe | 樣本外月 Sharpe | 樣本外最大回撤 |
|---|---|---|---|
| 預設(6 檔、58% 池) | 1.26 | 1.06 | -41.0% |
| 穩健格(7 檔、62% 池) | 1.24 | 1.10 | -38.4% |

兩組幾乎打平:穩健格把持股放寬到 7 檔、低波池拉到 62%,研究段月 Sharpe 略低(1.24 vs 1.26)、樣本外月 Sharpe 略高(1.10 vs 1.06)、樣本外回撤稍淺(-38.4% vs -41.0%)。這正是「參數最佳化沒有自由午餐」的好現象——如果有哪一格能在所有指標上同時碾壓其他格,那才該擔心是過擬合。實務上我們選擇守住集中 6 檔的預設,因為它研究段風險調整最高、且與穩健格的差距只在小數點後;把「優化」用在確認穩健,而不是榨出歷史最高分。過度最佳化的風險很實在:在這種高原型的參數面上硬挑單格最高,換到未來大概率回吐。
搭配月營收 YoY:基本面是選配,不在主策略內
本文的主策略是完全不含基本面的純技術策略:選股只用 NATR 低波池、多窗動能與 1/NATR³ 反波動加權,風控只用 ATR 廣度,沒有任何財報或月營收輸入。這是刻意的設計——純技術訊號每日可得、無財報公布延遲與對齊問題,回測口徑乾淨、可重現性高。
常見的延伸問題是:在選股端疊一層月營收年增率(YoY),報酬端會不會更好?這是一個合理的研究方向,但屬於「在純技術主策略之外的選配實驗」,不納入本文主策略的數字。原因有二:其一,主策略只取 6 檔、集中度已高,再加營收過濾會大幅縮小可選池,反而犧牲了多窗動能的選股空間與分散度;其二,月營收是領先指標、公布有時間落差,要正確對齊「當期(含)以前已公布」的資料才不會前視,這會把乾淨的純技術口徑複雜化。
實務經驗也指向同一個方向:這套策略的 edge 來自低波選股池與反波動加權這個風險底盤,不是再疊一個基本面因子就能放大的。想自己實驗的讀者可在下載的程式碼裡,於多窗動能評分前加一層 monthly_revenue 的 YoY 過濾自行對照;想看基本面因子當主角的策略,可參考技術面與基本面選股的差異。
策略的限制與取捨
- 集中 6 檔帶來較深回撤:策略全期最大回撤 -41.27%,明顯深於含息 0050 的 -34.0%。ATR 廣度減碼已把樣本外回撤從沒有風控時的約 -44% 收到 -41%,但集中 6 檔的單股與類股尾部風險仍在,承受得住這級回撤才適合。
- 報酬靠集中度換來,不是免費的:全期年化 26.8% 高於含息 0050 的 21.0%,但這建立在只持 6 檔、1/NATR³ 強加權的高集中配置上。ATR 是波動度指標、負責把回撤收乾淨,超額報酬主要來自集中持有低波動能股;換成更分散的配置,報酬與回撤會同步下降。
- 樣本外順風段會少賺:樣本外(2022-2026)年化 25.96% 略低於含息 0050 的 30.4%,因為 2022 之後是台股強單邊多頭,ATR 廣度風控偶爾轉防禦會在順風段少賺一點;真正可信的是研究段與樣本外一致的月 Sharpe(1.26 / 1.06)與相近的年化(27.68% / 25.96%),那才是穩定性證據,不應線性外推未來報酬。
- 低波不等於產業中性:低波池可能長期偏向防禦類股,本輪未做產業 / 規模中性化驗證,edge 不排除部分來自產業押注,需再檢。
- 容量與成本:宇宙限前 300 大、turnover 中等偏高(年換手約 9.5 次),大資金部署需重估流動性衝擊;回測未逐筆估算滑價與借券成本,極端流動性衝擊未單獨建模。
自己跑一次
把下面這句話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:
用 AI 開始 FinLab
把這句話交給你的AI,它會帶你完成設定並做出第一個策略。
告訴你的AI:
「幫我設定 FinLab,做一個動能策略:https://finlab.finance/setup」
裝好之後,下載本文的 strategy.py 與 data.csv,即可在自己的環境重跑、改參數、換選股因子。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽與程式交易是什麼。
常見問題
Q:ATR 指標的參數要設多少?14 是最好的嗎? 14 是 Wilder 的原始建議,也是本文用的設定。我們對 ATR 週期(10/14/20)做過全掃,低波選股的 edge 對週期不敏感——研究段與樣本外 Sharpe 都落在穩定區間。重點不在參數微調,而在用法:把 ATR 當低波濾網與部位控制,而不是當停損或擇時。
Q:ATR 移動停損到底有沒有用? 看情境。套在本文這種「已做低波濾網的月頻籃子」上,2 倍 ATR 停損的觸發率只有 0.1%、對回撤幾乎零貢獻,因為低波選股已先排除易崩個股、月度換股本身就是隱含時間停損。ATR 停損在「日頻、高波標的、緊密停損」的當沖 / 波段情境另有價值,但那不是月頻選股籃子的適用場景。
Q:ATR 高的股票是不是比較會漲? 不是。台股回測顯示,選最高 NATR 40% 的全期年化(16.62%)雖看似高於低波組,但月 Sharpe 只有 0.66、最大回撤深達 -47.23%。高 ATR 是「風險」不是「報酬」,raw 報酬高是用很深的回撤換來的,風險調整後反而輸給低波組。
Q:ATR 和 NATR 差在哪?為什麼選股要用 NATR? ATR 是絕對金額(例如一天波動 2.5 元),會隨股價高低失真——500 元股票的 ATR 自然比 20 元股票大。NATR = ATR ÷ 收盤價,把波動度換算成百分比,不同價位的股票才能放在同一把尺上排序選股。所以跨個股的橫截面比較一律用 NATR。
Q:ATR 和布林通道、肯特納通道差在哪? 三者都是波動類工具。布林通道用標準差定義通道寬度;肯特納通道用 ATR 定義通道寬度;ATR 本身則是純波動幅度的讀數。實務上常被一起比較,延伸可看肯特納通道與 ATR 指標與台股 ATR 波動率指標解析。
Q:這套策略適合誰? 適合想主動參與台股、追求明顯高於含息 0050 報酬,且能承受 -41% 等級回撤與較高換手成本的人:全期年化 26.8%、月 Sharpe 1.13,研究段與樣本外都站得住。不適合受不了深度回撤、或偏好低周轉被動持有的人——集中 6 檔的回撤比 0050 深,那種需求直接買進持有含息 0050 更省心。
Q:ATR 廣度減碼和「用 ATR 自己當大盤多空開關」差在哪? 差在「溫和減碼」與「全進全出」。我們試過用 NATR 市場中位的 z-score 當大盤二元開關,研究段 Sharpe 衝到 1.10、但樣本外掉到 0.60,門檻只 fit 到 2015-2021 的波動結構。本文採用的 ATR 廣度(池內波動上升個股比例 > 0.55 才減碼到 0.85)靠的是橫截面多數股的訊號、且只溫和減碼而非清零,跨減碼檔位(0.85 / 0.9)與觀察窗(60 / 120 日)都穩健,樣本外站得住。ATR 的 edge 主要在橫截面選股與加權,廣度減碼則是把回撤再收一刀的輔助。
Q:ATR 可以單獨拿來選股嗎? 不建議單用。低波單因子全期年化只有 11.51%、raw 報酬太低;必須配多窗動能補報酬,才到可發佈門檻。ATR 的正確定位是「風險底盤」——當動能策略的低波濾網與反波動加權,不是自己當主因子。各選股面向的整合可參考台股選股方法總覽與技術面與基本面選股的差異。
最後更新:2026-06|回測區間:2015-01 ~ 2026-06-09|作者:FinLab 量化研究團隊(經量化研究員審閱)
本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。ATR 三重風控純技術策略全期最大回撤 -41.27%,實際交易前請自行評估風險、滑價與交易容量。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

