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

ATR 停損有用嗎?台股實測 ATR 指標移動停損:動能策略年化 8% 變 -3.6% 的反面教材

ATR 指標(平均真實區間)衡量股價真實波動,最常用來設移動停損。我們用 finlab 實測台股 2018 至 2026:月營收動能策略加上 ATR(14) 兩倍移動停損,年化報酬從 8.0% 掉到 -3.6%,最大回撤反而從 -49.2% 加深到 -57.4%。本文拆解失效機制與 ATR 仍有用的場景。

ATR 停損實測 CAGR 8.0% Sharpe 0.36

台股月營收動能策略加 ATR 移動停損 2018-2026 權益曲線比較,無停損年化 8% 對比 ATR 停損後轉為負報酬

本文是一篇反面教材。 我們用 finlab 在台股實測 2018-01 到 2026-06:一個年化 8.0% 的月營收動能選股策略,加上教科書標準的 ATR(14) 兩倍移動停損之後,年化報酬變成 -3.6%,最大回撤從 -49.2% 加深到 -57.4%;把倍數放寬到三倍,結果仍是年化 -0.4%。在這個場景裡,ATR 停損沒有提供任何保護,它同時毀掉了報酬與回撤。下面把 ATR 指標的定義、計算、停損規則、完整回測與失效機制攤開,所有數字都能用文末的程式碼重跑。

關鍵數字

2018-01 ~ 2026-06(含交易成本) 年化報酬 CAGR 日 Sharpe 日 Sortino 最大回撤 勝率 單邊年化換手
月營收動能 25 檔(無停損) 8.0% 0.36 0.54 -49.2% 42.8% 6.0 倍
同策略 + ATR(14)×2 移動停損 -3.6% -0.21 -0.29 -57.4% 36.5% 10.0 倍
同策略 + ATR(14)×3 移動停損 -0.4% 0.00 0.00 -55.3% 39.3% 8.5 倍
0050 含息(benchmark) 25.6% 1.14 1.90 -34.0%

日 Sharpe:以日報酬計算的夏普比率,衡量每承擔一單位波動換到多少超額報酬,計算方式與判讀標準見夏普比率計算器

8.4 年裡,兩倍版觸發了 1,736 次停損、三倍版 1,074 次,每一次出場都付出手續費與證交稅,而且常常賣在波動的低點。要理解這張表為什麼長這樣,得從 ATR 是什麼說起。

ATR 指標是什麼?定義與計算

ATR(Average True Range,平均真實區間)是衡量一段期間內股價「真實波動幅度」的技術指標:先計算每天的真實區間 TR(True Range),再對 TR 取 N 日(慣例 14 日)的 Wilder 移動平均。ATR 數值越大,代表這檔股票最近震盪越劇烈;它只描述波動的大小,不判斷漲跌方向。

ATR 出自 Wilder (1978) 的《New Concepts in Technical Trading Systems》,與 RSI、DMI 同一本書。TR 的設計重點是把「跳空缺口」也算進波動,取下列三個值的最大者:

TR 候選值 捕捉的情況
當日最高價 - 當日最低價 日內震幅
|當日最高價 - 昨日收盤| 向上跳空,日內震幅會低估波動
|當日最低價 - 昨日收盤| 向下跳空,同上

Wilder 平滑等價於 alpha = 1/14 的指數移動平均。在 finlab 裡一行就能取得:data.indicator('ATR', timeperiod=14);若要自己算,本文回測用的版本寫在下方程式碼區塊。更多技術指標名詞的白話定義整理在量化名詞詞彙表

台股有一個容易踩的坑:計算 ATR 必須用還原股價(etl:adj_closeetl:adj_highetl:adj_low)。除權息當天股價會出現人為跳空,用未還原價格算 TR,會把配息誤判成一根巨大波動,停損因此被假訊號觸發。

量化實務上 ATR 有三種常見用途:設定停損距離、當通道指標的頻寬(例如肯特納通道選股策略就以 ATR 畫上下軌)、以及依波動調整部位大小。本文聚焦第一種,也是散戶最常聽到的那一種。

ATR 移動停損怎麼設?吊燈式出場規則

最流行的 ATR 停損是「吊燈式出場」(chandelier exit):停損價 = 進場後的最高價 - k × ATR(14),k 慣例取 2 到 3。停損線像吊燈一樣掛在高點下方,股價創新高就跟著上移,回落超過 k 倍 ATR 就出場。它的賣點是隨股性自動調整:波動大的股票給寬一點的容忍距離,波動小的收緊,理論上比固定百分比停損更貼合個股。

