kd 指標在台股的正確用法:拆成選股因子加大盤風控
散戶最熟的 kd 指標用法是「黃金交叉買、死亡交叉賣,K 值跌到 20 以下超賣就抄底」。但把這些教科書規則放進台股做 11 年回測(2015-2026),黃金交叉選股研究段年化只有 10.4%、輸給含息 0050;最受歡迎的「超賣抄底」研究段年化更只有 2.3%,且最大回撤一路崩到 -48.9%。問題不在 kd 指標,而在用錯地方——把整個指標當成單一買賣訊號。用 finlab 套件抓取的上市櫃真實價量資料攤開來看,kd 真正的價值在於拆成兩個各司其職的零件:第一個零件是「K−D 的 5 日斜率」,當成橫截面選股因子(在強動能族群裡,挑 kd 快慢線正在轉強的相對落後股);第二個零件是「全市場 K 值站上 D 值(K−D>0)的個股比例(廣度)」,當成大盤多空風控開關。把這兩個零件疊上 120 日動能,組成一套完全不含基本面的純技術策略:在 120 日動能池裡選綜合分最佳的 10 檔、等權持有、季再平衡,廣度或大盤趨勢轉弱時整籃減碼到三成五。這套「kd 雙核心純技術策略」研究段(2015-2021)年化 35.3%、月夏普 1.21,樣本外(2022-2026)年化 25.2%、月夏普 1.32,全期(2015-2026)年化 31.1%、月夏普 1.20,全期最大回撤 -25.4%——三段都勝過含息 0050(全期年化 21.0%、夏普 1.05、回撤 -34.0%),且回撤更淺。
先用一張表回答你搜尋「kd」時最想知道的事:
| 你想知道的 | 本文用真實台股回測的回答 |
|---|---|
| kd 指標是什麼 | 隨機指標(Stochastic),由 K 值與 D 值組成,衡量收盤價在近期高低區間的相對位置,0 到 100 有界擺盪 |
| 黃金交叉買進有效嗎 | 台股 11 年回測,K−D 由負轉正選股研究段年化 10.4%,輸給含息 0050 的 15.3% |
| 超賣(K<20)抄底有效嗎 | 最差用法。研究段年化僅 2.3%、最大回撤 -48.9%,台股超賣股常是下跌趨勢中段,接刀傷重 |
| kd 能拿來選股嗎 | 整個指標單獨選股不行;但拆出「K−D 的斜率」當其中一個因子,配合 120 日動能就有效 |
| 那它該怎麼用 | 兩個零件分工:K−D 斜率當選股因子、全市場 K−D>0 的廣度當大盤風控開關 |
| 效果如何 | 雙核心純技術策略研究段年化 35.3%、夏普 1.21,樣本外 25.2%、1.32,全期 31.1%、1.20,三段都勝含息 0050 |

本文所有數字皆出自 finlab 套件抓取的上市櫃真實價量資料(
price與etl:adj_close含息還原股價),回測區間 2015-01-01 至 2026-06-09,基準為含息 0050。文末附可下載的strategy.py與data.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼。
kd 指標是什麼
kd 指標(Stochastic Oscillator,隨機指標)由 George Lane 在 1950 年代提出,用來衡量「收盤價落在近期高低區間的哪個位置」。計算分三步:先算 RSV(未成熟隨機值),再把 RSV 平滑成 K 值,最後把 K 值再平滑成 D 值。
其中 是今日收盤價, 是近 日最高價, 是近 日最低價。接著:
所以 D 比 K 鈍、K 比 D 敏感。常用設定是:
kd 是「有界擺盪指標」,值永遠落在 0 到 100 之間。實務上衍生出三組教科書訊號:
黃金交叉 / 死亡交叉:K 值由下往上穿過 D 值(K−D 由負轉正)稱黃金交叉,視為轉強;反向穿越(K−D 由正轉負)稱死亡交叉,視為轉弱。
超買 / 超賣:K 值 > 80 視為超買(股價強勢但有過熱風險)、K 值 < 20 視為超賣(弱勢但可能跌深反彈)。
kd 鈍化:強趨勢中 K、D 會貼在高檔(或低檔)長時間不動,交叉與超買超賣訊號短暫失效,這個現象稱鈍化。
技術指標的基礎名詞可參考名詞詞彙表。這些訊號聽起來都有道理,但「聽起來有道理」和「在台股回測賺得到錢」是兩回事。我們直接把每一種用法跑一次真實回測。
kd 指標的數學定義
上一段用文字描述了 kd 的三步計算,這裡把完整的遞迴式攤開,方便你照著公式自己實作或核對套件結果。kd 在 TA-Lib 與多數券商軟體裡用的是「遞迴平滑」版本:先算 RSV,再用前一日的 K、D 各帶三分之二的權重做指數平滑。
逐個符號拆開來看:
- 是當日收盤價,、 是近 日(常用 )的最高價與最低價。(未成熟隨機值)就是把收盤價放進近期高低區間做標準化,數值落在 0 到 100 之間:貼近區間頂端代表近期偏強、貼近底端代表偏弱。
- 是把當日 對前一日 K 值做指數平滑,三分之一的新值權重相當於一條平滑常數固定的指數移動平均,可削掉 逐日跳動的雜訊。
- 再把 K 值平滑一次,所以 D 一定比 K 鈍、K 一定比 D 敏感。兩者的差 就是後面整篇文章拿來做「廣度」的那個快慢線差。
這個遞迴式有一個對後面分析很關鍵的性質:K 與 D 都是把同一檔股票的價格序列各自平滑後相減,長期趨勢在相減時被抵掉了,留下的是短期的相對快慢。這正是為什麼把 拿去做個股橫截面排名會失效、但聚合成市場廣度卻有用——後面兩段會用真實回測把這件事說清楚。
把訊號畫在個股上:兩派買賣點與甩巴掌問題
公式歸公式,把它畫在真實股價上最直觀。下面兩張圖取台積電(2330)與聯發科(2454)2023-07 到 2024-06 這一年,上方面板是還原股價並標出兩個教科書派別的進出場箭頭,下方面板是 kd(9-3-3)的慢 K(藍)與慢 D(粉)兩條線與超買 80 / 超賣 20 帶。標的訊號用兩派:金叉死叉派(K 上穿 D 買、下穿 D 賣)與超賣派(K 跌破 20 買、突破 80 賣)。


