cci 指標在台股的正確用法:拆成趨勢濾網加大盤風控
cci 指標台股回測的關鍵數字:
| 你想知道的 | 本文用真實台股回測的回答 |
|---|---|
| cci 指標是什麼 | Commodity Channel Index,順勢指標;衡量現價偏離一段期間平均的標準化距離,沒有上下界,常以 ±100 為超買超賣門檻 |
| cci 低於 −100 買進有效嗎 | 每月買 cci(14) 最低的 30 檔,研究段(2015–2021)年化 2.2%;月底 cci 低於 −100 的股票全部持有只有 0.3%。同期含息 0050 是 15.1% |
| cci 指標能拿來選股嗎 | 拿 cci 高低排序不行:站上季線的池子裡改挑 cci 最高的股票,9 組參數研究段月夏普 0.55 到 0.84,全輸給只挑低波動的 1.01。改當「cci(14) 大於 −50 才留」的二元濾網,站季線、波動最低 24 檔的籃子全期年化由 14.5% 提高到 18.0% |
| 那它該怎麼用 | 兩個零件分工:個股 cci 當趨勢濾網,0050 自身的 cci 當大盤斷路器,月底讀到 −100 以下就整籃換成現金 |
| 效果如何 | 資料延長到 2026-09-30,全期年化 25.2%、月夏普 1.23、最大回撤 -22.9%,三項都勝含息 0050 的 21.2%、1.07、-34.0%;2022 年起年化 24.5% 落後 0050 的 30.5% |
| 最大的保留 | 這套規則在每月最後一個交易日換股。換股日改到每月 5、10、15、20、25 日,全期年化只剩 8.5% 到 16.3%,研究段更從 26.1% 掉到 0.9% 到 7.9%;斷路器改成每天檢查,全期年化 17.6%、回撤 -34.9% |
| 最近發生什麼事 | 首發資料截止日 2026-06-09 之後到 9 月底,策略 +6.8%、0050 +8.9%;7 月淨值從高點回落 22.9%,是 2015 年以來最深的一次回撤 |
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重現這篇文章,請讀:https://finlab.finance/setup?relatedUrl=/blog/cci-indicator-taiwan

本文所有數字皆出自 finlab 套件(2.2.21)抓取的上市櫃真實價量資料(
price與etl:adj_close含息還原股價),cci 以 TA-LibCCI計算,回測從 2015-01-30 起算、資料截至 2026-09-30,基準為同日起算的含息 0050。2026-10-28 用延長後的資料重跑,參數一個都沒改:2022 年起月夏普由首發版(資料截至 2026-06-09)的 1.32 降到 1.23,仍在我們設的 1.0 門檻之上。這次重跑另外補做了換股日、斷路器檢查頻率、逐層拆解與參數逐格掃描,也修正了 0050 斷路器的價格口徑,結論比首發版保守很多,首發版的幾個錯誤在對應段落更正。文末附可下載的strategy.py與data.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼。
cci 指標是什麼
cci 指標(Commodity Channel Index,順勢指標)是 Donald Lambert 在 1980 年提出的動量振盪指標,原本用於商品市場。它衡量「現在的價格偏離一段期間的平均有多遠」,並用平均絕對偏差做標準化,公式為:
cci =(典型價格 − N 日典型價格均線)/(0.015 × 平均絕對偏差),其中典型價格 =(最高價 + 最低價 + 收盤價)/ 3。常數 0.015 是 Lambert 刻意設計,讓多數讀數落在 ±100 之間。
實務上 cci 有兩派互斥用法:均值回歸派主張「cci 跌破 −100 是超賣、該買;突破 +100 是超買、該賣」,假設價格會回到均值;突破動能派則主張 cci 站上 +100 代表強勢趨勢成形,該追進。兩派當選股訊號在台股都站不住,回測見後面。
cci 指標的數學定義與計算公式
把前面那句白話拆成可計算的式子,cci 的定義是:
逐個符號拆開來看:
- (典型價格,Typical Price) ,其中 、、 是當日的最高、最低、收盤價。用三價平均,是為了讓 cci 同時反映盤中的高低振盪,不只看收盤一個點。
- 是 的 日簡單移動平均,代表「最近這段期間的價格重心」。 預設 14。分子 就是「現價偏離重心多遠」,正值代表在均值之上、負值代表在均值之下。
- (平均絕對離差,Mean Deviation) 是 對其 日均值的平均絕對距離,。它的角色是把分子的「偏離」用近期波動度做標準化:同樣偏離 5 元,在一檔平常就劇烈震盪的股票上算正常,在一檔平常很穩的股票上就是異常。除以 之後,cci 在不同價位、不同波動度的股票之間才可比。
- 常數 是 Lambert 刻意挑的縮放係數。他希望多數讀數落在 之間,於是用 把分母放大;當價格偏離大約 1.5 倍平均絕對離差時,cci 剛好等於 ,這就是 門檻的由來。
和 KD(0 到 100)、威廉指標(−100 到 0)把讀數壓在固定區間不同,cci 的分母會隨波動度浮動、分子可正可負,所以它沒有上下界,理論上能到正負無限大,較少出現指標貼著天花板或地板的鈍化。技術指標的基礎名詞可參考名詞詞彙表。
TA-Lib 的 CCI 就是這個公式:用台積電(2330)2015 年起每天的高、低、收盤價手算,和 finlab data.indicator("CCI", timeperiod=14) 的結果逐日相同。finlab 預設用未還原的價格計算,除權息、減資或分割當天價格跳動,cci 也會跟著跳一次,這點在後面 0050 斷路器的段落會再遇到。
把 cci 畫在單股上:教科書 ±100 派的買賣點長什麼樣
公式看完,最快建立直覺的方式是把 cci 畫在一檔真股票上、標出教科書 ±100 派的買賣點。下圖是台積電(2330)2023-07 到 2024-06 這一年,下方面板是 cci(14)、上方價格面板標出「cci 跌破 −100 時買進、突破 +100 時賣出」的訊號:

光是這一年、這一檔,教科書 ±100 派就觸發了 29 個訊號(10 次超賣買進、19 次超買賣出)。這一年台積電上漲 66.8%,cci 有 29.2% 的交易日在 +100 以上。聯發科(2454)同期也有 25 個(7 買、18 賣),股價上漲 102.6%:

兩張圖直接點出 cci 當個股進出訊號的兩個問題。第一是訊號太頻繁:cci 是短週期振盪計,一年穿越 ±100 二、三十次,每次進出都要付手續費與證交稅。第二是反覆被洗(whipsaw):在 2024 年初那段明顯的上升趨勢裡,cci 一漲超過 +100 就發「超買賣出」(台積電 2024 年 1 月到 4 月就有 6 次),把還在續漲的股票早早賣掉,接著股價又創高,這正是「均值回歸派」在趨勢盤的弱點。
想自己重畫這張圖、把訊號換成你想驗證的邏輯,下面這段程式碼可以複製來改(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")
# 教科書 ±100 派:cci 跌破 −100 視為超賣買進、突破 +100 視為超買賣出
# 先用完整歷史判斷穿越(窗內第一天也看得到真正的前一天),再截出要畫的一年
cci_all = cci[sid]
crossed_below = ((cci_all < -100) & (cci_all.shift(1) >= -100)).loc[window]
crossed_above = ((cci_all > 100) & (cci_all.shift(1) <= 100)).loc[window]
price_s = close[sid].loc[window]
cci_s = cci_all.loc[window]
# 上下兩個面板:價格在上、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 換成任何一檔股票、把訊號邏輯改成你的假設,就能在動筆做回測前先用眼睛檢查訊號合不合理。上面這段跑出來,台積電是 10 次買進、19 次賣出,和圖上相同。
教科書最常見的用法,在台股 11 年幾乎沒賺到錢
我們在可交易宇宙(60 日均成交金額前 300 名、60 日均量 > 100 萬股、收盤 > 10 元,排除 ETF、金融保險股、處置與全額交割股)裡,把六種「cci 選股」寫法各跑一次:cci(14)、等權、每月最後一個交易日換股、不擇時。
| cci 指標用法 | 研究段年化 | 研究段月夏普 | 2022 年起年化 | 全期最大回撤 |
|---|---|---|---|---|
| 每月買 cci 最低 30 檔 | 2.25% | 0.21 | 17.03% | -44.67% |
| 月底 cci < −100 的股票全部持有 | 0.31% | 0.12 | 11.35% | -44.83% |
| 月底當天剛跌破 −100 的股票 | -5.93% | -0.16 | 11.13% | -68.56% |
| 每月買 cci 最高 30 檔 | 7.93% | 0.50 | 15.25% | -47.53% |
| 月底 cci > +100 的股票全部持有 | 9.65% | 0.60 | 10.31% | -44.25% |
| 月底當天剛突破 +100 的股票 | 10.29% | 0.57 | 16.65% | -38.47% |
| 對照:含息 0050 | 15.09% | 1.00 | 30.51% | -33.96% |

研究段(2015–2021)六種寫法全部輸給含息 0050 的 15.1%。最常被教的「cci 跌破 −100 買進」,不論怎麼寫都接近零或為負:每月買最低 30 檔 2.25%、月底低於 −100 全部持有 0.31%、只買當天剛跌破的股票是 -5.93%。 追強勢的三種寫法好一些,研究段 7.9% 到 10.3%,仍落後 0050。首發版代表「超賣買進」的只有「cci 最低 30 檔」一列,卻標成「cci 跌破 −100 超賣買進」,沒有真的用 −100 當條件;這次把以 −100 為條件的兩種寫法補上。
2022 年起這六種寫法年化 10.3% 到 17.0%,全部輸給 0050 的 30.5%,全期最大回撤在 -38% 到 -69% 之間。首發版說「超賣買進與追強勢在樣本外漂亮、研究段很差,是市況依賴」,兩段其實都輸 0050,看不出哪個市況下有效。cci 不是設計來做橫截面選股的指標,下一段改用它的另外兩個用途。
把 cci 拆成兩個有用的零件
整個 cci 當買賣開關失效,但拆開來看,它有兩個各自有用的零件,本文的純技術策略就建立在這兩個零件上。
零件一:個股 cci 當趨勢持有濾網,不當選股排序
先釐清一個差別:把 cci 當「橫截面選股排序」(誰的 cci 高就買誰、誰低就買誰)沒有用;把 cci 當「二元的趨勢持有濾網」(只把錢留在 cci 站上某個門檻的股票、把深跌中的股票剔出去)則有用。
先看排序。建一個「品質低波籃」:只留站上季線(close > 60 日均線)的股票,取 60 日波動最低的 30 檔等權,完全不看 cci:研究段年化 14.90%、月夏普 1.01。(首發版寫「先剔除 60 日波動最高的一半,再取最低的若干檔」;程式實際是先在站季線的股票裡取波動最低的 150 檔,再取其中最低的 30 檔,等於直接取最低 30 檔。)同一個池子改挑 cci 最高的股票,cci 週期 14/20/30 乘上持股 20/30/40 檔共 9 組,研究段月夏普 0.55 到 0.84,沒有一組贏過只挑低波的 1.01;全期最大回撤 -40.3% 到 -48.0%,也比低波籃的 -32.3% 深。首發版這 9 組出自較早的研究回合(當時的回測框架還沒有統一從 2015 年起算),這次用本文的設定重跑,結論相同。一種解讀是 cci 和短期漲幅高度重疊,在已經用季線框過方向的池子裡,挑 cci 最高等於挑最近漲最急的股票;本文沒有另外驗證這個機制。
同一個 cci 改當二元濾網,結果就不一樣。 在站季線的池子裡只留 cci(14) > −50 的股票,再取波動最低的 24 檔:
- 等權、不擇時:全期年化 14.46% 提高到 18.04%,研究段月夏普 1.07 升到 1.13,2022 年起 0.90 升到 1.03;全期最大回撤 -30.9% 變 -32.1%,略深。
- 放進完整策略(動能傾斜加斷路器)再拿掉這層濾網:全期年化 25.22% 掉到 19.69%,研究段 26.11% 掉到 20.43%,2022 年起 24.53% 掉到 19.02%;最大回撤 -22.9% 對 -22.2%,差不多。
選波動最低的股票,動機來自學術上記載已久的低波動異常:Ang, Hodrick, Xing & Zhang (2006) 發現高波動股票的後續報酬反而偏低。但在本文的設定下,低波本身贏不了 0050:可交易宇宙內直接取波動最低 24 檔,全期年化 10.05%;限定站季線後 14.46%,都低於 0050 的 21.17%。報酬主要是後面的動能傾斜加上去的(見「逐層拆開」)。延伸閱讀:技術面與基本面選股的差異、動能策略。
零件二:0050 自身的 cci 當大盤斷路器
cci 對個股排序沒有增量;放到大盤指數上,它衡量的是 0050 現在偏離自己 20 日均值多遠。本文把 0050 自身的 cci(20) 當斷路器:每月最後一個交易日讀一次,讀到 −100 以下就整籃清倉、持有現金一個月,其餘月份滿倉。

斷路器只在月底看一次。 2015 年起,0050 的 cci(20) 日頻跌破 −100 共 124 次(每年約 10.6 次),其中 103 次在月底前就回到 −100 以上,從來沒有清倉;真正落在月底、執行清倉的只有 21 次,佔 141 個月底換股日的 14.9%。
清倉的效果集中在少數月份。21 個清倉月份裡,不擇時的籃子下個月平均 +0.1%(11 個月虧損),滿倉月份平均 +2.5%。少賠最多的是 2020 年 2 月 27 日:月底 cci(20) -139.0,3 月整月持有現金,不擇時的籃子 3 月 -20.0%、0050 -14.1%;3 月底 cci 回到 −100 以上,4 月重新滿倉。2020 年策略 82.0%,不擇時的籃子 52.1%,這一年就差了 29.9 個百分點。代價最大的一次是 2026 年 3 月 31 日:月底 cci(20) -168.5,4 月清倉,不擇時的籃子那個月 +22.6%、0050 +25.1%,策略只有 +2.7%。
如果把同一個月底選出的籃子改成每天檢查斷路器(cci 跌破 −100 隔天清倉、回到 −100 以上再買回),全期年化只有 17.64%、最大回撤 -34.94%,比完全不擇時(26.04%、-36.67%)少賺很多,回撤也沒有比較淺;研究段月夏普 0.80、2022 年起 0.89。日頻訊號一年翻轉約 10 次,大多數在幾天內就回到 −100 以上。首發版把規則寫成「0050 的 cci(20) ≤ −100 時整籃清倉」,回測其實是月底才看,月中跌破不會動;照字面每天執行,結果差很多。
0050 的 cci 掉到 −100 以下時,市場確實比較動盪:日頻斷路器關閉的日子,0050 隔天報酬的年化波動 29.1%,開啟時 17.6%;但往後 20 個交易日的平均報酬差不多(關閉時 +1.54%、開啟時 +1.76%,上漲機率 64.2% 對 62.4%)。波動高、報酬沒有跟著高,這和 Moreira & Muir (2017) 在《Volatility-Managed Portfolios》的發現一致:波動升高時降低曝險,可以提升風險調整後報酬。斷路器避開的是高波動的月份,它不能預測下跌。
把斷路器拿掉(同一個動能傾斜籃全程滿倉),全期年化 26.04%、最大回撤 -36.67%;加上斷路器後是 25.22%、-22.87%,每年少賺 0.8 個百分點,換到回撤淺 13.8 個百分點。分段看,研究段年化由 23.70% 提高到 26.11%、月夏普 1.09 升到 1.26;2022 年起反而由 30.18% 降到 24.53%,月夏普 1.21 對 1.23 差不多,每年少賺約 5.7 個百分點。
門檻要多寬,逐格掃一次(0050 的 cci(20),其餘設定不變):

門檻設 −150,141 個月底只觸發 8 次,2020 年 2 月 27 日的 -139.0 沒有觸發,全期最大回撤回到 -36.9%。−125 到 0 的全期最大回撤都是 -22.9%:全期最深的那次回撤發生在 2026 年 6 月 3 日到 7 月 30 日,決定這段持股的兩個月底讀數(5 月 29 日 196.7、6 月 30 日 67.6)都在這些門檻之上,任何門檻都沒有觸發。報酬則是門檻越嚴越低:−100 是 25.2%,−50 是 20.5%,−25 是 13.8%,0 只剩 9.4%。首發版說「−100 與 −50 都能把回撤明顯壓低」,在本文期間 −50 的全期回撤和 −100 相同,年化少 4.7 個百分點。
斷路器的週期也掃了 10 到 30 日(門檻 −100):研究段月夏普 1.01 到 1.26,20 日與 18、19 日並列最高;2022 年起 1.06 到 1.39;全期年化 21.5% 到 26.7%。18 到 20 日以外的週期,研究段年化在 20.0% 到 25.3% 之間,本文的 20 日剛好落在研究段的高點。首發版說換成 cci(14) 也成立(樣本外月夏普 1.45);重跑後 cci(14) 研究段年化 22.33%、月夏普 1.10,2022 年起 27.27%、1.34。
完整策略: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 的高、低、收盤價先乘上還原係數)。讀到 −100 以下就整籃清倉、持有現金到下個月底;其餘月份滿倉。
- 每月最後一個交易日換股,月中不檢查。
首發版更正:首發版寫成「當 0050 的 cci(20) ≤ −100 時整籃清倉」,沒有說明只在月底檢查;回測是
sim(resample="M"),部位只在月底讀取,每天檢查的結果見上一節。另外,首發版用未還原價算 0050 的 cci:2025 年 6 月 0050 一拆四,6 月 11 日到 17 日停止交易,18 日恢復交易那天未還原價的 cci(20) 是 −667,還原價是 +280。可下載的程式更因為停牌那幾天沒有價格,算出的 cci 連續 24 個交易日是空值,2025 年 6 月 30 日月底被當成清倉,7 月整月空手。這次改用還原價計算,影響見「回測方法與口徑」。
選股端與斷路器的核心程式碼(可直接交給你的 AI 助理改寫、或下載完整版執行):
顯示程式碼
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:最低價")
volume = data.get("price:成交股數")
amount = data.get("price:成交金額")
adj_close = data.get("etl:adj_close")
# 零件二先算:0050 自身 cci(20) 大盤斷路器
# 0050 的高、低、收先乘上還原係數,避免分割與配息讓指標看起來像大跌
ratio = adj_close["0050"] / close["0050"]
px = pd.DataFrame({"high": high["0050"] * ratio,
"low": low["0050"] * ratio,
"close": close["0050"] * ratio}).dropna()
cci_0050 = pd.Series(talib.CCI(px["high"].values, px["low"].values, px["close"].values,
timeperiod=20), index=px.index)
risk_on = cci_0050.reindex(close.index).ffill() > -100
# 可交易宇宙:60 日均成交金額前 300 大(先在全市場排名)、60 日均量 > 100 萬股、收盤 > 10 元,
# 排除處置與全額交割股
top300 = amount.rolling(60, min_periods=20).mean().is_largest(300)
enough_volume = volume.rolling(60, min_periods=20).mean() > 1_000_000
flagged = data.get("etl:is_flagged_stock").reindex_like(close).fillna(False).astype(bool)
universe = top300 & enough_volume & (close > 10) & ~flagged
# 只留代號剛好 4 碼、不是 00 開頭(ETF)、也不是金融保險的股票
cat = data.get("security_categories")
financial = set(cat.loc[cat["category"].astype(str).str.contains("金融|保險|銀行", na=False),
"stock_id"].astype(str))
stocks = [s for s in close.columns
if len(str(s)) == 4 and str(s).isdigit()
and not str(s).startswith("00") and str(s) not in financial]
universe, close = universe[stocks], close[stocks]
# 零件一:個股 cci(14) 趨勢濾網。站季線 + cci > −50(順勢、剔除接刀股)
cci14 = data.indicator("CCI", timeperiod=14).reindex(columns=stocks)
above_ma60 = close > close.rolling(60, min_periods=20).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)
raw = ((0.4 * r60 + 0.6 * r120) ** 3.5 / vol60).where(basket)
weights = raw.div(raw.sum(axis=1), axis=0).fillna(0.0)
# 套上斷路器:月底讀到 0050 cci(20) ≤ −100 就整籃清空、持有現金
weights = weights.mul(risk_on.reindex(weights.index).fillna(False).astype(float), axis=0)
# 每月最後一個交易日換股(手續費打三折,另扣賣出證交稅 0.3%)
report = sim(weights.loc["2015":], resample="M", fee_ratio=1.425 / 1000 * 0.3, upload=False)這段程式碼和文末可下載的 strategy.py 是同一套規則;資料截到 2026-09-30 實跑,研究段、2022 年起與全期的年化、月夏普和最大回撤都和下一節的表相同。下載版另外印出逐層建構(4 層加每天檢查斷路器的對照)、換股日比較、逐年報酬與首發後的逐月報酬。
完整策略的真實績效
所有數字從同一天(2015-01-30,策略第一個淨值日)起算:
| 指標 | 研究段(2015–2021) | 2022 年起 | 全期 | 含息 0050 研究段 | 含息 0050 2022 年起 | 含息 0050 全期 |
|---|---|---|---|---|---|---|
| 年化報酬 | 26.11% | 24.53% | 25.22% | 15.09% | 30.51% | 21.17% |
| 月夏普 | 1.26 | 1.23 | 1.23 | 1.00 | 1.21 | 1.07 |
| 月索提諾 | 3.84 | 2.71 | 3.23 | 1.47 | 2.44 | 1.85 |
| 最大回撤 | -21.00% | -22.87% | -22.87% | -28.22% | -33.96% | -33.96% |
研究段四項都勝過 0050。2022 年起年化落後 0050 6.0 個百分點,月夏普 1.23 對 1.21 差不多,月索提諾與最大回撤較好。全期四項都勝:年化領先 0050 4.1 個百分點,月夏普 1.23 對 1.07,最大回撤 -22.9% 對 -34.0%。全期年化波動 17.7%,0050 是 19.8%。年換手約 7.2 倍,11 年多共 2,844 筆交易。
「2022 年起」這一段,首發時挑參數的門檻就包含它的表現,看過這段才定案,所以本文不把它稱為樣本外。真正選完參數才出現的資料,是首發資料截止日 2026-06-09 之後的四個月,見後面「2026-06-09 之後」一節。
下面是完整互動式回測:月報酬熱力圖、權益曲線、年度績效都可以直接在文章裡操作:
逐層拆開:cci 濾網、動能傾斜與斷路器各自的作用
先從最單純的低波籃開始,一次加一個條件;再從完整策略各拿掉一個零件。其餘設定不變,同一天起算:
| 版本 | 研究段年化 / 月夏普 | 2022 年起年化 / 月夏普 | 全期年化 | 全期最大回撤 |
|---|---|---|---|---|
| 宇宙內波動最低 24 檔(等權、不擇時) | 9.55% / 0.91 | 10.87% / 1.00 | 10.05% | -29.28% |
| 再限站上季線 | 14.97% / 1.07 | 14.00% / 0.90 | 14.46% | -30.93% |
| 再限個股 cci(14) > −50 | 16.36% / 1.13 | 21.00% / 1.03 | 18.04% | -32.05% |
| 再改成動能傾斜加權(不擇時) | 23.70% / 1.09 | 30.18% / 1.21 | 26.04% | -36.67% |
| 再加 0050 斷路器(完整策略) | 26.11% / 1.26 | 24.53% / 1.23 | 25.22% | -22.87% |
| 完整策略拿掉個股 cci 濾網 | 20.43% / 1.13 | 19.02% / 1.23 | 19.69% | -22.20% |
| 完整策略拿掉季線 | 16.30% / 1.50 | 15.14% / 1.20 | 15.60% | -16.62% |
| 完整策略改成等權 | 17.54% / 1.38 | 15.23% / 1.06 | 16.41% | -19.07% |
| 池內改挑動能最高 24 檔(不看波動,等權) | 18.32% / 0.82 | 13.52% / 0.70 | 16.27% | -47.82% |

