cci 指標在台股的正確用法:拆成趨勢濾網加大盤風控
散戶最熟的 cci 指標用法是「cci 跌破 −100 就超賣買進、突破 +100 就超買賣出」。但把這個規則放進台股做 11 年回測(2015-2026),教科書「cci 低於 −100 超賣買進」研究段(2015-2021)年化報酬只有 2.0%、月夏普 0.20,幾乎等於沒賺;反過來追「cci 最高的強勢股」研究段年化也只有 7.4%、月夏普 0.48,靠的是高達 -38.7% 的回撤硬撐。問題不在 cci 指標,而在用錯地方——把整個指標當成單一買賣開關。用上市櫃真實價量資料攤開來看,cci 真正的價值在於拆成兩個各司其職的零件:第一個零件是「個股 cci」當趨勢持有濾網,只把錢留在 cci 站上 −50(順勢)的股票,剔除順勢深跌的接刀股;第二個零件是「0050 自身的 cci」當大盤斷路器,只在大盤重度弱勢(cci ≤ −100)時整籃清倉避開崩盤尾部。把這兩個零件疊上「站季線 + 低波選股」與「動能傾斜除以波動」的加權,組成一套完全不含基本面的純技術策略:在站季線且 cci > −50 的池子裡取 60 日波動最低的 24 檔、以動能除以波動傾斜加權,大盤斷路器斷電時清空持現金。這套「cci 雙零件純技術策略」研究段(2015-2021)年化 25.5%、月夏普 1.23,樣本外(2022-2026)年化 24.7%、月夏普 1.32,全期(2015-2026)年化 24.9%、月夏普 1.25,全期最大回撤 -21.0%——三段都勝過含息 0050(全期年化 21.0%、月夏普 1.05、回撤 -34.0%),且回撤明顯更淺。
先用一張表回答你搜尋「cci 指標」時最想知道的事:
| 你想知道的 | 本文用真實台股回測的回答 |
|---|---|
| cci 指標是什麼 | Commodity Channel Index,順勢指標;衡量現價偏離一段期間平均的標準化距離,無上下界,常以 ±100 為超買超賣門檻 |
| cci 低於 −100 買進有效嗎 | 台股 11 年回測研究段年化僅 2.0%、月夏普 0.20,接近無效;追 cci 最高的強勢股也只有 7.4% |
| cci 指標能拿來選股嗎 | 整個指標單獨選股不行;但拆出「個股 cci 站上 −50」當趨勢持有濾網、剔除順勢下殺的接刀股,配合低波與動能就有效 |
| 那它該怎麼用 | 兩個零件分工:個股 cci 當趨勢濾網、0050 自身 cci 當大盤斷路器開關 |
| 效果如何 | cci 雙零件純技術策略研究段年化 25.5%、月夏普 1.23,樣本外 24.7%、1.32,全期 24.9%、1.25,三段都勝含息 0050、回撤更淺(-21.0%) |

本文所有數字皆出自 finlab 套件抓取的上市櫃真實價量資料(
price與etl:adj_close含息還原股價),回測區間 2015-01 至 2026-06-09,基準為含息 0050。文末附可下載的strategy.py與data.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼。
cci 指標是什麼
cci 指標(Commodity Channel Index,順勢指標)是 Donald Lambert 在 1980 年提出的動量振盪指標,原本用於商品市場。它衡量「現在的價格偏離一段期間的平均有多遠」,並用平均絕對偏差做標準化,公式為:
cci =(典型價格 − N 日典型價格均線)/(0.015 × 平均絕對偏差),其中典型價格 =(最高價 + 最低價 + 收盤價)/ 3。常數 0.015 是 Lambert 刻意設計,讓多數讀數落在 ±100 之間。
cci 和 KD、威廉指標最大的不同是它沒有 0 到 100 的上下界,可以是正無限大到負無限大,因此較少出現指標鈍化。技術指標的基礎名詞可參考名詞詞彙表。
實務上 cci 有兩派互斥用法:均值回歸派主張「cci 跌破 −100 是超賣、該買;突破 +100 是超買、該賣」,假設價格會回到均值;突破動能派則主張 cci 站上 +100 代表強勢趨勢成形,該追進。哪一派對?台股實際資料下,兩派當選股訊號都站不住——直接回測給你看。
cci 指標的數學定義與計算公式
把前面那句白話拆成可計算的式子,cci 的定義是:
逐個符號拆開來看:
- (典型價格,Typical Price) ,其中 、、 是當日的最高、最低、收盤價。用三價平均而不是只看收盤,是為了讓 cci 同時感受到盤中的高低振盪,而不是只盯收盤一個點。
- 是 的 日簡單移動平均,代表「最近這段期間的價格重心」。 預設 14。分子 就是「現價偏離重心多遠」,正值代表在均值之上、負值代表在均值之下。
- (平均絕對離差,Mean Deviation) 是 對其 日均值的平均絕對距離,。它的角色是把分子的「偏離」用近期波動度做標準化——同樣偏離 5 元,在一檔平常就劇烈震盪的股票上算正常,在一檔平常很穩的股票上就是異常。除以 之後,cci 在不同價位、不同波動度的股票之間才可比。
- 常數 是 Lambert 刻意挑的縮放係數。他希望多數讀數落在 之間,於是用 把分母放大;當價格偏離大約 1.5 倍平均絕對離差時,cci 剛好等於 ,這就是 門檻的由來。
和 KD、威廉指標把讀數壓在 0 到 100 之間不同,cci 的分母會隨波動度浮動、分子可正可負,所以它沒有上下界,理論上能到正負無限大,較少出現指標貼著天花板或地板的鈍化。技術指標的基礎名詞可參考名詞詞彙表。
把 cci 畫在單股上:教科書 ±100 派的買賣點長什麼樣
公式看完,最快建立直覺的方式是把 cci 畫在一檔真股票上、標出教科書 ±100 派的買賣點。下圖是台積電(2330)2023-07 到 2024-06 這一年,下方面板是 cci(14)、上方價格面板標出「cci 跌破 −100 時買進、突破 +100 時賣出」的訊號:

光是這一年、這一檔,教科書 ±100 派就觸發了 29 個訊號(10 次超賣買進、19 次超買賣出)。聯發科(2454)同期也有 25 個(7 買、18 賣):

兩張圖直接點出 cci 當個股進出訊號的兩個結構性問題。第一是訊號太頻繁:cci 是短週期振盪計,一年穿越 ±100 二、三十次,每次進出都要付手續費與證交稅,光成本就把報酬磨掉一截。第二是反覆被洗(whipsaw):在 2024 年初那段明顯的上升趨勢裡,cci 一漲超過 +100 就發「超買賣出」,把還在續漲的台積電早早賣掉,接著股價又創高——這正是「均值回歸派」在趨勢盤的致命傷。換句話說,教科書把 cci 當買賣開關,在台股大型權值股上既貴又抓不準,這也預告了下一段回測的結果。
想自己重畫這張圖、把訊號換成你想驗證的邏輯,下面這段程式碼可以複製來改(cci 由 finlab 內建的 data.indicator 算,不必自己接 TA-Lib):
顯示程式碼
import finlab
from finlab import data
import matplotlib.pyplot as plt
# finlab 會在需要資料時自動引導登入
finlab.login()
# 用 finlab 內建的 indicator 介面直接算 cci(14)
cci = data.indicator("CCI", timeperiod=14)
close = data.get("price:收盤價")
# 取單一檔、單一年度的窗(太長會擠成一團不可讀)
sid = "2330"
window = slice("2023-07-01", "2024-06-30")
price_s = close[sid].loc[window]
cci_s = cci[sid].loc[window]
# 教科書 ±100 派:cci 跌破 −100 視為超賣買進、突破 +100 視為超買賣出
crossed_below = (cci_s < -100) & (cci_s.shift(1) >= -100)
crossed_above = (cci_s > 100) & (cci_s.shift(1) <= 100)
# 上下兩個面板:價格在上、cci 在下
fig, (ax_price, ax_cci) = plt.subplots(
2, 1, figsize=(12, 7), sharex=True, gridspec_kw={"height_ratios": [2, 1]}
)
ax_price.plot(price_s.index, price_s, color="#111111", linewidth=1)
ax_price.scatter(price_s.index[crossed_below], price_s[crossed_below],
marker="^", color="#10B981", label="超賣買進")
ax_price.scatter(price_s.index[crossed_above], price_s[crossed_above],
marker="v", color="#EF4444", label="超買賣出")
ax_price.legend()
ax_cci.plot(cci_s.index, cci_s, color="#A855F7", linewidth=1)
ax_cci.axhline(100, color="#9CA3AF", linestyle="--") # +100 超買
ax_cci.axhline(-100, color="#9CA3AF", linestyle="--") # −100 超賣
plt.show()把 sid 換成任何一檔股票、把訊號邏輯改成你的假設,就能在動筆做回測前先用眼睛檢查訊號合不合理。要把這套訊號變成整個策略、跑出可重現的績效,再往下看。
教科書最常見的用法,在台股 11 年幾乎沒賺到錢
我們在可交易宇宙(成交金額前 300 大、60 日均量 > 100 萬股、收盤 > 10 元,排除 ETF、金融股、KY 股、處置股)裡,把幾種「cci 選股」用法各跑一次月再平衡的回測,研究段(2015-2021)結果如下:
| cci 指標用法 | 研究段年化報酬 | 研究段月夏普 | 研究段最大回撤 |
|---|---|---|---|
| cci 跌破 −100 超賣買進(cci 最低 30 檔) | 2.0% | 0.20 | -41.7% |
| cci 突破追強勢(cci 最高 30 檔) | 7.4% | 0.48 | -38.7% |
| 對照:含息 0050(研究段) | 15.3% | 1.00 | -28.2% |