本文實測的規則完全照這個教科書版本:持有期間內,還原收盤價跌破「期間最高還原收盤 - k×ATR(14)」,就在次一交易日收盤出場;出場後該檔的部位轉為現金,等到下一次月再平衡才重新參與選股。這個「停損後當期不回補」的語意,與 finlab 原生的 stop_trading_next_period 一致。

回測設計:拿一個會賺錢的基準策略當底

要測「停損有沒有用」,基準策略本身要先站得住,否則測出來只是雜訊。我們選一個邏輯單純、長年正報酬的月營收動能組合當底:

  • 股票池:60 日均量大於 1,000 張(流動性)、收盤價大於 10 元、月營收年增率大於 0
  • 選股:月營收年增率(去年同月增減%)排名前 25 名,等權持有
  • 再平衡:月底訊號、次一交易日生效,持有一個月
  • 成本:手續費 0.1425% 打三折(0.0475%)加賣出證交稅 0.3%,finlab sim() 預設台股成本模型

對照組有三個:同選股加 ATR(14)×2 停損、加 ATR(14)×3 停損,以及 0050 含息買進持有。核心程式碼長這樣,完整可重跑版本(含吊燈式停損的逐期高點計算)在文末下載區:

顯示程式碼
from finlab import data
from finlab.backtest import sim
import numpy as np
 
# 還原價(除權息已調整):算 ATR 與停損一律用它,避免除權息跳空誤觸
adj   = data.get('etl:adj_close')
adj_h = data.get('etl:adj_high')
adj_l = data.get('etl:adj_low')
rev   = data.get('monthly_revenue:去年同月增減(%)')
close = data.get('price:收盤價')
vol   = data.get('price:成交股數')
 
# 基準策略:流動性過濾 + 月營收 YoY 前 25 名,等權、月再平衡
liq      = vol.rolling(60).mean() > 1_000_000          # 60 日均量 > 1,000 張
pool     = liq & (close > 10) & (rev > 0)
position = rev.where(pool).rank(axis=1, ascending=False) <= 25
 
# ATR(14):TR 取三者最大,再做 Wilder 平滑(alpha = 1/14)
prev_c = adj.shift(1)
tr  = np.maximum(np.maximum(adj_h - adj_l, (adj_h - prev_c).abs()),
                 (adj_l - prev_c).abs())
atr = tr.ewm(alpha=1/14, adjust=False).mean()
 
# 無停損 vs finlab 原生百分比移動停損(本文用它交叉驗證方向)
report_base  = sim(position, resample='M',
                   fee_ratio=1.425/1000/3, tax_ratio=3/1000)
report_trail = sim(position, resample='M',
                   fee_ratio=1.425/1000/3, tax_ratio=3/1000, trail_stop=0.10)

回測的基本觀念(訊號何時可得、成本怎麼扣、為什麼要對照 benchmark)在回測是什麼有完整說明;資料取得的入門可看用 Python 取得台股資料

實測結果:兩個倍數都輸給不停損

文首那張表就是全部的結果,這裡把幾個容易被忽略的維度拉出來:

維度 無停損 ATR×2 ATR×3 變化方向
年化報酬 8.0% -3.6% -0.4% 報酬全毀
最大回撤 -49.2% -57.4% -55.3% 回撤反而更深
勝率 42.8% 36.5% 39.3% 一批「先跌後漲」的交易被截斷成確定虧損
單邊年化換手 6.0 倍 10.0 倍 8.5 倍 成本墊高
8.4 年停損觸發次數 0 1,736 次 1,074 次 平均每月 10~17 次

把同一份數據按年度拆開,結論更難看:

月營收動能策略與 ATR 移動停損版本逐年報酬對比 2018-2026,18 個停損版年度中僅 1 個年度優於無停損

兩個停損版本合計 18 個年度數字裡,只有一個贏過無停損:ATR×2 在 2022 年跌 17.5%,比無停損的 21.6% 淺;其餘 17 個年度全部落後。多頭年的差距最傷:2020 年無停損賺 29.3%,ATR×2 只剩 9.1%;2023 年是 28.9% 對 6.3%。連停損最該發揮的空頭年也沒守住:2018 年兩個停損版(-25.1%、-26.9%)都跌得比無停損(-24.3%)深,2022 年 ATR×3(-22.4%)同樣輸給無停損。

