跳至主要內容
台股研究 約 18 分鐘閱讀

obv 指標怎麼用才對?台股 11 年回測:拆成吸籌確認+廣度擇時的純技術策略

obv 指標怎麼用才對?台股 11 年回測發現:把「obv 數值最高」拿去選股幾乎沒有額外報酬(研究段年化 17.7%、月夏普僅 0.78、回撤達 -74.7%),因為 obv 是累積量能、跨股不可比,等於變相選大型股。把 obv 拆成兩個零件——90 日 z-score 的吸籌確認當選股濾網、全市場 obv 廣度當大盤擇時開關——再疊上風險調整動能與反波動加權,組成一套完全不含基本面的純技術策略:研究段年化 26.3%、月夏普 1.25,樣本外 38.8%、1.38,全期 31.1%、1.22,三段都勝含息 0050。附可下載 Python 程式碼與可重現回測。

obv 真用法 CAGR 31.1% Sharpe 1.22

obv 指標在台股的正確用法:拆成吸籌確認加廣度擇時

多數教學把 obv(On-Balance Volume,能量潮)當買賣訊號:看 obv 創新高就追、背離就反向。但把「obv 數值最高的股票」拿去橫截面選股,在台股做 11 年回測(2015-2026),研究段年化只有 17.7%、月夏普僅 0.78、最大回撤更高達 -74.7%——報酬普通、風險極大。問題出在 obv 的本質:它是從回測起點一路累加的「累積量能 level」,老牌大型股天生就比新上市小型股大好幾個量級,直接比大小等於在比股本與上市年資,不是在比量能。用真實價量資料攤開來看,obv 真正的價值在於拆成兩個各司其職的零件:第一個零件是「obv 的 90 日時序 z-score」,當成吸籌確認濾網(只留下 obv 相對自身歷史仍偏多、量能持續流入的股);第二個零件是「全市場 obv 站上自身均線的個股比例(廣度)」,當成大盤多空擇時開關。把這兩個零件疊上風險調整動能(每單位波動換到多少動能)與反波動加權,組成一套完全不含基本面的純技術策略:在通過吸籌確認的股裡選風險調整動能最高的 14 檔、反波動加權,廣度退潮時整池轉持含息 0050 防禦。這套「obv 雙核心純技術策略」研究段(2015-2021)年化 26.3%、月夏普 1.25,樣本外(2022-2026)年化 38.8%、月夏普 1.38,全期(2015-2026)年化 31.1%、月夏普 1.22,全期最大回撤 -39.0%——三段都勝過含息 0050(全期年化 21.0%、夏普 1.05、回撤 -34.0%)。代價講清楚:集中持股 14 檔讓全期最大回撤 -39.0% 深於 0050 的 -34.0%,是用較深的回撤換到明顯更高的報酬與更穩的夏普。

先用一張表回答你搜尋「obv」時最想知道的事:

你想知道的 本文用真實台股回測的回答
obv 指標是什麼 累積量能指標:上漲日把成交量加上去、下跌日減掉,衡量買賣力道的方向
obv 數值最高拿來選股有效嗎 台股研究段年化 17.7%、月夏普僅 0.78、回撤 -74.7%,被股本因子主導,沒有獨立 alpha
obv 該怎麼標準化才對 用 90 日時序 z-score 把 obv 標準化回自身歷史,當「量能是否持續流入」的吸籌確認濾網
obv 最強的用法是什麼 拆成兩個零件:z-score 吸籌確認當選股濾網、全市場 obv 廣度當大盤擇時開關
效果如何 雙核心純技術策略研究段年化 26.3%、夏普 1.25,樣本外 38.8%、1.38,全期 31.1%、1.22,三段都勝含息 0050

obv 雙核心純技術策略與含息 0050 買進持有的淨值對照圖,2015 到 2026 台股回測,策略線全程在上方

本文所有數字皆出自 finlab 套件抓取的上市櫃真實價量資料(price 收盤價與成交量、etl:adj_close 含息還原股價),obv 由 TA-Lib 的 OBV 計算,回測區間 2015-01 至 2026-06-09,基準為含息 0050。文末附可下載的 strategy.pydata.csv,可自行重現。對回測的觀念還不熟,可先看回測是什麼

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 就是一條按漲跌方向累加成交量的遞迴序列:

OBVt=OBVt1+{Vt,Ct>Ct1Vt,Ct<Ct10,Ct=Ct1OBV_t = OBV_{t-1} + \begin{cases} V_t, & C_t > C_{t-1}\\ -V_t, & C_t < C_{t-1}\\ 0, & C_t = C_{t-1}\end{cases}

逐個符號拆開來看:OBVtOBV_t 是第 tt 個交易日收盤後的能量潮數值;CtC_tCt1C_{t-1} 分別是當日與前一日的收盤價;VtV_t 是當日成交量(股數)。規則只有三條:今天收高(Ct>Ct1C_t > C_{t-1}),就把整筆當日成交量「加」進前一日的 obv;今天收低(Ct<Ct1C_t < C_{t-1}),就把整筆當日成交量「減」掉;收平則不動。

從公式可以一眼看出三件事,剛好解釋了後面所有回測結論。第一,obv 是前後相依的累加序列OBVtOBV_t 一定要先有 OBVt1OBV_{t-1}),所以它沒有自然的零點或上限,數值大小完全取決於累積了多久、量有多大——這就是它跨股不可比、變相選到大型股的根源。第二,它只用「收盤漲跌的方向」決定加減,不看漲跌幅大小:漲 0.1% 和漲 9% 對 obv 的貢獻一樣,都是把當日全部成交量加進去,這讓 obv 對小幅震盪特別敏感、訊號容易反覆。第三,它是價量結合的指標:價格只貢獻「方向」(正負號),量貢獻「力道」(加減的大小),所以 obv 衡量的是「帶量的方向性」而非單純的價或量。

實務上常見三種用法,以下用台股回測一一檢驗:

橫截面選股派:挑「obv 數值最高」或「obv 創新高」的股票,假設量能最強者續強。

背離/突破派:看單股 obv 與股價背離、或 obv 領先突破,當買賣訊號。

量能廣度派(本文主張):不看單股絕對值,改看「全市場有多少比例的股票 obv 站上自身均線」,當大盤量能的多空溫度計。

哪一派站得住?直接回測。

教科書最常見的用法,在台股 11 年風險極高、報酬普通

我們在可交易宇宙(60 日均成交金額前 300 大、收盤 > 10 元、60 日均量 > 100 萬股,排除 ETF、金融股、KY 股、處置股)裡,把幾種「obv 選股」用法各跑一次月再平衡的回測,研究段(2015-2021)結果如下:

obv 選股用法 研究段年化報酬 月夏普 最大回撤
obv 數值最高 30 檔(教科書用法) 17.7% 0.78 -74.7%
obv 數值最低 30 檔(方向對照) 4.6% 0.32
obv 斜率(速度)最強 30 檔 11.2% 0.58
含息 0050 買進持有(同期基準) 15.3% 1.00 -28.2%

obv 四種用法的研究段月夏普對照長條圖,raw obv 選最高 0.78、obv 斜率追高 0.58、obv z90 吸籌 0.89、obv 廣度擇時 1.15,標準化回自身與廣度擇時的風險調整報酬最佳

結論很清楚:最多人用的「obv 數值最高」選股,研究段年化 17.7% 看似贏過 0050 的 15.3%,但月夏普只有 0.78(0050 是 1.00)、最大回撤更高達 -74.7%——報酬是用近乎腰斬一倍的回撤硬換來的,實務上根本抱不住。 對照組「obv 最低 30 檔」研究段年化只有 4.6%、月夏普 0.32,方向雖然對,但價差不足以支撐一個獨立因子。

原因就在前面講的「累積 level」性質:選「obv 最高」其實只是選到一批成交量大、上市久的大型股,這層訊息早被市值因子吸收了,obv 沒有貢獻獨立的 alpha。obv 的一階斜率(速度)噪音又太大,研究段年化 11.2%、月夏普 0.58,同樣站不住。obv 本來就不是設計來做橫截面選股的指標。

那 obv 完全沒有選股價值嗎?有,但要先解決「跨股不可比」這件事。延伸閱讀:技術面與基本面選股的差異動能策略

在單股上實際畫一次:兩個教科書派別的買賣點長什麼樣

橫截面選股之外,多數人對 obv 的第一印象其實來自單股圖上的兩個派別:obv 創新高派(obv 突破前一段時間的最高點就追、跌破前低就賣)與量價背離派(價格創新高但 obv 沒跟上=賣警訊;價格創新低但 obv 沒破低=買背離)。這兩派到底實用不實用,直接畫出來最快。下圖以台積電(2330)2023-07 到 2024-06 約一年的日線為例,上方面板是股價並標出兩派的買賣箭頭,下方面板是 obv 原始線與其 60 日均線:

台積電 2330 的 obv 創新高派與量價背離派買賣訊號示意圖,上方股價面板標出買賣箭頭、下方面板畫 obv 與 60 日均線,創新高訊號頻繁進出而背離訊號稀疏

光看這一張,兩派的毛病就攤在眼前。創新高派訊號太頻繁:在這段約一年的窗裡,光是 obv 突破 60 日前高的買進訊號就觸發了 20 次、跌破前低的賣出 3 次——在一段整體往上的多頭裡平均不到兩週就要動一次,多數只是 obv 在均線上下反覆穿越的雜訊(whipsaw),每次進出都付手續費與證交稅。背離派則剛好相反,訊號太稀疏又常常太早:整段只出現 1 次買背離、9 次賣背離,而那些「價創高、量沒跟」的賣警訊在這段強勢盤裡幾乎每一次都太早離場,賣完價格繼續漲。換一檔鴻海(2317)同窗來看也是同一個結構——創新高買 12 次、賣 7 次,背離買 4 次、賣 6 次,合計 29 個訊號,一樣是「創新高頻繁甩巴掌、背離稀疏難用」。

鴻海 2317 的 obv 創新高派與量價背離派買賣訊號示意圖,訊號分布同樣呈現創新高頻繁進出、背離稀疏的問題

這正呼應前一節的回測結論:obv 的單股絕對值與穿越訊號噪音太大,當單股進出場依據站不住。這兩派在特定個股、特定時段或許偶有命中,但單股級的 obv 訊號本質上頻繁又雜,要嘛被交易成本吃掉、要嘛太早出場,這也是後面我們把 obv 改成「標準化因子」與「市場廣度」來用的動機。

想自己重畫這張圖、用不同股票或不同窗口檢查,可以用下面這段程式碼。它把「算 obv → 定義兩派訊號 → 畫雙面板圖」拆成幾個好讀的步驟:

顯示程式碼
import finlab
from finlab import data
import matplotlib.pyplot as plt
 
# 套件會在需要資料時引導你完成登入,不需手動填 token
finlab.login()
 
# 1. 載入價量並取出單檔(以台積電 2330 為例)
close = data.get("price:收盤價")
sid, start, end = "2330", "2023-07-01", "2024-06-30"
price = close[sid].loc[start:end].dropna()
 
# 2. obv 直接取 finlab 內建指標,再算 60 日均線
obv = data.indicator("OBV")[sid].loc[price.index]
obv_ma = data.indicator("OBV")[sid].rolling(60).mean().loc[price.index]
 
# 3. 創新高派:obv 突破前 60 日(不含當日)最高 = 買、跌破前低 = 賣
prior_high = obv.shift(1).rolling(60).max()
prior_low = obv.shift(1).rolling(60).min()
newhigh_buy = price[(obv > prior_high) & (obv.shift(1) <= prior_high.shift(1))]
newlow_sell = price[(obv < prior_low) & (obv.shift(1) >= prior_low.shift(1))]
 
# 4. 量價背離派:價創 20 日新高但 obv 未創高 = 賣;價創新低但 obv 未破低 = 買
bear = (price >= price.rolling(20).max()) & (obv < obv.rolling(20).max())
bull = (price <= price.rolling(20).min()) & (obv > obv.rolling(20).min())
 
# 5. 畫雙面板:上面板股價標買賣點、下面板 obv 與其均線
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 7), sharex=True)
ax1.plot(price.index, price, color="black", linewidth=1)
ax1.scatter(newhigh_buy.index, newhigh_buy, marker="^", color="green", label="創新高買")
ax1.scatter(newlow_sell.index, newlow_sell, marker="v", color="red", label="創新高賣")
ax1.legend()
ax2.plot(obv.index, obv, label="OBV")
ax2.plot(obv_ma.index, obv_ma, label="OBV 60 日均")
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》發現,股票報酬的序列相關會隨成交量變化,代表量能本身就承載了報酬資訊;但要把這份資訊抽出來,得先把每檔股票的量能放回它自己的歷史基準看,而不是直接比絕對大小。