上圖把全文四種用法的研究段年化攤在一起:兩種 cci 裸用選股(超賣買進 2.0%、突破追高 7.4%)墊底,「品質低波籃」(14.8%)已勝過含息 0050,而把 cci 用對地方(個股 cci 趨勢濾網 + 大盤斷路器 + 動能傾斜)後,研究段年化一路拉到 25.5%——後面幾段會逐一拆解這個跳升怎麼來的。先看裸用選股這兩根:最多人用的「cci 跌破 −100 超賣買進」在台股研究段年化只有 2.0%、月夏普 0.20,接近無效。 原因不難理解——台股 cci 偏低的股票,多半是下跌中繼(順勢往下殺),缺乏均值回歸的保護,接刀往往續跌。反過來追「cci 最高的強勢股」雖然研究段年化拉到 7.4%,但月夏普只有 0.48、最大回撤 -38.7%,全期回撤更達 -47.7%,報酬是用很深的回撤硬撐出來的,實務上很難抱得住。兩派當橫截面選股都遠遠落後含息 0050。
值得一提的是,cci 突破追強勢這組在樣本外(2022-2026)年化跳到 17.4%、cci 超賣買進那組樣本外也有 17.3%——但別被這段騙了:研究段那麼差、樣本外才漂亮,是典型的市況依賴(regime dependence),不是穩定的 edge(後面策略的限制會再展開)。cci 本來就不是設計來做橫截面選股的指標。
把 cci 拆成兩個有用的零件
整個 cci 當買賣開關失效,但拆開來看,它有兩個各自有效的零件,本文的純技術策略就建立在這兩個零件上。
零件一:個股 cci 當趨勢持有濾網,不當選股排序
先釐清一個關鍵差別:把 cci 當「橫截面選股排序」(誰的 cci 高就買誰、誰低就買誰)是負增量;但把 cci 當「二元的趨勢持有濾網」(只把錢留在 cci 站上某門檻的順勢股、把順勢深跌的接刀股剔出去)卻有效。差別在前者要 cci 提供它沒有的選股資訊,後者只要 cci 做它本來就會的事——標記「現價偏離均值的方向」。
先看排序為何不行。建一個「品質低波籃」——只留站上季線(close > 60 日均線)的股票,剔除 60 日波動最高一半,再取波動最低的若干檔,完全不看 cci——研究段月夏普 1.02、年化 14.8%。把 cci 動能塞進這個池內當選股排序,掃 timeperiod(14/20/30)× 檔數(20/30/40)共 9 組,沒有任何一組的研究段月夏普贏過「不看 cci 只選低波」的對照組(1.02)。機制是 cci 衡量「價格偏離均值多遠」,和「動能、趨勢強度」高度共線;在已用「站季線」框過趨勢方向的池子裡,cci 排序再沒有增量資訊,反而傾向選到「短期暴衝、偏離均值最大」的高波標的,把回撤拉高。
但同一個 cci,改當二元濾網就翻盤。在站季線的池子裡,只留 cci(14) > −50 的股票(順勢、未深跌),把 cci(14) ≤ −50 的順勢下殺接刀股整批剔除——這一個動作本身就是 CAGR 的加值來源。後面的消融測試會證明:拔掉這層趨勢濾網(只站季線、不看 cci),研究段年化從 25.5% 掉到 21.0%、樣本外也掉到 19.0%。延伸閱讀:技術面與基本面選股的差異、動能策略。
選股的低波 edge 本身則來自學術上記載已久的低波動異常——Ang, Hodrick, Xing & Zhang (2006) 發現高波動股票的後續報酬反而偏低,低波組合長期有較佳的風險調整報酬。cci 趨勢濾網的角色是把這個低波籃裡「順勢深跌的爛標的」清掉,讓錢留在順勢標的上。
零件二:0050 自身的 cci 當大盤斷路器
cci 對個股排序沒有增量,是因為它和動能共線;但對大盤指數而言,cci 是一個很乾淨的東西——它衡量「指數現在偏離自己均值多遠」。當 0050 自身的 cci 深跌到 −100 以下,代表整個大盤處於系統性的重度弱勢。這正是 cci「順勢」設計初衷在指數層級的正確應用:把整個大盤當成一個標的,用它自己的 cci 當整體市場的斷路器,在系統性深弱勢時拉斷電、整籃清倉持現金,等 cci 回升再進場。

