7、累积成交量增量(CVD):从定义到实战

各位同学,今天我们来聊一个在订单流分析中非常核心的指标——CVD。

说实话,刚开始做量化那会儿,我总觉得成交量就是成交量,价格就是价格,两者分开看就行。直到有一次在期货盘口上吃了个大亏——价格明明在涨,我追进去,结果瞬间被套。复盘时才发现,那波上涨背后,主动卖单其实一直在悄悄增加。嗯,从那以后,我就把CVD列入了我的必看指标清单。

7.1 CVD的定义:到底在算什么东西?

CVD,全称Cumulative Volume Delta,中文叫累积成交量增量。说白了,它就是把每一笔的「主动买盘 - 主动卖盘」累加起来。

你想想看,每一笔成交都有买卖双方。但谁更主动?谁在吃单?这个信息就藏在Delta里。

核心公式:

CVD = Σ (主动买盘成交量 - 主动卖盘成交量)

从第一个数据点开始,逐笔累加。

举个例子:

时间 价格 主动买盘 主动卖盘 单笔Delta CVD
09:30:01 100.00 500 200 +300 +300
09:30:02 100.02 300 400 -100 +200
09:30:03 100.01 100 600 -500 -300

看到没?价格从100.00涨到100.02又跌回100.01,但CVD从+300直接掉到-300。这说明什么?说明虽然价格没怎么变,但主动卖盘已经悄悄占了上风。

7.2 CVD与价格背离:最危险的信号

我个人习惯,把CVD和价格走势放在同一张图上对比。背离,就是我最关注的信号。

两种背离形态:

  • 顶背离:价格创新高,但CVD没创新高,甚至走低。说明上涨缺乏主动买盘支撑,是虚涨。
  • 底背离:价格创新低,但CVD没创新低,甚至走高。说明下跌缺乏主动卖盘推动,是假跌。

我曾经踩过的坑:

有一次做螺纹钢的日内交易,看到价格突破前高,CVD却还在低位徘徊。我当时觉得「背离了,赶紧空」。结果价格继续拉了两根大阳线,我被迫止损。后来复盘发现,那波上涨是突发利多消息驱动的,CVD虽然没跟上,但大单资金流是正的。所以记住:CVD背离不是100%的入场信号,它需要结合盘口深度和消息面一起看。

7.3 Python实现CVD指标

好了,理论讲完,咱们直接上代码。我习惯用pandas来处理,因为数据量大的时候,向量化操作比循环快得多。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def calculate_cvd(tick_data):
    """
    计算CVD指标
    tick_data: DataFrame,必须包含列:
        - 'price': 成交价格
        - 'volume': 成交量
        - 'side': 主动买卖方向,'buy'或'sell'
    """
    # 计算单笔Delta
    tick_data['delta'] = np.where(
        tick_data['side'] == 'buy',
        tick_data['volume'],
        -tick_data['volume']
    )
    
    # 累积求和得到CVD
    tick_data['cvd'] = tick_data['delta'].cumsum()
    
    return tick_data

# 示例数据
data = pd.DataFrame({
    'price': [100.0, 100.02, 100.01, 100.03, 100.0],
    'volume': [500, 300, 100, 700, 200],
    'side': ['buy', 'sell', 'sell', 'buy', 'sell']
})

result = calculate_cvd(data)
print(result[['price', 'volume', 'side', 'delta', 'cvd']])

实战小技巧:

我建议把CVD和价格画在双轴图上。价格用K线或折线,CVD用柱状图或面积图。这样背离一眼就能看出来。

def plot_cvd_price(df):
    fig, ax1 = plt.subplots(figsize=(12, 6))
    
    # 价格折线
    ax1.plot(df['price'], color='blue', label='Price')
    ax1.set_ylabel('Price', color='blue')
    
    # CVD柱状图
    ax2 = ax1.twinx()
    colors = ['green' if v >= 0 else 'red' for v in df['cvd']]
    ax2.bar(df.index, df['cvd'], color=colors, alpha=0.3, label='CVD')
    ax2.set_ylabel('CVD', color='black')
    
    plt.title('Price vs CVD')
    plt.show()

7.4 知识体系总览

下面这张图,是我自己整理CVD知识体系时画的。你把它存下来,以后每次用CVD之前扫一眼,思路会清晰很多。

CVD指标 定义与计算 价格背离识别 Python实现 逐笔Delta 累积求和 正负方向 顶背离 底背离 结合盘口验证 向量化计算 双轴可视化 背离信号检测

7.5 实战中的注意事项

最后,分享几个我用CVD时总结的经验:

  • 时间周期要匹配:如果你看的是1分钟K线,CVD也要用1分钟的Tick数据累加。用日线数据算CVD,基本没什么意义。
  • 注意数据源质量:有些交易所的Tick数据会丢失或者重复。我建议先做一次去重和排序,否则CVD会漂移。
  • 别只看CVD绝对值:我更关注CVD的斜率变化。CVD从上升转为走平,往往比CVD本身的高低更有信号价值。

一句话总结:

CVD是订单流分析里最直观的「资金态度」指标。价格可以骗人,但主动买卖盘的累积量很难造假。学会看CVD背离,你就多了一双看透盘口的眼睛。

无相订单流研究社 微信Lucian808555