Pharos
TAVolume

TA.OBV() - 能量潮

能量潮 (On Balance Volume)

通过累积成交量的方向性变化来衡量买卖压力。

返回成交量指标目录


语法

python
TA.OBV(close, volume)

参数

参数名类型必选默认值说明
closeany-收盘价数组
volumeany-成交量数组

返回值

返回 OBV 值数组,与输入数组长度相同。

计算方法

能量潮通过累积成交量的方向性变化来计算:

  • 当日收盘价 > 昨日收盘价:OBV += 当日成交量
  • 当日收盘价 < 昨日收盘价:OBV -= 当日成交量
  • 当日收盘价 = 昨日收盘价:OBV 不变

OBV 的绝对值不重要,重要的是其趋势方向。

信号解读

基本信号

  1. OBV 上升 + 价格上升:健康的上升趋势,买盘强劲
  2. OBV 下降 + 价格下降:健康的下降趋势,卖盘强劲
  3. 价格上升 + OBV 下降:顶背离,可能见顶
  4. 价格下降 + OBV 上升:底背离,可能见底

趋势确认

  • OBV 创新高确认上升趋势
  • OBV 创新低确认下降趋势
  • OBV 突破均线显示趋势加强

基础示例

价量关系判断

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 30:
            Sleep(1000)
            continue
        
        closes = [r['Close'] for r in records]
        volumes = [r['Volume'] for r in records]
        
        obv = TA.OBV(closes, volumes)
        
        # 价量关系判断
        if obv[-1] > obv[-2] and closes[-1] > closes[-2]:
            Log("价量齐升,强势信号")
            
        elif obv[-1] < obv[-2] and closes[-1] < closes[-2]:
            Log("价量齐跌,弱势信号")
            
        elif obv[-1] < obv[-2] and closes[-1] > closes[-2]:
            Log("价涨量跌,背离,可能见顶")
            
        elif obv[-1] > obv[-2] and closes[-1] < closes[-2]:
            Log("价跌量涨,背离,可能见底")
        
        Sleep(60000)

高级应用

OBV 趋势确认策略

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 50:
            Sleep(1000)
            continue
        
        closes = [r['Close'] for r in records]
        volumes = [r['Volume'] for r in records]
        
        obv = TA.OBV(closes, volumes)
        
        # 计算 OBV 的移动平均
        obv_sma = TA.SMA(obv, 20)
        
        # OBV 突破其均线
        if obv[-1] > obv_sma[-1] and obv[-2] <= obv_sma[-2]:
            Log("OBV 突破均线,成交量支持上涨,买入信号")
            # 可以考虑买入
            
        elif obv[-1] < obv_sma[-1] and obv[-2] >= obv_sma[-2]:
            Log("OBV 跌破均线,成交量支持下跌,卖出信号")
            # 可以考虑卖出
        
        Sleep(60000)

突破有效性验证

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 50:
            Sleep(1000)
            continue
        
        highs = [r['High'] for r in records]
        closes = [r['Close'] for r in records]
        volumes = [r['Volume'] for r in records]
        current_price = closes[-1]
        
        # 计算阻力位(20 周期最高价)
        resistance = max(highs[-20:])
        
        # OBV 确认
        obv = TA.OBV(closes, volumes)
        
        # 向上突破阻力位
        if current_price > resistance and obv[-1] > obv[-2]:
            Log("价格突破阻力位且 OBV 上升,有效突破")
            # exchange.Buy(...)
        
        # 假突破(价格突破但 OBV 未确认)
        elif current_price > resistance and obv[-1] < obv[-2]:
            Log("价格突破但 OBV 未确认,可能是假突破,观望")
        
        Sleep(60000)

OBV 背离检测

python
def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 100:
            Sleep(1000)
            continue
        
        closes = [r['Close'] for r in records]
        volumes = [r['Volume'] for r in records]
        
        obv = TA.OBV(closes, volumes)
        
        # 检测顶背离
        # 价格创新高但 OBV 未创新高
        price_new_high = closes[-1] == max(closes[-20:])
        obv_new_high = obv[-1] == max(obv[-20:])
        
        if price_new_high and not obv_new_high:
            Log("⚠️ 顶背离:价格创新高,但 OBV 未创新高,警惕回调")
        
        # 检测底背离
        # 价格创新低但 OBV 未创新低
        price_new_low = closes[-1] == min(closes[-20:])
        obv_new_low = obv[-1] == min(obv[-20:])
        
        if price_new_low and not obv_new_low:
            Log("✅ 底背离:价格创新低,但 OBV 未创新低,可能反弹")
        
        Sleep(60000)

参数优化建议

OBV 本身无参数,但可以配合其他指标优化:

配合指标参数建议说明
SMA10-20 周期OBV 的均线,判断趋势
EMA12 周期更快反应 OBV 变化
回溯周期20-50检测背离的时间窗口

与其他指标配合

OBV + 移动平均线

python
obv = TA.OBV(closes, volumes)
obv_ma = TA.SMA(obv, 20)

# OBV 在均线上方 = 上升趋势
if obv[-1] > obv_ma[-1]:
    Log("OBV 趋势向上")

OBV + AD 双重确认

python
obv = TA.OBV(closes, volumes)
ad = TA.AD(highs, lows, closes, volumes)

obv_trend = obv[-1] - obv[-5]
ad_trend = ad[-1] - ad[-5]

# 双重确认资金流入
if obv_trend > 0 and ad_trend > 0:
    Log("OBV + AD 双重确认资金流入")

OBV + 趋势指标

python
obv = TA.OBV(closes, volumes)
sma20 = TA.SMA(closes, 20)
sma50 = TA.SMA(closes, 50)

# 上升趋势 + OBV 支持
if sma20[-1] > sma50[-1] and obv[-1] > obv[-5]:
    Log("趋势向上且有成交量支持")

注意事项

  1. 相对值重要:OBV 的绝对数值无意义,关注其趋势方向
  2. 背离信号:价格与 OBV 的背离是重要的反转预警
  3. 时间周期:OBV 在较长周期(日线、周线)更可靠
  4. 配合使用:OBV 应与价格走势、其他指标结合使用
  5. 假突破识别:价格突破但 OBV 未确认,通常是假突破
  6. 单边市场:在单边上涨/下跌市场,OBV 会持续同向累积
  7. 震荡市场:在震荡市场,OBV 信号可能不明显

相关指标

实战要点

买入信号

✅ OBV 突破均线 + 价格上涨 ✅ 底背离出现(价跌量涨) ✅ OBV 创新高确认趋势

卖出信号

❌ OBV 跌破均线 + 价格下跌 ❌ 顶背离出现(价涨量跌) ❌ OBV 创新低确认趋势

风险控制

  • 背离信号需要价格确认才能交易
  • 结合其他指标(RSI、MACD)综合判断
  • 在重要支撑/阻力位附近关注 OBV 表现

返回成交量指标目录 | 返回 TA 指标总目录