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

aroon 阿隆指標怎麼用才對?台股 11 年回測:它是選股因子,
不是交叉訊號

aroon 阿隆指標怎麼用才對?台股 11 年回測(2015-2026)發現:散戶最愛的「兩條線黃金交叉就買」其實沒有額外 edge,真正的價值在把 Aroon 震盪當趨勢起點的選股因子,再用 Aroon 自家市場廣度做純技術風控。完全不含基本面的「Aroon 震盪選股+廣度減碼」純技術策略:研究段年化 25.4%、月 Sharpe 1.32,樣本外 29.6%、1.17,全期 26.9%、1.18,全期最大回撤 -35.6%,三段都勝過含息 0050。附可下載 Python 程式碼與可重現回測。

aroon 真用法 CAGR 26.9% Sharpe 1.18

aroon 阿隆指標在台股的正確用法:當趨勢起點的選股因子,配上 Aroon 自家廣度風控

散戶最熟的 aroon 阿隆指標用法是「AroonUp 上穿 AroonDown 就買、下穿就賣」。但把這個黃金交叉規則放進台股做 11 年回測(2015-2026),它跟「直接選 Aroon 震盪最高的股票」幾乎一模一樣(研究段年化 14.1% vs 12.7%、月 Sharpe 都是 0.67),代表交叉那一刻本身沒提供額外資訊——真正帶來報酬的是「股價趨勢有多領先」這個排序量。aroon 量的是「距離上次創新高 / 新低過了幾天」這個時間差,而非漲跌幅度;AroonUp 減 AroonDown 得到的震盪,本質是一個乾淨的「趨勢起點偵測器」:震盪剛翻正、且近期持續站在零軸上方,代表這檔股票剛從盤整轉入上升趨勢、起漲還新鮮。本文把這個機制組成一套完全不含基本面的純技術策略:在流動性宇宙裡,先用「趨勢持續性濾網」(近 20 個交易日內 Aroon 震盪大於 0 的天數至少 15 天)濾掉假突破,再取震盪最高的 10 檔、以反波動加權持有;同時用 aroon 自家的「市場廣度」(全市場 Aroon 震盪大於 0 的家數比例)當風控開關——廣度崩潰時把股票部位減碼到 5 成、其餘持現金。這套「Aroon 震盪選股+廣度減碼」純技術策略研究段(2015-2021)年化 25.4%、月 Sharpe 1.32,樣本外(2022-2026)年化 29.6%、月 Sharpe 1.17,全期(2015-2026)年化 26.9%、月 Sharpe 1.18,全期最大回撤 -35.6%——三段年化都勝過含息 0050(全期年化 21.0%、Sharpe 1.05、回撤 -34.0%),報酬引擎完全來自 aroon 機制、不靠任何財報或營收資料。

先用一張表回答你搜尋「aroon」時最想知道的事:

你想知道的 本文用真實台股回測的回答
aroon 阿隆指標是什麼 Tushar Chande 提出的趨勢計時器;量的是「距離上次創新高 / 新低過了幾天」,不是漲跌幅度
黃金交叉買進有效嗎 與裸選高震盪幾乎相同(研究段 14.1% vs 12.7%、Sharpe 都 0.67),交叉沒給額外 edge
Aroon 震盪能拿來選股嗎 能,而且這才是正解:震盪剛翻正+持續站上零軸 = 趨勢起點,選最高 10 檔月持有
那它該怎麼用 震盪當趨勢起點選股因子,加持續性濾網與反波動加權;Aroon 自家市場廣度當風控開關
效果如何 Aroon 純技術策略研究段年化 25.4%、Sharpe 1.32,樣本外 29.6%、1.17,全期 26.9%、1.18,三段都勝含息 0050

aroon 阿隆指標震盪選股加廣度風控純技術策略與含息 0050 買進持有的淨值對照圖,2015 到 2026 台股回測,策略線全程在上方

本文所有數字皆出自 finlab 套件抓取的上市櫃真實價量資料(priceetl:adj_close 含息還原股價),回測區間 2015-01 至 2026-06-09,基準為含息 0050。文末附可下載的 strategy.pydata.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼

aroon 阿隆指標是什麼

aroon 阿隆指標是技術分析師 Tushar Chande 在 1995 年提出的趨勢指標,名字源自梵文「黎明前的曙光」。它跟大多數指標最不一樣的地方,在於它量的是「距離上次創新高 / 新低過了幾天」,而非漲跌幅度——本質上是一個趨勢的計時器。技術指標的基礎名詞可參考名詞詞彙表

aroon 由兩條 0 到 100 的線組成:

AroonUp:(timeperiod − 期間內最高價距今天數)/ timeperiod × 100。越接近 100,代表最近才剛創新高,上升趨勢很「新鮮」。

AroonDown:(timeperiod − 期間內最低價距今天數)/ timeperiod × 100。越接近 100,代表最近才剛創新低。

Aroon 震盪(oscillator):AroonUp − AroonDown,範圍 −100 到 +100。這是一個乾淨的「上升趨勢主導度」量:越高代表上升趨勢越領先。