這個零件在本文不會自己當選股主因子,而是當一道吸籌確認濾網:只保留「obv 90 日 z-score > 0」的股票,篩掉量能已經相對自身退潮的標的,再在這個池子裡用別的因子排序選股。換句話說,z-score 回答的是「這檔股票的量能還在不在」這個是非題,而不是拿來比高低排名。

零件二:全市場 obv 廣度當大盤擇時開關

單看一檔指數(例如 0050)的 obv 有沒有站上自己的均線,訊號太雜:盤整期會反覆穿越、來回甩巴掌。但如果改看「全市場有多少比例的股票 obv 站上各自的 60 日均線」,就得到一個橫截面的、平滑的大盤量能力道度量,我們稱為 obv 廣度。廣度高,代表多數個股的量能結構偏多;廣度崩落,代表系統性的量能在退潮。把它做成 risk-on / risk-off 的開關,就是整套策略的防禦腿。

全市場 obv 廣度與策略累積報酬的雙軸對照圖,廣度走低時對應策略整池轉守含息 0050 避開下跌

這個「用量能結構控曝險」的邏輯,和學術上的波動度擇時一致——Moreira & Muir (2017) 在《Volatility-Managed Portfolios》證明:在風險惡化時系統性地調降曝險,能顯著提升投資組合的夏普比率。obv 廣度正是一個可操作的市場量能結構訊號。

把這兩個零件疊上風險調整動能與反波動加權組成完整策略後,效果一目了然。下圖比較「裸風險調整動能籃」(同宇宙、同風險調整動能、反波動加權,但不加 obv 吸籌確認、不加 obv 廣度擇時)與加上兩個 obv 零件後的完整策略:裸籃研究段月夏普 1.24、樣本外 1.17、全期最大回撤 -43.1%;加上 obv 吸籌確認與廣度擇時後,研究段月夏普維持 1.25、樣本外拉到 1.38,全期最大回撤收斂到 -39.0%。 雙核心主要把樣本外的風險調整報酬墊高、同時把全期回撤往內收。

裸風險調整動能籃與加上 obv 吸籌確認加廣度擇時後的研究段月夏普、樣本外月夏普與全期最大回撤對照長條圖

順帶一提,選股端我們用「買風險調整後最強的股票」而不是「買最弱想等反彈」,這和 Jegadeesh & Titman (1993) 的動能效應一致:過去的贏家在中期傾向繼續贏。關於用大盤訊號降低回撤,也可參考市場濾網如何降低回撤均線市場濾網

完整策略:obv 雙核心純技術選股

把上面兩個零件疊上風險調整動能與反波動加權,組成一套可執行、可重現、完全不含基本面的純技術策略:

  1. 風險調整動能(選股排序因子):在可交易宇宙裡,每檔股票算「(收盤 ÷ 40 日前收盤 − 1)÷ NATR」,NATR 是 ATR14 ÷ 收盤。它衡量的是「每承擔一單位波動,換到多少動能」,避免單純追高把高波亂漲股選進來。
  2. obv 吸籌確認(零件一,當濾網):只在「obv 90 日 z-score > 0」的股票上計分,篩掉量能相對自身已退潮的標的。
  3. 持股:在通過吸籌確認的股裡,取風險調整動能最高的 10 至 16 檔(本文預設 14 檔),以反波動(1 ÷ NATR)正規化加權——波動越低的股票配重越高。
  4. 大盤擇時(零件二,obv 廣度):每日算全市場「obv 站上自身 60 日均線」的個股比例(obv 廣度);廣度 > 0.55 轉為 risk-on、≤ 0.55 轉為 risk-off。
  5. 資產配置:risk-on 時滿倉持有那 14 檔選股籃;risk-off 時選股清零、整池改持含息 0050 防禦(不空手、不用槓桿)。
  6. 月再平衡。

選股端的核心程式碼(可直接交給你的 AI 助理改寫、或下載完整版執行):

顯示程式碼
import numpy as np
import pandas as pd
from finlab import data
 
# 載入價量資料
close = data.get("price:收盤價")
volume = data.get("price:成交股數")
amount = data.get("price:成交金額")
 
# 可交易宇宙:成交額前 300 大、收盤 > 10 元、60 日均量 > 100 萬股,排除 ETF 與權證/KY
liquidity = volume.rolling(60).mean()
turnover = 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 = turnover.is_largest(300) & (close > 10) & (liquidity > 1_000_000) & is_common
 