停損的行銷話術通常是「犧牲一點報酬,換更小的回撤」。這次實測連這個交換都不存在:報酬與回撤同時變差,沒有任何一個指標站在停損這邊。下面是 ATR(14)×3 版本(兩個停損版本中較好的那個)的互動式回測報告,月報酬熱力圖、權益曲線、每筆交易都能在頁面上操作:

無停損基準版的完整互動報告也公開:月營收動能 25 檔(無停損)回測報告

為了排除「自製停損實作有 bug」的疑慮,我們用同一份選股訊號,改以 finlab 原生 sim(resample='M', trail_stop=0.10) 的百分比移動停損重跑一次交叉驗證:無停損版年化 8.8%、最大回撤 -47.5%(與自製基準 8.0%/-49.2% 的小差異來自原生月再平衡的細節),加上 10% 移動停損後變成年化 -1.3%、最大回撤 -53.9%。兩套完全獨立的實作、兩種停損定義(ATR 倍數與固定百分比),方向一致:在這個月再平衡動能選股上,移動停損就是傷害績效。

為什麼 ATR 停損反而毀掉這個策略?四個機制

機制一:停損賣在波動的低點。 吊燈式停損觸發的那一刻,定義上就是「從期間高點回落了 2 倍 ATR」的時刻,也就是急跌段的相對低點附近。如果那次下跌是趨勢反轉,停損確實止血;但如果只是動能股常見的劇烈洗盤,停損等於把最差的價格鎖成實現虧損。勝率從 42.8% 掉到 36.5%,就是一批原本「先跌後漲」的交易被攔腰截斷的痕跡。

機制二:月再平衡結構讓你「賣低買高」。 停損出場後,該檔部位閒置為現金,要等月底再平衡才能重新進場。月營收動能強的股票,常常在洗盤後繼續上漲,而且下個月往往仍在前 25 名名單裡;於是策略在低點賣出,一個月後在更高的價格把同一檔買回來,中間的反彈完全沒賺到,還多付兩趟交易成本。

機制三:成本墊高,但解釋不了全部。 單邊年化換手從 6.0 倍升到 10.0 倍,以本文成本設定粗估,多出的 4 倍換手一年約多吃 0.8 個百分點的報酬。這筆錢真實存在,但相對於 11.6 個百分點的年化報酬差距只是配角;主要的傷害來自機制一與機制二的出場與回補時點,以及錯過的反彈段。這也呼應量化交易的缺點與風險裡的提醒:策略疊加的每一條規則都有隱性成本。

機制四:系統性崩跌時,停損鎖住損失、錯過反彈。 最大回撤反而加深(-49.2% 變 -57.4%)看起來違反直覺,拆開看很合理:大盤急跌時,25 檔幾乎同時觸發停損,跌幅被實現;反彈初期波動仍大、策略卻空手,要等月底才回補,於是「跌的有跟到、彈的沒跟到」,水下越陷越深。停損保護單一部位的邏輯,放到「整個組合同漲同跌」的系統性風險上並不成立。

月營收動能策略水下回撤曲線對比 2018-2026,無停損版回到新高而 ATR 停損版自 2021 年後長期深陷水下

水下回撤曲線把這個機制畫得很清楚。2022 年 10 月的空頭谷底,三個版本一起趴在水下(以月頻淨值計算:無停損 -36.7%、ATR×2 -37.2%、ATR×3 -40.8%,日內低點比這更深);此後無停損版一路修復,2026 年 6 月回到歷史新高,兩個停損版卻在 2021 年 4 月的高點之後再也沒有創過新高,月頻水下最深一路探到 2025 年 4 月的 -54.7% 與 -50.6%,到回測結束仍分別在水下 39.0% 與 25.2%。

這個結果在學術上有對應的框架。Kaminski & Lo (2014) 在《When Do Stop-Loss Rules Stop Losses?》證明:停損規則只有在報酬序列呈正自相關(跌了之後傾向續跌)時才會加值;當報酬接近隨機漫步,或短期呈現「跌深反彈」的負自相關,停損會系統性地把暫時的帳面虧損變成實現虧損。本文的月營收動能組合,持有的是波動劇烈、洗盤頻繁的營收成長股,日線層級的劇烈回檔多數沒有發展成趨勢反轉,正好落在停損最吃虧的那一側。

什麼情況 ATR 仍然有用?