從這張表讀出的事:
- 報酬主要來自動能傾斜。 同一個 cci 濾網低波籃,等權全期年化 18.04%,改成動能傾斜加權是 26.04%(都不擇時)。完整策略改回等權只剩 16.41%,回撤 -19.07% 較淺、研究段月夏普 1.38 較高,等於用報酬換穩定。
- 傾斜讓持股很集中。 每個月底的名單多數是 24 檔(141 個月裡有 16 個月池子不到 24 檔,最少 15 檔),但權重集中在前幾檔:有效持股數(1 ÷ 權重平方和)中位數 10.2 檔,權重最大的 5 檔合計中位數 61.3%,單一個股最高曾到 24.8%,權重最小的 12 檔合計中位數只有 7.1%。2026-09-30 換股日權重最高的是鴻準(2354)14.1%。
- cci 濾網留下的不是「超賣」股。 每個月底入選股的 cci(14) 中位數,141 個月取中位數是 72.4;平均每個月有 35.8% 的入選股 cci 在 +100 以上,照教科書的說法屬於「超買」。濾網的作用是剔除 cci 在 −50 以下、正在深跌的股票。
- 季線和 cci 濾網都在加報酬。 拿掉季線全期 15.60%、拿掉 cci 濾網 19.69%。拿掉季線的版本回撤最淺(-16.62%)、研究段月夏普 1.50 最高,同樣是用報酬換穩定。
- 低波選股是穩定度的來源。 池內改挑動能最高的 24 檔(不看波動、等權),全期 16.27%、最大回撤 -47.82%、研究段月夏普 0.82;同樣等權、改挑波動最低的版本(完整策略改等權)是 16.41%、-19.07%、1.38。
- 斷路器用 2022 年起的報酬換研究段與回撤。 數字見上一節:全期回撤由 -36.67% 降到 -22.87%,2022 年起每年少賺約 5.7 個百分點。
換股日挪到月中,結果差很多
同一套規則、同一個部位,只把讀取部位的日子從月底改到每月 5、10、15、20、25 日(遇假日取該月在這天以前的最後一個交易日;該月在這天以前沒有交易日就不換股,5 日有 3 個月、10 日有 1 個月因此沒換),其餘完全不變:
| 換股日 | 研究段年化 / 月夏普 | 2022 年起年化 / 月夏普 | 全期年化 | 全期最大回撤 |
|---|---|---|---|---|
| 每月 5 日 | 7.91% / 0.58 | 30.01% / 1.43 | 16.28% | -30.28% |
| 每月 10 日 | 7.59% / 0.57 | 26.22% / 1.28 | 14.74% | -29.90% |
| 每月 15 日 | 5.58% / 0.43 | 25.81% / 1.25 | 13.29% | -33.37% |
| 每月 20 日 | 0.85% / 0.14 | 21.03% / 0.99 | 8.52% | -43.72% |
| 每月 25 日 | 4.69% / 0.41 | 23.81% / 1.29 | 12.04% | -40.33% |
| 月底(本文) | 26.11% / 1.26 | 24.53% / 1.23 | 25.22% | -22.87% |