# 因子一:風險調整動能 =(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,只保留 z > 0(量能相對自身仍偏多)
obv = data.indicator("OBV")
obv_z = (obv - obv.rolling(90).mean()) / obv.rolling(90).std()
accumulating = obv_z > 0
 
# 在通過吸籌確認的股裡,取風險調整動能最高 14 檔,反波動 1/NATR 加權
candidate = risk_adj_mom.where(universe & accumulating)
basket = candidate.rank(axis=1, ascending=False) <= 14
inv_vol = (1 / natr).where(basket)
weight = inv_vol.div(inv_vol.sum(axis=1), axis=0).fillna(0.0)

完整的 obv 廣度擇時、配置與回測請見文末可下載的 strategy.py

這套策略研究段(2015-2021)年化 26.27%、月夏普 1.25、月索提諾 2.13、研究段最大回撤 -31.96%;樣本外(2022-2026)年化 38.78%、月夏普 1.38、月索提諾 3.32;全期(2015-2026)年化 31.05%、月夏普 1.22、月索提諾 2.37、全期最大回撤 -39.02%。三段都勝過含息 0050(全期年化 21.0%、夏普 1.05、回撤 -34.0%),代價是集中持股讓全期回撤略深。

下面是完整互動式回測:月報酬熱力圖、權益曲線、年度績效都可以直接在文章裡操作:

參數最佳化:要的是一片高原,不是一根孤峰

這套策略有兩個最值得檢查的參數:選股檔數 n(決定持股集中度)與obv 廣度的 risk-on 門檻(多少比例的個股 obv 站上均線才滿倉個股籃)。很多人做最佳化的方式,是把所有組合都跑一遍、挑出夏普最高的那一格當答案——這正是過度最佳化的典型陷阱。正確的做法是看整張參數平面的形狀:我們要找的是一片連續的高原,而不是一根孤立的高峰。

下面這張色溫圖把選股檔數(13/14/15/16 檔)× obv 廣度門檻(0.52/0.55/0.58/0.60)的 16 種組合各真跑一次完整回測,每格的顏色與數字是該組合的研究段月夏普:

obv 雙核心策略選股檔數乘以 obv 廣度門檻的研究段月夏普色溫圖,整片網格從 1.18 到 1.32 連成綠色高原,沒有突兀孤峰

讀這張圖的關鍵在「看區塊、不看單格」。整片 16 格的研究段月夏普全落在 1.18 到 1.32 之間,連成一大片高原,沒有任何一格特別突兀。 橫看選股檔數軸,13 到 16 檔的夏普差距都在小數點後一兩位;縱看廣度門檻軸,0.52 到 0.58 那幾列普遍偏綠,門檻拉到 0.60 才略降溫。這代表策略的優勢是一整片參數區域共有的,不是靠某一格運氣湊出來。

正因為是高原,我們刻意不去挑那格絕對最高的孤峰,而是取高原中段一個合理、四周鄰居都同樣健康的預設值。文章主策略用的是 14 檔、廣度門檻 0.55;如果改取「鄰域內研究段夏普最高的另一格」這個更積極的對照,會落在 14 檔、門檻 0.58。下圖把這兩組參數的研究段夏普、樣本外夏普、最大回撤幅度並排對照:

obv 雙核心策略勝出格與穩健鄰格對照長條圖,勝出格 14 檔門檻 0.55 與鄰格 14 檔門檻 0.58 在研究段夏普樣本外夏普與最大回撤上幾乎打平,顯示沒有過度最佳化的自由午餐

對照的結論很樸素,也正是穩健的證據:兩組參數幾乎打平。勝出格(14 檔、門檻 0.55)研究段月夏普 1.25、樣本外 1.38、全期最大回撤 -39.0%;鄰格(14 檔、門檻 0.58)研究段 1.32、樣本外 1.32、全期最大回撤 -41.3%。把門檻往上挪到 0.58 雖然研究段夏普略高,但樣本外夏普反而略降、回撤略增,整體與勝出格在同一個水準。也就是說,在高原裡換參數並沒有換到「免費」的更好成績——沒有「優化的自由午餐」反而是好消息:它代表這個 edge 對參數不敏感、整片區域都成立,是個結構性現象,而非某一格巧合的參數湊出來的假象。如果哪天你看到一張色溫圖只有單一一格特別亮、四周都是平庸或負值,那才該警惕:那種「孤峰」通常是過擬合的產物,換到樣本外就崩。實務上我們寧可用一個落在高原中央、四周都健康的參數,也不要那根樣本外站不住的孤峰。