中文教學裡 aroon 幾乎只被當成「兩條線交叉」的進出場訊號:AroonUp 上穿 AroonDown 就買、下穿就賣。但這種交叉用法雜訊極高,而且把 aroon 最有價值的特性丟掉了。aroon 真正的強項是它的震盪「水準值」是一個天然的橫截面排序量——這一點,下面用真實台股回測攤開來看。

aroon 阿隆指標的數學定義

把上面的白話翻成公式,aroon 的計算很乾淨。設 timeperiod 為 nn,AroonUp 與 AroonDown 的定義是:

AroonUp=n(自 n 期最高點以來天數)n×100,AroonDown=n(自 n 期最低點以來天數)n×100AroonUp = \frac{n - (\text{自 } n \text{ 期最高點以來天數})}{n}\times 100,\qquad AroonDown = \frac{n - (\text{自 } n \text{ 期最低點以來天數})}{n}\times 100

震盪(oscillator)則是兩者相減:

AroonOsc=AroonUpAroonDownAroonOsc = AroonUp - AroonDown

逐個符號拆開來看:

  • nn 是回看窗格(本文用 25 個交易日)。它決定 aroon「記得多久以前的高低點」:nn 越大、越偏中長期趨勢,nn 越小、越敏感也越多雜訊。
  • 「自 nn 期最高點以來天數」是從今天往回數,最近一次 nn 日新高發生在幾天前。今天剛創新高時這個天數是 0,代入後 AroonUp=100AroonUp = 100;如果最高點落在窗格最左端(nn 天前),天數是 nnAroonUp=0AroonUp = 0。AroonDown 對最低點同理。
  • 因為分子最大是 nn、最小是 0,兩條線都被鎖在 0 到 100 之間,震盪則落在 100-100+100+100

關鍵在於 aroon 量的是時間(距離上次極值幾天),不是幅度(漲跌多少)。這跟 RSI、KD 這類用漲跌幅算出來的指標本質不同——它更像一個「趨勢新鮮度」的計時器。震盪越接近 +100+100,代表「最近才創新高、卻很久沒創新低」,也就是上升趨勢正在領先;越接近 100-100 則相反。這個乾淨的 100-100+100+100 連續量,正是它適合拿來做橫截面排序的數學基礎。

單股示意圖:兩個派別的買賣點,與訊號頻繁的代價

光看公式不夠直觀,把 aroon 畫到單一個股上最清楚。下圖是台積電(2330)2023-08 到 2024-06 這段的日線(上半部黑線為股價),下半部疊上 AroonUp(25)、AroonDown(25)與震盪三條線,並在價格面板標出兩個教科書派別的買賣點:

  • 交叉派:AroonUp 上穿 AroonDown 進場、下穿出場(圖上藍色 / 黃色三角)。
  • 震盪派:震盪向上突破 50 進場、跌破 0 出場(圖上紫色三角)。

台積電 2330 的 aroon 阿隆指標 25 日 AroonUp、AroonDown 與震盪三條線,價格面板標出交叉派與震盪派買賣點的單股示意圖,2023 到 2024 台股

同一段、同一套參數換到聯發科(2454)上長這樣:

聯發科 2454 的 aroon 阿隆指標 25 日 AroonUp、AroonDown 與震盪線與交叉派、震盪派買賣訊號單股示意圖,2023 到 2024 台股

兩張圖一起看,能直觀感受兩個派別的差別與共同的毛病。在台積電這段近 11 個月裡,交叉派進場 4 次、出場 3 次,震盪派進場 6 次、出場 4 次;聯發科則是交叉派進場 4 次、出場 3 次,震盪派進場 5 次、出場 3 次。也就是說,單股逐訊號操作會在短短不到一年裡反覆進出近十次。盤整段(看 2023-09 到 2023-11,價格橫盤、AroonUp 與 AroonDown 互相穿來穿去)尤其明顯:兩條線貼在一起反覆交叉,交叉派被迫一買一賣來回挨刀,這就是技術指標常見的 whipsaw(來回掃損)。震盪派把進場門檻拉到震盪大於 50、稍微過濾掉貼合區的雜訊,但盤整時照樣會被洗。

這正是為什麼本文主張別在單一個股上逐訊號操作 aroon:訊號太頻繁、雜訊太大,每次進出都付手續費與證交稅。把 aroon 從「單股擇時訊號」改用成「全市場橫截面排序、月頻換股」,等於用一籃子股票把單股雜訊平均掉,這也是後面回測證明有效的那條路。

想自己重畫這張圖、把任何一檔股票的 aroon 攤開來看,核心程式碼如下(一行一個動作、可讀版):

顯示程式碼
import pandas as pd
import matplotlib.pyplot as plt
import finlab
from finlab import data
 
# finlab 會在需要資料時自動引導登入
finlab.login()
 
# 載入價量並取單一個股(以台積電 2330 為例、取近 11 個月)
close = data.get("price:收盤價")
sid = "2330"
window = slice("2023-08-01", "2024-06-30")
 
# Aroon(25):data.indicator 直接回傳 AroonDown 與 AroonUp 兩個 DataFrame
aroon_down, aroon_up = data.indicator("AROON", timeperiod=25)
oscillator = aroon_up - aroon_down
 
# 取出這一檔、這段期間的序列
price = close[sid].loc[window]
up = aroon_up[sid].loc[window]
down = aroon_down[sid].loc[window]
osc = oscillator[sid].loc[window]
 
