2025年11月24日 星期一

Python 學習筆記 : 技術分析套件 pandas-ta 用法 (六)

本篇旨在測試 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 長短期都偏空 → 強勢空頭或盤整


沒有留言 :