把箭頭數一數就會發現第一個問題:訊號太多、太密。 光是金叉死叉派,台積電這一年就出現 32 次金叉、31 次死叉;聯發科 27 次金叉、27 次死叉。加上超賣派的買賣點,單一檔股票一年內合計的派別訊號,台積電 87 個、聯發科 78 個——平均每三、四個交易日就翻一次方向。圖上看得很清楚:在 2023 下半年那種橫盤整理段,K、D 兩條線反覆纏繞,金叉買進後沒幾天就死叉賣出,這就是技術分析裡常講的「甩巴掌」(whipsaw)。每一次來回都是一次買賣,都要付手續費與證交稅。
第二個問題是強趨勢裡的鈍化:看台積電 2024 年初那段噴出,K 值一路貼在 80 以上的超買區,如果照超賣派「K 突破 80 就賣」的規則,會在最該抱住的主升段提早出場,把後面一大段漲幅讓掉。這兩個現象合起來,就是後面回測會看到「教科書裸用幾乎不賺」的直觀來源。
這張圖你可以自己重畫。下面這段程式碼用 data.indicator("STOCH") 取 kd,再用簡單的交叉與門檻邏輯標出訊號點,邏輯一目了然:
顯示程式碼
import pandas as pd
from finlab import data
# 取價量與 kd(9-3-3);finlab 會在需要資料時自動引導登入
close = data.get("price:收盤價")
slowk, slowd = data.indicator("STOCH", fastk_period=9, slowk_period=3, slowd_period=3)
# 鎖定台積電與一年觀察窗
sid = "2330"
window = slice("2023-07-01", "2024-06-30")
k = slowk[sid].loc[window]
d = slowd[sid].loc[window]
# 金叉死叉派:K 上穿 D 為買、下穿 D 為賣
cross_up = (k > d) & (k.shift(1) <= d.shift(1))
cross_dn = (k < d) & (k.shift(1) >= d.shift(1))
# 超賣派:K 由下穿越 20 為買、由上跌破 80 為賣
oversold_buy = (k > 20) & (k.shift(1) <= 20)
overbought_sell = (k < 80) & (k.shift(1) >= 80)
# 數一數一年內各派別出現幾次,量化「訊號頻繁」的問題
print("金叉", int(cross_up.sum()), "死叉", int(cross_dn.sum()))
print("超賣買", int(oversold_buy.sum()), "超買賣", int(overbought_sell.sum()))把 sid 換成 "2454" 就能畫聯發科。你會發現不論換哪一檔,一年內訊號都是數十次的量級——訊號頻繁本身就是 kd 當個股進出場依據的硬傷,下一段的回測會把這個直覺變成數字。
訊號頻繁不是中性的:周轉率怎麼吃掉報酬
很多人以為「多做幾筆交易」頂多是麻煩,對報酬影響不大。在台股這是個昂貴的誤會。每一筆賣出都要付 0.3% 的證交稅,加上手續費(0.1425%,多數券商有折扣),一買一賣的固定摩擦就在 0.3% 到 0.5% 之間。前面圖上那種「平均三、四個交易日翻一次方向」的頻率,換算成全年就是把本金反覆繳過數十次這樣的過路費。
這在回測的周轉率上看得很清楚。本文後面會跑的「黃金交叉選股」策略,年換手高達 7.7 次——也就是整個投資組合一年要被換掉七、八輪;相對地,本文最終採用的純技術策略改用 K−D 的「斜率」當選股因子、再用季再平衡,年換手只有 1.97 次。同樣一檔股票的 kd 資訊,當個股無腦交叉訊號時製造的交易次數,是把它降頻成斜率因子與季頻選股時的近四倍。差出來的這幾倍周轉,全是要從報酬裡扣掉的成本。
這帶出一個容易被忽略的設計原則:訊號頻率本身就是成本。 一個指標訊號跳得越勤,越要先問「這些訊號裡有多少是真資訊、多少只是雜訊」。kd 在個股層的高頻交叉大多是雜訊(盤整期的來回纏繞),所以高周轉換不到對等的報酬;把它降頻——選股端改看數日級的 K−D 斜率、風控端把個股 K−D 聚合成市場廣度——雜訊互相抵消,訊號變稀疏但每一個更有意義,周轉率也跟著降到 1.97 次。要降的是個股層的雜訊,不是把已經乾淨的廣度訊號從日頻硬砍成月頻(那會錯過避崩時點,後面限制段會說明)。
散戶最常見的 kd 用法,在台股 11 年幾乎沒賺到錢
我們在可交易宇宙(成交金額前 300 大、收盤 > 10 元,排除 ETF、金融股、KY 股、處置股)裡,把幾種「kd 選股」用法各跑一次月再平衡的回測,研究段(2015-2021)結果如下,基準是同期含息 0050 的年化 15.3%:
| kd 選股用法 | 研究段年化 | 樣本外年化 | 全期最大回撤 |
|---|---|---|---|
| 超賣抄底(慢 K 最低 30 檔,均值回歸) | 2.3% | 11.7% | -48.9% |
| 橫截面 K−D 最低 30(買最弱等反彈) | 2.5% | 20.4% | -47.6% |
| 黃金交叉(K−D 由負轉正選股) | 10.4% | 15.9% | -39.0% |
| kd z-score 極值排名 | 10.1% | 12.9% | -46.6% |
| 橫截面 K−D 最高 30(買最強) | 9.0% | 10.5% | -47.7% |