這次實測否定的是「ATR 移動停損疊在月再平衡選股策略上」這一種用法,而非 ATR 指標本身。ATR 作為波動度量,在下面這些場景仍有明確價值:

場景 ATR 的角色 補充
部位規模(position sizing) 用 ATR 把每檔的金額風險標準化:波動大的買少、波動小的買多,經典海龜交易法的 N 值就是 ATR 改變的是權重,沒有「賣在低點再買回」的問題;概念與低波動因子相通
通道型指標的頻寬 肯特納通道以 EMA 為中軸、上下加減 k 倍 ATR,當趨勢與突破的量尺 實作與回測見ATR 指標應用:肯特納通道選股策略
市場情緒與波動率監控 把全市場高波動股的 ATR/收盤價當情緒指標,判讀大盤恐慌與沉澱 做法見台股市場 ATR 波動率指標解析
日頻檢查的單股動能停損 Han, Zhou & Zhu (2016) 實測美股動能策略,逐日檢查的停損顯著壓低動能崩盤的左尾 注意結構差異:他們停損後立即轉入無風險資產、策略月初重組,與本文「停損後閒置等月底」不同,結論不能直接搬到月再平衡選股
評估「該不該設停損」本身 與其先射箭再畫靶,可用 MAE 分析看獲利與虧損交易的回檔分布,再決定停損距離有沒有資訊量 MAE & MFE 教學用另一個策略實測,固定 -10% 停損同樣讓 CAGR 從 15.1% 降到 9.7%

一句務實的判準:ATR 適合拿來「衡量與分配風險」,拿來「逐日踢出持股」之前,要先驗證你的策略報酬有沒有跌了會續跌的結構。 月頻選股策略的超額報酬多半來自抱住整段波動,逐日停損與它的邏輯天生衝突。

回測方法揭露:這些數字怎麼算出來的

項目 本文設定
回測區間 2018-01-01 ~ 2026-06-09,全段單一樣本(in-sample)
再平衡頻率 月底訊號、次一交易日收盤生效;停損逐日檢查,觸發後次一交易日收盤出場
成交價假設 收盤價(trade_at_price='close')
手續費 0.1425% × 1/3 = 0.0475%(finlab sim() 設定)
證交稅 賣出 0.3%,已內含於所有數字
滑價 未設定額外滑價;動能股急跌日的實際成交價差可能比收盤假設更差
股票池 全上市櫃;60 日均量 > 1,000 張、收盤 > 10 元、月營收 YoY > 0;未額外排除金融股 / KY 股 / 全額交割股
權重 入選 25 檔等權;停損出場後該檔權重回到現金,當期不再分配給其他持股
前視處理 月營收以資料公告可得日對齊(finlab 該資料表 index 即公告截止日);訊號用當日收盤資料、次日才交易
周轉率 單邊年化:基準 6.0 倍、ATR×2 10.0 倍、ATR×3 8.5 倍
benchmark 0050 買進持有,用含息還原的 etl:adj_close,同區間
樣本內外 全段 in-sample,未做樣本外或滾動測試
容量 未估算策略容量;實際資金規模對成交的影響本文未量化

兩點限制要說清楚。第一,本文只測了 k=2 與 k=3 兩個 ATR 倍數與一個 10% 百分比停損,沒有掃描全部參數空間;我們刻意不這麼做,因為在幾十組參數裡挑出一組剛好獲利的停損設定,大概率是回測過度配適而非真實規律。第二,結論的適用範圍是「台股、月再平衡、動能型選股、2018 到 2026」這個設定;其他頻率(日內、週頻)、其他市場或空頭佔比更高的區間,結果可能不同,文獻段也提供了停損在日頻動能上有效的反例。

常見問題 FAQ

Q1:ATR 指標是什麼?一句話怎麼講? ATR(平均真實區間)是「這檔股票最近平均一天震多大」的量尺:把每天的真實區間(含跳空的高低價差)取 14 日 Wilder 移動平均。它衡量波動大小,不預測方向。

Q2:ATR 停損一般設幾倍? 教科書與多數論壇的慣例是 2 到 3 倍 ATR(14),也就是吊燈式出場的 k 值。本文兩個倍數都實測了:在月再平衡動能選股上,k=2 年化 -3.6%、k=3 年化 -0.4%,都遠輸無停損的 8.0%。

Q3:ATR 停損和固定百分比移動停損哪個比較好? 本文兩種都測了。ATR(14)×2 把策略從年化 8.0% 打到 -3.6%;finlab 原生 10% 移動停損把同一選股從 8.8% 打到 -1.3%。在這個場景裡兩者是程度差異,方向相同:都顯著傷害績效。

