威廉指標在台股的正確用法:當相對強勢排序工具,不抓超買超賣
威廉指標台股回測的關鍵數字:
| 你想知道的 | 本文用真實台股回測的回答 |
|---|---|
| 威廉指標是什麼 | Larry Williams 1973 年提出的擺盪指標,值域 -100 ~ 0,衡量收盤價在近 N 日高低區間中的相對位置 |
| 超賣(< -80)買進有效嗎 | 每月買 14 日 %R 最低的 30 檔,研究段(2015–2021)年化 3.7%;只買換股日當天剛從 -80 下方回升的股票,研究段 -1.6%。同期含息 0050 是 15.1% |
| 那它該怎麼用 | 反過來讀,取最強勢的一籃:14 日 %R 最高 30 檔研究段 10.6%,回看窗拉長到 35 日變成 19.1% |
| 單獨用就夠嗎 | 不夠。35 日 %R 單獨挑 11 檔,研究段只有 13.8%;只用 60 日報酬挑也只有 16.6%;兩者合成一個綜合分,研究段 29.8%、月夏普 1.39 |
| 效果如何 | 資料延長到 2026-09-30 後,全期年化 28.6% 仍高於含息 0050 的 21.2%,但 2022 年起月夏普只剩 0.99、年化 26.9% 落後 0050 的 30.5%,全期最大回撤 -38.5% 比 0050 深 |
| 最近發生什麼事 | 2026 年 7 月單月 -29.3%(0050 -4.0%),持股 11 檔全數虧損;0050 月中一度從 7 月 1 日的高點回落 14.0%,但均線擇時開關到 7 月 30 日才轉弱一天,7 月 31 日換股時又回到站上,沒有減碼 |
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重現這篇文章,請讀:https://finlab.finance/setup?relatedUrl=/blog/williams-r-indicator-taiwan

本文所有數字皆出自 finlab 套件(2.2.16)抓取的上市櫃真實價量資料(
price與etl:adj_close含息還原股價),回測從 2015-01-30 起算、資料截至 2026-09-30,基準為同日起算的含息 0050。2026-10 用延長後的資料重跑,參數一個都沒改:首發版(資料截至 2026-06-09)2022 年起月夏普 1.22,現在降到 0.99,低於我們設的 1.0 門檻,文中新增「策略衰退追蹤」一節交代發生什麼事。研究段年化由首發的 29.6% 變成 29.8%,原因是 finlab 版本差異(新版讓首個淨值日由 2015-02-26 提前到 01-30),用新版在首發同一截止日重跑就是 29.8%,和新資料無關。文末附可下載的strategy.py與data.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼。
威廉指標是什麼
威廉指標(Williams %R,TA-Lib 代號 WILLR)是 Larry Williams 在 1973 年提出的擺盪指標,計算公式是:%R =(近 N 日最高價 − 當日收盤價)/(近 N 日最高價 − 近 N 日最低價)×(−100)。它的值域固定在 −100 ~ 0 之間:
接近 0:收盤價收在近 N 日高低區間的頂端,代表近期相對最強勢。
接近 −100:收盤價收在近 N 日高低區間的底端,代表近期相對最弱勢。
教科書常見用法把它當 KD 類擺盪指標:高於 −20 視為超買(該賣)、低於 −80 視為超賣(該買),假設價格會均值回歸、回到區間中段。預設回看窗 N 通常取 14 日。技術指標的基礎名詞可參考名詞詞彙表。
這裡藏著一個關鍵的觀念分歧:威廉指標到底該當「均值回歸訊號」(超賣會反彈、超買會回落),還是「相對強勢訊號」(強的續強、弱的續弱)?這兩種讀法方向完全相反,回測可以分出高下。
威廉指標的數學定義:它衡量「收盤離近期高點多遠」
把上面的白話寫成公式,威廉指標 %R 的定義是:
逐項拆解每個符號:
- :當日收盤價。
- :近 日(含今日)的最高價。
- :近 日的最低價。
- :近 日的高低價差,也就是這段期間的波動區間。
- :收盤價離區間頂端(近期最高點)還有多遠。
整個式子先算「收盤距離近期高點的差距佔整個區間的比例」,再乘上 把值域翻到 。所以當收盤價正好等於近期最高點(),分子為 0,,是最強勢的讀數;當收盤價落在近期最低點(),分子等於整個區間,,是最弱勢的讀數。換句話說, 量的是「今天收在近 日箱型的相對位置」,與漲跌幅或波動大小無關,這正是它能反過來當相對強勢排序工具的數學根源。這條公式和 KD 的未成熟隨機值(RSV)幾乎是同一個東西的鏡像,差別只在 KD 量「收盤離低點多遠」、威廉指標量「收盤離高點多遠」,這也是為什麼後面會說它和 KD 資訊高度重疊。
「離近期高點多近」在學術上有直接對應的研究:George & Hwang (2004) 在美股發現,收盤價接近 52 週最高價的股票,後續報酬高於遠離高點的股票,預測力還強過單純的過去報酬。威廉指標的回看窗短得多(本文用 35 日),所以只能算同一類訊號的短窗版本,效果要在台股另外驗證。
散戶最常見的「超賣買進」,在台股 11 年幾乎沒賺到錢
我們在可交易宇宙(60 日均成交金額前 300 大、收盤 > 10 元、60 日均量 > 100 萬股,只留代號 4 碼數字,排除 00 開頭 ETF、金融保險股、處置股)裡,把幾種「威廉指標選股」用法各跑一次等權、月換股、不擇時的回測:
| 威廉指標用法 | 研究段年化(2015–2021) | 2022 年起年化 |
|---|---|---|
| 超賣買進:14 日 %R 最低 30 檔 | 3.7% | 11.3% |
| 換股日當天剛從 -80 下方回升(超賣回升進場) | −1.6% | 9.9% |
| 近 20 個交易日內曾從 -80 下方回升 | 7.4% | 16.3% |
| 反過來讀:14 日 %R 最高 30 檔 | 10.6% | 14.5% |
| 回看窗拉長:35 日 %R 最高 30 檔 | 19.1% | 16.7% |
| 含息 0050 買進持有 | 15.1% | 30.5% |