# 交叉派訊號:AroonUp 上穿 AroonDown 進場、下穿出場
cross_up = (up > down) & (up.shift() <= down.shift())
cross_dn = (up < down) & (up.shift() >= down.shift())
 
# 震盪派訊號:震盪突破 50 進場、跌破 0 出場
osc_in = (osc > 50) & (osc.shift() <= 50)
osc_out = (osc < 0) & (osc.shift() >= 0)
 
# 上半部畫股價並標買賣點、下半部畫 aroon 三條線
fig, (ax_price, ax_aroon) = plt.subplots(2, 1, figsize=(12, 7), sharex=True)
ax_price.plot(price.index, price, color="black", label=sid)
ax_price.scatter(price[cross_up].index, price[cross_up], marker="^", label="交叉派買進")
ax_price.scatter(price[cross_dn].index, price[cross_dn], marker="v", label="交叉派賣出")
ax_price.scatter(price[osc_in].index, price[osc_in], marker="^", label="震盪派買進")
ax_price.legend()
 
ax_aroon.plot(up.index, up, label="AroonUp(25)")
ax_aroon.plot(down.index, down, label="AroonDown(25)")
ax_aroon.plot(osc.index, osc, label="震盪(Up−Down)")
ax_aroon.axhline(50, linestyle="--")
ax_aroon.axhline(0, linestyle="--")
ax_aroon.legend()
plt.show()

黃金交叉沒有額外 edge:交叉用法在台股的真相

我們在可交易宇宙(60 日均量 > 100 萬股、收盤 > 10 元、成交金額前 300 大,排除 ETF、權證、KY、金融股、處置股)裡,把幾種「aroon 用法」各跑一次月再平衡回測,研究段(2015-2021)與樣本外(2022-2026)結果如下:

aroon 用法 研究段年化 研究段 Sharpe 樣本外年化
黃金交叉持有(AroonUp > AroonDown 才抱) 14.1% 0.67 21.0%
裸選高震盪 top30(震盪最高 30 檔) 12.7% 0.67 21.0%
選低震盪 bottom30(「超賣接刀」想等反彈) 0.2% 0.12 12.5%

aroon 阿隆指標不同用法的研究段年化報酬(CAGR)對照長條圖,黃金交叉與裸選高震盪幾乎相同,選低震盪近乎零

兩個結論很清楚:

第一,「黃金交叉持有」跟「裸選高震盪 top30」幾乎一模一樣(研究段 14.1% vs 12.7%、月 Sharpe 都是 0.67,樣本外都是 21.0%)。這代表那一刻的「穿越」本身沒有提供額外資訊——會買到的股票本來就是 AroonUp 高、AroonDown 低、也就是震盪高的那些。把焦點放在「交叉的瞬間」是搞錯重點,真正帶來報酬的是「趨勢有多領先」這個持續的狀態量。

第二,「選低震盪想等反彈」近乎零報酬(研究段年化只有 0.2%、月 Sharpe 0.12)。低 Aroon 的股票就是趨勢落後的股票,把它當「超賣接刀」標的,等於系統性地買進弱勢股。aroon 沒有均值回歸的特性,硬要它抄底會被市場修理。延伸閱讀:技術面與基本面選股的差異動能策略

那 aroon 到底該怎麼用?答案是把震盪當成一個橫截面的選股因子,而不是糾結於兩條線什麼時候交叉。本文先用 11 年回測證明這個反直覺的結論——交叉沒有 edge、震盪當排序因子才有——攤開背後的五分位單調性、多空價差與參數穩健度;再把這個乾淨的選股基底加上趨勢持續性濾網、反波動加權與 aroon 自家的廣度風控,組成一套完整、可上桌的純技術策略。如果你想了解把 AroonUp、AroonDown、AroonOsc 各種條件組合丟進每月換股回測、用選股條件優化器逐一掃描的實作流程,可以另外讀動量指標 AROON 阿隆指標選股回測實作

aroon 真正的強項:把震盪當橫截面選股因子

五分位單調性:高 Aroon 就是後續報酬更好

判斷一個量有沒有橫截面 alpha,最直接的做法是把全市場按它排序、切成五等分(五分位),看報酬會不會隨分位單調變化。我們把可交易宇宙按 Aroon 震盪由低到高切成 Q1 到 Q5,各組等權月持有,毛報酬結果如下:

分位(震盪由低到高) 研究段年化 研究段 Sharpe 樣本外年化 樣本外 Sharpe
Q1(最低) 1.2% 0.15 3.7% 0.39
Q2 7.3% 0.42 9.2% 0.58
Q3 8.0% 0.48 14.8% 0.76
Q4 5.9% 0.38 17.6% 0.83
Q5(最高) 19.4% 0.93 42.8% 1.41

aroon 震盪五分位 Q1 到 Q5 研究段與樣本外月 Sharpe,近單調遞增,最高分位壓倒性領先

研究段與樣本外都近單調遞增:分位越高、報酬越好。最高分位 Q5 在兩段都壓倒性領先(研究段年化 19.4%、樣本外衝到 42.8%、Sharpe 1.41),最低分位 Q1 兩段近乎零。重點不只是「極端分位有效」——中間的 Q2、Q3、Q4 也大致按順序排開,這是一個乾淨的橫截面因子才會有的特徵,不是挑兩個極端硬湊出來的假象。

