本篇旨在測試 pandas-ta 套件的 AOBV (進階能量潮) 技術指標函式 ta.aobv() 或 df.ta.aobv().
本系列全部文章索引參考 :
8. 計算 AOBV (進階能量潮) 指標 :
AOBV 指標 (Accumulation / Distribution OBV, 累積能量潮) 又稱為 Absolute OBV 或 Advanced OBV (進階能量潮), 它是傳統 OBV 指標的改良版, OBV 僅靠收盤價漲跌決定是否加減成交量, 容易忽略 intraday 的多空力量; 而 AOBV 則加入 "價格位置" 資訊, 其計算邏輯比較接近 Chaikin A/D (ADL) 指標 (僅使用收盤價與成交量), 但仍保有 OBV 的累積特性, 使得 AOBV 比 OBV 更敏感反應更快, 適合偵測吸貨/出貨, 主力動向或是否背離等, 比 OBV 更能準確地反映市場內部力量, 對趨勢改變與背離反應更快, 更有 "量先價行" 指標之作用.
AOBV 指標是 OBV 的進化版本 (OBV 的加權 + 平滑), 但它並非是某個人的個人發明, 而是技術分析界結合量價累積指標 OBV (能量潮) 與 A/D 指標 (吸貨/出貨) 對價格位置的敏感度發展而成的衍生複合指標, 它用更精準的方式分配成交量, 使量能訊號更敏感, 兩者之比較如下表 :
| 項目 | OBV (On Balance Volume) | AOBV (Accumulation OBV) |
|---|---|---|
| 概念來源 | 1963 年 Joseph Granville | 2000 年後量化圈改良版本 |
| 基本精神 | 成交量依「收盤價漲跌」累加 | 成交量依「收盤價在區間的位置」分配 |
| 判斷依據 | 今日收盤價比昨日高或低 | 收盤價在最高價/最低價的相對位置 |
| 公式 |
OBV(n) = OBV(n-1) + Vol (若 Close > PrevClose) OBV(n) = OBV(n-1) - Vol (若 Close < PrevClose) |
AOBV = ∑ (MF × Vol) MF = (Close − Low) − (High − Close) MF = ((Close − Low) / (High − Low) × 2 − 1) |
| 成交量分配方式 | 全量加或全量減 | 依價格位置加部分量或減部分量 |
| 訊號敏感度 | 較不敏感(容易延遲) | 較敏感(能提前反映) |
| 缺點 | 對長上影/下影缺乏反應 | 易受極端影線干擾,需要平滑 |
| 與 ADL 關係 | 無關,僅用收盤價漲跌 | 類似 ADL,但為 OBV 版本 |
AOBV 的核心概念是 : 以 OBV 累積成交量, 但依漲跌幅大小給成交量不同的加權.
計算步驟如下 :
(1). 計算今日價格變動比例 :
R_t = (Close_t − Close_{t−1}) / Close_{t−1}
若收盤價上漲 → R_t > 0
若收盤價下跌 → R_t < 0
若整理盤 → R_t ≈ 0
(2). 計算加權成交量 :
WV_t = Volume_t × |R_t|
成交量加上漲跌幅度的權重
漲跌越大 → 權重成交量越大
漲跌越小 → 權重成交量越小
(3). 累計 AOBV 值 :
若 Close_t > Close_{t−1} : AOBV_t = AOBV_{t−1} + WV_t
若 Close_t < Close_{t−1} : AOBV_t = AOBV_{t−1} − WV_t
若 Close_t = Close_{t−1} : AOBV_t = AOBV_{t−1}
整合上述計算為如下公式 :
AOBV_t = AOBV_{t−1} + sign(Close_t − Close_{t−1}) × Volume_t × |(Close_t − Close_{t−1}) / Close_{t−1}|
其中 :
sign(x) = 1 若 x > 0
−1 若 x < 0
0 若 x = 0
pandas-ta 套件提供 ta.aobv() 函式與 df.ta.aobv() 方法計算 OBV 指標, 計算結果為 1 或 0. 與 OBV 不同的是, 長短期 AOBV 的值並非累積的成交量, 而是透過收盤價在區間的位置計算量能方向是否支持趨勢, +1 為看多 (量能支持上升); 0 為看空 (量能支持下降).
以下利用 yfinance 取得台股 0050 價量資料來計算 OBV 與 AOBV 指標, 並於 K 線圖的副圖中分別繪製 OBV 與 AOBV 曲線 ( 使用 df.ta.aobv() 也會同時自動產生原始 OBV 值).
首先匯入 yfinance 與 pandas-ta 套件 :
>>> import yfinance as yf
>>> import pandas_ta as ta
下載 yfinance 股票價量資料 :
>>> df=yf.download('0050.TW', start='2024-11-06', end='2025-01-09', auto_adjust=False)
[*********************100%***********************] 1 of 1 completed
為了取值與繪製 K 線圖, 須將 DataFrame 改為傳統的單層欄位 :
>>> df.columns=df.columns.map(lambda x: x[0])
在計算指標之前, 先用 help(ta.aobv) 檢視 AOBV 指標的參數結構 :
>>> help(ta.aobv)
Help on function aobv in module pandas_ta.volume.aobv:
aobv(close, volume, fast=None, slow=None, max_lookback=None, min_lookback=None, mamode=None, offset=None, **kwargs)
Indicator: Archer On Balance Volume (AOBV)
可見 ta.aobv() 要傳入收盤價與成交量, 其傳回值為一個 DatFrame, 如果是呼叫 df.ta.aobv() 方法, 它會將計算結果自動加入 df 中 :
>>> df.ta.aobv(close='Close', append=True)
OBV OBV_min_2 ... AOBV_LR_2 AOBV_SR_2
Date ...
2024-11-06 66825504.0 NaN ... 0 0
2024-11-07 120819712.0 66825504.0 ... 0 0
2024-11-08 172620316.0 120819712.0 ... 0 0
2024-11-11 222076368.0 172620316.0 ... 0 0
2024-11-12 116988020.0 116988020.0 ... 0 0
2024-11-13 80209660.0 80209660.0 ... 0 0
2024-11-14 31623200.0 31623200.0 ... 0 0
2024-11-15 61165524.0 31623200.0 ... 0 0
2024-11-18 7587460.0 7587460.0 ... 0 0
2024-11-19 38060744.0 7587460.0 ... 0 0
2024-11-20 37748744.0 37748744.0 ... 0 0
2024-11-21 -25757724.0 -25757724.0 ... 0 0
2024-11-22 6104624.0 -25757724.0 ... 0 0
2024-11-25 -25202028.0 -25202028.0 ... 0 1
2024-11-26 -70765316.0 -70765316.0 ... 0 1
2024-11-27 -127056060.0 -127056060.0 ... 0 1
2024-11-28 -179492516.0 -179492516.0 ... 0 1
2024-11-29 -146979636.0 -179492516.0 ... 0 1
2024-12-02 -104803324.0 -146979636.0 ... 0 1
2024-12-03 -64990900.0 -104803324.0 ... 1 0
2024-12-04 -39169904.0 -64990900.0 ... 1 0
2024-12-05 -9385092.0 -39169904.0 ... 1 0
2024-12-06 -36623116.0 -36623116.0 ... 1 0
2024-12-09 -18063660.0 -36623116.0 ... 1 0
2024-12-10 -35972888.0 -35972888.0 ... 1 0
2024-12-11 -62831644.0 -62831644.0 ... 0 1
2024-12-12 -42722680.0 -62831644.0 ... 0 1
2024-12-13 -24640972.0 -42722680.0 ... 1 0
2024-12-16 4733396.0 -24640972.0 ... 1 0
2024-12-17 41910312.0 4733396.0 ... 1 0
2024-12-18 41910312.0 41910312.0 ... 1 0
2024-12-19 -10269876.0 -10269876.0 ... 1 0
2024-12-20 -54763452.0 -54763452.0 ... 0 1
2024-12-23 -10059188.0 -54763452.0 ... 0 1
2024-12-24 22724420.0 -10059188.0 ... 1 0
2024-12-25 46348912.0 22724420.0 ... 1 0
2024-12-26 27134668.0 27134668.0 ... 1 0
2024-12-27 55084336.0 27134668.0 ... 1 0
2024-12-30 20375272.0 20375272.0 ... 1 0
2024-12-31 -10970864.0 -10970864.0 ... 0 1
2025-01-02 -62161672.0 -62161672.0 ... 0 1
2025-01-03 -33708188.0 -62161672.0 ... 0 1
2025-01-06 64802984.0 -33708188.0 ... 1 0
2025-01-07 128578360.0 64802984.0 ... 1 0
2025-01-08 81155492.0 81155492.0 ... 1 0
[45 rows x 7 columns]
其中 AOBV_LR_2 與 AOBV_SR_2 即為 AOBV 指標計算結果, 分別為長短期 AOBV 指標, 注意, 它的值只有 0 與 1, 它是將連續的 OBV 累積線轉換為更易於判讀的二元 (Binary) 買賣信號以便於趨勢判斷, 0 代表賣出/趨勢向下 (Sell/Down), 表示該時間框架內的淨累積量趨勢為負向 (即賣盤力量大於買盤); 1 代表買入/趨勢向上 (Buy/Up), 表示該時間框架內的淨累積量趨勢為正向 (即買盤力量大於賣盤).
檢視 df 欄位 :
>>> df.columns
Index(['Adj Close', 'Close', 'High', 'Low', 'Open', 'Volume', 'OBV',
'OBV_min_2', 'OBV_max_2', 'OBVe_4', 'OBVe_12', 'AOBV_LR_2',
'AOBV_SR_2'],
dtype='object')
可見 df.ta.aobv() 將計算結果加入 df 中, 新欄位說明如下 :
- OBV : 原始 On-Balance Volume
- OBV_min_2 : OBV 最低值 (期間 2 日)
- OBV_max_2 : OBV 最高值 (期間 2 日)
- OBVe_4 : 指數平滑 OBV (期間 4 日)
- OBVe_12 : 指數平滑 OBV (期間 12 日)
- AOBV_LR_2 : AOBV 長期加權累積量信號 (期間 2 日)
- AOBV_SR_2 : AOBV 短期加權累積量信號 (期間 2 日)
其中 AOBV_LR_2 為長期 AOBV, 顯示趨勢方向; 而 AOBV_SR_2 為短期 AOBV, 顯示近期資金流入/流出變化, 可用 kbar 套件來繪製 K 線圖, OBV, 與 AOBV 的長短期加權累積量變化 :
>>> from kbar import KBar
>>> kb=KBar(df)
設定字型為: Microsoft JhengHei
先在 pannel 2 繪製原始 OBV 曲線副圖 :
>>> kb.addplot(
df['OBV'],
panel=2,
color='red', # OBV 線顏色
width=1.2,
ylabel='OBV' # 設定此副圖的 Y 軸標籤
)
然後在 pannel 3 繪製 AOBV 長期 (紅色) 加權累積量線 :
>>> kb.addplot(
df['AOBV_LR_2'],
panel=3,
color='red', # AOBV 長期加權累積量線顏色
width=1.2,
ylabel='AOBV' # 設定此副圖的 Y 軸標籤
)
同樣在 pannel 3 繪製 AOBV 短期 (藍色) 加權累積量線 :
>>> kb.addplot(
df['AOBV_SR_2'],
panel=3,
color='blue', # AOBV 短期加權累積量線顏色
width=1.2
)
呼叫 KBar 物件的 plot() 方法繪製 K 線圖 :
>>> kb.plot(
volume=True, # 顯示成交量副圖 (Panel 1)
mav=(5, 10), # K 線圖上疊加 5 日和 10 日均線
title='K 線圖與 OBV, AOBV 指標'
)
使用指定字型: Microsoft JhengHei
字型候選清單: ['Microsoft JhengHei', 'DejaVu Sans', 'Arial']
完整程式碼 :
# pandas_ta_aobv.py
import yfinance as yf
import pandas_ta as ta
from kbar import KBar
df=yf.download('0050.TW', start='2024-11-06', end='2025-01-09', auto_adjust=False)
df.columns=df.columns.map(lambda x: x[0])
df.ta.aobv(close='Close', append=True)
kb=KBar(df)
kb.addplot(df['OBV'], panel=2, color='red', width=1.2, ylabel='OBV')
kb.addplot(df['AOBV_LR_2'], panel=3, color='red', width=1.2, ylabel='AOBV')
kb.addplot(df['AOBV_SR_2'], panel=3, color='blue', width=1.2)
kb.plot(volume=True, mav=(5, 10), title='K 線圖與 OBV, AOBV 指標')
執行結果 :
其中 AOBV 藍線 (長期 AOBV, LR) 趨勢變化較慢, 代表較長期的資金累積或趨勢方向, 當藍線變為 1 (上方) 時代表長期資金積累趨勢向上; 變為 0 (下方) 時代表趨勢向下. AOBV 紅線 (短期 AOBV, SR) 趨勢變化較快, 代表較短期的資金累積或市場情緒, 當紅線變為 1 (上方) 時通常代表短期買盤增強; 變為 0 (下方) 時代表短期賣盤增強.
解讀如下 :
- 2024-11-06 ~ 2024-11-22 :
長短期 AOBV 均為 0, 空頭趨勢確認, 長短期資金累積皆為負向, 股價從高點 $50.5 附近開始下跌並盤整於 $48 上下. - 2024-11-25 :
SR 線從 0 轉 1, 短期買盤出現, 短期資金累積轉正, 股價在低檔 $47.5 附近震盪, 但尚未上漲. - 2024-12-31 :
LR 線從 0 轉 1, 長期趨勢轉正, 長期資金累積開始轉正, 死叉發生 (SR 回到 0), 但 LR 的轉正顯示長期動能恢復, 股價仍在 $47 附近, 但 OBV 曲線開始築底回升. - 2024-12-11 :
SR 線轉 1, 短期買盤再次出現, 短期資金積極, 股價從 $47.5 附近開始回升, 進入 $48 左右的盤整區. - 2024-12-13 :
LR 線從 0 轉 1, 長期趨勢再轉正, 長期資金累積轉正, 死叉發生, 股價開始在 $48 上方站穩. - 2024-12-20 :
SR 線轉 1, 短期買盤強勁, 股價小幅拉升, 股價突破 $48.5$. - 2024-12-24 :
LR 線從 0 轉 1, 長期趨勢再轉正, 股價上漲, 股價突破 $49$ 關卡. - 2024-12-31 :
SR 線轉 1, 短期買盤主導, 價格向上嘗試突破, 股價在 $50 附近震盪. - 2025-01-06 :
LR 線轉 1, 強力多頭確認, 隨後幾日 SR 線再次轉 0, 但 LR 線持續為 1, 顯示長期資金累積趨勢非常強勁。股價突破 $50$ 並持續走高, 創下圖中新高.
總之, 長期訊號 AOBV_LR_2 用來判斷長期量能方向; 而短期訊號 AOBV_SR_2 則是用來判斷短期量能方向, 解讀規則總結如下表 :
| AOBV 指標組合 | 說明 |
|---|---|
| LR=1, SR=0 | 長期多頭,短期整理 → 穩健上升 |
| LR=0, SR=1 | 長期空頭,短期反彈 → 短期買點,但整體偏空 |
| LR=1, SR=1 | 長短期都偏多 → 強勢多頭 |
| LR=0, SR=0 | 長短期都偏空 → 強勢空頭或盤整 |

沒有留言 :
張貼留言