結論很清楚:最多人用的「超賣抄底」在台股研究段年化只有 2.3%、最大回撤 -48.9%,是最差的一種用法。 原因不難理解——台股的超賣股往往是「下跌趨勢的中段」,用 kd 低檔去接,等於在下跌趨勢裡逆勢接刀。表現相對好看的「黃金交叉選股」研究段年化 10.4%,看似有點東西,但仍輸給同期含息 0050 的 15.3%,且最大回撤高達 -39.0%;它賺到的其實是「近期漲多」這個動能特徵,而不是 kd 交叉本身帶來的額外資訊。
關鍵問題出在:kd 是 0 到 100 的有界擺盪值,把它拿來做個股橫截面排名,只是把「近期相對強弱」重新貼一次標籤。低 kd 可能是健康回檔(該買),也可能是趨勢轉空的起點(該跑);把這兩種互斥邏輯混在同一個排名裡,訊號自然互相抵消。我們也測了「黃金交叉買、死亡交叉賣」的多空組合,研究段報酬同樣站不住。kd 指標本來就不是設計來選個股的因子。 這個「教科書裸用選股無效、真正價值在風控」的結論並非 kd 獨有:同一套真實回測方法套到 MACD、布林通道上也成立,只是各指標的失效細節不同——MACD 的柱狀圖在台股是反轉訊號而非動能訊號,布林通道則是觸帶買賣幾乎不賺。三者並列的差異與正確用法,可參考RSI vs MACD vs KD 三大指標台股實測,以及 kd 鈍化的定義與參數設定實驗。本文聚焦的是 kd 獨有的那一刀:K−D 橫截面選股為何徹底失效、以及把 K−D>0 廣度做成「水準或斜率」雙條件再 AND 趨勢的風控用法。
那 kd 的資訊到底在哪裡?答案是:不在個股層,在市場層。
kd 真正有效的用法:把它聚合成「市場廣度」當風控開關
這是本文的重點,也是搜尋第一頁還沒有人用真實回測講清楚的角度。
單看一檔個股(或單一指數)的 kd 有沒有黃金交叉,訊號太雜:盤整期會反覆穿越、來回甩巴掌。但如果改看「全市場有多少比例的股票,K 值站在 D 值之上(K−D>0)」,就得到一個橫截面的、平滑的大盤多空力道度量,我們稱為 kd 廣度。個股層的雜訊在加總時互相抵消,留下來的是大盤短期內部動能的轉強或轉弱訊號。廣度高,代表多數個股結構偏多;廣度崩落,代表系統性轉弱。

把這個廣度做成大盤風控開關,套在選股籃外層,再把 K−D 的斜率收進選股端當其中一個因子,效果立刻不同。本文最終採用的純技術策略正是這兩件事疊起來:選股端在 120 日動能池內,用「120 日動能分位 + K−D 的 5 日斜率分位」的綜合分挑 10 檔等權;風控端用全市場 K−D 廣度雙條件做部分減碼。為了拆清楚兩個零件各自的貢獻,我們把完整策略、拆掉廣度風控(只留 0050 年線濾網)、拆掉 K−D 斜率因子(選股改純動能)三種版本並排,回測區間 2015-2026,結果如下:
| 策略版本 | 研究段年化 | 樣本外年化 | 全期最大回撤 |
|---|---|---|---|
| 完整策略(K−D 斜率選股 + K−D 廣度風控) | 35.3% | 25.2% | -25.4% |
| 拿掉 K−D 廣度風控(只留 0050 年線濾網) | 33.1% | 14.7% | -56.9% |
| 拿掉 K−D 斜率因子(選股改純動能) | 22.5% | 14.0% | -26.7% |