結論很清楚:最多人用的「超賣買進」在台股研究段年化只有 3.7%。 「超賣回升才進場」的版本,若只買換股日當天剛好穿越 -80 的股票,每個月入選的檔數中位數只有 12 檔,141 個換股日裡有 5 個一檔都沒有,研究段 -1.6%;放寬成「近 20 個交易日內曾回升」,每月入選中位數 171 檔,研究段也只有 7.4%。兩種寫法都輸給同期含息 0050 的 15.1%。
原因不難理解:台股長期呈現「強者恆強、弱者續弱」。收在近期區間底端(%R 超賣)的股票,往往是基本面或籌碼出了問題的續弱股,接刀容易被套;擺盪指標假設的「超賣必反彈」,在流動性宇宙裡並不成立。把同一個指標反過來讀:取收在區間頂端的股票,14 日版研究段年化從 3.7% 升到 10.6%,回看窗拉長到 35 日再升到 19.1%,勝過同期 0050。這和 Jegadeesh & Titman (1993) 的動能效應一致:過去的相對贏家,中期傾向繼續贏。延伸閱讀:技術面與基本面選股的差異、動能策略。
但表格最右欄要一起看:2022 年起,這五種裸用法全部落後含息 0050 的 30.5%,連研究段最好的 35 日相對強勢也只有 16.7%。裸用威廉指標選股,近幾年在台股沒有優勢;後面的完整策略之所以還能做出成績,靠的是和 60 日動能的組合,這一點會在「拆開綜合分」一節用數字說明。
在單一檔股票上,兩個派別的買賣點長怎樣
回測數字告訴你哪條路有優勢,但很多人會問:那畫在 K 線上到底是什麼感覺?我們挑台積電(2330)與聯發科(2454)在 2023-08 ~ 2024-06 這段約 11 個月(222 個交易日)的窗,把威廉指標(14 日)兩個派別的訊號標出來看。%R 用完整歷史計算後再取窗內,窗內第一天沒有前一日,不算交叉。下方面板是 %R 的走勢,加上 −20(超買)與 −80(超賣)兩條帶,價格面板則標出兩派各自的進出場點。
兩派的規則完全相反:
- 超賣派(教科書均值回歸):%R 由下上穿 −80 視為超賣反彈買進、由上下穿 −20 視為超買賣出。
- 相對強勢派:%R 上穿 −20 進入強勢區視為轉強買進、跌破 −80 視為由強轉弱賣出。