機制上很好理解:高 Aroon 震盪代表這檔股票最近才剛創新高、上升趨勢正在領先,而領先的趨勢在中期傾向延續。這和 Jegadeesh & Titman (1993) 的動能效應一致:過去的贏家在中期傾向繼續贏。aroon 等於是用「距離創新高的天數」這個角度,量出了同一個趨勢延續的力道。

多空價差:alpha 集中在多腿,long-only 投資人是好消息

把因子拆成多腿(高震盪 top30)與空腿(低震盪 bottom30)分開看,能進一步確認 edge 在哪一端(毛報酬日序):

研究段年化 研究段 Sharpe 樣本外年化 樣本外 Sharpe
多腿(高 Aroon top30) 24.4% 1.07 48.3% 1.50
空腿(低 Aroon bottom30) −1.1% 0.06 1.6% 0.31
多空價差(多腿 − 空腿) 23.9% 1.27 43.9% 1.68

下圖把這個多空價差的全期走勢(2015 到 2026)攤開來看。灰線(右側對數軸)是「高震盪多腿 − 低震盪空腿」的累積價差淨值,一路向右上、沒有長期回吐,就是上表 Sharpe 的視覺版。紫線(左軸 0 到 1)則是另一個輔助觀察的廣度序列:每天在可交易宇宙裡,Aroon 震盪大於 0(也就是上升趨勢主導)的股票占多少比例。它代表市場有多少股票正處於趨勢領先狀態——紫線在高檔(接近 1)時,是普遍趨勢盤、多空價差通常順風;紫線塌到低檔時,市場趨勢分散,價差容易盤整。兩條線一起看,能直觀感受這個因子的報酬怎麼隨市場趨勢廣度起伏。

aroon 震盪多空價差(高震盪多腿減低震盪空腿)2015 到 2026 全期累積淨值對數軸走勢,疊上池內 Aroon 震盪大於 0 的家數比例廣度序列

回到上表,兩件事值得注意:

多空價差兩段皆正,而且樣本外不衰退反而強化:研究段月 Sharpe 1.27、樣本外拉到 1.68,月勝率從 57.8% 升到 71.7%。一個因子若是過擬合,典型病徵是「研究段漂亮、樣本外崩」;aroon 震盪正好相反,這是它站得住的有力證據。

alpha 幾乎全在多腿:空腿(低 Aroon)研究段 −1.1%、樣本外 +1.6%,約等於零。這代表低 Aroon 股只是「不漲」,不是「可放空 alpha」。對只做多的投資人這是好消息——直接做多高 Aroon 籃子就能拿到主要報酬,不必承擔台股放空的借券成本與限制。

參數穩健:timeperiod 14、25、35 都站得住

一個因子最怕「只有某一組參數有效」。我們把多空價差在 timeperiod 14、25、35 各跑一次(毛報酬):

timeperiod 多空研究段 Sharpe 多空樣本外 Sharpe
14 0.87 1.26
25 1.27 1.68
35 1.83 1.57

三組參數的研究段與樣本外 Sharpe 全部為正,period 35 研究段 Sharpe 甚至高達 1.83。period 越長(25 到 35),研究段與樣本外越對稱穩定。edge 不是某一組參數調出來的假象,是因子本身的特性——這也是為什麼建議用 25 到 35,而不是去微調出一個「最佳」的單一數字。

完整策略:Aroon 震盪選股 + 廣度減碼(純技術)

把上面的洞見組成一套可執行、可重現、完全不含基本面的純技術策略。選股端用震盪抓「趨勢起點」、風控端用 aroon 自家的市場廣度抓「整體趨勢何時崩」:

  1. 可交易宇宙:上市櫃普通股,60 日均成交金額前 300 名、60 日均量 > 100 萬股、收盤 > 10 元,排除 ETF(代號 00 開頭)、權證 / KY / 特別股(非 4 碼純數字)、金融保險股、處置與全額交割股。
  2. 因子:用 TA-Lib AROON(timeperiod=20) 算 AroonUp 與 AroonDown,相減得 Aroon 震盪。
  3. 趨勢持續性濾網(去假突破):只保留近 20 個交易日內「Aroon 震盪 > 0」的天數至少 15 天的個股——確認趨勢已穩定站在零軸上方、是真起漲,而非曇花一現的單日突刺。
  4. 選股:在合格池內取 Aroon 震盪橫截面最高的 10 檔。
  5. 加權:反波動加權,權重與個股 60 日日報酬標準差成反比、組內正規化——同樣是高震盪股,把資金多配給波動較低的那幾檔。
  6. 大盤風控(廣度減碼):每日算宇宙內「Aroon 震盪 > 0」的家數比例(市場廣度),平滑 14 日;若跌破其 120 日滾動均減 1.2 倍滾動標準差(判定上升趨勢廣度崩潰),當日把整體股票部位減碼到 50%、其餘持現金;廣度回到門檻之上即恢復滿倉。
  7. 再平衡:月頻。

選股端的核心程式碼(可直接交給你的 AI 助理改寫、或下載完整版執行):

