Python 实现股票指标计算——OBV
OBV (On Balance Volume) - 能量潮
1 公式
1.1 第一种计算公式
该指标为累计指标:
当价格上涨时,成交量会被加入到运行总量中;当价格下跌时,成交量将从运行总量中减去。
1.2 第二种计算公式
多空比率净额= [(收盘价-最低价) - (最高价-收盘价)] ➗ (最高价 - 最低价) ✖ 成交量
2 数据准备
我们以科创50指数 000688 为例,指数开始日期为2019-12-31,数据格式如下:
3 计算过程
3.1 第一种计算公式
def calculate_obv(df: pd.DataFrame, N=10) -> pd.DataFrame:
'''
计算On-Balance Volume (OBV) 和 OBV的N期移动平均线。
参数:
df (pd.DataFrame): 包含至少'close'和'volume'列的DataFrame,分别代表收盘价和成交量。
N (int): 移动平均线的周期,默认值为10。
返回:
pd.DataFrame: 包含'obv'和'obv_ma'列的DataFrame,表示OBV值和OBV的移动平均线。
'''
# 创建一个df的副本以避免修改原始数据
data = df.copy()
# 定义一个函数来根据价格变化计算成交量信号
def volume_signal(diff, volume):
if diff > 0: # 如果当日收盘价高于前一日,则成交量视为正值
return volume
elif diff < 0: # 如果当日收盘价低于前一日,则成交量视为负值
return -volume
else: # 如果收盘价没有变化,则成交量视为0
return 0
# 计算收盘价的变化差额
data['diff'] = data['close'].diff()
# 应用volume_signal函数到'diff'和'volume'列上,并将结果保存在'volume_signal'列中
data['volume_signal'] = data.apply(
lambda x: volume_signal(x['diff'], x['volume']), axis=1)
# 计算累积成交量(OBV)
data['obv'] = data['volume_signal'].cumsum() / 10000 # 除以10000通常是为了缩放数据,使其更易读
# 计算OBV的N期移动平均线
data['obv_ma'] = data['obv'].rolling(N).mean()
# 返回包含OBV和OBV移动平均线的新DataFrame
return data
3.2 第二种计算公式
def calculate_obv(df: pd.DataFrame, N=10) -> pd.DataFrame:
'''
计算On-Balance Volume (OBV) 和 OBV的N期移动平均线。
参数:
df (pd.DataFrame): 包含至少'close'和'volume'列的DataFrame,分别代表收盘价和成交量。
N (int): 移动平均线的周期,默认值为10。
返回:
pd.DataFrame: 包含'obv'和'obv_ma'列的DataFrame,表示OBV值和OBV的移动平均线。
'''
# 创建一个df的副本以避免修改原始数据
data = df.copy()
# 多空比率净额= [(收盘价-最低价)-(最高价-收盘价)] ÷( 最高价-最低价)×V
data['obv'] = (2*data['close']-data['low']-data['high']) / \
(data['high']-data['low'])*data['volume']/10000
# 计算OBV的N期移动平均线
data['obv_ma'] = data['obv'].rolling(N).mean()
# 返回包含信封指标的新DataFrame
return data
4 注意事项
第一种公式计算结果与东方财富软件中存在差异,原因为东方财富第一日成交量记为负值,除了第一日数据,之后的数据结果一致
雪球无此指标
原文地址:https://blog.csdn.net/myqijin/article/details/140514082
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!