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之前扫一眼,思路会清晰很多。
7.5 实战中的注意事项
最后,分享几个我用CVD时总结的经验:
- 时间周期要匹配:如果你看的是1分钟K线,CVD也要用1分钟的Tick数据累加。用日线数据算CVD,基本没什么意义。
- 注意数据源质量:有些交易所的Tick数据会丢失或者重复。我建议先做一次去重和排序,否则CVD会漂移。
- 别只看CVD绝对值:我更关注CVD的斜率变化。CVD从上升转为走平,往往比CVD本身的高低更有信号价值。
一句话总结:
CVD是订单流分析里最直观的「资金态度」指标。价格可以骗人,但主动买卖盘的累积量很难造假。学会看CVD背离,你就多了一双看透盘口的眼睛。