顯示程式碼
import numpy as np
import pandas as pd
import finlab
from finlab import data
 
# finlab 會在需要資料時自動引導登入
finlab.login()
 
# 載入價量資料
close = data.get("price:收盤價")
amount = data.get("price:成交金額")
volume = data.get("price:成交股數")
 
# 可交易宇宙:成交額前 300 大、60 日均量 > 100 萬股、收盤 > 10 元
# 排除 ETF(00 開頭)與權證 / KY(非 4 碼純數字)
liquidity_amount = amount.rolling(60).mean()
liquidity_volume = volume.rolling(60).mean()
is_common = pd.Series({sid: (str(sid)[:4].isdigit() and not str(sid).startswith("00"))
                       for sid in close.columns})
universe = (liquidity_amount.is_largest(300)
            & (liquidity_volume > 1_000_000)
            & (close > 10)
            & is_common)
 
# Aroon(20):震盪 = AroonUp − AroonDown(越高 = 上升趨勢越領先)
aroon_down, aroon_up = data.indicator("AROON", timeperiod=20)
oscillator = aroon_up - aroon_down
 
# 趨勢持續性濾網:近 20 交易日內「震盪 > 0」天數 >= 15(濾掉假突破)
persistence = (oscillator > 0).rolling(20).sum()
qualified = universe & (persistence >= 15)
 
# 選股:合格池內 Aroon 震盪橫截面最高 10 檔
basket = oscillator.where(qualified).rank(axis=1, ascending=False) <= 10
 
# 反波動加權:權重 ∝ 1 / 個股 60 日日報酬標準差,組內正規化
vol60 = close.pct_change().rolling(60).std()
inv_vol = (1.0 / vol60).where(basket)
weights = inv_vol.div(inv_vol.sum(axis=1).replace(0, np.nan), axis=0).fillna(0.0)

完整的廣度減碼風控、配置與穩健度掃描請見文末可下載的 strategy.py

這套純技術策略研究段(2015-2021)年化 25.4%、月 Sharpe 1.32、月 Sortino 3.06、研究段最大回撤 -24.1%;樣本外(2022-2026)年化 29.6%、月 Sharpe 1.17、月 Sortino 2.59、段內回撤 -35.3%;全期(2015-2026)年化 26.9%、月 Sharpe 1.18、月 Sortino 2.58、全期最大回撤 -35.6%,年換手約 9.8 次。 三段年化都勝過含息 0050(全期年化 21.0%、Sharpe 1.05、回撤 -34.0%),且報酬引擎完全來自 aroon 機制——選股用震盪、風控用廣度,全程沒有任何財報或月營收輸入。比起裸選高震盪 top30 等權的舊版(全期最大回撤 -45.0%),三項純技術升級(持續性濾網、反波動加權、廣度減碼)把全期回撤一路壓到 -35.6%,這也是 aroon 從「乾淨因子」走到「可上桌純技術策略」的關鍵。

下面是完整互動式回測:月報酬熱力圖、權益曲線、年度績效都可以直接在文章裡操作:

回測方法與口徑

量化結論的可信度取決於方法,以下逐項交代:

  • 交易成本:策略使用 finlab sim(),台股預設已內扣手續費(本文以 0.1425% 打三折計)與賣出證交稅 0.3%。
  • 滑價:未額外假設滑價,實際成交衝擊取決於資金規模與流動性。
  • 股票池:上市櫃普通股,60 日均成交金額前 300 名、60 日均量 > 100 萬股、收盤 > 10 元。
  • 排除類別:排除 ETF(代號 00 開頭)、權證 / KY / 特別股(非 4 碼純數字)、金融保險股、處置與全額交割股,以降低生存者偏差與不可交易標的污染。
  • 前視偏差:Aroon 震盪、趨勢持續性天數、60 日波動與市場廣度均只使用當日(含)以前的價格計算;月頻再平衡,訊號於當期可得。完全不使用財報或月營收等基本面資料,自然沒有財報公布日對齊問題。
  • 權重:選股籃以反波動(1 ÷ 個股 60 日日報酬標準差)加權、單一標的不另設上限;廣度風控觸發時整體股票部位減碼到 50%、其餘持現金,不放空、不加槓桿。
  • 周轉率:月再平衡年換手約 9.8 次(選股集中 10 檔+持續性濾網進出+廣度減碼切換),屬中等偏高;週再平衡會飆到約 28.9 次(見下節)。
  • 毛報酬 vs 含成本:五分位與多空價差為毛報酬日序,用來證明因子有橫截面 alpha,未經完整成本與部位模型(故不列最大回撤);含成本的落地策略(持續濾網+反波動加權+廣度減碼)報酬會比毛報酬縮水,兩者數字不可混用。
  • 樣本內外:研究段 2015-2021、樣本外 2022-2026 分開回報,所有關鍵數字兩段都列,避免只報漂亮的一段。

穩健度