圖上有兩件事值得注意。第一,這兩檔在這段窗裡都是多頭(台積電收盤 +70.4%、聯發科 +96.4%),超賣派的買點稀稀落落、賣點卻一大堆:台積電超賣派只觸發 11 次買、卻有 20 次賣;聯發科更極端,只有 5 次買、23 次賣。原因是強勢股的 %R 經常停在 −20 上方:台積電有 36.5% 的交易日 %R 高於 −20,聯發科 44.6%,跌到 −80 以下的日子都只有約 15%。所以「超賣才買」很少有機會上車,反而一碰到 −20 就賣、把上漲讓出去。第二,相對強勢派的進出剛好相反:台積電 21 次買、11 次賣,聯發科 22 次買、5 次賣,順著上升段持有。
同一張圖也暴露單股使用威廉指標的硬傷:訊號太頻繁、容易甩巴掌(whipsaw)。%R 在 −20 與 −80 之間反覆穿越,每穿一次就是一組進出,盤整段尤其嚴重。所以本文把威廉指標當「橫截面排序工具」用:把全市場個股的 %R 拿來比高低、每月選一籃最強的,用分散與月頻再平衡稀釋單股的雜訊。
想自己把這張圖畫出來、換成別檔股票看,下面這段程式碼用 finlab 的 data.indicator 算威廉指標、再用簡單的穿越邏輯算出兩派訊號:兩派的次數都會印出來(台積電這段窗是超賣派 11 買 20 賣、相對強勢派 21 買 11 賣),圖上標的是相對強勢派的買賣點:
顯示程式碼
import pandas as pd
import matplotlib.pyplot as plt
from finlab import data
# 套件會在需要資料時自動引導登入
import finlab
finlab.login()
# 載入收盤價,計算威廉指標(回看窗 14 日,用完整歷史計算)
close = data.get("price:收盤價")
willr = data.indicator("WILLR", timeperiod=14)
# 取單一檔股票(台積電 2330)的一段窗來看
sid = "2330"
px = close[sid].loc["2023-08":"2024-06"]
w = willr[sid].loc["2023-08":"2024-06"]
# 超賣派:%R 上穿 -80 買、下穿 -20 賣(均值回歸抄底)
buy_oversold = (w > -80) & (w.shift(1) <= -80)
sell_oversold = (w < -20) & (w.shift(1) >= -20)
# 相對強勢派:%R 上穿 -20 進入強勢區買、跌破 -80 轉弱賣
buy_strength = (w > -20) & (w.shift(1) <= -20)
sell_strength = (w < -80) & (w.shift(1) >= -80)
print("超賣派 買", int(buy_oversold.sum()), "賣", int(sell_oversold.sum()))
print("相對強勢派 買", int(buy_strength.sum()), "賣", int(sell_strength.sum()))
# 上下兩個面板:上畫股價與買賣點,下畫威廉指標與超買超賣帶
fig, (ax_px, ax_ind) = plt.subplots(2, 1, sharex=True, figsize=(12, 7))
ax_px.plot(px.index, px, color="#374151", label=sid)
ax_px.scatter(px.index[buy_strength], px[buy_strength], marker="^",
color="#10B981", label="相對強勢派買進")
ax_px.scatter(px.index[sell_strength], px[sell_strength], marker="v",
color="#EF4444", label="相對強勢派賣出")
ax_px.legend()
ax_ind.plot(w.index, w, color="#06B6D4", label="威廉指標 WILLR(14)")
ax_ind.axhline(-20, ls="--", color="#9CA3AF") # 超買帶
ax_ind.axhline(-80, ls="--", color="#9CA3AF") # 超賣帶
ax_ind.legend()
plt.tight_layout()
plt.show()威廉指標真正有效的兩個調整
調整一:回看窗拉長到 35 日,再和 60 日動能合成綜合分
預設的 14 日回看窗偏短,混進大量短線雜訊。把回看窗拉長,威廉指標衡量的就從「短線位置」變成「中期相對強勢」:裸用時研究段年化從 10.6%(14 日)升到 19.1%(35 日)。
光拉長還不夠,第二步是把它和 60 日報酬動能合成綜合分。對每檔股票,先把 35 日 %R 做橫截面百分位排名(值越接近 0、近 35 日越強勢,排名越高),再把 60 日報酬也做橫截面排名,兩者按 0.6 與 0.4 的權重相加。%R 看的是「收盤在近 35 日區間的哪個位置」,60 日報酬看的是「這段時間漲了多少」,兩個條件同時成立的股票,才是既在漲、又收在近期高點附近的那一群。
調整二:反波動加權集中持有 + 0050 均線擇時半倉
選好相對強勢的一籃股票後,還有兩個工程細節。
第一是權重:取綜合分最高的 11 檔,以反波動度加權(權重和 60 日報酬波動度成反比,入選股內正規化),波動較低的股票配重較高。全期換股日單檔權重最高到 22.1%,每月最大單檔的中位數是 12.4%。
第二是風控:計算 0050 還原價(etl:adj_close)的 60 日均線,只看「0050 有沒有站上自己的 60 日均線」這一個訊號;為避免在均線附近反覆甩巴掌,用「近 10 個交易日 ≥ 50% 在均線上」的多數決平滑。換股日判定為 risk-on 就滿倉,risk-off 就把整體部位縮到半倉,其餘放現金,全程不加碼、不用槓桿。要注意回測每月只在最後一個交易日讀一次這個開關,月中轉弱不會提前減碼,這個落差的影響在下面「0050 均線擇時」一節有數字。這裡採用的是可操作、可重現的趨勢濾網;它和 Moreira & Muir (2017) 以已實現變異數調整曝險的方法不同,只共享「風險升高時降低曝險」的一般風險管理理念,該論文並不是 60 日均線訊號的實證依據。
分工從頭到尾清楚:%R 疊動能負責選股,0050 均線負責風控。整套只用價量、完全不碰財報或月營收。用大盤訊號降低回撤的其他做法,可參考均線市場濾網。
拆開綜合分:威廉指標與 60 日動能各自的貢獻
綜合分裡兩個因子各佔多少功勞?把權重改成只用其中一個,其餘設定(11 檔、反波動加權、0050 擇時半倉)全部不變,各跑一次:
| 版本 | 研究段年化 | 研究段月夏普 | 2022 年起年化 | 2022 年起月夏普 | 全期最大回撤 |
|---|---|---|---|---|---|
| 完整策略(0.6 %R + 0.4 動能) | 29.8% | 1.39 | 26.9% | 0.99 | -38.5% |
| 只用 35 日 %R | 13.8% | 0.98 | 13.4% | 0.80 | -33.2% |
| 只用 60 日動能 | 16.6% | 0.74 | 18.5% | 0.77 | -44.5% |
| 綜合分不變、改等權 | 31.4% | 1.35 | 27.5% | 0.98 | -39.1% |
| 含息 0050 買進持有 | 15.1% | 1.00 | 30.5% | 1.21 | -34.0% |

讀法:兩個因子單獨用,研究段月夏普都低於 0050(0.98、0.74 對 1.00),2022 年起年化也都落後;只用 60 日動能的研究段年化 16.6% 略高於 0050 的 15.1%,代價是 -44.5% 的回撤。兩者合在一起才變成 29.8%、月夏普 1.39。所以這套策略的優勢來自兩個條件的交集,說威廉指標「單獨扛起」選股並不精確。反波動加權也不是報酬來源,改成等權,研究段 31.4%、2022 年起 27.5%,月夏普幾乎一樣,回撤略深。
0050 均線擇時:半倉、全現金、不擇時三種做法
風控層到底幫了多少?同一籃股票,比較三種處理 risk-off 的方式:
| 版本 | 研究段年化 | 研究段月夏普 | 2022 年起年化 | 2022 年起月夏普 | 全期最大回撤 |
|---|---|---|---|---|---|
| risk-off 半倉(完整策略) | 29.8% | 1.39 | 26.9% | 0.99 | -38.5% |
| 不擇時(全程滿倉) | 32.6% | 1.24 | 28.1% | 0.98 | -42.4% |
| risk-off 全現金 | 25.8% | 1.31 | 25.2% | 0.96 | -38.5% |

