VR (Volume Ratio) - 成交量变异率
1 公式
- AV = 股价上升日成交量;AVS = N日内AV求和
- BV = 股价下跌日成交量;BVS = N日内BV求和
- CV = 股价平盘日成交量;CVS = N日内CV求和
- VR = (AVS+1/2CVS) ➗ (BVS+1/2CVS) ✖ 100
- MAVR = VR的M日简单移动平均
2 数据准备
我们以科创50指数 000688 为例,指数开始日期为2019-12-31,数据格式如下:
3 计算过程
def calculate_vr(df: pd.DataFrame, N=26, M=6):
'''
计算Volume Ratio (VR) 指标和其M天移动平均线 MAVR。
参数:
df (pd.DataFrame): 包含至少'close'和'volume'列的DataFrame,分别代表收盘价和成交量。
N (int): 用于计算VR指标的时间窗口大小,默认为26。
M (int): 用于计算MAVR的时间窗口大小,默认为6。
返回:
pd.DataFrame: 包含VR和MAVR值的DataFrame。
'''
# 创建一个df的副本以避免修改原始数据
data = df.copy()
# 计算每日收盘价的变化
data['diff'] = data['close'].diff()
# 根据收盘价的变化,将成交量分为三类:
# av (Accumulation Volume) - 上涨时的成交量
# dv (Distribution Volume) - 下跌时的成交量
# uv (Unchanged Volume) - 收盘价不变时的成交量
data['av'] = np.where(data['diff'] > 0, data['volume'], 0)
data['dv'] = np.where(data['diff'] < 0, abs(data['volume']), 0)
data['uv'] = np.where(data['diff'] == 0, data['volume'], 0)
# 计算过去N天的AV, DV, UV的滚动求和
avs = data['av'].rolling(N, min_periods=M).sum()
dvs = data['dv'].rolling(N, min_periods=M).sum()
uvs = data['uv'].rolling(N, min_periods=M).sum()
# 计算VR指标
# VR = (AV_sum + 0.5 * UV_sum) / (DV_sum + 0.5 * UV_sum) * 100
vr = (avs + 0.5 * uvs) / (dvs + 0.5 * uvs) * 100
data['vr'] = vr
# 计算VR指标的M天移动平均线 MAVR
data['mavr'] = data['vr'].rolling(M).mean()
# 返回包含VR和MAVR指标的DataFrame
return data
4 注意事项
参数N=26,M=6时与东方财富软件中一致
雪球无此指标