這套策略的 edge 不是靠單一參數湊出來的:

  • 底層因子五分位單調:Aroon 震盪本身切五分位(毛報酬),Q1 到 Q5 研究段(Sharpe 0.15 到 0.93)與樣本外(Sharpe 0.39 到 1.41)皆近單調遞增,不是只有極端分位有效——選股的排序量本身就站得住。
  • 底層多空價差跨參數穩健:多空價差 timeperiod 14、25、35 的研究段與樣本外 Sharpe 全部為正(研究段 0.87 / 1.27 / 1.83),edge 非單一參數。
  • 三項升級各自有貢獻:以裸選震盪最高 10 檔等權為基線(研究段年化 20.1%、Sharpe 0.88、回撤 -46.1%),加上趨勢持續性濾網把研究段年化拉到 25.6%、反波動加權把回撤收到 -35.9%、再加廣度減碼把研究段 Sharpe 推上 1.32、回撤壓到 -24.1%——每一件單獨拿掉都會退步,不是某一項在硬撐。
  • 樣本外不衰退:策略研究段月 Sharpe 1.32、樣本外 1.17,年化 25.4% 到 29.6%,沒有「研究漂亮、樣本外崩」的過擬合徵兆;底層多空價差研究段 Sharpe 1.27 到樣本外 1.68、月勝率 57.8% 到 71.7% 也同向。
  • 再平衡頻率界定清楚:必須月頻。把同一套選股邏輯改成週再平衡,年換手飆到約 28.9 次、樣本外最大回撤惡化到 -46.4%——aroon 是 20 到 35 日的中低頻趨勢因子,提高再平衡頻率等於追逐雜訊,被成本和雜訊吃光。關於過擬合的判斷,可參考回測過擬合機率

參數最佳化:找的是一片高原,不是一根孤峰

選參數最大的陷阱,是在一張二維網格裡挑出績效最高的那一格、宣稱「最佳參數」。那通常是過擬合:你挑到的多半是雜訊運氣最好的那一格,換一段資料就垮。正確的做法是看「一整片表現都不錯的高原」,而不是「四周都很差、只有它特別高的單一孤峰」——孤峰是過擬合的警訊,高原才代表 edge 對參數不敏感、是策略本身的特性。

我們把純技術策略的兩個關鍵參數做網格:Aroon 週期(18、20、22)× 持股數(8、10、12),每一格都帶著同一套持續性濾網、反波動加權與廣度減碼真跑一次回測,把研究段月 Sharpe 畫成色溫圖:

aroon 阿隆指標純技術策略週期與持股數參數最佳化的研究段月 Sharpe 色溫圖,週期 20 整排站得住、週期 22 研究段衝高但樣本外崩,2015 到 2026 台股回測

九格的研究段月 Sharpe 落在 1.0 到 1.42 之間,但這張圖真正的資訊不在「哪一格研究段最高」,而在研究段與樣本外的對稱性。看週期軸就清楚:週期 22 那一排研究段 Sharpe 衝到 1.35 到 1.42 最漂亮,卻是過擬合的邊界——它的樣本外整排崩(週期 22、持股 8 樣本外 Sharpe 只剩 0.72,持股 10 也只有 0.89)。週期 18 那排則相反,研究段 Sharpe 偏低(1.0 到 1.09)、撐不起策略。唯一研究段與樣本外都站得住的是中間的週期 20:持股 10 研究段 1.32、樣本外 1.17,持股 8 研究段 1.27、樣本外更高到 1.28,兩格都通過「研究段年化 ≥ 25%、月 Sharpe ≥ 1.2」與「樣本外年化 ≥ 15%、月 Sharpe ≥ 1.0」的把關。這就是為什麼全文用週期 20、持股 10——它坐在穩健高原的中央,而不是去追週期 22 那格研究段最高、樣本外卻打回原形的假孤峰。

更廣的鄰域掃描也指向同一結論:把廣度減碼的崩潰門檻(1.0 到 1.3 倍標準差)、減碼後保留比例(0.4 到 0.6)、廣度平滑天數(10 到 20)與廣度均線(100 到 150 日)各動一格,21 個鄰格中有 9 格仍同時過硬門檻、週期 20 配持股 8 或持股 10 都過——是一片站得住的高原,不是靠單一格的運氣。一個健康的策略本來就該對參數鈍感;如果你發現某個設定非得調到某一格研究段才漂亮、隔壁格樣本外就垮,那多半是過度最佳化挖出來的假 edge,上實盤會原形畢露。

aroon 的其他變體用法:斜率、加速度、AroonUp 高檔過濾

除了「震盪水準」與「黃金交叉」,網路上還流傳幾種 aroon 變體用法。既然數據引擎都跑了,順手把它們放進同一套月再平衡框架真測一遍(裸選股、含成本、long-only),跟最樸素的「裸選震盪最高 30 檔」對照,讓你不用自己踩坑:

用法 研究段年化 研究段月 Sharpe 樣本外年化
震盪斜率最大 top30(追「趨勢正在加速領先」) 5.0% 0.34 9.2%
震盪加速度最大 top30(二階變化、追「加速的加速」) 5.9% 0.38 11.6%
裸 AroonUp 最高 top30(只看 AroonUp、不減 AroonDown) 2.9% 0.24 11.4%
AroonUp > 80 且創 60 日新高過濾 8.4% 0.52 22.0%
裸選震盪水準最高 top30(本文策略的選股基底) 12.7% 0.67 21.0%

