obv 指標在台股的正確用法:拆成吸籌確認加廣度擇時
| 你想知道的 | 本文用真實台股回測的回答 |
|---|---|
| obv 指標是什麼 | 累積量能指標:收盤上漲日把成交量加上去、下跌日減掉,衡量帶量的方向 |
| obv 數值最高拿來選股有效嗎 | 研究段(2015-2021)年化 17.9%、月夏普 0.78,低於含息 0050 的 1.00;2022 年起年化 22.1%,落後 0050 的 30.5% |
| obv 該怎麼標準化才對 | 用 90 日時序 z-score 把 obv 放回自身歷史比較,當「量能是否持續流入」的吸籌確認濾網 |
| obv 最有用的用法 | 拆成兩個零件:z-score 吸籌確認當選股濾網、股票池的 obv 廣度當大盤擇時開關 |
| 效果如何 | 純技術策略全期年化 28.1%、月夏普 1.09,同期含息 0050 為 21.2%、1.07;2022 年起年化 30.7% 與 0050 的 30.5% 打平,月夏普 1.11 落後 0050 的 1.21 |
| 最近的表現 | 首發版資料截止日 2026-06-09 之後到 9 月底下跌 16.8%(0050 上漲 8.9%),2026 年 7 月單月 -28.7% |
執行這個策略
複製提示詞,讓 AI 依照上方證據的資料、條件與風險檢查重跑一次。
告訴你的AI:
幫我設定 FinLab,重現這篇文章,請讀:https://finlab.finance/setup?relatedUrl=/blog/obv-on-balance-volume-taiwan
若想比較OBV以外的選股規則,可看營收篩選創新高策略,核對股價新高、RSI 與營收條件如何形成持股。

本文所有數字皆出自 finlab 套件(2.2.16 版)抓取的上市櫃真實價量資料(
price收盤價與成交量、etl:adj_close含息還原股價),obv 由 TA-Lib 的OBV計算。資料截至 2026-09-30,策略第一個換股淨值日是 2015-01-30,含息 0050 從同一天起算。文末附可下載的strategy.py、data.csv與metrics.json,執行strategy.py印出的數字與本文表格相同。對回測的觀念還不熟,可先看回測是什麼。
obv 指標是什麼
obv(On-Balance Volume,能量潮)是 Joseph Granville 在 1963 年提出的量價指標。計算很單純:每個交易日,收盤上漲就把當日成交量「加」到前一日的 obv、下跌就「減」掉、平盤不變,一路累加成一條累積量能曲線。它背後的假設是「量先於價」:成交量的方向領先價格,obv 持續走高代表買盤在累積、走低代表賣壓在堆積。obv 的原始論述見 Granville(1963)的《Granville's New Key to Stock Market Profits》。技術指標的基礎名詞可參考名詞詞彙表。
這裡有個多數教學略過、卻最關鍵的性質:obv 是「累積值(level)」,不是「比率」。它從資料起點開始累加,所以一檔成交量大、上市久的權值股,obv 數字天生就比一檔剛上市的小型股大上好幾個量級。這個性質直接決定了 obv 該怎麼用、不該怎麼用,也是它最常被誤用的地方。
obv 的數學定義
把上面那段白話寫成公式,obv 就是一條按漲跌方向累加成交量的遞迴序列:
逐個符號拆開來看: 是第 個交易日收盤後的能量潮數值; 與 分別是當日與前一日的收盤價; 是當日成交量(股數)。規則只有三條:今天收高(),就把整筆當日成交量「加」進前一日的 obv;今天收低(),就把整筆當日成交量「減」掉;收平則不動。
從公式可以一眼看出三件事,剛好解釋了後面的回測結論。第一,obv 是前後相依的累加序列( 一定要先有 ),沒有自然的零點或上限,數值大小取決於累積了多久、量有多大,所以跨股比大小會偏向成交量大的大型股(下一節有實測)。第二,它只用「收盤漲跌的方向」決定加減,不看漲跌幅大小:漲 0.1% 和漲 9% 對 obv 的貢獻一樣,都是把當日全部成交量加進去,這讓 obv 對小幅震盪特別敏感、訊號容易反覆。第三,它是價量結合的指標:價格只貢獻「方向」(正負號),量貢獻「力道」(加減的大小),所以 obv 衡量的是帶量的方向性。
實務上常見三種用法,以下用台股回測一一檢驗:
橫截面選股派:挑「obv 數值最高」或「obv 斜率最強」的股票,假設量能最強者續強。
創新高與背離派:看單股 obv 突破前高、或 obv 與股價背離,當買賣訊號。
量能廣度派(本文主張):不看單股絕對值,改看「股票池裡有多少比例的股票 obv 站上自身均線」,當大盤量能的多空溫度計。
教科書最常見的用法:obv 數值最高選股,風險調整後輸給 0050
我們在可交易宇宙(60 日均成交金額前 300 大、收盤 > 10 元、60 日均量 > 100 萬股,排除 ETF、權證與特別股、金融保險股、處置與全額交割股;KY 股的代號也是 4 碼數字,沒有被排除)裡,把幾種 obv 選股用法各取 30 檔等權、每月換股、不做任何擇時,結果如下:
| obv 選股用法(等權 30 檔) | 研究段年化 | 研究段月夏普 | 2022 年起年化 | 2022 年起月夏普 | 全期最大回撤 |
|---|---|---|---|---|---|
| obv 數值最高(教科書用法) | 17.9% | 0.78 | 22.1% | 0.88 | -37.3% |
| obv 數值最低(方向對照) | 5.1% | 0.32 | 0.3% | 0.24 | -50.3% |
| obv 5 日斜率最強 | 11.6% | 0.59 | 22.8% | 0.91 | -41.0% |
| obv 90 日 z-score 最高 | 18.8% | 0.90 | 23.6% | 0.92 | -37.7% |
| obv 90 日 z-score 最低(方向對照) | 5.4% | 0.37 | 13.6% | 0.67 | -40.3% |
| 含息 0050 買進持有(同日起算) | 15.1% | 1.00 | 30.5% | 1.21 | -34.0% |