回測方法與口徑

量化結論的可信度取決於方法,以下逐項交代:

  • 交易成本:策略使用 finlab sim(),台股預設已內扣手續費(本文以 0.1425% 打三折計)與賣出證交稅 0.3%。
  • 滑價:未額外假設滑價;實際成交衝擊取決於資金規模與流動性。risk-off 改持的含息 0050 為高流動 ETF,配置層切換的衝擊相對小。
  • 股票池:上市櫃普通股,60 日均成交金額前 300 名、收盤 > 10 元、60 日均量 > 100 萬股。
  • 排除類別:排除 ETF(代號 00 開頭)、權證/KY/特別股(非 4 碼純數字)、金融保險股、處置與全額交割股,以降低生存者偏差與不可交易標的污染。
  • 前視偏差:風險調整動能、obv 90 日 z-score 與 obv 廣度均只使用當日(含)以前的價量;月頻再平衡,訊號於當期可得。完全不使用財報或月營收等基本面資料,自然沒有財報公布日對齊問題。
  • 權重:risk-on 時選股籃以反波動(1 ÷ NATR)正規化加權、不另設個股上限;risk-off 時整池轉持單一資產含息 0050;obv 廣度為配置層的多空開關。
  • 周轉率:年換手約 9.3 次(選股集中 14 檔 + 月再平衡 + 配置層切換),高於被動持有,成本敏感度較高,已在 sim() 內扣手續費與證交稅下計算。
  • 樣本內外:研究段 2015-2021、樣本外 2022-2026 分開回報,所有數字兩段都列,避免只報漂亮的一段。

穩健度

這套策略的 edge 不是靠單一參數湊出來的:

  • 雙核心各自獨立加值:拆開做三層消融——純風險調整動能籃(不含 obv)研究段年化 29.1%、月夏普 1.24、樣本外 1.17;只加 obv z90 吸籌確認,研究段升到 1.28、樣本外 1.20;只加 obv 廣度擇時不加吸籌,樣本外拉到 1.37;兩個零件全上的完整策略研究段 1.25、樣本外 1.38,全期最大回撤從裸籃的 -43.1% 收斂到 -39.0%。兩段貢獻方向一致、不互斥。
  • 跨參數穩健:持股檔數與 obv 廣度門檻在勝出設定(14 檔、門檻 0.55)的整片鄰域裡都同時通過硬門檻,不是靠單一格運氣(下一節的色溫圖逐格攤開)。
  • z 視窗一致:把 obv 標準化的時序 z-score 視窗,40/60/90 日都有效,90 日最穩,視窗越長越穩。
  • 吸籌方向穩定:obv z90 高分位(吸籌)穩定贏低分位(出貨),多空價差樣本外不縮反擴(研究段多空年化價差 12.6%、樣本外 14.2%)。

不同大盤狀態下的表現:研究段與樣本外都站得住

判斷一套策略是不是只靠某一段行情湊出來,最直接的方法是把回測切成兩段、各自結算。本文把 2015-2021 當研究段(涵蓋 2015 股災、2018 中美貿易戰急跌、2020 疫情崩跌與反彈),2022-2026 當樣本外(涵蓋 2022 升息熊市與其後的強多頭,2026 標示「截至 2026-06」資料):

區間 大盤背景 策略年化 策略月夏普 策略最大回撤 含息 0050 年化
研究段 2015-2021 多次急跌與反彈交錯 26.3% 1.25 -32.0% 15.3%
樣本外 2022-2026(截至 2026-06) 升息熊市後轉強多頭 38.8% 1.38 -39.0% 30.4%
全期 2015-2026 31.1% 1.22 -39.0% 21.0%

兩段分開看的重點是:策略在研究段與樣本外的年化都明顯高於同期含息 0050(研究段 26.3% vs 15.3%、樣本外 38.8% vs 30.4%),月夏普兩段都在 1.2 以上,沒有出現「研究段漂亮、樣本外垮掉」的過擬合特徵。 研究段它大幅領先含息 0050,靠的是風險調整動能在震盪市裡挑到相對強勢標的、再用 obv 吸籌確認濾掉假動能;樣本外 2022 之後是台股強單邊多頭,集中持股的爆發力讓策略不僅守住、還把報酬差距拉開,只是代價是回撤加深到 -39.0%(同期含息 0050 -34.0%)。