這張歸因表是整篇文章的鐵證:K−D 的兩個橫截面用法缺一不可。 拿掉廣度風控、只留 0050 年線濾網,樣本外年化從 25.2% 崩到 14.7%、全期最大回撤從 -25.4% 惡化到 -56.9%——壓尾部回撤、守住樣本外的這一刀,可歸因到 K−D 廣度本身,不是趨勢濾網。拿掉 K−D 斜率因子、選股改成純動能,研究段年化則從 35.3% 掉到 22.5%、跌破門檻——拉研究段報酬靠的是 K−D 斜率把強勢族群裡的補漲股挑出來。
kd 廣度有一個其他擺盪指標做不到的細節:它的多空力道是直接量「K 減 D(K−D)」這個內生的快慢線差,而不是把單一價格序列跟一條外加的均線或通道比。也正因為 K−D 是把同一檔股票的快慢平滑值相減、抵掉了長期趨勢,把它當個股橫截面排名選股會徹底失效(前面那張表裡 K−D 最高 / 最低排名全部 ≤10.1% 年化);但同一個 K−D 換兩種橫截面用法就活了過來:聚合成全市場廣度,個股雜訊互相抵消後成為乾淨的市場內部多空溫度計;取它的 5 日斜率,量的是「轉強的速度」而非「絕對水準」,在強動能族群裡用來挑相對落後、正在補漲的股票。本文用的「廣度水準(>0.5)」再 AND 0050 站上年線雙條件,就是為了在大盤內部結構與長期趨勢同時轉強時才滿倉。
這個「用市場內部結構控風險」的邏輯,和學術上的波動度擇時一致——Moreira & Muir (2017) 在《Volatility-Managed Portfolios》證明:在風險惡化時調降曝險,能顯著提升投資組合的夏普值。kd 廣度正是一個可操作、可日頻更新的市場內部風險訊號。選股端「在強勢族群裡挑相對落後股」則承接動能效應——Jegadeesh & Titman (1993) 在《Returns to Buying Winners and Selling Losers》發現過去的中期贏家傾向繼續贏,本文用 120 日動能先框出強勢池,再用 K−D 斜率在池內挑補漲標的。兩個零件打的是不同的問題:斜率因子拉報酬,廣度風控砍尾部崩盤。關於用大盤訊號降低回撤,也可參考用大盤濾網把最大回撤從 -60% 降到 -30%與4 種均線濾網實測。
完整策略:K−D 斜率選股籃 + K−D 廣度風控
把上面的洞見組成一套可執行、可重現、完全不含基本面的純技術策略。整套策略只用價量算出來的兩個 K−D 橫截面零件——斜率當選股因子、廣度當風控開關——再疊上 120 日動能框出強勢池:
- 選股籃(綜合分挑補漲股):可交易宇宙中,先用 120 日動能取池內前 80 檔當動能池。池內每檔算一個綜合分:0.6 倍的 120 日動能分位(報酬越高分越接近 0)加 0.4 倍的 K−D 斜率分位(K−D 的 5 日斜率越高分越接近 0),取綜合分最低的 10 檔等權持有。綜合分最低 = 強勢動能族群裡相對落後、正在補漲的標的,這是策略的報酬引擎。
- 風控訊號(K−D 廣度):每日計算可交易宇宙內「K−D>0(K 在 D 之上)的個股比例」當廣度(kd 參數 fastk 6)。當「廣度 > 0.5」且「0050 收盤站上 200 日均線」兩條件同時成立,視為 risk-on。
- 部位調整:risk-on 時整籃滿倉等權;risk-off 時不全清空、不轉槓桿,整籃部位縮到 35%(部分減碼轉現金,保留下檔參與)。
- 季再平衡,廣度與趨勢訊號跑日頻。
K−D 的 K、D 用 data.indicator("STOCH", fastk_period=6, slowk_period=3, slowd_period=3) 算,K−D 的 5 日斜率就是 (K−D) − (K−D).shift(5)。頁面內放好讀的核心程式碼(完整版請下載文末的 strategy.py):
顯示程式碼
import pandas as pd
from finlab import data
# 載入價量資料
close = data.get("price:收盤價")
amount = data.get("price:成交金額")
# 可交易宇宙:成交額前 300 大、收盤 > 10 元,排除 ETF 與權證 / KY
liquidity = amount.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.is_largest(300) & (close > 10) & is_common
# 120 日動能取池內前 80 檔當動能池
ret120 = close / close.shift(120) - 1
mom_pool = ret120.where(universe).rank(axis=1, ascending=False) <= 80
# K−D 的 5 日斜率:量「K−D 轉強的速度」,當選股因子
slowk, slowd = data.indicator("STOCH", fastk_period=6, slowk_period=3, slowd_period=3)
kd_diff = slowk - slowd
kd_slope = kd_diff - kd_diff.shift(5)把動能分位與 K−D 斜率分位加權成綜合分(越小越優先),在動能池內挑綜合分最低的 10 檔等權:
顯示程式碼
# 綜合分越小越優先:0.6 動能 + 0.4 K−D 斜率,挑強勢族群裡的補漲股
mom_score = ret120.where(mom_pool).rank(axis=1, ascending=False, pct=True)
slope_score = kd_slope.where(mom_pool).rank(axis=1, ascending=False, pct=True)
combo = 0.6 * mom_score + 0.4 * slope_score
basket = combo.rank(axis=1, ascending=True) <= 10風控端把日頻 K−D 廣度與 0050 年線組成 risk-on 條件,risk-off 時整籃部位縮到三成五:
顯示程式碼
import numpy as np
from finlab.backtest import sim
# K−D 廣度:宇宙內 K−D>0 的個股比例,當市場內部多空溫度計
breadth = (kd_diff > 0).where(universe).sum(axis=1) / universe.sum(axis=1)
# 雙條件 risk-on:廣度 > 0.5,且 0050 站上 200 日均線
adj = data.get("etl:adj_close")
tw0050 = adj["0050"]
trend_up = tw0050 > tw0050.rolling(200).mean()
risk_on = (breadth > 0.5) & trend_up.reindex(breadth.index).ffill().fillna(False)
# risk-off 時整籃部位縮到 35%(部分減碼轉現金,非全清空、不加槓桿)
weights = basket.astype(float)
weights = weights.div(weights.sum(axis=1), axis=0).fillna(0.0)
scale = pd.Series(np.where(risk_on.reindex(weights.index).fillna(False), 1.0, 0.35),
index=weights.index)
position = weights.mul(scale, axis=0)
# 季再平衡,台股預設成本:手續費 + 賣出證交稅 0.3%
report = sim(position, resample="Q", upload=False)完整的可重現版本(含成本設定與分段評估)請見文末可下載的 strategy.py。
這套純技術策略全期(2015-2026)年化 31.1%、月夏普 1.20、月索提諾 3.00、最大回撤 -25.4%。 含息 0050 同期年化 21.0%、月夏普 1.05、最大回撤 -34.0%——策略在絕對報酬與風險調整報酬都勝過 0050,且回撤更淺。研究段(2015-2021)策略年化 35.3%、月夏普 1.21、月索提諾 3.28、最大回撤 -25.4%;樣本外(2022-2026)年化 25.2%、月夏普 1.32、月索提諾 2.68、最大回撤 -21.0%。研究段與樣本外的年化都站上 25%、月夏普都站上 1.2,沒有出現「研究段漂亮、樣本外垮掉」的型態,年換手只有 1.97 次。
下面是完整互動式回測:月報酬熱力圖、權益曲線、年度績效都可以直接在文章裡操作:
回測方法與口徑
量化結論的可信度取決於方法,以下逐項交代:
- 交易成本:策略使用 finlab
sim(),台股預設已內扣手續費(0.1425%,本文以打三折計)與賣出證交稅 0.3%。 - 滑價:未額外假設滑價,實際成交衝擊取決於資金規模與流動性。
- 股票池:上市櫃普通股,60 日均成交金額前 300 名、收盤 > 10 元。
- 排除類別:排除 ETF(代號 00 開頭)、權證 / KY / 特別股(非 4 碼純數字)、金融保險股、處置與全額交割股,以降低生存者偏差與不可交易標的污染。
- 前視偏差:120 日動能、K−D、K−D 的 5 日斜率與廣度均只使用當日(含)以前的價格;季頻再平衡,風控訊號於當日可得。整套策略只用價量、不使用任何財報或月營收資料,自然沒有財報公布日對齊問題。
- 權重:選股籃等權、單一資產不另設上限;risk-off 時整籃乘上 0.35 的部位係數。
- 周轉率:年換手約 1.97 次(季再平衡 + 風控切換),屬中低;季頻換股把個股 kd 的高頻雜訊降頻,是這個換手率的主因。
- 樣本內外:研究段 2015-2021、樣本外 2022-2026 分開回報,所有關鍵數字兩段都列,避免只報漂亮的一段。
穩健度
這套策略的 edge 不是靠單一參數湊出來的,四個方向都驗過:
- 減碼係數是一片平台:risk-off 留倉係數在 0.30 / 0.35 / 0.40 三格全段都過「研究段年化 ≥ 25%、月夏普 ≥ 1.2」門檻——0.30 研究段年化 34.6% / 月夏普 1.21、0.35(本文採用)35.3% / 1.21、0.40 為 36.0% / 1.21。係數越高、牛市曝險越多、報酬略升(研究段年化 34.6% 升到 36.0%),但回撤同步走深(全期最大回撤從 -24.2% 加深到 -25.4%、再到 -28.6%),月夏普則三格幾乎不動。甜蜜點落在 0.30 到 0.40,是平滑高原不是孤峰;本文採用 0.35,在報酬與回撤之間取平衡。
- kd 週期穩健:把驅動選股斜率與廣度的 STOCH fastk 在 5 / 6 / 7 / 8 / 9 之間掃,fastk 6 是高原中心(研究段月夏普 1.21);fastk 5 與 9 也都在 1.1 以上,過度微調 fastk 的價值有限,但週期不宜放太長(14 起研究段月夏普明顯下滑)。
- 廣度門檻穩健:廣度門檻在 0.45 / 0.50 / 0.55 之間,0.50(本文採用)研究段年化 35.3% / 月夏普 1.21、樣本外 25.2% / 1.32 過門檻;0.45 樣本外更高(27.4% / 1.37)但全期最大回撤惡化到 -36.4% 不過門檻、0.55 研究段仍穩但樣本外退到 20.4% / 1.21。0.50 是報酬與回撤的平衡點。
- 集中度單調可解釋:選股檔數從 9 到 11 檔,研究段月夏普落在 1.13 到 1.21、最大回撤都在 -25% 附近;10 檔(本文採用)是研究段月夏普最高的一格。動能池放大到 100 檔則樣本外更強(26.9% / 1.43)但研究段月夏普退到 1.17 略低於門檻,10 檔配池 80 是兼顧兩段的設定。
參數最佳化:用色溫圖找一片高原,不是找一根孤峰
策略只報一組參數的成績,最容易被質疑「是不是剛好挑到漂亮的數字」。為了把這個疑慮攤在陽光下,我們對策略最關鍵的兩個 kd 參數做網格搜尋:STOCH 的 fastk 週期(5 / 6 / 9 / 14,它同時驅動選股的 K−D 斜率因子與風控的 K−D 廣度)× 廣度門檻(0.40 / 0.45 / 0.50 / 0.55),其餘設定(動能池 80、持股 10 檔等權、0050 年線濾網、risk-off 留倉 0.35、季再平衡)固定不動,每一格都用同一套 sim() 真跑一次回測,把研究段(2015-2021)的月夏普填進色溫圖。

