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) * 100vr = (avs + 0.5 * uvs) / (dvs + 0.5 * uvs) * 100data['vr'] = vr# 计算VR指标的M天移动平均线 MAVRdata['mavr'] = data['vr'].rolling(M).mean()# 返回包含VR和MAVR指标的DataFramereturn data
4 注意事项
参数N=26,M=6时与东方财富软件中一致
雪球无此指标