搭配月營收 YoY:基本面是選配,不在主策略內

本文的主策略是完全不含基本面的純技術策略:選股只用風險調整動能與 obv 吸籌確認,擇時只用 obv 廣度,沒有任何財報或月營收輸入。這是刻意的設計——純技術訊號每日可得、無財報公布延遲與對齊問題,回測口徑乾淨、可重現性高。

常見的延伸問題是:在選股端疊一層月營收年增率(YoY)過濾,績效會不會更好?這是一個合理的研究方向,但屬於「在純技術主策略之外的選配實驗」,不納入本文主策略的數字。原因有二:其一,主策略選股只取 14 檔、集中度已高,再加營收過濾會大幅縮小可選池,反而犧牲風險調整動能的爆發力;其二,月營收是領先指標、公布有時間落差,要正確對齊「當期(含)以前已公布」的資料才不會前視,這會把乾淨的純技術口徑複雜化。想實驗的讀者可在下載的程式碼裡,於選股計分前加一層 monthly_revenue 的 YoY 過濾自行對照。基本面與技術面如何分工,可延伸看技術面與基本面選股的差異

obv 最常見的四個誤用,與對應的真實數字

把前面散落各節的結論收斂成一張「踩雷清單」,方便對照自己現在是不是正在用錯:

  1. 直接比 obv 數值大小選股。obv 是從回測起點累加的 level、跨股不可比,比大小等於在比股本與上市年資。台股研究段「obv 最高 30 檔」年化 17.7% 看似不差,但月夏普僅 0.78、最大回撤 -74.7%,報酬是用近乎腰斬一倍的回撤硬換的。
  2. 拿單股 obv 創新高/背離當進出場訊號。前面台積電與鴻海的示意圖已經看到:創新高訊號一年觸發 20 多次、多是 whipsaw;背離訊號稀疏又常太早出場。單股 obv 訊號噪音太大,回測站不住。
  3. 把 obv z-score 當成唯一選股主因子。把絕對值換成 90 日 z-score 確實改善了跨股可比性——z90 最高 30 檔研究段年化 17.9%、月夏普 0.89,比直接比大小好;但只靠它選股仍站不住,最大回撤照樣高達 -74.2%。z-score 的正確角色是「確認量能還在不在」的是非濾網,排序選股要交給風險調整動能,回撤要交給 obv 廣度。
  4. 指望 obv 個股訊號降低大盤回撤。即使是有效的 z90 吸籌籃,單獨用最大回撤仍高達 -74.2%,跟裸選股一樣會吃滿系統性下跌。個股級訊號改善的是「選對股」,降系統性回撤必須靠 obv 廣度這種大盤級的訊號。

這四點背後是同一個原則:obv 的本質是「累積量能 level」,所以它的正確舞台是「標準化回自身」與「聚合成市場廣度」,而不是直接比絕對值、也不是當單股的買賣扳機。 用對地方,比把參數調得多精細都重要。

策略的限制與取捨

  • 集中持股帶來較深回撤:策略只持 14 檔、全期最大回撤 -39.0%,深於含息 0050 的 -34.0%。較高的報酬(全期年化 31.1% vs 0050 的 21.0%)是用更深的回撤換來的,承受得住這級回撤才適合。
  • 高周轉、成本敏感:選股籃年換手約 9.3 次,明顯高於被動持有;報酬已在 finlab sim() 內扣手續費與證交稅後計算,但實單滑價會進一步侵蝕,資金規模越大越明顯。
  • z-score 單獨選股不足:obv 的 90 日 z-score 在本文只當「量能還在不在」的吸籌確認濾網,不單獨排序選股;單獨拿 z90 最高選股研究段年化 17.9%、月夏普 0.89,最大回撤仍達 -74.2%,必須搭配風險調整動能排序與 obv 廣度擇時才站得住。
  • 崩盤型態涵蓋有限:obv 廣度門檻主要在 2018/2020/2022 幾次量能退潮上驗證,資料起點 2015,未對更早期(2008/2011)的崩盤型態做滾動測試;廣度均線視窗目前固定 60 日,40/90 日視窗的穩健度尚待補。
  • 容量與成本:選股僅 14 檔、宇宙限前 300 大,turnover 偏高,大資金部署需重估流動性衝擊與成本侵蝕;risk-off 改持的含息 0050 為高流動 ETF,配置層切換的衝擊相對小。