(月底那一列用「只在月底讀取部位」的寫法重算,全期年化與主表相同,用來確認這個比較的做法沒有偏差。)
2022 年起各換股日的年化 21.0% 到 30.0%,和月底的 24.5% 互有高低,5 日甚至到 30.0%;差距幾乎全在研究段:月底換股研究段年化 26.11%,其他五個日子只有 0.85% 到 7.91%,月夏普全部低於 0.6,全期年化也全部輸給 0050 的 21.2%。
把斷路器拿掉再比一次,可以看出差距從哪裡來。不套斷路器的籃子,月底換股研究段年化 23.70%,每月 5 到 25 日是 8.19% 到 19.72%(15 日最高),選股本身就有換股日的落差;套上斷路器後,月底由 23.70% 提高到 26.11%,其他五個日子反而從 8.2% 到 19.7% 降到 0.9% 到 7.9%。斷路器只有在月底讀取時讓研究段變好,在月中讀取都讓研究段變差。全期來看也一樣:不套斷路器時月底 26.0%、其他日子 14.9% 到 22.5%;套上之後月底 25.2%、其他日子 8.5% 到 16.3%。
這叫換股時點運氣(rebalance timing luck)。Hoffstein, Faber & Braun (2020) 分析 smart beta 指數時指出,規則完全相同、只差換股日的組合,績效可以有明顯落差。本文的參數是在研究段用月底換股挑出來的,研究段的優勢又只出現在月底這一組,所以研究段 26.1% 應該看成「月底換股這一組」的結果。我們沒有找到月底換股特別有效的原因。同系列的 KD 指標回測與 RSI 指標回測也有同樣的問題,這個檢查是首發版沒有做的。
參數最佳化:持股檔數、動能冪次與 cci 週期
持股檔數與動能傾斜冪次各取三格,每一格都跑完整策略(cci 濾網加斷路器)。研究段月夏普:

同一張網格的 2022 年起月夏普:

研究段 9 格在 1.17 到 1.52 之間,18 檔那一欄最高(1.42 到 1.52),30 檔最低(1.17 到 1.24);2022 年起 9 格都在 1.22 到 1.39,沒有一格跌破 1.0。年化與月夏普往相反方向走:以 24 檔為例,冪次 2.5、3.5、4.5 的全期年化是 22.7%、25.2%、27.4%,最大回撤 -20.5%、-22.9%、-24.7%;18 檔的月夏普最高,全期年化只有 19.5% 到 22.4%。首發版寫「研究段月夏普都落在 1.12 到 1.48」,重跑後是 1.17 到 1.52。
這次也把每個參數連續掃了一遍(一次只動一個,其餘不變):

- 個股 cci 週期 8 到 24 日:研究段月夏普 1.17 到 1.34、2022 年起 1.05 到 1.29,全期年化 22.5% 到 25.2%,14 日的全期年化在這一段最高。
- 個股 cci 門檻 −150 到 0:全期年化 19.3% 到 26.0%,−25 最高、−50 次之;研究段月夏普 1.13 到 1.29、2022 年起 1.13 到 1.34。
- 持股 16 到 32 檔:研究段月夏普 1.09 到 1.58、2022 年起 1.04 到 1.64,全期年化 20.7% 到 26.2%。
- 動能冪次 2.0 到 5.0:冪次越高,全期年化由 21.3% 一路升到 28.4%,研究段月夏普由 1.33 降到 1.20,最大回撤由 -19.0% 加深到 -25.5%。
選股端的參數對結果不太敏感,掃過的每一格月夏普都在 1.0 以上。比較敏感的是斷路器的門檻(見前面「零件二」)與換股日。依季度刷新的規則,參數不因事後看到的鄰格而更換。
2026-06-09 之後:首發後的新資料
首發版資料截止日 2026-06-09 之後的四個月,是這套參數選定後才出現的資料:
| 區間 | 策略 | 不擇時 | 斷路器每天檢查(對照) | 含息 0050 |
|---|---|---|---|---|
| 2026-06-09 → 06-30 | -3.6% | -3.6% | -3.6% | +4.2% |
| 2026 年 7 月 | -8.3% | -8.3% | -13.3% | -4.0% |
| 2026 年 8 月 | +20.8% | +20.8% | +17.6% | +3.3% |
| 2026 年 9 月 | +0.1% | +0.1% | +0.1% | +5.5% |
| 06-09 → 09-30 合計 | +6.8% | +6.8% | -1.7% | +8.9% |