Q4:為什麼加了停損,最大回撤反而更深? 系統性急跌時 25 檔幾乎同時觸發停損,跌幅被實現;反彈初期策略空手,要等月底再平衡才回補,等於跌的時候在場、彈的時候缺席。8.4 年下來最大回撤從 -49.2% 變成 -57.4%。

Q5:把 ATR 倍數再調大或調小,有機會變好嗎? k=3 已經比 k=2 溫和(觸發次數從 1,736 降到 1,074),但仍是負報酬。繼續掃參數直到出現一組獲利的設定,得到的多半是過擬合的假象;判斷標準與計算方式見回測過度配適的機率

Q6:ATR 可以用在當沖、期貨或加密貨幣嗎? ATR 作為波動度量,在日內交易與期貨風控確實常用(例如決定口數)。但本文只回測了台股現股的月再平衡選股,結論不能外推到其他頻率與商品;要用,請在你的場景重新回測。

Q7:這個結果代表所有停損都沒用嗎? 此結論僅限「逐日移動停損疊在月再平衡選股上」。Kaminski & Lo (2014) 的理論說明停損在報酬正自相關(續跌)的環境有價值,Han, Zhou & Zhu (2016) 也在美股日頻動能上找到停損降低崩盤左尾的證據;MAE & MFE 分析則提供了在自己的策略上檢驗停損是否有資訊量的方法。

Q8:我可以重現本文所有數字嗎? 可以。文末的 atr_strategy.py 含基準、兩個 ATR 停損版本、0050 對照與交叉驗證,pip install finlab 後即可重跑;月頻權益曲線數據 equity_monthly.csv 與指標彙總 metrics.json 也一併提供。

結語:先驗證報酬結構,再決定要不要停損

這次實測沒有得到「調一調就能用」的 ATR 停損版本,得到的是一個更值錢的負面結果:在台股月再平衡動能選股上,2018 到 2026 這段期間,ATR 移動停損的兩個慣用倍數同時毀掉報酬與回撤,固定百分比停損也一樣。停損不是免費的保險,它對「洗盤多、反彈快」的持股結構收取昂貴的隱形保費。

量化交易的價值正在這裡:一個聽起來穩健的常識,丟進真實數據幾分鐘就能驗證。想把這套驗證流程用在自己的想法上,可以從這幾篇接下去:

不用先學會寫程式,也能跑真實台股回測:FinLab 讓你用 AI 對話描述策略,底層交給套件實跑。免費開始試試看,把這篇的 atr_strategy.py 丟進去,改成你想測的停損規則,看看數據怎麼說。

引用文獻

  • Wilder, J. W. (1978). New Concepts in Technical Trading Systems. Trend Research. ATR、RSI、DMI 等經典指標的原始出處,定義了 True Range 與 Wilder 平滑。
  • Kaminski, K. M., & Lo, A. W. (2014). When Do Stop-Loss Rules Stop Losses? Journal of Financial Markets, 18, 234-254. 證明停損的價值取決於報酬序列的自相關結構:動能延續環境加值,隨機漫步與均值回歸環境減值。
  • Han, Y., Zhou, G., & Zhu, Y. (2016). Taming Momentum Crashes: A Simple Stop-Loss Strategy. SSRN Working Paper 2407199. 美股動能策略上,日頻檢查、出場即轉入無風險資產的停損顯著降低崩盤左尾;結構與本文的月再平衡選股不同,是停損有效的對照案例。

下載資源

檔案 說明
atr_strategy.py 完整回測程式碼:基準 + ATR×2 / ×3 停損 + 0050 對照 + 原生 trail_stop 交叉驗證
equity_monthly.csv 四條權益曲線的月頻數據
metrics.json 全部績效指標彙總(本文數字的單一來源)
report_baseline.html 無停損基準版互動式回測報告
report_strategy.html ATR(14)×3 停損版互動式回測報告

本文為「ATR 指標 / ATR 停損」教學與研究內容,標記為反面教材:文中所有停損版本績效均為負且未達本站風險調整門檻,僅供理解移動停損與選股策略互動機制之用,非實盤推薦。投資有風險,過去績效不代表未來表現。本內容僅供教學參考,不構成投資建議,請依個人風險承受度審慎評估。

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

FinLab AI

想建立自己的策略?

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

免費開始

更多技術指標研究

查看全部