擇時的作用主要在研究段:月夏普從 1.24 提高到 1.39,2022 年全年少賠 4.6 個百分點(-31.4% 對不擇時的 -36.0%),全期最大回撤從 -42.4% 收斂到 -38.5%。代價是多頭年少賺,2017 年少 16.0 個百分點、2023 年少 23.7 個百分點,研究段年化因此從 32.6% 降到 29.8%。半倉優於全現金:全現金版研究段年化少 4 個百分點、月夏普也較低。2022 年起三種做法的月夏普都在 1.0 以下,擇時沒有改變近幾年的結論。
月頻檢查的落差要一起知道。2015 年起,0050 擇時開關轉成 risk-off 共 27 次,其中 4 次在月底前就轉回、從來沒有執行;其餘 23 次從轉弱到第一個換股日,中位數要等 10 個交易日,最長 22 個交易日。全期 72.9% 的交易日是 risk-on,141 個換股日裡有 38 個(27.0%)是半倉。
參數最佳化:研究段的高原,2022 年起的下坡
選 35 日、11 檔,會不會只是事後挑到漂亮的參數?我們把兩個最關鍵的旋鈕:威廉指標回看窗(21 / 28 / 35 / 42 日)與持股檔數(10 / 11 / 12 / 14 檔),排成 4×4 網格,對完整策略逐格真跑回測。看色溫圖要找一整片都偏綠的高原;一格特別深綠的孤峰,多半是湊參數湊出來的。研究段的色溫圖符合高原的樣子:

研究段 16 格的月夏普在 1.08 到 1.39 之間,28、35、42 日三列全部在 1.22 以上,21 日那一列最低(1.08 到 1.16)。「回看窗要拉長到中期」在研究段是一整片成立的結論。
同一張網格換成 2022 年起的月夏普,整片往下掉(兩張圖用同一組色階,1.0 是中間的淡黃色):