把這個斷路器套在選股籃外層的效果很直接:裸籃(無斷路器)全期最大回撤深達 -37.3%;加上 0050 自身 cci 斷路器後,全期最大回撤砍到 -21.0%。 樣本外段裸籃月夏普 1.27、加斷路器後守到 1.32,回撤同步收斂。斷路器用順風段偶爾少賺一點,換到深跌段的整段避險。

這個「在系統性弱勢時降曝險」的邏輯,和學術上的波動度擇時一致——Moreira & Muir (2017) 在《Volatility-Managed Portfolios》證明:在波動升高、風險惡化時調降曝險,能顯著提升投資組合的夏普值。0050 的 cci 正是一個可操作的系統性弱勢偵測器。
這裡有一個關鍵設計:門檻要寬,只在深弱勢時才斷電。 我們掃了不同門檻,cci ≤ −100 與 ≤ −50 都能把回撤明顯壓低;但若把門檻拉嚴到 cci ≤ 0(只要大盤稍微偏弱就空手),每次淺回檔就空手、錯失反彈、把複利殺掉。原因是 cci 的價值在「避開崩盤尾部」而不是「頻繁進出」——cci 適合當「斷路器」,不適合當「進出開關」。把兩個零件疊上低波選股與動能傾斜加權後,效果一目了然,下一段給完整策略。
完整策略:cci 雙零件純技術選股
把上面兩個零件疊上低波選股與動能傾斜加權,組成一套可執行、可重現、完全不含基本面的純技術策略:
- 選股池(個股 cci 趨勢濾網):可交易宇宙中,先留站上季線(close > 60 日均線)、且個股 cci(14) > −50(順勢、剔除接刀股)的股票。
- 選股(低波):在這個池子裡取 60 日報酬日波動度最低的 24 檔。
- 加權(動能傾斜除以波動):對這 24 檔分別算 60 日與 120 日報酬的橫截面分位,混合成
0.4 × 60日 + 0.6 × 120日的動能分數,權重正比於「動能分數的 3.5 次方除以 60 日波動」——把錢往「高動能、低波動」的股票傾斜。 - 大盤斷路器(0050 自身 cci):計算 0050 自身的 cci(20)。當 0050 的 cci(20) ≤ −100(大盤重度弱勢)時整籃清倉、持有現金;其餘時間滿倉。
- 月再平衡。
選股端的核心程式碼(可直接交給你的 AI 助理改寫、或下載完整版執行):
顯示程式碼
import numpy as np
import pandas as pd
import talib
from finlab import data
from finlab.backtest import sim
# 載入價量資料(finlab 會在需要資料時自動引導登入)
close = data.get("price:收盤價")
high = data.get("price:最高價")
low = 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
# 零件一:個股 cci(14) 趨勢濾網。站季線 + cci > −50(順勢、剔除接刀股)
cci14 = data.indicator("CCI", timeperiod=14)
above_ma60 = close > close.rolling(60).mean()
pool = universe & above_ma60 & (cci14 > -50)
# 選股:池內取 60 日報酬日波動度最低的 24 檔
vol60 = close.pct_change().rolling(60, min_periods=30).std()
basket = vol60.where(pool).rank(axis=1, ascending=True) <= 24
# 加權:動能傾斜除以波動。混合 60 日與 120 日動能分位,往高動能、低波傾斜
r60 = (close / close.shift(60) - 1).where(basket).rank(axis=1, pct=True)
r120 = (close / close.shift(120) - 1).where(basket).rank(axis=1, pct=True)
blend = 0.4 * r60 + 0.6 * r120
raw_w = (blend ** 3.5) / vol60
weights = raw_w.where(basket).div(raw_w.where(basket).sum(axis=1), axis=0).fillna(0.0)
# 零件二:0050 自身 cci(20) 大盤斷路器。跌破 −100 → 整籃清倉持現金
cci_0050 = pd.Series(
talib.CCI(high["0050"].values, low["0050"].values, close["0050"].values,
timeperiod=20),
index=close.index,
)
risk_on = (cci_0050 > -100).reindex(weights.index).ffill().fillna(False)
weights = weights.where(risk_on, 0.0)
# 月再平衡(台股預設成本:手續費 + 賣出證交稅 0.3%)
report = sim(weights, resample="M")完整的可交易宇宙過濾、權重正規化與斷路器遮罩請見文末可下載的 strategy.py。
這套策略研究段(2015-2021)年化 25.5%、月夏普 1.23、月索提諾 3.80、研究段最大回撤 -21.0%;樣本外(2022-2026)年化 24.7%、月夏普 1.32、月索提諾 3.03、樣本外最大回撤 -13.9%;全期(2015-2026)年化 24.9%、月夏普 1.25、月索提諾 3.45、全期最大回撤 -21.0%。三段都勝過含息 0050(全期年化 21.0%、月夏普 1.05、回撤 -34.0%),且全期回撤明顯更淺。年換手約 6.9 倍。
下面是完整互動式回測:月報酬熱力圖、權益曲線、年度績效都可以直接在文章裡操作:
回測方法與口徑
量化結論的可信度取決於方法,以下逐項交代:
- 交易成本:策略使用 finlab
sim(),台股預設已內扣手續費(本文以 0.1425% 打三折計)與賣出證交稅 0.3%。 - 滑價:未額外假設滑價,實際成交衝擊取決於資金規模與流動性。
- 股票池:上市櫃普通股,60 日均成交金額前 300 名、60 日均量 > 100 萬股、收盤 > 10 元。
- 排除類別:排除 ETF(代號 00 開頭)、權證/KY/特別股(非 4 碼純數字)、金融保險股、處置與全額交割股,以降低生存者偏差與不可交易標的污染。
- 前視偏差:60 日波動、60/120 日動能、季線、個股 cci(14)、0050 的 cci(20) 均只使用當日(含)以前的價格;月頻再平衡,斷路器訊號於當期可得。完全不使用財報或月營收等基本面資料,自然沒有財報公布日對齊問題。
- 權重:選股籃以「動能分數 3.5 次方除以 60 日波動」傾斜加權、單一資產不另設上限;斷路器關閉時整籃歸零、持有現金。
- 周轉率:年換手約 6.9 倍(月再平衡 + 動能傾斜換股 + 偶發斷路器切換),斷路器是「偶發深弱勢清倉」而非高頻進出。
- 樣本內外:研究段 2015-2021、樣本外 2022-2026 分開回報,所有數字兩段都列,避免只報漂亮的一段。
穩健度
這套策略的 edge 不是靠單一參數湊出來的。我們逐一拔掉策略的每個零件,看研究段與樣本外的報酬怎麼變:
| 拔掉哪個零件 | 研究段年化 | 研究段月夏普 | 樣本外年化 | 樣本外月夏普 | 全期最大回撤 |
|---|---|---|---|---|---|
| 完整策略(三零件齊全) | 25.5% | 1.23 | 24.7% | 1.32 | -21.0% |
| 拔個股 cci(14) > −50 趨勢濾網 | 21.0% | 1.16 | 19.0% | 1.24 | -22.2% |
| 拔動能傾斜、改純低波等權 | 17.1% | 1.34 | 16.8% | 1.15 | -19.2% |
| 拔 0050 斷路器、裸籃 | 23.0% | 1.06 | 30.8% | 1.27 | -37.3% |
三個零件方向一致、各有分工:
- 個股 cci 趨勢濾網是 CAGR 加值來源之一:拔掉它(只站季線),研究段年化從 25.5% 掉到 21.0%、樣本外從 24.7% 掉到 19.0%。把順勢深跌的接刀股清掉,確實留住了報酬。
- 動能傾斜是 CAGR 主來源:拔掉傾斜、改純低波等權,研究段年化掉到 17.1%、樣本外 16.8%——夏普反而略升(純低波本來就穩),但報酬被砍掉一大截,證明「往高動能傾斜」是把報酬拉高的主力。
- 0050 斷路器是回撤的主力:拔掉斷路器的裸籃,樣本外年化更高(30.8%),但全期最大回撤從 -21.0% 惡化到 -37.3%。斷路器用一點順風段報酬,換到深跌段約 16 個百分點的回撤縮減。
- 成本壓力測試:把手續費加倍、賣出稅率拉到 0.6% 再跑,研究段年化仍有 22.0%、樣本外 21.4%、樣本外月夏普 1.17——雖未達 25% 硬門檻,但樣本外仍站得住,不是靠零成本假設撐出來的。
- 斷路器週期穩健:把斷路器從 0050 cci(20) 換成 cci(14),研究段年化 22.4%、樣本外年化更衝到 27.6%、樣本外月夏普 1.45,兩個週期都成立,不是只有單一 timeperiod 僥倖。
參數最佳化:找一片高原,不是追一個孤峰
策略有兩個最值得檢查的旋鈕:選股檔數(決定集中度)與動能傾斜的冪次(決定往高動能傾斜多兇)。為了確認本文預設的 24 檔、冪次 3.5 不是事後挑出來的漂亮數字,我們把這兩個參數做成網格——檔數 18/24/30 檔 × 冪次 2.5/3.5/4.5——每一格都真跑一次回測,把研究段月夏普畫成色溫圖:

看色溫圖時,真正該盯的是那個高分格的四周長什麼樣,而非單純哪一格數字最大。如果最佳格被一圈差很多的格子包圍,那是一座孤峰——換個市況、換個資料段就會塌掉,是過度最佳化的警訊;如果高分格落在一整片都還不錯的區域裡,那是一片高原,代表結論對參數不敏感,比較可信。
這張圖屬於後者。整片網格 9 格的研究段月夏普都落在 1.12 到 1.48 之間,沒有突兀的孤峰。 橫看檔數軸,越集中(18 檔)研究段夏普越高(1.41–1.48)、但報酬絕對值反而較低;越分散(30 檔)夏普略降(1.12–1.17)。縱看冪次軸,2.5 到 4.5 之間研究段年化都站得住。本文預設取 24 檔、冪次 3.5(研究段月夏普 1.23、年化 25.5%),它落在高原中段,研究段與樣本外都穩;冪次拉到 4.5 那一列研究段年化更高(24 檔可到 27.9%),但回撤也跟著放大,我們刻意取報酬與回撤平衡的中段,而非追單格峰值。
那麼「往更兇的傾斜去調」會差多少?把預設(24 檔、冪次 3.5)和相鄰的更兇傾斜(24 檔、冪次 4.5)擺在一起對照:

| 參數組 | 研究段月夏普 | 樣本外月夏普 | 樣本外最大回撤 | 樣本外年化 |
|---|---|---|---|---|
| 預設:24 檔、冪次 3.5(本文主策略) | 1.23 | 1.32 | -13.9% | 24.7% |
| 鄰格:24 檔、冪次 4.5 | 1.20 | 1.32 | -15.1% | 26.7% |
兩組基本上是平手:冪次 4.5 換到樣本外年化高一點(26.7% vs 24.7%),但樣本外月夏普一樣是 1.32、樣本外回撤反而略深(-15.1% vs -13.9%)。這就是沒有免費午餐——相鄰的格子數字差距都在小數點後一兩位,選哪一格結論都成立。所以與其追單格峰值,不如取一片高原裡的合理預設,這也是我們把 24 檔、冪次 3.5 設為這套策略預設的原因。提醒一句:色溫圖上若真有某一格特別突出、四周卻很差,那通常是過度最佳化的訊號而非發現了聖杯,要先懷疑、不要先興奮。
不同大盤狀態下的表現:研究段與樣本外都站得住
判斷一套策略是不是只靠某一段行情湊出來,最直接的方法是把回測切成兩段、各自結算。本文把 2015-2021 當研究段(涵蓋 2015 股災、2018 中美貿易戰急跌、2020 疫情崩跌與反彈),2022-2026 當樣本外(涵蓋 2022 升息熊市與其後的強多頭,2026 標示「截至 2026-06」資料):
| 區間 | 大盤背景 | 策略年化 | 策略月夏普 | 策略最大回撤 | 含息 0050 年化 |
|---|---|---|---|---|---|
| 研究段 2015-2021 | 多次急跌與反彈交錯 | 25.5% | 1.23 | -21.0% | 15.3% |
| 樣本外 2022-2026(截至 2026-06) | 升息熊市後轉強多頭 | 24.7% | 1.32 | -13.9% | 30.4% |
| 全期 2015-2026 | — | 24.9% | 1.25 | -21.0% | 21.0% |
兩段分開看的重點是:策略在研究段與樣本外的年化都落在 24%–26%、月夏普都在 1.2 以上,沒有出現「研究段漂亮、樣本外垮掉」的過度最佳化特徵。 研究段它大幅領先含息 0050(25.5% vs 15.3%),靠的是個股 cci 趨勢濾網 + 低波選股在震盪市裡挑到順勢穩健標的;樣本外它與含息 0050 的差距縮小(24.7% vs 30.4%),因為 2022 之後是台股強單邊多頭,斷路器偶爾轉防禦會在順風段少賺一點,但全期仍以更淺的回撤(-21.0% vs 0050 的 -34.0%)勝出。
加上月營收 YoY 會更好嗎:基本面是選配,不在主策略內
本文的主策略是完全不含基本面的純技術策略:選股只用站季線、個股 cci 趨勢濾網、低波與動能傾斜,風控只用 0050 自身的 cci 斷路器,沒有任何財報或月營收輸入。這是刻意的設計——純技術訊號每日可得、無財報公布延遲與對齊問題,回測口徑乾淨、可重現性高。
常見的延伸問題是:在選股端疊一層月營收年增率(YoY)過濾,績效會不會更好?這是一個合理的研究方向,但屬於「在純技術主策略之外的選配實驗」,不納入本文主策略的數字。原因有二:其一,主策略選股只取 24 檔、又有 cci 趨勢濾網與低波雙重收斂,集中度已高,再加營收過濾會大幅縮小可選池,反而稀釋動能傾斜的爆發力;其二,月營收是領先指標、公布有時間落差,要正確對齊「當期(含)以前已公布」的資料才不會前視,這會把乾淨的純技術口徑複雜化。想實驗的讀者可在下載的程式碼裡,於選股池計算前加一層 monthly_revenue 的 YoY 過濾自行對照。基本面與技術面如何分工,可延伸看技術面與基本面選股的差異。
為什麼不用常規均線擇時?
讀到這裡你可能會問:用 0050 站上 / 跌破 200 日均線(MA200)來擇時不是更直覺嗎?cci 斷路器和 MA200 擇時的差別在反應速度。MA200 是慢速趨勢線,牛市中只要淺回檔跌破均線就整段空手、反應遲鈍,常被洗出去;cci 斷路器是均值偏離的快速振盪計,門檻設寬(cci ≤ −100),只在「真正深跌」才觸發,對上升趨勢中的淺回檔容忍度高,能在降回撤的同時保住多頭段的複利。本文的斷路器把全期最大回撤從裸籃的 -37.3% 砍到 -21.0%,靠的就是「只在系統性深弱勢時拉斷電」這個寬門檻設計。關於用大盤訊號降低回撤,也可參考市場濾網如何降低回撤與均線市場濾網。
用 cci 指標最常踩的四個陷阱
把前面的回測整理成可操作的避雷清單,這四個是散戶用 cci 最常犯、也最傷績效的錯:
- 把 −100/+100 當無腦進出開關。 教科書 ±100 派在台積電一年觸發 29 個訊號(見前面單股圖),訊號太密、又會在趨勢盤反覆被洗。cci 跌破 −100 在研究段年化只有 2.0%、月夏普 0.20,接近無效。cci 是「警示燈」不是「板機」,看到極端讀數要結合趨勢判斷,而不是機械式照單下單。
- 把個股 cci 當選股因子排序。 個股的 cci 和動能高度共線,在已用「站季線」過濾掉趨勢方向的池子裡幾乎沒有排序增量;本文掃 9 組參數,沒有一組的研究段月夏普贏過同池「只看低波」的對照組(1.02)。cci 對個股的正確用法是當「二元趨勢濾網」(站上 −50 才留、剔接刀股),不是當「誰高買誰」的排序分數。
- 斷路器門檻設太嚴。 斷路器的價值在「避開崩盤尾部」而非「頻繁進出」。門檻拉到 cci ≤ 0(大盤稍弱就空手)會把每次淺回檔都掃成空手、錯過反彈、把複利殺掉。門檻要「寬」(≤ −100),只在深弱勢時拉斷電——本文裸籃全期回撤 -37.3%,加上寬門檻斷路器後砍到 -21.0%,靠的就是這個設計。
- 看色溫圖只挑最高那一格。 參數最佳化要找一片高原、不是追一個孤峰。本文檔數 × 動能冪次的網格 9 格研究段月夏普都落在 1.12 到 1.48,相鄰格差距都在小數點後一兩位;被研究段單格峰值吸引去調參,往往就是過度最佳化的開始。
這四個陷阱有個共同根源:cci 是個敏感的短週期振盪計,把它放在「需要乾淨排序訊號」的位置(個股選股排序、機械式進出)會放大它的雜訊;放在「標記方向」的位置(個股二元趨勢濾網、大盤深弱勢斷路器)才用對了它的特性。各擺盪指標的正確用法差異,可再看RSI、MACD、KD 比較。
策略的限制與取捨
- 集中度帶來不可忽視的回撤:策略只持 24 檔、全期最大回撤 -21.0%。雖比含息 0050 的 -34.0% 淺,但仍是兩成以上的回撤,承受得住這級回撤才適合。選股集中換到較高報酬,代價是單股與類股風險集中。
- 個股 cci 是趨勢濾網、不是選股排序:本文主策略用個股 cci(14) > −50 當二元持有濾網(剔接刀股),不是用 cci 高低做橫截面排序——後者在本研究是負增量,不該宣稱「cci 選股排序有效」。
- 高周轉、成本敏感:年換手約 6.9 倍明顯高於被動持有,報酬已在
sim()內扣手續費與證交稅後計算,但實單滑價會進一步侵蝕;成本加倍壓測下研究段年化退到 22.0%、樣本外 21.4%,仍站得住但獲利空間變窄。 - 擇時類訊號有市況風險:樣本外段(2022 空頭 + 2023-2024 反彈)有明確的「深跌後反彈」型態,cci 寬門檻斷路器的樣本外表現受惠於此。前面提到的「cci 超賣買進樣本外年化 17.3%、研究段卻只有 2.0%」就是一個市況依賴的反例——只在特定下跌-反彈 regime 賺錢、換個市況就崩,提醒擇時與反轉類訊號的過擬合風險。不同市況(如陰跌盤整)下斷路器的效益會變動。
- 容量與成本:選股 24 檔、宇宙限前 300 大成交金額,中大型資金可承載;低波與 cci 濾網收斂後實際可選池更窄,超大資金需放寬檔數。回測未逐筆估算滑價與借券成本。
自己跑一次
把下面這句話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:
用 AI 開始 FinLab
把這句話交給你的AI,它會帶你完成設定並做出第一個策略。
告訴你的AI:
「幫我設定 FinLab,做一個動能策略:https://finlab.finance/setup」
裝好之後,下載本文的 strategy.py 與 data.csv,即可在自己的環境重跑、改參數、換選股基底。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽與程式交易是什麼。
常見問題
Q:cci 指標跌破 −100 一定會反彈嗎? 不一定。cci 跌破 −100(超賣)在台股研究段回測年化只有 2.0%、月夏普 0.20,因為它無法區分「健康回檔」與「趨勢轉空」。台股 cci 偏低的股票多為下跌中繼,把它當無腦抄底訊號,長期接近無效。
Q:cci 指標可以單獨拿來當買賣訊號嗎? 不建議。跌破 −100 買、突破 +100 賣或用 cci 高低做橫截面排序選股,在台股回測都站不住。要讓 cci 變得有用,得拆成兩個零件:個股 cci 當「站上 −50 才留」的二元趨勢濾網(剔接刀股),0050 自身的 cci 當大盤斷路器(深弱勢時清倉)。cci 適合拆成這兩個零件搭配低波與動能傾斜使用,而不是整個拿來當進出場依據。
Q:cci 指標參數要設多少?timeperiod 14、門檻 ±100 是最好的嗎? 14 期、±100 是 Donald Lambert 的原始設定。本文個股趨勢濾網用 cci(14)、門檻 −50,大盤斷路器用 0050 自身的 cci(20)、門檻 −100;斷路器週期換成 cci(14) 結論一致(樣本外月夏普 1.45)。重點不在參數微調,而在用法:斷路器門檻要「寬」(≤ −100),只在深弱勢時清倉;門檻設太嚴(≤ 0)反而把複利殺掉。
Q:cci 指標和 RSI、KD 有什麼差別? cci、RSI、KD 都是擺盪類指標,但 cci 沒有 0 到 100 的上下界(可正負無限大),較少鈍化。三者資訊高度重疊,硬疊在一起通常是負貢獻。比較有效的組合是「不同性質」的訊號搭配,例如低波選股 + 動能傾斜 + cci 大盤斷路器(風控)。各指標的正確用法可參考RSI、MACD、KD 比較。
Q:為什麼用 0050 的 cci 而不是個股的 cci? 兩者都用,但角色不同。個股 cci(14) 當二元趨勢濾網(站上 −50 才留、剔接刀股);0050 自身的 cci(20) 當大盤斷路器(深弱勢清倉)。個股 cci 不適合當「誰高買誰」的橫截面排序——它和動能共線、排序是負增量;但指數層級的 cci 是乾淨的「系統性弱勢偵測器」,當 0050 自己的 cci 深跌,代表整個大盤重度弱勢,此時清倉避開崩盤尾部,正是 cci「順勢」設計在大盤層級的正確應用。
Q:cci 斷路器和肯特納通道、ATR 這類波動指標差在哪? cci 衡量「價格偏離均值的標準化距離」,ATR 與肯特納通道衡量「波動幅度本身」。三者都能用於風控,但訊號性質不同。延伸可看肯特納通道與 ATR 指標與台股 ATR 波動度指標。
Q:這套策略適合誰? 適合想要主動選股、能接受兩成等級回撤與較高換手成本,追求明顯高於含息 0050 報酬的人:全期年化 24.9%、月夏普 1.25,研究段與樣本外都勝過含息 0050、回撤更淺。不適合受不了任何深度回撤、或偏好低周轉被動持有的人——那種需求直接買進持有含息 0050 更省心(樣本外強多頭段 0050 年化 30.4%,仍高於本策略的 24.7%)。
Q:cci 斷路器為什麼比 MA200 擇時好? 差別在反應速度。MA200 是慢速趨勢線,牛市中淺回檔跌破均線就整段空手、反應遲鈍,常被洗出去;cci 斷路器是均值偏離的快速振盪計,門檻設寬(≤ −100),只在「真正深跌」才觸發,對上升趨勢中的淺回檔容忍度高,能在降回撤的同時保住多頭段的複利。本文斷路器把裸籃全期回撤 -37.3% 砍到 -21.0%,靠的就是這個寬門檻設計。
最後更新:2026-06|回測區間:2015-01 ~ 2026-06-09|作者:FinLab 量化研究團隊(經量化研究員審閱)
本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。cci 雙零件純技術策略全期最大回撤 -21.0%、樣本外最大回撤 -13.9%,實際交易前請自行評估風險、滑價與交易容量。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