結論很一致:把 aroon 的訊號做得越「花」,表現越差。追震盪斜率、追加速度,等於去抓更高階、雜訊更大的微分量,研究段年化掉到 5% 上下、月 Sharpe 只剩 0.3 出頭。只看裸 AroonUp(不減 AroonDown)更差,因為它丟掉了「下降趨勢有沒有同時退場」這半邊資訊。唯一勉強跟震盪水準同級的是「AroonUp > 80 且創 60 日新高」——它本質上跟「震盪水準高」高度重疊(都是在抓上升趨勢領先的股票),樣本外年化 22.0% 接近裸選震盪的 21.0%,但研究段較弱(月 Sharpe 0.52 對 0.67)。

這帶出一個更通用的教訓:面對一個指標,與其發明越來越複雜的衍生訊號,不如先確認它最樸素的「水準值」有沒有橫截面 alpha,再從這個乾淨的基底往上疊有意義的工序。aroon 的答案是震盪水準就夠了——本文的純技術策略就是站在這個裸選震盪的基底上,再加趨勢持續性濾網、反波動加權與廣度減碼,而不是去發明更花的衍生訊號。各技術指標的正確用法可參考RSI、MACD、KD 比較

不同大盤狀態下的表現:研究段與樣本外都站得住

判斷一套策略是不是只靠某一段行情湊出來,最直接的方法是把回測切成兩段、各自結算。本文把 2015-2021 當研究段(涵蓋 2015 股災、2018 中美貿易戰急跌、2020 疫情崩跌與反彈),2022-2026 當樣本外(涵蓋 2022 升息熊市與其後的強多頭,2026 標示「截至 2026-06」資料):

區間 大盤背景 策略年化 策略月 Sharpe 策略最大回撤 含息 0050 年化
研究段 2015-2021 多次急跌與反彈交錯 25.4% 1.32 -24.1% 15.3%
樣本外 2022-2026(截至 2026-06) 升息熊市後轉強多頭 29.6% 1.17 -35.3% 30.4%
全期 2015-2026 26.9% 1.18 -35.6% 21.0%

兩段分開看的重點是:策略在研究段與樣本外的年化都落在 25% 到 30%、月 Sharpe 都在 1.1 以上,沒有出現「研究段漂亮、樣本外垮掉」的過擬合特徵。 研究段它大幅領先含息 0050(25.4% vs 15.3%),靠的是震盪選股在震盪市裡挑到剛起漲的趨勢領先股,加上廣度減碼在 2015、2018、2020 幾次急跌時把曝險砍下來——研究段最大回撤壓到 -24.1%,明顯淺於含息 0050。樣本外它與含息 0050 的差距縮小(29.6% vs 30.4%),因為 2022 之後是台股強單邊多頭,廣度減碼偶爾轉防禦會在順風段少賺一點、段內回撤也擴大到 -35.3%,但全期年化仍以 26.9% 勝過含息 0050 的 21.0%。

這個「上升趨勢廣度崩潰時調降曝險」的風控邏輯,和 Moreira & Muir (2017) 在《Volatility-Managed Portfolios》的發現一致:在風險惡化時調降曝險,能提升投資組合的風險調整報酬。這裡的風控用的是 aroon 自家的「市場廣度」(全市場震盪大於 0 的家數比例),而非單一個股或指數的 aroon 交叉——廣度是橫截面的、平滑的整體趨勢度量,比單一序列的交叉穩定得多。關於用大盤訊號降低回撤,也可參考市場濾網如何降低回撤均線市場濾網

加上月營收 YoY 會更好嗎:基本面是選配,不在主策略內

本文的主策略是完全不含基本面的純技術策略:選股只用 Aroon 震盪與其趨勢持續性、波動度,風控只用 aroon 自家的市場廣度,沒有任何財報或月營收輸入。這是刻意的設計——純技術訊號每日可得、無財報公布延遲與對齊問題,回測口徑乾淨、可重現性高,報酬引擎完整地來自 aroon 機制本身。

常見的延伸問題是:在高震盪選股池裡疊一層月營收年增率(YoY)過濾,績效會不會更好?這是一個合理的研究方向,但屬於「在純技術主策略之外的選配實驗」,不納入本文主策略的數字。原因有二:其一,主策略選股只取 10 檔、又先過一道趨勢持續性濾網,集中度已高,再加營收過濾會大幅縮小可選池,反而犧牲趨勢領先股的爆發力;其二,月營收是領先指標、公布有時間落差,要正確對齊「當期(含)以前已公布」的資料才不會前視,這會把乾淨的純技術口徑複雜化。想實驗的讀者可在下載的程式碼裡,於選股前加一層 monthly_revenue 的 YoY 過濾自行對照。基本面與技術面如何分工,可延伸看技術面與基本面選股的差異