2022 年起的 16 格落在 0.81 到 1.05,只有 35 日 10 檔(1.01)與 42 日 12 檔(1.05)高於 1.0;42 日 11 檔是 0.998,圖上四捨五入顯示成 1.00。首發版用的穩健格選法(研究段月夏普 3×3 鄰域中位數最高)選出的正是 42 日 12 檔,它的研究段 1.33、2022 年起 1.05,四道門檻(研究段年化 ≥ 25%、月夏普 ≥ 1.2、2022 年起年化 ≥ 15%、月夏普 ≥ 1.0)都過。我們仍然不換:看到新資料之後才把參數挪到剛好過門檻的那一格,就是拿答案回頭調參,季度刷新的規則是參數不動、據實記錄衰退。
完整策略:35 日威廉指標 + 60 日動能 + 0050 均線擇時半倉
把上面的設計組成一套可執行、可重現、完全不含基本面的純技術策略:
- 選股綜合分:可交易宇宙中,對每檔股票算兩項橫截面排名:① 35 日 %R 排名(越接近 0 排名越高);② 60 日報酬排名。按 0.6 與 0.4 的權重相加成綜合分。
- 持股:取綜合分最高的 11 檔,以反波動度(1 ÷ 60 日報酬波動度)加權。
- 風控:0050 還原價站上自己的 60 日均線,再用「近 10 個交易日 ≥ 50% 在均線上」平滑,得到 risk-on / risk-off 開關。
- 部位調節:換股日 risk-on 時滿倉持有那 11 檔;risk-off 時整體部位縮到半倉、其餘放現金,不加碼、不用槓桿。
- 每月最後一個交易日換股,月中不檢查。
選股與擇時的核心程式碼(可直接交給你的 AI 助理改寫、或下載完整版執行):
顯示程式碼
from finlab import data
from finlab.backtest import sim
# 套件會在需要資料時自動引導登入
import finlab
finlab.login()
# 載入價量資料
close = data.get("price:收盤價")
volume = data.get("price:成交股數")
amount = data.get("price:成交金額")
adj_close = data.get("etl:adj_close") # 還原權值股價,算 0050 擇時用
# 可交易宇宙:60 日均量 > 100 萬股、收盤 > 10 元、60 日均成交金額前 300 大
liquid = ((volume.rolling(60, min_periods=20).mean() > 1_000_000)
& (close > 10)
& amount.rolling(60, min_periods=20).mean().is_largest(300))
# 只留代號剛好 4 碼數字的股票,排除 ETF(00 開頭)、金融保險股、處置與全額交割股
cat = data.get("security_categories")
financial = set(cat.loc[cat["category"].astype(str)
.str.contains("金融|保險|銀行", na=False), "stock_id"].astype(str))
common_cols = [
sid for sid in close.columns
if len(str(sid)) == 4 and str(sid).isdigit()
and not str(sid).startswith("00") and str(sid) not in financial
]
flagged = (data.get("etl:is_flagged_stock")
.reindex(index=close.index, columns=common_cols).fillna(False).astype(bool))
universe = liquid[common_cols] & ~flagged
close = close[common_cols]
# 因子一:35 日威廉指標的橫截面百分位,越接近 0(越強勢)分位越高(權重 0.6)
willr = data.indicator("WILLR", timeperiod=35).reindex(columns=common_cols)
willr_rank = willr.where(universe).rank(axis=1, pct=True)
# 因子二:60 日報酬的橫截面百分位(權重 0.4)
mom_rank = (close / close.shift(60) - 1).where(universe).rank(axis=1, pct=True)
# 綜合分取最高 11 檔,權重與 60 日報酬波動度成反比
score = 0.6 * willr_rank + 0.4 * mom_rank
basket = (score.where(universe).rank(axis=1, ascending=False) <= 11) & universe
inv_vol = 1.0 / close.pct_change().rolling(60, min_periods=30).std().clip(lower=1e-4)
weights = inv_vol.where(basket)
weights = weights.div(weights.sum(axis=1), axis=0).fillna(0.0)
# 0050 擇時:站上自己的 60 日均線,再用近 10 個交易日多數決平滑;沒站上時整體部位減半
idx = adj_close["0050"].dropna()
idx_ma60 = idx.rolling(60, min_periods=30).mean()
raw_on = (idx > idx_ma60).reindex(close.index).ffill().fillna(False)
risk_on = raw_on.rolling(10, min_periods=1).mean() >= 0.5
position = weights.mul(risk_on.map({True: 1.0, False: 0.5}), axis=0)
# 每月最後一個交易日換股,從 2015 年起回測
report = sim(position.loc["2015":], resample="M", fee_ratio=1.425 / 1000 * 0.3, upload=False)data.indicator 算出來的欄位比收盤價少幾檔,所以要先 reindex 對齊再篩選。這段程式碼我們用資料截至 2026-09-30 實跑,6 月 30 日、7 月 31 日、8 月 31 日、9 月 30 日四個換股日的 11 檔持股與權重和完整回測逐檔相同,最後淨值也一致。主要績效表、四種零件拆解、逐年與衰退追蹤表格都在文末可下載的 strategy.py。
這套策略研究段(2015-01-30 至 2021 年底)年化 29.8%、月夏普 1.39、月索提諾 2.44、研究段最大回撤 -34.4%;2022 年起(至 2026-09-30)年化 26.9%、月夏普 0.99、月索提諾 1.48、最大回撤 -38.5%;全期年化 28.6%、月夏普 1.09、月索提諾 1.64、最大回撤 -38.5%、年化波動 28.3%,年換手約 8.7 次。同日起算的含息 0050 研究段 15.1%、月夏普 1.00;2022 年起 30.5%、1.21;全期 21.2%、月夏普 1.07、月索提諾 1.85、最大回撤 -34.0%、年化波動 19.8%。全期勝過 0050 的是年化報酬(28.6% 對 21.2%,多 7.4 個百分點),月夏普 1.09 對 1.07 幾乎打平,月索提諾、最大回撤與波動都輸;2022 年起四項全輸。
下面是完整互動式回測:月報酬熱力圖、權益曲線、年度績效都可以直接在文章裡操作:
策略衰退追蹤:2026-06-09 之後發生什麼事
首發版的資料截至 2026-06-09。延長到 2026-09-30 的四個月裡,策略累計 -19.2%,同期含息 0050 +8.9%:
| 期間 | 策略 | 含息 0050 |
|---|---|---|
| 2026-06-09 至 06-30 | +0.4% | +4.2% |
| 2026 年 7 月 | -29.3% | -4.0% |
| 2026 年 8 月 | +12.3% | +3.3% |
| 2026 年 9 月 | +1.3% | +5.5% |

