Python 實現 OBV 指標計算:股票技術分析的利器系列(7)
- 介紹
- 算法解釋
- 代碼
- rolling函數介紹
- 核心代碼
- 計算 VA 列
- 計算 OBV 列
- 計算 MAOBV
- 完整代碼
介紹
OBV 指標是“On-Balance Volume”的縮寫,意為“量價平衡指標”。它是一種用于衡量買賣壓力的技術分析工具,主要基于成交量的變化來預測價格趨勢。OBV 指標的計算方法很簡單,它將每日的成交量根據價格變動分為買入量和賣出量,然后根據這些量的正負來對當前價格走勢形成判斷。
OBV 指標的基本原理是,如果某一天的收盤價高于前一天的收盤價,則當天的成交量被視為買入量,反之則被視為賣出量。通過累加這些買入量和賣出量,形成一個持續增加或減少的曲線,這條曲線反映了資金流入和流出的情況。當 OBV 曲線上升時,意味著成交量在上漲,市場上存在著買盤力量;反之,當 OBV 曲線下降時,意味著成交量在下降,市場上存在著賣盤力量。
先看看官方介紹:
OBV (累積能量線)
用法
1.股價一頂比一頂高,而OBV 一頂比一頂低,暗示頭部即將形成;
2.股價一底比一底低,而OBV 一底比一底高,暗示底部即將形成;
3.OBV 突破其 N 字形波動的高點次數達5 次時,為短線賣點;
4.OBV 跌破其 N 字形波動的低點次數達5 次時,為短線買點;
5.OBV 與ADVOL、PVT、WAD、ADL同屬一組指標群,使用時應綜合研判。
算法解釋
VA:=IF(CLOSE>REF(CLOSE,1),VOL,-VOL);
OBV:SUM(IF(CLOSE=REF(CLOSE,1),0,VA),0);
MAOBV:MA(OBV,M);
-
VA 計算:
- 這行代碼首先計算了 VA(Volume Accumulation)。
CLOSE > REF(CLOSE, 1)
是一個條件,檢查當前收盤價是否高于前一天的收盤價。- 如果當前收盤價高于前一天的收盤價,則 VA 為當日成交量(VOL);否則為當日成交量的負值(-VOL)。
-
OBV 計算:
- 這行代碼計算了 OBV(On-Balance Volume)。
IF(CLOSE=REF(CLOSE,1),0,VA)
這一部分首先判斷當前收盤價是否等于前一天的收盤價,如果相等,則對應的 VA 為 0,否則為 VA 的值。- 然后使用
SUM
函數對這些 VA 值進行累加,得到 OBV。
-
MAOBV 計算:
- 這行代碼計算了 MAOBV(Moving Average of OBV)。
MA(OBV, M)
是對 OBV 列進行移動平均計算,其中 M 是移動平均窗口的大小。
代碼
rolling函數介紹
rolling
函數通常與其他函數(如 mean
、sum
、std
等)一起使用,以計算滾動統計量,例如滾動均值、滾動總和等。
以下是 rolling
函數的基本語法:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
window
: 用于計算統計量的窗口大小。min_periods
: 每個窗口最少需要的非空觀測值數量。center
: 確定窗口是否居中,默認為False
。win_type
: 窗口類型,例如None
、boxcar
、triang
等,默認為None
。on
: 在數據幀中執行滾動操作的列,默認為None
,表示對整個數據幀執行操作。axis
: 執行滾動操作的軸,默認為0
,表示按列執行操作。closed
: 確定窗口的哪一端是閉合的,默認為None
。
核心代碼
計算 VA 列
# 計算 VA 列
df['VA'] = df['VOL'].where(df['CLOSE'] > df['CLOSE'].shift(1), -df['VOL'])
VA 列也被稱為 “Volume Adjustment”(成交量調整)列。它表示在價格上漲時和價格下跌時的成交量調整值,根據收盤價與前一日收盤價的比較情況來確定是正值還是負值。因此,它可以用來衡量價格變動對成交量的影響,有助于理解買賣壓力的變化
計算 OBV 列
# 計算 OBV 列
df['OBV'] = df['VA'].where(df['CLOSE'] != df['CLOSE'].shift(1), 0).cumsum()
OBV 列通常也稱為"On-Balance Volume"(量價平衡指標)列。 OBV 是一種累積型的指標,用于衡量買入和賣出壓力的相對強度。 OBV 列的數值根據成交量的變化以及價格走勢的漲跌而增加或減少,它反映了資金流入和流出的情況。 OBV 列的變化可以幫助分析者判斷價格趨勢的強弱以及市場的買賣力量對比情況。
計算 MAOBV
# 計算 MAOBV
M = 30
df['MAOBV'] = df['OBV'].rolling(window=M).mean()
完整代碼
import pandas as pdimport a_get_datadata = {'CLOSE': 填每日收盤的數據,'VOL': 填每日交易量的數據
}df = pd.DataFrame(data)
# 計算 VA 列
df['VA'] = df['VOL'].where(df['CLOSE'] > df['CLOSE'].shift(1), -df['VOL'])# 計算 OBV 列
df['OBV'] = df['VA'].where(df['CLOSE'] != df['CLOSE'].shift(1), 0).cumsum()# 計算 MAOBV
M = 30
df['MAOBV'] = df['OBV'].rolling(window=M).mean()# 打印結果
print(df)