最多人用的「obv 數值最高」選股,研究段年化 17.9% 看起來贏過 0050 的 15.1%,但月夏普只有 0.78(0050 是 1.00),2022 年起年化 22.1% 更落後 0050 的 30.5%。報酬沒有比 0050 多,波動卻更大。
原因就在前面講的「累積 level」性質。我們在每月換股日檢查這 30 檔持股的市值:它們在股票池內的市值百分位中位數是 70.5(100 代表最大),平均約 21.5% 的持股同時是股票池市值前 30 大。也就是說,比 obv 大小會系統性地偏向大型股,這層資訊和市值因子大幅重疊。換成 90 日 z-score 之後,持股的市值百分位中位數降到 47.2、與市值前 30 大的重疊剩 10.3%,大小偏誤大致消失,研究段月夏普也由 0.78 升到 0.90。
方向是對的:z-score 最高 30 檔與最低 30 檔,研究段年化相差 13.4 個百分點、2022 年起相差 10.1 個百分點。但即使標準化過,z-score 最高 30 檔的月夏普仍低於 0050,2022 年起年化也只有 23.6%。obv 一階斜率(5 日變化量)噪音更大,研究段月夏普只有 0.59。單靠 obv 排序選股,在這段期間沒有一種贏過含息 0050 的風險調整報酬。延伸閱讀:技術面與基本面選股的差異、動能策略。
在單股上實際畫一次:兩個教科書派別的買賣點長什麼樣
橫截面選股之外,多數人對 obv 的第一印象其實來自單股圖上的兩個派別:obv 創新高派(obv 突破前 60 日最高就追、跌破前 60 日最低就賣)與量價背離派(價格創 20 日新高但 obv 沒跟上=賣警訊;價格創 20 日新低但 obv 沒破低=買背離)。下圖以台積電(2330)2023-07 到 2024-06 約一年的日線為例,上方面板是股價並標出兩派的買賣箭頭,下方面板是 obv 原始線與其 60 日均線:

光看這一張,兩派的毛病就攤在眼前。創新高派訊號太頻繁:這段窗裡 obv 突破前 60 日最高的買進訊號觸發了 20 次、跌破前 60 日最低的賣出 4 次,平均約兩週就要動一次,多數只是 obv 在前高附近反覆穿越,每次進出都付手續費與證交稅。背離派的賣警訊太早:整段出現 10 次賣背離、3 次買背離,台積電在這一年從 580 元附近漲到 960 元以上,那些「價創高、量沒跟」的賣警訊大多出現在上漲途中,賣完價格繼續漲。換一檔鴻海(2317)同窗來看是同一個結構:創新高買 13 次、賣 6 次,背離買 5 次、賣 6 次,合計 30 個訊號。

單股級的 obv 訊號頻繁又雜,要嘛被交易成本吃掉、要嘛太早出場,這也是後面我們把 obv 改成「標準化濾網」與「市場廣度」來用的動機。
想自己重畫這張圖、換股票或換窗口檢查,可以用下面這段程式碼。訊號用完整歷史計算(窗口開頭的回看期不會缺資料),再取 2023-07 到 2024-06 這段;台積電執行後會印出 20、4、3、10 次,與上圖相同:
顯示程式碼
import finlab
from finlab import data
import matplotlib.pyplot as plt
finlab.login() # 套件會在需要資料時引導你完成登入
# 1. 單檔收盤價與 obv(以台積電 2330 為例),用完整歷史計算
sid = "2330"
close = data.get("price:收盤價")[sid].dropna()
obv = data.indicator("OBV")[sid].reindex(close.index)
def cross_up(cond):
"""條件由不成立轉為成立的那一天。"""
cond = cond.fillna(False).astype(bool)
return cond & ~cond.shift(1, fill_value=False)
# 2. 創新高派:obv 突破前 60 日(不含當日)最高 = 買,跌破前 60 日最低 = 賣
prior_high = obv.shift(1).rolling(60).max()
prior_low = obv.shift(1).rolling(60).min()
newhigh_buy = cross_up(obv > prior_high)
newlow_sell = cross_up(obv < prior_low)
# 3. 量價背離派:價格創 20 日新高但 obv 沒有 = 賣;價格創 20 日新低但 obv 沒有 = 買
price_high = close >= close.rolling(20).max()
price_low = close <= close.rolling(20).min()
obv_high = obv >= obv.rolling(20).max()
obv_low = obv <= obv.rolling(20).min()
divergence_sell = cross_up(price_high & ~obv_high)
divergence_buy = cross_up(price_low & ~obv_low)
# 4. 取 2023-07 到 2024-06 這段,數一數各派訊號
window = slice("2023-07-01", "2024-06-30")
signals = {
"newhigh_buy": newhigh_buy[window],
"newlow_sell": newlow_sell[window],
"divergence_buy": divergence_buy[window],
"divergence_sell": divergence_sell[window],
}
for name, flags in signals.items():
print(name, int(flags.sum()))
# 5. 畫雙面板:上面板股價與買賣點、下面板 obv 與 60 日均線
price = close[window]
markers = {
"newhigh_buy": ("^", "green"),
"newlow_sell": ("v", "red"),
"divergence_buy": ("^", "blue"),
"divergence_sell": ("v", "orange"),
}
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 7), sharex=True)
ax1.plot(price.index, price, color="black", linewidth=1)
for name, flags in signals.items():
marker, color = markers[name]
days = flags.index[flags.values]
ax1.scatter(days, price.loc[days], marker=marker, color=color, label=name)
ax1.legend()
ax2.plot(price.index, obv[window], label="OBV")
ax2.plot(price.index, obv.rolling(60).mean()[window], label="OBV MA60")
ax2.legend()
plt.show()把這段交給你的 AI 助理,請它換成你想看的股票或調整窗口,就能確認「單股 obv 訊號頻繁而難用」在你關心的標的上是否一樣成立。
把 obv 拆成兩個有用的零件
直接比 obv 絕對值選股站不住,但拆開來看,它有兩個各自有用的零件,本文的純技術策略就建立在這兩個零件上。
零件一:obv 的 90 日 z-score 當吸籌確認濾網
既然 obv 的絕對值跨股不可比,解法是「別跟別人比,跟自己比」。把每一檔股票的 obv 用 90 日時序 z-score 標準化,也就是看「今天的 obv 相對它自己過去 90 日的均值,高出幾個標準差」。z-score 為正,代表這檔股票的累積量能相對自身近期仍偏多、量能持續流入,也就是還在吸籌;z-score 轉負,代表量能相對自身在退潮。會這樣標準化,是因為「成交量帶有報酬資訊」在實證上有依據:Campbell, Grossman & Wang (1993) 在《Trading Volume and Serial Correlation in Stock Returns》發現,股票報酬的序列相關會隨成交量變化。要把這份資訊抽出來,得先把每檔股票的量能放回它自己的歷史基準看。
z-score 的視窗長短有差。同樣取最高 30 檔等權:40 日視窗研究段年化 14.0%、2022 年起 13.5%,高低分位的年化差在 2022 年起只剩 1.5 個百分點;60 日視窗為 15.5% 與 20.8%;90 日視窗 18.8% 與 23.6%,研究段月夏普 0.90 是四種視窗裡最高;120 日視窗 17.5% 與 24.8%,2022 年起略好。視窗太短時 z-score 跟著每日漲跌跳動,量能「持續流入」的意思就被稀釋了。
這個零件在本文的角色是一道吸籌確認濾網:只保留「obv 90 日 z-score > 0」的股票,篩掉量能已經相對自身退潮的標的,再在這個池子裡用別的因子排序。z-score 回答的是「這檔股票的量能還在不在」這個是非題,排名高低交給下一步的動能因子。
零件二:股票池的 obv 廣度當大盤擇時開關
單看一檔指數(例如 0050)的 obv 有沒有站上自己的均線,訊號太雜:盤整期會反覆穿越。改看「可交易股票池裡有多少比例的股票 obv 站上各自的 60 日均線」,就得到一個橫截面、比較平滑的大盤量能度量,我們稱為 obv 廣度。廣度高,代表多數個股的量能結構偏多;廣度崩落,代表量能普遍在退潮。把它做成 risk-on/risk-off 的開關,就是整套策略的防禦腿。