7 月的經過是這樣:6 月 30 日換股時 0050 站在 60 日均線上,策略滿倉持有 11 檔。這 11 檔從 7 月 1 日進場抱到 8 月 3 日,全部虧損,中位數 -27.2%,按權重加總 -26.1%,最差的國巨(2327)-51.6%。同一段時間 0050 從 7 月 1 日的高點到 7 月 30 日回落 14.0%,7 月 31 日反彈,整月 -4.0%。擇時開關用的是 60 日均線加 10 日多數決,反應慢:到 7 月 30 日才轉弱一天,7 月 31 日換股時又回到 risk-on,所以策略一路滿倉,沒有任何減碼。
這一跌讓策略從 2026-07-06 的高點到 7 月 30 日回落 38.5%,成為全期最大回撤;9 月底仍在高點下 24.8%。對照歷史,研究段最差的月份是 2018 年 10 月的 -10.8%,2022 年起在這之前最差是 2022 年 1 月與 9 月的 -13.3%,7 月的 -29.3% 是它的兩倍以上。
同一次執行把淨值截到首發日 2026-06-09 重算,2022 年起月夏普是 1.27(首發版 1.22,差距來自 finlab 版本),研究段 29.8%、月夏普 1.39 不受新資料影響。所以 1.27 降到 0.99,是這四個月、主要是 7 月一個月造成的。依季度刷新的規則,參數不改(網格裡剛好過門檻的兩格見上一節)。
這次衰退說明了兩件事。第一,0050 均線開關是慢訊號,大盤要跌上一段時間才會轉弱;這個月選股籃裡的強勢股跌得比大盤快、也深得多(11 檔中位 -27.2%,0050 月中最深 -14.0%),開關只轉弱了一天、又剛好在月底前轉回。第二,月頻檢查讓任何擇時都只能事後反應。想要針對持股本身的保護,得改成個股停損或日頻擇時,那是另一個策略,需要另外驗證,不在這篇裡改參數。同一批技術指標文在 2026-09 重跑時也普遍在 7 月重挫,經過可對照 MACD 怎麼用才對。
回測方法與口徑
量化結論的可信度取決於方法,以下逐項交代:
- 交易成本:策略使用 finlab
sim(),台股預設已內扣手續費(本文以 0.1425% 打三折計)與賣出證交稅 0.3%。 - 滑價:未額外假設滑價,實際成交衝擊取決於資金規模與流動性。
- 股票池:上市櫃股票,60 日均量大於 100 萬股、收盤大於 10 元、60 日均成交金額前 300 名。
- 排除類別:只留代號剛好 4 碼數字的股票(排除權證、特別股、6 碼代號),再排除 ETF(代號 00 開頭)、金融保險股、處置與全額交割股。KY 股代號是 4 碼數字,沒有排除,7 月持股裡就有兩檔 KY 股。首發版的頁內程式碼只檢查代號前 4 碼,會放行 6 碼代號;用首發的宇宙規則重跑,換股日實際持股完全相同,數字不受影響。
- 生存者偏差:宇宙每天依當時資料篩選,2015-01-30 有收盤價、到 2026-09-30 已無收盤價的 4 碼普通股共 142 檔,在當時都可能被選入。
- 前視偏差:%R、60 日動能、波動度與 0050 均線都只使用當日(含)以前的價格;月頻再平衡,換股日收盤算出的訊號從下一個交易日起生效。完全不使用財報或月營收等基本面資料(月營收對照組另行說明公布日對齊)。
- 檢查頻率:擇時開關只在每月最後一個交易日讀取,月中不減碼、不加碼。首發版寫「次日回到 risk-on 即恢復滿倉」與回測不符,已更正。
- 權重:入選 11 檔以反波動度加權、入選股內正規化,不設單檔上限;全期換股日單檔最高 22.1%。risk-off 時整體部位 0.5、其餘現金,不持有防禦標的、不用槓桿。
- 周轉率:全期年換手約 8.7 次。
- 基準與起算日:含息 0050 用
etl:adj_close純算術買進持有,與策略同日 2015-01-30 起算。首發版的 0050 從 2015-01-05 起算,早了一段,已對齊。 - 樣本內外:研究段 2015-2021 是選參數用的;2022 年起在首發時已被看過,是選參數時參考過的驗證段,真正沒看過的資料只有 2026-06-09 之後這四個月。
穩健度
把前面幾節的檢查收在一起,哪些站得住、哪些在新資料後變弱:
- 站得住的:讀數方向(超賣買進兩段都低於相對強勢讀法)、回看窗要拉長(研究段 28 日以上整片 1.22 以上)、加權方式不影響結論(等權與反波動加權的月夏普幾乎一樣)。
- 變弱的:2022 年起的網格 16 格只有 2 格高於 1.0,首發版是 16 格全部在 1.0 以上;兩個因子單獨用、三種擇時做法,2022 年起月夏普也都在 1.0 以下。問題出在整套方法近幾年的表現;換參數最多只能勉強過 1.0,而且是看過新資料才挑得出來。
加上月營收 YoY 會更好嗎:基本面是選配,不在主策略內
本文的主策略是完全不含基本面的純技術策略:選股只用威廉指標與 60 日動能,風控只用 0050 均線,沒有任何財報或月營收輸入。純技術訊號每日可得、沒有財報公布延遲與對齊問題,回測口徑乾淨、可重現性高,也才與本文「威廉指標純技術用法」的主題一致。
常見的延伸問題是:在可交易宇宙裡先要求「月營收年增為正」,再跑同一套選股與擇時,會不會更好?我們實際跑了:月營收以公布日對齊、只用已公布的數字,YoY > 0 的股票才能入選,其餘設定不變。結果研究段年化 29.0%、月夏普 1.32,2022 年起 25.4%、0.93,全期最大回撤 -38.0%;對照完整策略的 29.8%/1.39 與 26.9%/0.99,兩段都略差。在這套 11 檔的集中策略裡,加營收過濾沒有幫助,所以不放進主策略。想自己試別的搭法,可在下載的程式碼裡於綜合分計算前加一層 monthly_revenue 的過濾。基本面與技術面如何分工,可延伸看技術面與基本面選股的差異。
不同年度的表現:12 年贏 7 年,2022、2024 與 2026 年落後
| 年度 | 策略 | 含息 0050 | 不擇時版 |
|---|---|---|---|
| 2015(自 1/30 起) | 18.9% | -7.9% | 7.2% |
| 2016 | 12.7% | 19.6% | 20.6% |
| 2017 | 38.7% | 18.1% | 54.7% |
| 2018 | -13.3% | -4.9% | -15.3% |
| 2019 | 39.1% | 33.5% | 47.3% |
| 2020 | 76.2% | 31.1% | 78.8% |
| 2021 | 54.2% | 21.9% | 57.6% |
| 2022 | -31.4% | -21.4% | -36.0% |
| 2023 | 79.3% | 27.5% | 103.0% |
| 2024 | 20.7% | 48.6% | 20.1% |
| 2025 | 53.4% | 36.8% | 52.2% |
| 2026(至 9/30) | 35.8% | 74.3% | 35.8% |
12 個年度裡 7 年贏 0050,2020、2021、2023 三年都多贏 30 個百分點以上。輸的 5 年裡,2018、2022 是空頭年跌得比 0050 深;2024、2026 是 0050 本身大漲的年份(2024 年 0050 +48.6%、2026 年截至 9 月 +74.3%,策略都不到 0050 的一半);2016 年則是 12.7% 對 19.6%。2022 年起年化落後 0050,就是這三個年度疊起來的結果。
使用威廉指標常見的五個陷阱
整理本文回測與單股示意圖暴露出的問題,用威廉指標最常踩的坑有五個:
- 把超賣 −80 當無腦抄底訊號。 台股強者恆強,跌進超賣區的常常是續弱股,回測研究段年化只有 3.7%,只買當天剛回升的股票甚至 -1.6%。超賣不等於便宜,更不等於要反彈。
- 拿單一檔股票當進出場依據、被甩巴掌磨損。 台積電、聯發科的示意圖裡,%R 在 −20 與 −80 之間反覆穿越,每穿一次就是一組進出,獲利容易耗在來回的手續費與滑價上。比較穩的用法是當橫截面排序工具、用一籃股票與月頻再平衡稀釋雜訊。
- 用 14 日預設值就上場。 14 日偏短、雜訊多。拉到 28 ~ 42 日,研究段月夏普整片在 1.22 以上;14 日裸用的最高 30 檔研究段只有 10.6%。
- 和 KD、RSI 疊在一起用。 威廉指標衡量「收盤離近期高點多遠」,KD 的 RSV 衡量「收盤離近期低點多遠」,兩者幾乎是鏡像、資訊高度重疊。真正互補的是不同性質的訊號,本文的例子是 %R(收盤位置)配 60 日報酬(漲幅),兩者單獨用研究段月夏普都低於 0050,合起來才有用。KD 的台股回測見 KD 指標怎麼用。
- 以為大盤濾網能保護選股籃。 0050 均線擇時是慢訊號,又只在月底讀取;2026 年 7 月選股籃 11 檔全跌、策略單月 -29.3%,0050 月中回落 14.0%,開關只轉弱一天、月底又轉回,完全沒有減碼。持股集中在強勢股時,要另外想個股層級的風險控管。
這五點的共通教訓是:威廉指標本身沒有錯,錯的是把它當成一個能獨立發號施令的買賣訊號。它的位置應該是「一個衡量相對位置的排序量」,搭配其他性質的訊號、風控與分散使用。
三項穩健性驗證:重跑到 2026 年 10 月
這裡驗證本文的完整策略:35 日威廉指標與 60 日動能的綜合分取最高 11 檔、反波動加權,0050 近 10 個交易日站上 60 日均線的天數不到一半時部位減半,每月換股。我們在 2026-10-27 用本文附的 strategy.py(把 DATA_END 改成 None,finlab 2.2.20,資料截至 2026-10-27)把它重跑到最新,再做三項檢查。三項檢查的「贏」都是同一個意思:日夏普高於同一段期間的 0050 含息買進持有(etl:adj_close 還原價、純算術計算、不扣成本)。兩邊的日夏普用同一個公式:日報酬平均除以標準差、乘上 √252,不扣無風險利率。三項都用 sim() 預設的手續費 0.1425% 與證交稅 0.3%;原文手續費三折的結果另列於成本對照表。
| 檢查 | 標準 | 結果 |
|---|---|---|
| 鄰近參數 | 威廉指標天數(28、35、42)乘上持股檔數(9、11、13),9 組至少 7 組贏 | 0/9 組贏,不過 |
| 前後兩段 | 2015-01-30 到 2020-12-11、2020-12-14 到 2026-10-27 兩段都贏 | 前段 1.01 對 0.89,後段 0.96 對 1.24,不過 |
| 交易成本 | 原參數、sim() 預設成本 |
日夏普 0.97 對 1.08,不過 |