這四個月的月底,0050 的 cci(20) 都在 −100 以上(6 月 30 日 67.6、7 月 31 日 -14.8、8 月 31 日 63.0、9 月 30 日 112.0),斷路器一次都沒有清倉,所以策略和不擇時的籃子完全相同。7 月發生的事:
- 6 月 30 日換股時斷路器開啟。 7 月 1 日進場的 24 檔,持有到 8 月 3 日,16 檔虧損,中位數 -1.5%,依權重加總 -5.5%。最差的健鼎(3044)-24.1%(權重 6.6%),權重最大的藥華藥(6446)-5.0%(權重 16.3%)。
- 0050 的 cci(20) 7 月有 8 個交易日低於 −100(7 月 14 日、17 日到 21 日、27 日到 30 日),最低 7 月 20 日的 -224.8,但 7 月 31 日月底回到 -14.8,沒有清倉。每天檢查的對照組在月中出場,7 月反而跌 13.3%。同期 0050 從 7 月 1 日高點跌到 7 月 30 日 -14.0%,整月 -4.0%。
- 淨值從 6 月 3 日高點到 7 月 30 日回落 22.9%,是 2015 年以來最深的回撤(研究段最深是 2015 年的 -21.0%)。8 月 +20.8% 收復,9 月 4 日創新高,9 月底距高點 -1.7%。
2022 年起的月夏普因此從同截止日的 1.37 降到 1.23。同截止日比對:用新版程式與 finlab 2.2.21 把資料截到 2026-06-09,研究段 26.11%、2022 年起 24.60% / 1.37、全期 25.26%;首發版是 25.49%、24.66% / 1.32、24.91%。研究段的差距可以拆成三塊:首發程式換成新版 finlab,25.49% 變 25.70%(第一個淨值日也由 2015-02-26 提前到 01-30);季線與波動的暖身期改成和可下載程式相同,25.70% 變 25.30%;0050 斷路器改用還原價,25.30% 變 26.11%(只差 2015 年 10 月底一次判定,見下一節)。首發版的 2022 年起與全期數字,用首發程式截到 2026-06-09 重算是 24.26%、24.75%,和首發版有 0.2 到 0.4 個百分點的差距,原因沒有查明;研究段則逐位相同。
回測方法與口徑
- 交易成本:finlab
sim(),手續費 0.1425% 打三折,賣出另扣證交稅 0.3%。改用sim()預設手續費(不打折),全期年化 23.41%、2022 年起月夏普 1.16;原設定的三折手續費再加倍(約 0.0855%)、賣出稅率拉到 0.6%,全期 21.76%、2022 年起月夏普 1.09。 - 滑價:未額外假設,實際成交衝擊取決於資金規模與流動性,本文未估算容量。
- 股票池:上市櫃普通股,60 日均量 > 100 萬股、收盤 > 10 元、60 日均成交金額前 300 名;代號必須剛好是 4 碼數字(排除權證、特別股與 6 碼代號),排除 00 開頭的 ETF、金融保險股、處置與全額交割股。KY 股的代號也是 4 碼數字,沒有排除;首發版寫「排除 KY」與程式不符。首發版的宇宙寫法(代號前 4 碼是數字就放行)跑出來的結果與本文完全相同。
- 前視偏差:季線、60 日波動、60/120 日動能、個股 cci 與 0050 的 cci 都只用當天(含)以前的價格,月底收盤後決定部位,下一個交易日成交。完全不用財報或月營收。
- cci 計算:個股 cci(14) 用 finlab
data.indicator("CCI")(TA-Lib,未還原價格)。0050 的 cci(20) 先把最高、最低、收盤價乘上同一個還原係數(etl:adj_close÷ 收盤價),去掉停牌日再算,停牌日沿用前一天的讀數。這和首發版有兩處不同的月底判定:2015 年 10 月 30 日(未還原價判定清倉、還原價判定持股,11 月策略因此有持股)與 2025 年 6 月 30 日(只有舊的可下載程式受影響)。照首發版的未還原價算法,全期年化 24.74%、研究段 25.30%,2022 年起相同;照舊的可下載程式,2022 年起年化 22.90%、月夏普 1.17。個股 cci 也改用還原價時,全期 24.09%、2022 年起月夏普 1.14,比未還原價略差,本文維持未還原價。 - 權重:動能傾斜除以波動,單一個股不另設上限;有效持股數中位數 10.2 檔,單一個股權重最高 24.8%。斷路器關閉時整籃歸零、持有現金。
- 周轉率:年換手約 7.2 倍,11 年多共 2,844 筆交易。
- 研究段與 2022 年起:研究段 2015–2021;2022 年起這段在首發選參數時已經看過。選定後才出現的資料只有 2026-06-09 之後的四個月。
- 生存者偏差:宇宙每天依當時的資料篩選,2015-01-30 有收盤價、到 2026-09-30 已經沒有收盤價的 4 碼普通股共 142 檔,在當時都可能被選入。
- 首發後補做的檢查:換股日(每月 5 到 25 日,含不套斷路器的版本)、每天檢查斷路器的對照組、逐層建構與零件拆除、持股檔數與動能冪次網格、持股 16 到 32 檔與個股 cci 週期 8 到 24 日逐格掃描、cci 門檻與冪次掃描、斷路器週期 10 到 30 日與門檻掃描、還原價對照、月營收過濾與年線擇時對照(首發只用舊版選股籃跑過,文章沒有放數字)。
不同年度的表現:12 年贏 8 年
| 年度 | 策略 | 含息 0050 | 不擇時 | 斷路器每天檢查 |
|---|---|---|---|---|
| 2015(1/30 起) | 4.4% | -7.9% | 4.9% | -0.8% |
| 2016 | 30.9% | 19.6% | 30.7% | 11.3% |
| 2017 | 34.1% | 18.1% | 35.1% | 24.2% |
| 2018 | 11.1% | -4.9% | 10.9% | 2.3% |
| 2019 | 8.2% | 33.5% | 8.2% | 1.4% |
| 2020 | 82.0% | 31.1% | 52.1% | 70.2% |
| 2021 | 24.1% | 21.9% | 28.9% | 16.8% |
| 2022 | -0.0% | -21.4% | -3.7% | -20.7% |
| 2023 | 41.4% | 27.5% | 61.1% | 43.2% |
| 2024 | 26.3% | 48.6% | 24.2% | 17.7% |
| 2025 | 18.6% | 36.8% | 9.2% | 23.2% |
| 2026(至 9/30) | 30.8% | 74.3% | 62.5% | 42.8% |
策略 12 年裡贏 0050 的有 8 年,輸的是 2019 年與 2024 年以後連續三年;2026 年至 9 月底 0050 上漲 74.3%,策略 30.8%。2022 年 0050 跌 21.4%,策略打平,那一年 1、2、4、6、9 月底五次清倉,不擇時的籃子 -3.7%。和不擇時相比,斷路器在 2020 年多賺 29.9 個百分點、2025 年 9.4 個百分點,在 2023 年少賺 19.7 個百分點、2026 年至 9 月底少賺 31.7 個百分點,2026 年的差距主要就是上面提到的 4 月清倉。每天檢查斷路器的版本只有 2023、2025 與 2026 年三年比月底檢查好。
加上月營收 YoY 會更好嗎:實跑結果 2022 年起明顯較差
首發版這一段只有推論,沒有放回測數字(首發研究只用舊版選股籃跑過)。這次用本文的策略實跑:選股前先限定月營收年增率大於 0 的股票(用 finlab 月營收資料的公布日索引對齊,只用當時應已公布的數字),其餘不變。研究段年化 26.86%、月夏普 1.11,2022 年起 18.53%、0.99,全期 23.10%、最大回撤 -21.92%。研究段年化略高但月夏普較低,2022 年起明顯較差,月夏普跌破 1.0。本文主策略維持純技術面。基本面與技術面如何分工,可延伸看技術面與基本面選股的差異。
為什麼不用常規均線擇時?
讀到這裡你可能會問:用 0050 站上/跌破 200 日均線(MA200)來擇時不是更直覺嗎?同一個動能傾斜籃,把斷路器換成「月底 0050 還原價站上 200 日均線才持股」:研究段年化 9.83%、最大回撤 -37.91%,2022 年起 30.00%、月夏普 1.32,全期 17.40%。研究段比完全不擇時(23.70%)還差很多,回撤也更深;2022 年起則比 cci 斷路器(24.53%)好。全期來看 cci 斷路器的年化與回撤都比年線擇時好,但 2022 年起的強多頭裡,年線擇時少賺得比較少。首發版說年線「反應遲鈍、常被洗出去」,本文只比較了結果,沒有逐段驗證這個原因。用大盤訊號降低回撤的其他做法,可參考四種均線市場濾網的崩盤避險實測。
用 cci 指標最常踩的四個陷阱
把前面的回測整理成可操作的避雷清單:
- 把 −100/+100 當進出開關。 教科書 ±100 派在台積電一年觸發 29 個訊號(見前面單股圖),訊號太密、又會在趨勢盤反覆被洗。月底 cci 低於 −100 的股票全部持有,研究段年化只有 0.3%;每月買 cci 最低 30 檔是 2.2%。
- 把個股 cci 當選股因子排序。 在站季線的池子裡挑 cci 最高的股票,9 組參數研究段月夏普 0.55 到 0.84,全輸給只挑低波的 1.01。cci 對個股的用法是當「二元趨勢濾網」(站上 −50 才留、剔除深跌股),不是當「誰高買誰」的排序分數。
- 斷路器門檻設太嚴。 門檻拉到 −25 或 0,月底稍微偏弱就空手一個月,全期年化掉到 13.8% 和 9.4%;−100 是 25.2%。
- 把月底才檢查的斷路器當成隨時在保護。 回測只在月底看一次,2026 年 7 月 cci 有 8 天低於 −100,策略照樣抱了整個月;照字面每天檢查,全期年化反而降到 17.6%。換股日從月底挪到月中,研究段的優勢也幾乎消失。
前兩個陷阱是把 cci 用在個股進出或排序,回測都輸 0050;後兩個是斷路器的門檻與檢查頻率,設定差一點,全期年化就差 7.6 到 15.8 個百分點。cci 在本文有用的位置只有兩個:個股的二元趨勢濾網,與每月底讀一次的大盤斷路器。各擺盪指標的用法差異,可再看RSI、MACD、KD 比較。
三項穩健性驗證:重跑到 2026 年 10 月
這裡驗證本文的完整策略:站上季線且 CCI(14) 大於 -50 的股票裡取 60 日波動最低 24 檔、往高動能傾斜加權,0050 自身 CCI(20) 跌破 -100 時整籃清倉,每月換股。我們在 2026-10-27 用本文附的 strategy.py 重跑三項檢查;2026-10-28 修正 0050 斷路器的價格口徑後,用新版 strategy.py(把 DATA_END 改成 "2026-10-27"、FEE 改成 1.425 / 1000,finlab 2.2.21,資料截至 2026-10-27)同口徑重跑,下面是修正後的數字。三項檢查統一採 sim() 預設手續費 0.1425% 與證交稅 0.3%;原程式手續費三折的結果另列於成本對照表。「贏」指日夏普高於同期 0050 含息買進持有(etl:adj_close 還原價、純算術計算、不扣成本)。兩邊日夏普皆為日報酬平均除以標準差、乘上 √252,不扣無風險利率。
| 檢查 | 標準 | 結果 |
|---|---|---|
| 鄰近參數 | 個股 CCI 週期(11、14、17)乘上持股檔數(20、24、28),9 組至少 7 組贏 | 9/9 組贏,過 |
| 前後兩段 | 2015-01-30 到 2020-12-11、2020-12-14 到 2026-10-27 兩段都贏 | 前段 1.44 對 0.89,後段 1.22 對 1.24,不過 |
| 交易成本 | 原參數、sim() 預設成本 |
日夏普 1.32 對 1.08,過 |