圖上看得到兩件事:2015 年中、2018 年 10 月、2020 年 3 月、2022 年與 2026 年 7 月,廣度都跌破 0.55;但策略淨值在 2026 年 7 月仍明顯下挫。原因是回測每月換股一次,廣度只在換股日讀取,月中跌破門檻要等到月底才轉守(後面的「首發後的新資料」一節有逐日拆解)。
用量能結構控曝險的想法,和 Moreira & Muir (2017) 在《Volatility-Managed Portfolios》的出發點相近:他們證明依已實現波動度在風險升高時調降曝險,能提高投資組合的夏普比率。obv 廣度量的是量能結構,和波動度是兩種訊號,本文只借用「風險惡化時降曝險」這個想法,效果要看本文自己的回測,他們的結論不能搬過來當證據。
把兩個零件分別加到同一個「風險調整動能 14 檔」選股籃上,各自的貢獻如下:
| 版本(同一個股票池、同為 14 檔反波動加權) | 研究段年化 | 研究段月夏普 | 2022 年起年化 | 2022 年起月夏普 | 全期最大回撤 |
|---|---|---|---|---|---|
| 風險調整動能(無 obv、無擇時) | 29.1% | 1.24 | 24.3% | 0.92 | -43.1% |
| +obv 吸籌確認(無擇時) | 30.1% | 1.29 | 26.2% | 0.97 | -42.0% |
| +obv 廣度擇時(無吸籌確認) | 25.7% | 1.22 | 30.5% | 1.09 | -39.4% |
| 兩個零件都加(完整策略) | 26.3% | 1.25 | 30.7% | 1.11 | -39.0% |