策略的限制與取捨

  • 樣本外回撤擴大、單邊多頭少賺:策略全期最大回撤 -35.6%,樣本外段內 -35.3%,比研究段的 -24.1% 深。原因是 2022 之後台股單邊多頭,廣度減碼偶爾在順風段轉防禦會少賺、回撤也跟著放大;它的強項在震盪市裡控風險,不在單邊多頭裡衝到最滿。
  • 集中度與單股風險:策略只持 10 檔、又用反波動加權集中到低波標的,承受得住 -35% 等級回撤、且能接受高集中度的人才適合;分散需求高者不適用。
  • 毛報酬與含成本不可混用:五分位、多空價差是毛報酬日序,用來驗證底層因子有效;它們明顯高於含成本落地策略的數字,引用時要分清楚。
  • 樣本外特別強可能有市況加成:樣本外(2022-2026)底層多空 Sharpe 1.68、Q5 年化 42.8%,部分受惠於該段台股趨勢行情特別明顯(趨勢因子受惠),不應外推「未來必有此等報酬」。
  • 容量與成本:宇宙限成交額前 300 名、選 10 檔,月頻換手約 9.8 次,中型容量尚可;大資金部署需重估流動性衝擊,回測未逐筆估算滑價與容量。
  • 單指標純度:本文刻意維持純技術主題(報酬引擎僅來自 aroon 機制與動能、波動等價量因子),未混入基本面;與 ADX(趨勢強度)等其他技術因子的雙因子交集是後續方向。各技術指標的正確用法可參考RSI、MACD、KD 比較KD 鈍化策略TA-Lib 158 種技術指標

自己跑一次

把下面這句話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:

免費試用

用 AI 開始 FinLab

把這句話交給你的AI,它會帶你完成設定並做出第一個策略。

告訴你的AI:

「幫我設定 FinLab,做一個動能策略:https://finlab.finance/setup」

裝好之後,下載本文的 strategy.pydata.csv,即可在自己的環境重跑、改參數、換因子。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽程式交易是什麼程式交易完整指南。對策略上線前該留意的陷阱,可看回測的限制量化交易的風險

常見問題

Q:aroon 阿隆指標的參數要設多少?timeperiod 20 是最好的嗎? 本文純技術策略用 timeperiod 20。重點不在微調出一個「最佳」數字,而在它落在研究段與樣本外都對稱站得住的穩健高原中央:週期 22 研究段衝高但樣本外崩、週期 18 研究段撐不起,唯有週期 20 兩段都過硬門檻。底層因子層面,多空價差在 timeperiod 14、25、35 三組參數的研究段與樣本外 Sharpe 也全部為正(研究段 0.87 / 1.27 / 1.83),edge 非單一參數。

Q:AroonUp 上穿 AroonDown 的黃金交叉到底能不能買? 能買,但沒有額外好處。黃金交叉持有的研究段年化 14.1%、月 Sharpe 0.67,和「直接選 Aroon 震盪最高 30 檔」(12.7% / 0.67)幾乎相同。交叉的瞬間沒提供額外資訊,真正帶來報酬的是「趨勢有多領先」這個狀態,把焦點放在交叉訊號是搞錯重點。

Q:Aroon 低檔(AroonDown 高)可以拿來抄底嗎? 不建議。選低震盪 bottom30 想等反彈,研究段年化只有 0.2%、月 Sharpe 0.12,近乎零報酬。低 Aroon 是趨勢落後的股票,aroon 沒有均值回歸特性,硬要它抄底等於系統性地買弱勢股。

Q:Aroon 震盪要選最高幾檔、多久換一次股? 本文選最高 10 檔、月再平衡,並先過一道趨勢持續性濾網(近 20 交易日內震盪大於 0 的天數至少 15 天)。再平衡頻率很關鍵:把同一套選股改成週再平衡,年換手飆到約 28.9 次、樣本外最大回撤惡化到 -46.4%。aroon 是中低頻趨勢因子,必須月頻再平衡,提高頻率只會被雜訊和成本吃光。

Q:aroon 和 ADX、DMI 這些趨勢指標差在哪? aroon 量的是「距離創新高 / 新低的天數」(趨勢的新鮮度與方向),ADX 量的是「趨勢的強度」(不分多空)。兩者角度互補,常被一起比較。本文只測了 aroon 單因子,與 ADX 的雙因子交集是後續方向。

Q:這套 aroon 純技術策略適合誰? 適合想要主動選股、能接受 -35% 等級回撤與較高換手成本,追求明顯高於含息 0050 報酬的人:全期年化 26.9%、月 Sharpe 1.18,研究段與樣本外年化都勝過含息 0050。不適合受不了深度回撤、或偏好低周轉被動持有的人——那種需求直接買進持有含息 0050 更省心。也適合想把「趨勢領先度」放進多因子模型、或想學會驗證一個技術指標到底有沒有橫截面 alpha 的人。

Q:為什麼風控用 Aroon 自家的「市場廣度」,而不是看單一個股或指數的 aroon 交叉? 因為單一序列的 aroon 交叉在盤整期雜訊太大、來回甩巴掌;改看「全市場有多少比例的股票 Aroon 震盪大於 0」這個橫截面廣度,是平滑得多的整體趨勢度量。本文把它平滑 14 日,跌破 120 日滾動均減 1.2 倍標準差時把股票部位減碼到 5 成——研究段把最大回撤從不加風控的 -35.9% 壓到 -24.1%,選股與風控都用 aroon 機制、不引入任何外部訊號。


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

本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。Aroon 震盪選股加廣度減碼純技術策略全期最大回撤 -35.6%,實際交易前請自行評估風險、滑價與交易容量。

FinLab AI

想建立自己的策略?

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

免費開始

更多技術指標研究

查看全部