9 組參數的日夏普(括號內是年化報酬,粗體是原文參數):
| 持股檔數 \ 威廉指標天數 | 28 | 35 | 42 |
|---|---|---|---|
| 13 | 0.79(年化 18.9%) | 0.86(年化 21.3%) | 0.94(年化 23.9%) |
| 11 | 0.81(年化 20.2%) | 0.97(年化 25.5%) | 0.98(年化 26.1%) |
| 9 | 0.88(年化 23.0%) | 0.92(年化 24.8%) | 0.92(年化 24.9%) |
前後兩段與全期:
| 期間 | 策略年化 | 策略日夏普 | 0050 含息年化 | 0050 日夏普 |
|---|---|---|---|---|
| 前段 2015-01-30 到 2020-12-11 | 22.0% | 1.01 | 13.5% | 0.89 |
| 後段 2020-12-14 到 2026-10-27 | 29.0% | 0.96 | 28.0% | 1.24 |
| 全期 2015-01-30 到 2026-10-27 | 25.5% | 0.97 | 20.5% | 1.08 |
前後兩段是把整段期間從中點對半切。上文的研究段與樣本外以 2022 年初為界,照這個切法,2015 到 2021 年日夏普 1.09 對 0050 的 0.96,2022 年起 0.83 對 1.22。上文多用月夏普,跟這裡的日夏普算法不同,數字不能直接比。
交易成本對照(原參數):
| 成本設定 | 年化 | 日夏普 | 最大回撤 |
|---|---|---|---|
| 不扣成本 | 32.2% | 1.16 | -38.3% |
sim() 預設:手續費 0.1425%、證交稅 0.3% |
25.5% | 0.97 | -38.5% |
| 原文設定:手續費打三折 | 27.8% | 1.04 | -38.5% |
| 0050 含息買進持有(同期) | 20.5% | 1.08 | -34.0% |
9 組鄰近參數全部輸,日夏普在 0.79 到 0.98 之間,威廉指標天數縮短到 28 日時最弱;前段(2015 到 2020 年)日夏普 1.01 贏 0050 的 0.89,後段 0.96 輸 1.24,三項都不成立,跟上文「研究段的高原,2022 年起的下坡」一致。上文的年化 28.6% 是資料到 2026-09-30、手續費打三折的結果;照三折跑到 2026-10-27 是 27.8%,換成 sim() 預設成本是 25.5%。
策略的限制與取捨
- 集中度帶來較深回撤:策略只持 11 檔強勢股,全期最大回撤 -38.5%、年化波動 28.3%,都比含息 0050 的 -34.0%、19.8% 差。2022 年起年化 26.9% 也落後 0050 的 30.5%,用更大的波動並沒有換到更高的報酬。
- 高換手、成本敏感:年換手約 8.7 次,報酬已在
sim()內扣手續費與證交稅後計算,但實單滑價會進一步侵蝕,資金規模越大越明顯。 - 擇時只看大盤、只看月底:0050 均線開關反應慢,選股籃跌得比大盤快時來不及;月頻檢查讓減碼的時間點中位數晚 10 個交易日,急殺急漲的行情裡可能來不及或剛好賣在低點。
- 容量與成本:宇宙限前 300 大、選股僅 11 檔,單檔權重最高到 22.1%,大資金部署需重估流動性衝擊;回測未逐筆估算滑價,容量未估算。
自己跑一次
把下面這句話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:
裝好之後,下載本文的 strategy.py 與 data.csv,即可在自己的環境重跑、改參數、換選股因子。strategy.py 把資料截止日釘在 2026-09-30,執行後會印出本文的主要表格、零件拆解、逐年報酬與衰退追蹤;把 DATA_END 改成 None 就用最新資料。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽與程式交易是什麼。各技術指標正確用法的橫向比較,見13 個技術指標的台股回測總覽。
常見問題
Q:威廉指標的參數要設多少?預設 14 日好嗎? 預設 14 日在台股偏短,混進太多短線雜訊。本文把回看窗設在 35 日;在參數網格裡,28 到 42 日的中期窗研究段月夏普整片在 1.22 到 1.39。重點不在微調到某個神奇數字,而在於用「中期」的視角衡量相對強勢。要注意的是,2022 年起整張網格都下滑到 0.81 到 1.05,換參數最多只能勉強過 1.0。
Q:威廉指標「超賣(< -80)一定會反彈」嗎? 不一定。每月買 14 日 %R 最低的 30 檔,研究段年化只有 3.7%;只買換股日當天剛從 -80 回升的股票,研究段 -1.6%。台股弱勢股往往續弱而非反彈,把超賣當抄底訊號,長期接近無效。
Q:威廉指標和 KD、RSI 差在哪?該一起用嗎? 三者都是擺盪指標,資訊高度重疊,硬疊在一起通常沒有加分。威廉指標衡量收盤在近 N 日高低區間的位置,與 KD 的計算很接近。比較有效的組合是不同性質的訊號搭配,例如本文用 %R 搭 60 日報酬選股、再用 0050 均線控風險。各擺盪指標的比較可參考 RSI、MACD、KD 比較,RSI 當選股因子的回測見 RSI 怎麼用。
Q:威廉指標可以單獨拿來當買賣訊號嗎? 不建議。超賣買、超買賣在台股單獨選股都站不住;就算反過來讀,35 日 %R 單獨挑 11 檔研究段也只有 13.8%,輸給 0050。它比較適合當排序工具,和其他訊號一起用。
Q:威廉指標和波動度指標(如 ATR)有什麼關係? 威廉指標是「相對位置」量,反過來讀就成了相對強勢因子;它衡量的是價格在區間中的位置,不衡量波動幅度。波動度量請看肯特納通道與 ATR 指標。選股方法的全貌可參考台股選股方法總覽。
Q:這套策略適合誰? 適合想參與台股強勢股、能接受 -38% 等級回撤與較高換手成本的人:它全期年化 28.6%、高於含息 0050 的 21.2%,但 2022 年起年化 26.9% 落後 0050 的 30.5%,2026 年 7 月單月 -29.3%。目前它處在衰退追蹤狀態,不適合受不了深度回撤、或偏好低周轉被動持有的人;這類需求直接買進持有含息 0050 更省心。
Q:風控為什麼用「0050 均線」這麼單純的訊號?它擋得住崩跌嗎? 訊號單純,比較不容易在歷史上被調參調出漂亮的假象:0050 還原價有沒有站上自己的 60 日均線,每日可得、定義明確,再用 10 日多數決壓掉均線附近的假訊號。它在研究段把月夏普從 1.24 提高到 1.39、2022 年少賠 4.6 個百分點,但它是慢訊號、又只在月底換股日讀取,2026 年 7 月 0050 月中回落 14.0%、選股籃大跌時,開關只轉弱一天,完全沒有減碼。
FinLab 量化研究團隊長期維護台股量化資料、FinLab Python 套件教學與策略研究文章;本文審閱重點為資料口徑、前視偏差、交易成本與回撤風險。
最後更新:2026-10|回測區間:2015-01-30 ~ 2026-09-30|作者:FinLab 量化研究團隊(經量化研究員審閱)
本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。威廉指標相對強勢策略全期最大回撤 -38.5%,2022 年起年化落後含息 0050,實際交易前請自行評估風險、滑價與交易容量。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