9 組參數的日夏普(括號內是年化報酬,粗體是原文參數):
| 持股檔數 \ 個股 CCI 週期 | 11 | 14 | 17 |
|---|---|---|---|
| 28 | 1.27(年化 23.2%) | 1.30(年化 23.5%) | 1.28(年化 22.8%) |
| 24 | 1.27(年化 22.5%) | 1.32(年化 23.4%) | 1.25(年化 21.7%) |
| 20 | 1.17(年化 19.3%) | 1.18(年化 19.6%) | 1.14(年化 18.7%) |
前後兩段與全期:
| 期間 | 策略年化 | 策略日夏普 | 0050 含息年化 | 0050 日夏普 |
|---|---|---|---|---|
| 前段 2015-01-30 到 2020-12-11 | 23.9% | 1.44 | 13.5% | 0.89 |
| 後段 2020-12-14 到 2026-10-27 | 22.8% | 1.22 | 28.0% | 1.24 |
| 全期 2015-01-30 到 2026-10-27 | 23.4% | 1.32 | 20.5% | 1.08 |
前後兩段是把整段期間從中點對半切。上文的研究段與 2022 年起以 2022 年初為界,照這個切法,2015 到 2021 年日夏普 1.42 對 0050 的 0.96,2022 年起 1.22 對 1.22。上文多用月夏普,跟這裡的日夏普算法不同,數字不能直接比。
交易成本對照(原參數):
| 成本設定 | 年化 | 日夏普 | 最大回撤 |
|---|---|---|---|
| 不扣成本 | 28.8% | 1.58 | -22.6% |
sim() 預設:手續費 0.1425%、證交稅 0.3% |
23.4% | 1.32 | -23.0% |
| 原文設定:手續費打三折 | 25.2% | 1.41 | -22.9% |
| 0050 含息買進持有(同期) | 20.5% | 1.08 | -34.0% |
重跑到 2026-10-27,原參數年化 23.4%、日夏普 1.32、最大回撤 -23.0%;同期 0050 含息年化 20.5%、日夏普 1.08、最大回撤 -34.0%。鄰近參數與交易成本兩項都過:9 組全部贏 0050,日夏普落在 1.14 到 1.32,是這一系列技術指標文裡唯一一片高原。卡在前後兩段:前段(2015 到 2020 年)日夏普 1.44 大贏 0050 的 0.89,後段 1.22 輸 1.24,年化 22.8% 也落後 0050 的 28.0%。三項沒有全過,所以不放進策略庫;優勢集中在前段。上文的 2022 年起年化同樣輸給大盤,月夏普 1.23 對 1.21;換成這裡的日夏普,2022 年起是 1.22 對 1.22。
這一段 2026-10-27 第一次上線時,用的是當時可下載的 strategy.py:它原本沒有指定起始日(當時已補上 2015-01-01 起算),0050 的 cci 又用未還原價整欄計算,2025 年 6 月 0050 停牌那幾天沒有價格,之後 24 個交易日算不出 cci,6 月 30 日月底被當成清倉,7 月整月空手。當時的數字是年化 22.3%、日夏普 1.27,鄰近參數 9 組 1.16 到 1.27,前段 1.40 對 0.89、後段 1.16 對 1.24;修正後三項的結論都沒有改變。上文的年化 25.2% 是資料到 2026-09-30、手續費打三折的結果;照三折跑到 2026-10-27 也是 25.2%,換成 sim() 預設成本是 23.4%。
策略的限制與取捨
- 換股日運氣:研究段 26.1% 只出現在月底換股這一組,挪到每月 5 到 25 日研究段只剩 0.9% 到 7.9%,全期 8.5% 到 16.3%。實際操作若無法固定在月底最後一個交易日換股,不應期待接近本文的數字。
- 斷路器的效果集中在少數月份:141 個月底只清倉 21 次;2020 年策略比不擇時多賺 29.9 個百分點,主要來自 3 月整月空手(不擇時的籃子那個月 -20.0%)。2022 年起斷路器每年少賺約 5.7 個百分點。
- 持股集中、回撤發生在最近:名單 24 檔,有效持股數只有 10 檔左右,前 5 檔權重合計約六成。全期最大回撤 -22.9% 發生在 2026 年 6 月到 7 月,也就是首發之後。
- 近年落後大盤:2022 年起年化 24.5% 落後 0050 的 30.5%,2024 年起連續三年輸 0050。
- 高周轉、成本敏感:年換手約 7.2 倍,改用
sim()預設手續費全期年化 23.4%,三折手續費加倍、賣出稅 0.6% 降到 21.8%;實單滑價會進一步侵蝕。 - 容量:宇宙限前 300 大成交金額,但權重集中在少數幾檔,超大資金需放寬檔數或限制單檔上限;回測未逐筆估算滑價與市場衝擊。
自己跑一次
FinLab Skill 可以讓你的 AI 助理一步步帶你安裝、抓台股資料、重現這篇的回測:
裝好之後,下載本文的 strategy.py 與 data.csv,即可在自己的環境重跑、改參數、換選股基底。strategy.py 會印出本文的主表、逐層建構、換股日比較、逐年報酬與首發後的逐月報酬;把 DATA_END 改成 None 就能用最新資料重跑。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽與程式交易是什麼。想知道哪些技術指標的教科書用法在台股失效,可看技術指標台股回測總覽。
常見問題
Q:cci 指標跌破 −100 一定會反彈嗎? 不一定。月底 cci 低於 −100 的股票全部持有,研究段(2015–2021)年化只有 0.3%;每月買 cci 最低的 30 檔是 2.2%,同期含息 0050 是 15.1%。2022 年起這兩種寫法是 11.4% 與 17.0%,仍輸 0050 的 30.5%。把它當無腦抄底訊號,長期接近無效。
Q:cci 指標可以單獨拿來當買賣訊號嗎? 不建議。跌破 −100 買、突破 +100 賣或用 cci 高低做橫截面排序選股,在台股回測都站不住。要讓 cci 變得有用,得拆成兩個零件:個股 cci 當「站上 −50 才留」的二元趨勢濾網,0050 自身的 cci 當大盤斷路器(月底讀到 −100 以下就清倉一個月),再搭配低波選股與動能傾斜。
Q:cci 指標參數要設多少?timeperiod 14、門檻 ±100 是最好的嗎? 14 期、±100 是 Donald Lambert 的原始設定。本文個股趨勢濾網用 cci(14)、門檻 −50,大盤斷路器用 0050 自身的 cci(20)、門檻 −100。個股端的參數不太敏感:cci 週期 8 到 24 日、門檻 −150 到 0 掃過的每一格,研究段與 2022 年起月夏普都在 1.0 以上。斷路器比較敏感:週期改成 14 日,研究段年化由 26.1% 降到 22.3%;門檻拉到 −25 或 0,全期年化只剩 13.8% 與 9.4%。
Q:cci 指標和 RSI、KD 有什麼差別? cci、RSI、KD 都是擺盪類指標,但 cci 沒有 0 到 100 的上下界(可正負無限大),較少鈍化。三者都由價格算出,本文沒有測試把它們疊在一起的效果;各指標在台股的用法可參考RSI、MACD、KD 比較與同系列的單篇回測。
Q:為什麼用 0050 的 cci 而不是個股的 cci? 兩者都用,但角色不同。個股 cci(14) 當二元趨勢濾網(站上 −50 才留、剔除深跌股);0050 自身的 cci(20) 當大盤斷路器。個股 cci 拿來做「誰高買誰」的排序沒有用;0050 的 cci 跌到 −100 以下時,0050 隔天報酬的年化波動 29.1%,平常是 17.6%,斷路器在這些高波動的月份避開市場。
Q:cci 斷路器和肯特納通道、ATR 這類波動指標差在哪? cci 衡量「價格偏離均值的標準化距離」,ATR 與肯特納通道衡量「波動幅度本身」。三者都能用於風控,但訊號性質不同。延伸可看肯特納通道與 ATR 指標。
Q:這套策略適合誰? 適合想要主動選股、能固定在每月最後一個交易日換股、接受兩成等級回撤與較高換手成本的人:全期年化 25.2%、月夏普 1.23,最大回撤 -22.9% 淺於 0050 的 -34.0%。要注意三件事:2022 年起年化 24.5% 低於 0050 的 30.5%;換股日挪到月中,研究段的優勢幾乎消失;有效持股只有 10 檔左右。偏好低周轉、被動持有的人,買進持有含息 0050 更省心。
Q:cci 斷路器和 MA200 擇時哪個好? 同一個選股籃,全期來看 cci 斷路器較好:年化 25.2% 對 17.4%,最大回撤 -22.9% 對 -37.9%。差距來自研究段(26.1% 對 9.8%);2022 年起的強多頭裡,年線擇時反而較好(30.0% 對 24.5%)。
最後更新:2026-10|回測區間:2015-01-30 ~ 2026-09-30|作者:FinLab 量化研究團隊(經量化研究員審閱)
本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。cci 雙零件純技術策略全期最大回撤 -22.9%(2026 年 6 月到 7 月),換股日改到每月 5 到 25 日時全期年化只剩 8.5% 到 16.3%,實際交易前請自行評估風險、滑價與交易容量。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