看色溫圖要先看「綠的地方是連成一片,還是只有孤零零一格」,而非急著找最高分那一格。如果最高分只出現在某一格、周圍立刻變紅,那多半是過擬合:參數稍微一動績效就崩,換到未來資料大概率失靈。這張圖的型態相對健康——fastk 5 到 6、門檻 0.45 到 0.55 那一片研究段月夏普都站在 1.13 以上,本文採用的 fastk 6、門檻 0.50 落在 1.21(圖中最深的一格),周圍鄰格都在 1.1 以上,是一片相連的高原而不是單一尖峰。真正偏弱的角落是 fastk 6 / 9 搭門檻 0.40(掉到 0.91 到 0.96),代表「門檻太鬆、放進太多雜訊」才是該避開的設定。
挑哪一格不能只看研究段的月夏普,還要對照樣本外與最大回撤。我們把幾個高原內鄰格與本文採用格並排,注意「研究段分數略高的格子,到了樣本外與回撤未必更好」:
| 參數版本 | 設定 | 研究段月夏普 | 樣本外月夏普 | 全期最大回撤 | 過硬門檻 |
|---|---|---|---|---|---|
| 本文採用 | fastk 6、門檻 0.50 | 1.21 | 1.32 | -25.4% | 是 |
| 門檻放鬆 | fastk 6、門檻 0.45 | 1.14 | 1.37 | -36.4% | 否 |
| 週期拉長 | fastk 9、門檻 0.50 | 1.11 | 1.40 | -26.9% | 否 |
| 週期更短 | fastk 5、門檻 0.50 | 1.18 | 1.30 | -26.2% | 否 |
把這幾格放在一起看就清楚:fastk 9、門檻 0.50 的樣本外月夏普衝到 1.40,比本文採用格還高,但研究段月夏普 1.11 略低於 1.2 門檻、且最大回撤更深到 -26.9%;門檻放鬆到 0.45 雖然樣本外月夏普 1.37,但全期最大回撤一口氣惡化到 -36.4%——壓回撤的能力被犧牲掉了。fastk 6、門檻 0.50 是少數研究段月夏普站上 1.2、樣本外也維持 1.32、回撤又最淺的一格,所以採用它,而不是去追某一格漂亮的樣本外數字。
挑好參數之後,最該確認的是「這套疊起來的策略,比沒有 kd 風控的裸籃好在哪」。下圖把同一個動能加 K−D 斜率選股籃,在「不套 kd 廣度風控(只留 0050 年線濾網的裸籃)」與「套上完整 kd 廣度風控(本文勝出策略)」兩種設定下並排:

這張圖的重點不在月夏普那兩根差不多高的柱子,而在右邊的最大回撤:沒有 kd 廣度風控的裸籃,全期最大回撤深達 -59.7%;套上 kd 廣度雙條件部分減碼後,回撤收斂到 -25.4%。 兩者的研究段與樣本外月夏普接近(都在 1.2 到 1.3 一帶),但裸籃是用承受近六成回撤換來的——這正是 kd 廣度這層風控的價值:在報酬幾乎不打折的前提下,把尾部回撤砍掉一半以上。提醒一句:色溫圖只掃了 fastk 與廣度門檻兩個參數,留倉係數固定在 0.35。如果連同部位層一起掃,要避免「為了把回撤壓更低而把牛市曝險砍過頭」——訊號參數與部位係數必須一起看,前面穩健度那段的減碼係數掃描就是在驗這件事。
不同大盤狀態下的表現:研究段與樣本外都站得住
判斷一套策略是不是只靠某一段行情湊出來,最直接的方法是把回測切成兩段、各自結算,再攤開逐年報酬看它在不同大盤狀態下的脾氣。本文把 2015-2021 當研究段(涵蓋 2015 股災、2018 中美貿易戰急跌、2020 疫情崩跌與反彈),2022-2026 當樣本外(涵蓋 2022 升息熊市與其後的強多頭,2026 資料截至 2026-06):
| 區間 | 大盤背景 | 策略年化 | 策略月夏普 | 策略最大回撤 | 含息 0050 年化 |
|---|---|---|---|---|---|
| 研究段 2015-2021 | 多次急跌與反彈交錯 | 35.3% | 1.21 | -25.4% | 15.3% |
| 樣本外 2022-2026(截至 2026-06) | 升息熊市後轉強多頭 | 25.2% | 1.32 | -21.0% | 30.4% |
| 全期 2015-2026 | — | 31.1% | 1.20 | -25.4% | 21.0% |
兩段分開看的重點是:策略在研究段與樣本外的年化都站上 25%、月夏普都在 1.2 以上,沒有出現「研究段漂亮、樣本外垮掉」的過擬合特徵。 研究段它大幅領先含息 0050(35.3% vs 15.3%),靠的是 K−D 斜率在強動能族群裡挑補漲股;樣本外它與含息 0050 的差距縮小(25.2% vs 30.4%),因為 2022 之後是台股強單邊多頭,kd 廣度風控偶爾轉防禦會在順風段少賺一點,但樣本外段內回撤只有 -21.0%、比同期 0050 更淺。
逐年看更清楚它的脾氣(樣本外口徑、季再平衡):策略在 2018(+65.5%)、2021(+85.5%)、2023(+67.9%)這幾個強勢年大賺,靠的是補漲股在多頭擴散時的爆發;在 2022 升息熊市則收在 -16.4%——kd 廣度與 0050 年線雙雙轉弱觸發減碼,把那年的傷壓在兩成內,沒有跟著大盤崩到三、四成。2025 只有 +7.0% 的平淡年,反映的是當盤面缺乏明確強勢族群、廣度反覆進出時,季頻策略容易兩面挨耳光。整體看,這是一套「強勢年吃滿、急跌年靠廣度風控收口」的策略,不是每年都穩賺的策略。
加上月營收 YoY 會更好嗎:基本面是選配,不在主策略內
本文的主策略是完全不含基本面的純技術策略:選股只用 120 日動能與 K−D 的 5 日斜率,風控只用全市場 K−D 廣度與 0050 年線,沒有任何財報或月營收輸入。這是刻意的設計——純技術訊號每日可得、無財報公布延遲與對齊問題,回測口徑乾淨、可重現性高,敘事也緊扣本文主題「kd 的兩個橫截面用法」。
常見的延伸問題是:在選股端疊一層月營收年增率(YoY),績效會不會更好?這是一個合理的研究方向,但屬於「在純技術主策略之外的選配實驗」,不納入本文主策略的數字。原因有二:其一,主策略選股只取 10 檔、集中度已高,再加營收過濾會大幅縮小可選池,反而稀釋掉 K−D 斜率挑補漲股的爆發力;其二,月營收是領先指標、公布有時間落差,要正確對齊「當期(含)以前已公布」的資料才不會前視,這會把乾淨的純技術口徑複雜化。想實驗的讀者可在下載的 strategy.py 裡,於綜合分計算前加一層 monthly_revenue 的 YoY 過濾或複合排名自行對照。基本面與技術面如何分工,可參考技術分析 vs 基本面分析台股 15 年回測。
策略的限制與取捨
- 集中度與季頻帶來的回撤波動:策略只持 10 檔、季再平衡,全期最大回撤 -25.4%。雖比含息 0050 的 -34.0% 淺,但 10 檔集中加上季頻換股,意味著選錯族群時要扛一整季,承受得住這級回撤與單股風險才適合。
- 報酬集中在強勢族群擴散的年份:策略的高報酬集中在 2018 / 2021 / 2023 這種強勢股擴散的年份;盤面缺乏明確強勢族群時(如 2025 只有 +7.0%),補漲股因子容易兩面挨打,不是每年都穩賺。
- kd 廣度風控必須跑日頻、不能為省成本降頻:拆掉 kd 廣度風控、只留 0050 年線濾網,樣本外月夏普會從 1.32 跌到 0.86、全期最大回撤從 -25.4% 惡化到 -56.9%。kd 廣度反映的是數日級的市場內部轉折,整段降頻會錯過避崩與回補時點。實盤若要壓 turnover,建議改用「最小持有期去抖」而非整段降頻,並重新驗成本後夏普是否仍站得住。
- 崩盤型態涵蓋有限、容量有限:廣度門檻主要在 2018 / 2020 / 2022 幾次急跌上驗證,資料起點 2015,未對更早期崩盤型態做滾動測試;選股籃僅 10 檔,大資金部署需重估流動性衝擊,本文未逐筆估算容量與滑價。
自己跑一次
把下面這句話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:
用 AI 開始 FinLab
把這句話交給你的AI,它會帶你完成設定並做出第一個策略。
告訴你的AI:
「幫我設定 FinLab,做一個動能策略:https://finlab.finance/setup」
裝好之後,下載本文的 strategy.py 與 data.csv,即可在自己的環境重跑、改參數、換選股因子。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽與程式交易是什麼。
常見問題
Q:kd 黃金交叉買進在台股有用嗎? 在本文設定、2015-2026 這段期間,用「K−D 由負轉正」選股研究段年化 10.4%,輸給同期含息 0050 的 15.3%、最大回撤還高達 -39.0%。它賺到的多半是「近期漲多」這個動能特徵,而非 kd 交叉本身的資訊。把它當無腦買賣訊號,長期討不到便宜。
Q:kd 超賣(K<20)抄底會反彈嗎? 不一定。超賣抄底(慢 K 最低 30 檔)在台股研究段回測年化只有 2.3%、最大回撤 -48.9%,是測過最差的一種用法。台股超賣股常是下跌趨勢的中段,用 kd 低檔接刀,等於逆勢接下跌趨勢,傷得很重。
Q:kd 參數要設多少?9、3、3 是最好的嗎? fastk 9、slowk 3、slowd 3 是最常見的教科書設定。本文純技術策略用的是 fastk 6、slowk 3、slowd 3——把 fastk 在 5 到 9 之間掃,fastk 6 是研究段月夏普最高的高原中心(1.21),fastk 5 與 9 也都站得住,但週期拉到 14 起研究段月夏普就明顯下滑。重點不在參數微調,而在用法:把 kd 拆成斜率因子與廣度風控時,對週期不算敏感;當個股黃金交叉或超買超賣訊號則怎麼調都站不住。
Q:kd 鈍化是什麼?要怎麼處理? 強趨勢中 K、D 會貼在高檔或低檔長時間不動,交叉與超買超賣訊號短暫失效,這就是鈍化。它正好說明了 kd 個股訊號的脆弱:在最該抱住的強趨勢裡,個股 kd 訊號反而最不可靠。鈍化的定義與參數實驗見如何定義 kd 鈍化。
Q:kd 可以單獨拿來當買賣訊號嗎? 不建議。無論是黃金交叉、超買超賣,還是 K−D 橫截面排名選股,在台股回測都站不住(研究段年化全部 ≤10.4%)。kd 適合「聚合成市場廣度當風控」,搭配其他選股因子使用,而不是自己當個股進出場依據。
Q:kd 和 RSI、MACD 一起用會更好嗎? 這些都是動能 / 擺盪類指標,資訊高度重疊,硬疊在一起通常是負貢獻。比較有效的組合是「不同性質」的訊號搭配,例如 120 日動能(框出強勢池)+ K−D 斜率(池內挑補漲股)+ K−D 廣度(大盤風控)。三大指標的差異與正確用法可參考 RSI vs MACD vs KD 台股實測。
Q:為什麼要用「全市場廣度」而不是只看個股或大盤指數的 kd? 單一個股或單一指數的 kd 交叉在盤整期雜訊太大、來回甩巴掌;把全市場個股的 K−D 加總成廣度後,雜訊互相抵消,得到的是橫截面、平滑的多空力道度量,再加上 200 日均線趨勢濾網雙重確認,才能在保住報酬的同時把尾部回撤砍下來(拆掉 kd 廣度只留趨勢濾網,全期最大回撤會從 -25.4% 惡化到 -56.9%)。
Q:這套策略適合誰? 適合想主動參與台股、追求明顯高於含息 0050 報酬、又能接受 -25% 等級回撤與季頻換股的人:全期年化 31.1%、月夏普 1.20,研究段與樣本外都勝過含息 0050。不適合受不了二成五回撤、或偏好低周轉被動持有的人——那種需求直接買進持有含息 0050 更省心。技術面與基本面選股的取捨,可參考技術分析 vs 基本面分析台股 15 年回測。
最後更新:2026-06|回測區間:2015-01 到 2026-06-09|作者:FinLab 量化研究團隊(經量化研究員審閱)
本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。kd 雙核心純技術策略全期最大回撤 -25.4%、樣本外段內回撤 -21.0%,實際交易前請自行評估風險、滑價與交易容量。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始