讀法:吸籌確認單獨加上去,研究段與 2022 年起的月夏普各多 0.04 到 0.05,最大回撤小幅收斂;廣度擇時在研究段反而讓年化少 3.5 個百分點(risk-off 時改持 0050,錯過部分個股反彈),但把 2022 年起的月夏普由 0.92 拉到 1.09、全期最大回撤由 -43.1% 收斂到 -39.4%。兩個零件都加,研究段月夏普 1.25 與無 obv 版本幾乎相同,主要差別在 2022 年以後與回撤。選股端用「風險調整後最強」的股票,是因為 Jegadeesh & Titman (1993) 的動能效應:過去 3 到 12 個月的贏家在中期傾向繼續贏。本文用的 40 日(約 2 個月)比他們測的最短回看期還短,40 日是 2026 年 6 月在台股研究段選出的參數,學術結果只能說明方向,不能保證這個窗長。
完整策略:obv 雙核心純技術選股
把兩個零件疊上風險調整動能與反波動加權,組成一套可執行、可重現、完全不含基本面的純技術策略:
- 風險調整動能(選股排序因子):在可交易宇宙裡,每檔股票算「(收盤 ÷ 40 日前收盤 − 1)÷ NATR」,NATR 是 ATR14 ÷ 收盤。它衡量每承擔一單位波動換到多少動能,避免單純追高把高波動股選進來。
- obv 吸籌確認(零件一,當濾網):只在「obv 90 日 z-score > 0」的股票上計分。
- 持股:在通過吸籌確認的股票裡,取風險調整動能最高的 14 檔,以反波動(1 ÷ NATR)加權,波動越低的股票配重越高。
- 大盤擇時(零件二,obv 廣度):同一個可交易宇宙裡「obv 站上自身 60 日均線」的個股比例 > 0.55 為 risk-on、≤ 0.55 為 risk-off。
- 資產配置:risk-on 時滿倉持有那 14 檔;risk-off 時選股清零,整池改持含息 0050(不空手、不用槓桿)。
- 月再平衡:每月最後一個交易日產生訊號、下一個交易日收盤換股。廣度也只在這一天讀取,月中轉弱要等到月底才轉守。
選股與擇時訊號的核心程式碼如下(可直接交給你的 AI 助理改寫;這裡的宇宙條件是簡化版,沒有均量門檻,也沒有排除金融股與處置股,選出的持股與廣度數值會和完整版略有不同;完整條件與回測在文末可下載的 strategy.py):
顯示程式碼
import numpy as np
from finlab import data
close = data.get("price:收盤價")
amount = data.get("price:成交金額")
# 可交易宇宙(簡化版):60 日均成交金額前 300 大、收盤 > 10 元,排除 ETF 與權證
liquidity = amount.rolling(60, min_periods=20).mean()
common_cols = [
s for s in close.columns
if str(s)[:4].isdigit() and not str(s).startswith("00")
]
universe = (liquidity.is_largest(300) & (close > 10))[common_cols]
# 風險調整動能 =(40 日報酬)÷ NATR,NATR = ATR14 ÷ 收盤
natr = data.indicator("ATR", timeperiod=14) / close
risk_adj_mom = (close / close.shift(40) - 1) / natr.replace(0, np.nan)
# 零件一(吸籌確認):obv 的 90 日時序 z-score > 0
obv = data.indicator("OBV")
obv_mean = obv.rolling(90, min_periods=45).mean()
obv_std = obv.rolling(90, min_periods=45).std()
accumulating = ((obv - obv_mean) / obv_std > 0)[common_cols]
# 零件二(大盤擇時):宇宙內 obv 站上自身 60 日均線的比例
above_ma = (obv > obv.rolling(60, min_periods=30).mean())[common_cols]
breadth = above_ma.where(universe).sum(axis=1) / universe.sum(axis=1).replace(0, np.nan)
risk_on = breadth > 0.55
# 吸籌確認池內取風險調整動能最高 14 檔,以 1 ÷ NATR 反波動加權
score = risk_adj_mom[common_cols].where(universe & accumulating)
basket = score.rank(axis=1, ascending=False) <= 14
inv_vol = (1 / natr[common_cols]).where(basket)
weight = inv_vol.div(inv_vol.sum(axis=1), axis=0).fillna(0.0)三段績效與同一天起算的含息 0050 並列如下(資料截至 2026-09-30):
| 區間 | 策略年化 | 策略月夏普 | 策略月索提諾 | 策略最大回撤 | 0050 年化 | 0050 月夏普 | 0050 月索提諾 | 0050 最大回撤 |
|---|---|---|---|---|---|---|---|---|
| 研究段 2015-01~2021-12 | 26.3% | 1.25 | 2.13 | -32.0% | 15.1% | 1.00 | 1.47 | -28.2% |
| 2022-01~2026-09 | 30.7% | 1.11 | 1.60 | -39.0% | 30.5% | 1.21 | 2.44 | -34.0% |
| 全期 2015-01~2026-09 | 28.1% | 1.09 | 1.60 | -39.0% | 21.2% | 1.07 | 1.85 | -34.0% |
讀法:研究段年化多出 11.2 個百分點,月夏普與月索提諾都明顯領先,最大回撤比 0050 深約 4 個百分點;2022 年起年化 30.7% 與 0050 的 30.5% 打平,月夏普、月索提諾落後,最大回撤深 5 個百分點。全期加總後,策略勝在年化報酬(28.1% 對 21.2%),月夏普 1.09 對 1.07 只小幅領先;月索提諾、最大回撤與年化波動(28.7% 對 19.8%)都輸給 0050。它的定位是「長期年化較高、但波動與回撤都比 0050 大,2022 年以後已經沒有報酬優勢」的動能策略,全程不吃任何財報或營收資料。
完整互動式回測(月報酬熱力圖、權益曲線、年度績效):
回測方法與口徑
量化結論的可信度取決於方法,以下逐項交代:
- 交易成本:策略使用 finlab
sim(),台股預設已內扣手續費(本文以 0.1425% 打三折計)與賣出證交稅 0.3%。 - 滑價:未額外假設滑價,實際成交衝擊取決於資金規模與流動性。risk-off 改持的含息 0050 是高流動性 ETF。
- 股票池:上市櫃普通股,60 日均成交金額前 300 名、收盤 > 10 元、60 日均量 > 100 萬股。
- 排除類別:排除 ETF(代號 00 開頭)、權證與特別股等非 4 碼數字代號、金融保險股、處置與全額交割股。KY 股的代號也是 4 碼數字,沒有被排除。策略全期沒有持有過非 4 碼的代號。
- 生存者偏差:價格資料保留了後來下市或停止交易的股票(2015-01-30 有收盤價、2026-09-30 已無收盤價的 4 碼代號個股共 142 檔,含本來就不在股票池內的金融股),宇宙每天依當時的成交資料篩選,沒有只用今天還存在的股票回推。
- 前視偏差:風險調整動能、obv 90 日 z-score 與 obv 廣度均只使用當日(含)以前的價量;月底產生訊號、下一個交易日換股。完全不使用財報或月營收等基本面資料,自然沒有財報公布日對齊問題。
- 擇時執行頻率:obv 廣度每天都算得出來,但回測只在每月最後一個交易日讀取。2015 年以來廣度 67 次跌到 0.55 以下,其中 48 次在月底前就回到門檻上方而從未執行;其餘 19 次中位數延遲 4 個交易日、最長 18 個交易日。換股日處於 risk-off 的月份佔 15.6%。實際交易若改成每日檢查,結果會不同,本文沒有回測日頻版本。
- 權重:risk-on 時選股籃以反波動(1 ÷ NATR)加權、單一股票不另設上限,籃內權重加總為 1;risk-off 時整池轉持單一資產含息 0050。
- 周轉率:年換手約 9.6 次(選股集中 14 檔、月再平衡、擇時切換),高於被動持有,成本敏感度較高,已在
sim()內扣手續費與證交稅下計算。 - 基準口徑:含息 0050 用
etl:adj_close還原價買進持有純算術計算,不含交易成本,從策略第一個淨值日 2015-01-30 起算;2022 年起那一段兩者都從 2022 年第一個交易日起算。 - 樣本內外:研究段 2015-2021、2022-01 至 2026-09 分開回報。參數在 2026 年 6 月定案,當時的篩選條件同時要求研究段與 2022 年以後的成績過門檻,所以 2022 年起這段嚴格來說是「選參數時看過的驗證段」;完全沒看過的資料只有 2026-06-09 之後的近四個月,結果見下面的新資料追蹤。
穩健度
下面說的「過門檻」,指研究段年化 ≥ 25%、月夏普 ≥ 1.2,且 2022 年起年化 ≥ 15%、月夏普 ≥ 1.0,這是 2026 年 6 月定案時用的同一組標準。
- 單參數鄰格:研究段多數站得住,2022 年起分散:固定其餘參數、一次只動一個(動能窗 30/50 日、z 視窗 60/120 日、選股 12/16 檔、廣度均線 40/90 日、門檻 0.52/0.58),10 個鄰格的研究段月夏普落在 1.01 到 1.37,2022 年起落在 0.97 到 1.23,四項門檻全過的有 5 格。
- 最敏感的是動能窗:改成 30 日,研究段年化掉到 19.8%、月夏普 1.01,2022 年起卻升到 40.5%;改成 50 日,研究段 26.4%、月夏普 1.19,2022 年起降到 26.0%、月夏普 0.97。40 日在兩段之間取得平衡,但這代表動能窗是讀者最該保留戒心的參數。
- z 視窗不敏感:吸籌確認的 z 視窗改 60 日或 120 日,2022 年起月夏普 1.12、1.10,與 90 日的 1.11 幾乎相同。
- 廣度均線視窗:改成 40 日,研究段 1.20、2022 年起 1.02;改成 90 日,研究段升到 1.37、2022 年起 1.05,兩者都沒有比 60 日在兩段同時更好。
- 防禦腿的選擇看過新資料:risk-off 改成空手,研究段月夏普反而升到 1.54,但 2022 年起年化只剩 21.6%、月夏普 0.89。防禦腿選 0050 的決定,是在看過 2022 年以後資料的情況下做的。
- 反波動加權沒有明顯加分:改成等權,研究段年化 29.1%、月夏普 1.28,2022 年起年化 29.1%、月夏普 1.05,全期年化 29.1% 反而略高。反波動加權的作用比較像是讓權重偏向低波動股,對報酬沒有一致的貢獻。
參數最佳化:找一片站得住的高原,避開單一孤峰
這套策略有兩個最值得檢查的參數:選股檔數(決定持股集中度)與obv 廣度門檻(多少比例的個股 obv 站上均線才持股)。把所有組合跑一遍、挑研究段最高的那一格上線,是過度最佳化的典型陷阱:研究段最漂亮的單一峰值,常常是運氣湊出來的,換到新資料就垮。比較穩當的做法是看色溫圖找「一片站得住的高原」。
我們對選股檔數(13/14/15/16)× obv 廣度門檻(0.52/0.55/0.58/0.60)做 4×4 網格,每一格都用該設定重算選股籃與擇時訊號、重跑回測,色溫填研究段月夏普:

研究段是一片緩坡:16 格研究段月夏普落在 1.19 到 1.33,14 格在 1.20 以上。橫看選股檔數,13 到 16 檔的差距都在 0.06 以內;縱看門檻,0.58 那一列最高(1.30 到 1.33),0.60 那一列最低(1.19 到 1.21),研究段年化也降到 22.9% 到 24.0%,未達 25% 門檻。
把同一張網格換成看 2022 年起,排序就不同了:16 格落在 0.97 到 1.15,最高的是門檻 0.55 那一列(1.08 到 1.15),研究段最高的 0.58 那一列在 2022 年起只有 1.07 到 1.10;門檻 0.52 配 13、14 檔則掉到 1.0 以下。全期最大回撤介於 -43.9% 到 -33.9%,四項門檻全過的有 10 格。本文維持 6 月定案的 14 檔、門檻 0.55,不因新資料改設定。
下圖把上一節的 10 個單參數鄰格與預設值並排,藍色是研究段、紫色是 2022 年起:

研究段與 2022 年起的高低經常相反:動能窗 30 日研究段最低、2022 年起最高;廣度均線 90 日研究段最高、2022 年起只有 1.05。如果你看到某個最佳化「換個參數夏普就從 0.8 跳到 1.8」,那通常是踩到過擬合的地雷。關於過擬合與參數穩健,延伸可看策略最佳化會不會過擬合。
不同大盤狀態下的表現:逐年攤開
判斷一套策略是不是只靠某一段行情湊出來,最直接的方法是把每一個年度單獨結算、和含息 0050 對照。下表的 0050 與策略從同一天起算(2015 年自 1 月 30 日起,2026 年截至 9 月 30 日):
| 年度 | 策略報酬 | 含息 0050 | 勝過 0050? |
|---|---|---|---|
| 2015(1/30 起) | +16.4% | -7.9% | 是 |
| 2016 | +11.8% | +19.6% | 否 |
| 2017 | +36.9% | +18.1% | 是 |
| 2018 | -7.3% | -4.9% | 否 |
| 2019 | +21.5% | +33.5% | 否 |
| 2020 | +66.3% | +31.1% | 是 |
| 2021 | +50.5% | +21.9% | 是 |
| 2022 | -11.4% | -21.4% | 是 |
| 2023 | +111.1% | +27.5% | 是 |
| 2024 | +9.4% | +48.6% | 否 |
| 2025 | +31.7% | +36.8% | 否 |
| 2026(截至 9/30) | +32.3% | +74.3% | 否 |
12 個年度區間有 6 個勝過 0050。領先主要來自 2020、2021、2023 三年(分別多 35.2、28.6、83.6 個百分點),2022 年空頭也少跌 10 個百分點;但 2024 年起連續三個年度區間落後,2024 年差 39.2 個百分點、2026 年到 9 月底差 42.0 個百分點。這套策略的領先集中在少數幾個大年,近三年反而跑輸 0050。
首發後的新資料:2026-06-09 之後
本文首發版的資料截至 2026-06-09,參數也在那時定案。從那天到 2026-09-30,策略下跌 16.8%,同期含息 0050 上漲 8.9%。分段拆開如下:
| 區間 | 策略 | 含息 0050 |
|---|---|---|
| 2026-06-09~06-30 | +5.2% | +4.2% |
| 2026 年 7 月 | -28.7% | -4.0% |
| 2026 年 8 月 | +8.6% | +3.3% |
| 2026 年 9 月 | +2.2% | +5.5% |
四段連乘就是上面的區間報酬,虧損集中在 7 月。6 月底 obv 廣度 0.704、處於 risk-on,選出的 14 檔持股在 7 月 1 日買進、8 月 3 日換股出場,14 檔全部虧損,逐檔報酬中位數 -30.8%,跌最深的國巨(2327)-51.6%。同一個月 0050 只跌 4.0%,虧損來自策略持有的那一群強勢股同步回檔。策略淨值在 2026-06-22 創高,到 9 月底仍比高點低 25.1%。
這次虧損和擇時的執行頻率直接相關。obv 廣度在 7 月 17 日跌到 0.524,第一次低於 0.55,但回測要等到 7 月 31 日的換股訊號、8 月 3 日收盤才把選股籃換成 0050。從跌破前一天 7 月 16 日收盤到 8 月 3 日出場,策略淨值下跌 18.7%,同期 0050 跌 3.6%;其中 7 月 17 日當天就跌了 8.3%,收盤確認跌破之後到出場仍再跌 11.4%(日頻讀取能省下多少,本文沒有回測:7 月 22、23 日廣度又短暫回到 0.55 以上);7 月 30 日的低點離 7 月 16 日跌了 27.3%。8 月整月廣度多半在 0.55 以下,策略持有 0050,8 月 31 日廣度剛好回到門檻上方,9 月又換回選股籃。研究段最差的單月是 2020 年 3 月的 -12.8%,2022 年以後在此之前最差的是 2025 年 3 月的 -15.9%;2026 年 7 月的 -28.7% 是研究段最差單月的兩倍多。
延長資料後,2022 年起的月夏普由 1.38 降到 1.11、年化由 38.8% 降到 30.7%,仍高於這類策略設定的 1.0 與 15% 門檻,因此本次屬於一般刷新:參數維持 2026 年 6 月的設定,數字全部換成新資料重跑的結果。但真正沒看過的這四個月,策略落後 0050 25.7 個百分點,下一次季度重跑會把 2026 年第四季補進這張表。
2026-10 更新與更正:資料延長到 2026-09-30,2026-10-24 用 finlab 2.2.16 重跑。把資料截止日設回上一版的 2026-06-09 另外完整重跑一次,研究段 26.30%/月夏普 1.25、2022 年起 38.78%/1.38、全期 31.04%/1.22,與上一版的 26.27%/1.25、38.78%/1.38、31.05%/1.22 差距在 0.03 個百分點以內,本次的變化來自新增的資料。另有六處更正:①上一版的含息 0050 從 2015-01-05 起算,但策略的第一個換股淨值日是 2015-01-30,0050 在這中間上漲 2.2%;本版改為同一天起算,以 2026-06-09 為截止日,0050 全期年化由 20.98% 變為 20.89%、研究段由 15.29% 變為 15.09%。②上一版可下載的 strategy.py 與 data.csv 是 6 月定案前的舊策略(obv 廣度高時持有 0050、低時改持 00646,從不持有個股),印出的數字對不上文章;現在兩個檔案都與本文策略相同,執行 strategy.py 會印出三段績效、教科書用法對照、零件拆解、逐年報酬與 7 月起的逐月報酬。③上一版教科書表的「obv 數值最高 30 檔」最大回撤 -74.7%(z-score 最高 30 檔 -74.2%),來自從 2007 年 5、6 月就開始持股的回測,含 2008 年金融海嘯(以 2026-06-09 資料重算為 -74.7% 與 -74.5%);與文中其他數字一樣從 2015 年起算後是 -37.3%(-37.7%),「用近乎腰斬一倍的回撤換報酬」的說法因此刪除,研究段年化也由 17.7% 變為 17.9%。④上一版寫可交易宇宙「排除 KY 股」,實際沒有排除。⑤上一版用法對照圖裡標成「obv 廣度擇時」的 1.15,是 6 月定案前那個 0050/00646 輪動舊策略的數字,本版改成與文中表格同一批回測。⑥上一版寫「z-score 視窗 40/60/90 日都有效」,40 日視窗在 2022 年起的高低分位年化差只有 1.5 個百分點,本版改寫;單股示意圖的訊號也改用完整歷史計算(上一版只用窗口內資料,窗口開頭的回看期不足,頁內程式碼也沒有畫背離訊號),台積電的訊號次數由 20/3/1/9 變為 20/4/3/10、鴻海由 12/7/4/6 變為 13/6/5/6(創新高買/賣、背離買/賣)。
搭配月營收 YoY:基本面是選配,不在主策略內
本文的主策略是完全不含基本面的純技術策略:選股只用風險調整動能與 obv 吸籌確認,擇時只用 obv 廣度,沒有任何財報或月營收輸入。這是刻意的設計:純技術訊號每日可得、無財報公布延遲與對齊問題,回測口徑乾淨、可重現性高。
常見的延伸問題是:在選股端疊一層月營收年增率(YoY)過濾,績效會不會更好?這是一個合理的研究方向,但屬於「在純技術主策略之外的選配實驗」,不納入本文主策略的數字。原因有二:其一,主策略選股只取 14 檔、集中度已高,再加營收過濾會縮小可選池,可能壓縮動能因子的選擇空間(本文未測);其二,月營收公布有時間落差,要正確對齊「當期(含)以前已公布」的資料才不會前視,這會把乾淨的純技術口徑複雜化。想實驗的讀者可在下載的程式碼裡,於選股計分前加一層 monthly_revenue 的 YoY 過濾自行對照。基本面與技術面如何分工,可延伸看技術面與基本面選股的差異。
obv 最常見的四個誤用,與對應的真實數字
- 直接比 obv 數值大小選股。obv 是從資料起點累加的 level,比大小會偏向大型股:持股的市值百分位中位數 70.5,平均約兩成同時是市值前 30 大。研究段月夏普 0.78 低於 0050 的 1.00,2022 年起年化 22.1% 也落後 0050 的 30.5%。
- 拿單股 obv 創新高/背離當進出場訊號。台積電一年內創新高派訊號 24 次、多是反覆穿越;背離派 10 次賣警訊大多出現在上漲途中。單股 obv 訊號頻繁又雜,回測站不住。
- 把 obv z-score 當成唯一選股主因子。標準化確實改善了大小偏誤,z-score 最高 30 檔研究段月夏普升到 0.90,但仍低於 0050,2022 年起年化 23.6% 也落後。z-score 適合當「量能還在不在」的是非濾網,排序選股交給風險調整動能。
- 指望個股訊號降低大盤回撤。z-score 吸籌籃全期最大回撤 -37.7%,比 0050 的 -34.0% 還深。降系統性回撤要靠 obv 廣度這種大盤級訊號,而且月頻讀取擋不住月中急跌:2026 年 7 月策略單月 -28.7%。
這四點背後是同一個原則:obv 的本質是累積量能 level,適合的位置是「標準化回自身」與「聚合成市場廣度」;直接比絕對值、或當單股的買賣扳機,在台股回測都站不住。
三項穩健性驗證:重跑到 2026 年 10 月
這裡驗證本文的完整策略:OBV 90 日 z-score 為正的股票裡,取風險調整動能最高 14 檔、反波動加權,股票池內 OBV 站上 60 日均的比例不到 0.55 時改持 0050,每月換股。我們在 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%;原文手續費三折的結果另列於成本對照表。
| 檢查 | 標準 | 結果 |
|---|---|---|
| 鄰近參數 | OBV z-score 天數(70、90、110)乘上持股檔數(11、14、17),9 組至少 7 組贏 | 0/9 組贏,不過 |
| 前後兩段 | 2015-01-30 到 2020-12-11、2020-12-14 到 2026-10-27 兩段都贏 | 前段 0.85 對 0.89,後段 1.03 對 1.24,不過 |
| 交易成本 | 原參數、sim() 預設成本 |
日夏普 0.95 對 1.08,不過 |