自己跑一次

把下面這句話交給你的 AI 助理,它會引導你安裝 FinLab Skill、抓台股資料、重現這篇的回測:

免費試用

用 AI 開始 FinLab

把這句話交給你的AI,它會帶你完成設定並做出第一個策略。

告訴你的AI:

「幫我設定 FinLab,做一個動能策略:https://finlab.finance/setup」

裝好之後,下載本文的 strategy.pydata.csv,即可在自己的環境重跑、改門檻、換防禦標的。登入只需在程式裡寫 finlab.login(),套件會在需要資料時引導你完成登入。想延伸成更完整的量化流程,可參考量化交易總覽程式交易是什麼如何挑選台股。關於用大盤訊號降低回撤,也可看市場濾網如何降低回撤均線市場濾網

常見問題

Q:obv 指標怎麼看?數字越大越好嗎? 不對。obv 是累積量能,數字大小受股本與上市年資主導,跨股比大小沒有意義(台股研究段「obv 最高 30 檔」年化 17.7% 但回撤 -74.7%)。正確看法是「跟自己比」:用時序 z-score 看 obv 相對自身歷史是否爆量上衝,或看全市場 obv 廣度判斷大盤量能。

Q:obv 背離一定會反轉嗎? 不一定。單股 obv 與股價背離是常見訊號,但本文回測顯示 obv 的單股絕對值與斜率訊號噪音都很大、樣本內站不住。obv 比較可靠的角色是「標準化後的吸籌因子」與「市場廣度風控」,而非單股背離抄底。

Q:obv 可以單獨拿來當買賣訊號嗎? 不建議。無論是 obv 創新高追、背離反向,還是 obv 數值橫截面選股,在台股回測都站不住或風險過大。obv 適合當「標準化後的選股因子」或「大盤量能風控」,搭配資產配置使用,而不是自己當單股進出場依據。

Q:obv 的參數(均線天數)要設多少? 本文用 60 日當 obv 廣度的均線視窗、90 日當個股 z-score 標準化視窗、廣度門檻 0.55、選股 14 檔。重點不在參數微調:持股 1316 檔 × 廣度門檻 0.520.60 的整片組合研究段月夏普都落在 1.18~1.32,z-score 視窗 40/60/90 日都有效且越長越穩。與其調參數,不如先用對地方。

Q:obv 和成交量、MFI 差在哪? 成交量是單日的量,obv 是把量按漲跌方向「累加」成趨勢線。MFI(資金流量指標)則把價量加權後做成 0-100 的擺盪指標。三者都是量價工具,但 obv 的特色是「累積 level」,所以最適合的用法是標準化看自身、或聚合成市場廣度,而不是直接比絕對值。

Q:為什麼要用「廣度」而不是只看大盤指數的 obv? 單一指數的 obv 穿越均線在盤整期雜訊太大、來回甩巴掌;全市場的廣度是橫截面的、平滑的量能力道度量,門檻穿越更乾淨,能把整池在量能退潮時轉守含息 0050,把系統性下跌的曝險降下來。

Q:這套策略適合誰? 適合想要主動選股、能接受 -39% 等級回撤與較高換手成本,追求明顯高於含息 0050 報酬的人:全期年化 31.1%、月夏普 1.22,研究段與樣本外都勝過含息 0050。不適合受不了深度回撤、或偏好低周轉被動持有的人——那種需求直接買進持有含息 0050 更省心。

Q:obv 和 KD、RSI 一起用會更好嗎? 這些都是量價/擺盪類指標,資訊高度重疊,硬疊通常是負貢獻。比較有效的組合是「不同性質」的訊號分工:用風險調整動能排序選股、用 obv 90 日 z-score 確認量能、用 obv 廣度當大盤擇時開關,各司其職。各擺盪指標的正確用法可參考RSI、MACD、KD 比較


最後更新:2026-06|回測區間:2015-01 ~ 2026-06-09|作者:FinLab 量化研究團隊(經量化研究員審閱)

本文僅供量化研究與教學用途,所有回測數字均由 finlab 套件在真實台股資料上產出,過去績效不代表未來表現,不構成投資建議。obv 雙核心純技術策略全期最大回撤 -39.0%,實際交易前請自行評估風險、滑價與交易容量。

FinLab AI

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始

更多技術指標研究

查看全部