自学内容网 自学内容网

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)!