9 組參數的日夏普(括號內是年化報酬,粗體是原文參數):
| 持股檔數 \ OBV z-score 天數 | 70 | 90 | 110 |
|---|---|---|---|
| 17 | 0.93(年化 23.7%) | 0.93(年化 23.8%) | 0.93(年化 23.6%) |
| 14 | 0.95(年化 25.3%) | 0.95(年化 25.1%) | 0.96(年化 25.4%) |
| 11 | 0.89(年化 24.0%) | 0.88(年化 23.6%) | 0.90(年化 24.4%) |
前後兩段與全期:
| 期間 | 策略年化 | 策略日夏普 | 0050 含息年化 | 0050 日夏普 |
|---|---|---|---|---|
| 前段 2015-01-30 到 2020-12-11 | 18.2% | 0.85 | 13.5% | 0.89 |
| 後段 2020-12-14 到 2026-10-27 | 32.0% | 1.03 | 28.0% | 1.24 |
| 全期 2015-01-30 到 2026-10-27 | 25.1% | 0.95 | 20.5% | 1.08 |
前後兩段是把整段期間從中點對半切。上文的研究段與樣本外以 2022 年初為界,照這個切法,2015 到 2021 年日夏普 0.96 對 0050 的 0.96,2022 年起 0.94 對 1.22。上文多用月夏普,跟這裡的日夏普算法不同,數字不能直接比。
交易成本對照(原參數):
| 成本設定 | 年化 | 日夏普 | 最大回撤 |
|---|---|---|---|
| 不扣成本 | 32.4% | 1.15 | -37.2% |
sim() 預設:手續費 0.1425%、證交稅 0.3% |
25.1% | 0.95 | -39.9% |
| 原文設定:手續費打三折 | 27.6% | 1.02 | -39.0% |
| 0050 含息買進持有(同期) | 20.5% | 1.08 | -34.0% |
9 組鄰近參數的日夏普在 0.88 到 0.96 之間,OBV z-score 天數與持股檔數怎麼換都差不多,但都低於 0050。前段(2015 到 2020 年)日夏普 0.85 小輸 0050 的 0.89,後段 1.03 輸 1.24,三項都不成立。年化高出 0050 約 4.6 個百分點,是用較大的波動與 -39.9% 的回撤換來的。上文的年化 28.1% 是資料到 2026-09-30、手續費打三折的結果;照三折跑到 2026-10-27 是 27.6%,換成 sim() 預設成本是 25.1%。
策略的限制與取捨
- 集中持股帶來高波動:策略只持 14 檔,年化波動 28.7% 高於 0050 的 19.8%,全期最大回撤 -39.0% 也深於 0050 的 -34.0%,單一月份可能虧近三成(2026 年 7 月 -28.7%)。承受得住這級波動才適合。
- 擇時是月頻,月中急跌擋不住:2026 年 7 月 obv 廣度在 7/17 就跌破門檻,部位到 8/3 才轉持 0050;從跌破前一天 7/16 收盤到 8/3 轉守,淨值跌 18.7%,7/17 收盤確認跌破之後仍再跌 11.4%。實際操作若改成每日檢查,報酬與回撤都會不同,本文沒有回測那個版本。
- 近年落後 0050:2022 年起年化與 0050 打平、月夏普 1.11 低於 0050 的 1.21;2024 年起連續三個年度區間落後,2026 年到 9 月底策略 +32.3%、0050 +74.3%。
- 對動能窗敏感:動能窗改成 30 或 50 日,研究段與 2022 年起的成績往相反方向大幅變動。參數與防禦腿都是在看過 2022 年後資料的情況下定案的,未來表現可能比本文 2022 年起那段更差。
- 高周轉、成本敏感:年換手約 9.6 次,報酬已在
sim()內扣手續費與證交稅後計算,但實單滑價會進一步侵蝕,資金規模越大越明顯。 - 容量與崩盤型態:選股僅 14 檔、宇宙限前 300 大,大資金部署需重估流動性衝擊;資料起點 2015,未對更早期(2008/2011)的崩盤型態做滾動測試,不保證對沒見過的型態同樣有效。
自己跑一次
把下面這句話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:
裝好之後,下載本文的 strategy.py、data.csv 與 metrics.json,即可在自己的環境重跑、改門檻、換防禦標的。strategy.py 把資料截止日釘在 2026-09-30,改成 None 就會用最新資料重跑;data.csv 是策略、0050 與 obv 廣度的逐日數列。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽、程式交易是什麼與如何挑選台股。想對照 RSI、KD、MACD 等其他指標的回測結論,可讀13 個技術指標的台股回測總覽;同樣用廣度做擇時、也遇到月頻落差的例子,可看布林通道的台股回測。關於用大盤訊號降低回撤,也可看市場濾網如何降低回撤。
常見問題
Q:obv 指標怎麼看?數字越大越好嗎? 不對。obv 是累積量能,數字大小受股本、成交量與累積時間主導,跨股比大小會偏向大型股(台股研究段「obv 最高 30 檔」月夏普 0.78,低於 0050 的 1.00)。正確看法是「跟自己比」:用時序 z-score 看 obv 相對自身近期是否偏多,或看股票池的 obv 廣度判斷大盤量能。
Q:obv 背離一定會反轉嗎? 不一定。台積電 2023-07 到 2024-06 一年內出現 10 次「價創新高、obv 沒跟上」的賣警訊,股價卻從 580 元附近漲到 960 元以上。單股背離訊號噪音大,obv 比較可靠的角色是標準化後的吸籌濾網與市場廣度擇時。
Q:obv 可以單獨拿來當買賣訊號嗎? 不建議。obv 創新高追、背離反向、obv 數值橫截面選股,在本文的台股回測都沒有贏過含息 0050 的風險調整報酬。obv 適合當選股的確認濾網或大盤量能開關,搭配其他因子使用。
Q:obv 的參數(均線天數)要設多少? 本文用 60 日當 obv 廣度的均線視窗、90 日當個股 z-score 標準化視窗、廣度門檻 0.55、選股 14 檔。z 視窗改 60 或 120 日幾乎沒差;廣度均線改 40 或 90 日、門檻在 0.52 到 0.60 之間,研究段月夏普都在 1.19 以上,但 2022 年起的表現會跟著變,動能窗則是最敏感的參數。與其細調參數,先用對位置比較重要。
Q:obv 和成交量、MFI 差在哪? 成交量是單日的量,obv 是把量按漲跌方向累加成趨勢線。MFI(資金流量指標)則把價量加權後做成 0 到 100 的擺盪指標,可以直接比超買超賣,回測結論見 MFI 資金流量指標的台股回測。obv 的特色是「累積 level」,最適合的用法是標準化看自身、或聚合成市場廣度。
Q:為什麼要用「廣度」,只看大盤指數的 obv 不行嗎? 單一指數的 obv 穿越均線在盤整期雜訊太大、來回甩巴掌;股票池的廣度是橫截面的量能度量,比較平滑。本文把廣度擇時加到同一個選股籃上,2022 年起月夏普由 0.92 升到 1.09、全期最大回撤由 -43.1% 收斂到 -39.4%。代價是研究段年化少 3.5 個百分點,而且月頻讀取會延遲轉守。
Q:這套策略適合誰? 適合想主動選股、能接受 -39% 等級回撤、單月近三成虧損與較高換手成本的人:全期年化 28.1%、月夏普 1.09,研究段大幅勝過含息 0050,但 2022 年起只與 0050 打平,2024 年起連續落後。受不了深度回撤、或偏好低周轉被動持有的人,直接買進持有含息 0050 更省心。
Q:obv 和 KD、RSI 一起用會更好嗎? 這些都是從同一組價量序列算出來的指標,資訊高度重疊,疊在一起很難增加新資訊(本文沒有回測這個組合)。本文的做法是讓不同性質的訊號分工:用風險調整動能排序選股、用 obv 90 日 z-score 確認量能、用 obv 廣度當大盤擇時開關。各擺盪指標的用法可參考 RSI、MACD、KD 比較。
最後更新:2026-10|回測區間:2015-01-30 ~ 2026-09-30|作者:FinLab 量化研究團隊(經量化研究員審閱)
本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。obv 雙核心純技術策略全期最大回撤 -39.0%、2026 年 7 月單月 -28.7%,實際交易前請自行評估風險、滑價與交易容量。
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始

