第七章:Delta与CVD分析
各位同学,今天我们来聊聊订单流交易里最核心的两个指标——Delta和CVD。说实话,这两个东西我刚开始接触时也觉得挺玄乎,不就是买卖量相减嘛。但真正在实盘里跑起来,你会发现它们就像市场的「心电图」,能提前告诉你价格要往哪走。
7.1 逐笔成交Delta计算
先说说Delta。它的定义很简单:每一笔成交中,主动买单量减去主动卖单量。正Delta说明买方更主动,负Delta说明卖方更主动。
但这里有个坑——你得搞清楚什么是「主动」。我见过不少新手把成交明细里的「买」和「卖」直接当成主动方向,其实不对。交易所的成交明细里,标记为「买」的通常是主动买,标记为「卖」的是主动卖。但有些数据源会反过来,你得先确认。
来看一段我实际用过的计算代码:
def calculate_delta(trades):
"""
逐笔计算Delta
trades: list of dict, 每笔包含 price, volume, side
side: 'buy' 表示主动买, 'sell' 表示主动卖
"""
delta = 0
delta_series = []
for trade in trades:
if trade['side'] == 'buy':
delta += trade['volume']
else:
delta -= trade['volume']
delta_series.append({
'time': trade['time'],
'price': trade['price'],
'delta': delta
})
return delta_series
嗯,这里要注意:Delta是累计值,不是单笔值。单笔Delta只是瞬时信号,累计Delta才能看出趋势。
核心要点:Delta反映的是「谁在主导市场」。正Delta持续扩大,说明买方在吸筹;负Delta持续扩大,说明卖方在出货。但别只看绝对值,要看变化速率。
7.2 累计成交量差(CVD)指标
CVD,全称Cumulative Volume Delta,其实就是Delta的累计版本。但为什么我要单独拿出来讲?因为CVD能帮你过滤掉很多噪音。
举个例子:某只股票在10秒内出现了3笔大单买入,Delta瞬间冲到+5000,但随后价格没怎么动。如果你只看单笔Delta,可能会觉得「哇,有大资金进场」。但CVD告诉你:这5000的Delta在5分钟维度上只占了总成交量的2%,其实没什么意义。
我习惯用两种CVD:
- 日内CVD:从开盘开始累计,适合日内交易
- 滚动CVD:取最近N笔成交的Delta和,适合捕捉短期动量
滚动CVD的计算方式:
def rolling_cvd(trades, window=100):
"""
滚动CVD,取最近window笔成交的Delta和
"""
deltas = []
cvd_series = []
for trade in trades:
if trade['side'] == 'buy':
deltas.append(trade['volume'])
else:
deltas.append(-trade['volume'])
# 只保留最近window笔
if len(deltas) > window:
deltas.pop(0)
cvd_series.append({
'time': trade['time'],
'price': trade['price'],
'cvd': sum(deltas)
})
return cvd_series
我的经验:滚动窗口大小很关键。做高频交易我用50笔,做日内波段用200笔。太小了噪音大,太大了反应迟钝。你可以用历史数据回测一下,找到最适合你品种的参数。
7.3 Delta背离识别
这是我最喜欢用的信号之一。什么叫Delta背离?说白了就是:价格创新高,但Delta没创新高;或者价格创新低,但Delta没创新低。
为什么会这样?你想想看,价格涨上去了,但主动买盘的力量却在减弱,说明这个上涨是「虚的」。我遇到过好几次这种情况——价格冲高回落,Delta背离就是最好的预警。
识别背离的步骤:
- 找到价格的高点/低点
- 找到对应时间点的Delta值
- 比较价格和Delta的走势是否一致
代码实现:
def detect_divergence(prices, deltas, lookback=20):
"""
检测Delta背离
返回:'bullish' 看涨背离, 'bearish' 看跌背离, None 无背离
"""
# 找价格高点
price_high = max(prices[-lookback:])
price_high_idx = prices.index(price_high)
# 找对应Delta
delta_at_high = deltas[price_high_idx]
# 比较当前价格和Delta
current_price = prices[-1]
current_delta = deltas[-1]
# 看跌背离:价格创新高,Delta没跟上
if current_price > price_high and current_delta < delta_at_high:
return 'bearish'
# 看涨背离:价格创新低,Delta没跟上
price_low = min(prices[-lookback:])
price_low_idx = prices.index(price_low)
delta_at_low = deltas[price_low_idx]
if current_price < price_low and current_delta > delta_at_low:
return 'bullish'
return None
避坑指南:我曾经在2019年做螺纹钢期货时,连续三次Delta背离都失败了。后来发现是时间周期没对齐——价格用1分钟K线,Delta用逐笔数据,两者天然存在延迟。记住:一定要用同一时间基准。
7.4 Delta与价格关系建模
最后这部分,我们来聊聊怎么把Delta和价格的关系量化。说白了,就是找「Delta变化多少,价格会跟着动多少」这个规律。
我常用的方法有两种:
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 线性回归 | Delta变化量 → 价格变化量 | 趋势明显的行情 |
| 分位数回归 | 不同Delta分位数下的价格响应 | 震荡行情,非线性关系 |
线性回归的代码示例:
import numpy as np
from sklearn.linear_model import LinearRegression
def delta_price_model(delta_changes, price_changes):
"""
建立Delta变化与价格变化的线性模型
"""
X = np.array(delta_changes).reshape(-1, 1)
y = np.array(price_changes)
model = LinearRegression()
model.fit(X, y)
# 斜率:每单位Delta变化对应的价格变化
slope = model.coef_[0]
# 截距:无Delta变化时的价格漂移
intercept = model.intercept_
return {
'slope': slope,
'intercept': intercept,
'r_squared': model.score(X, y)
}
嗯,这里有个细节:Delta变化和价格变化要取同一时间窗口。我习惯用1秒窗口,太短了噪声大,太长了滞后严重。
实战建议:别指望模型能100%预测价格。Delta只是众多因子中的一个。我通常把Delta模型的预测结果作为「权重信号」——比如模型预测价格要涨,我就把仓位从30%加到50%,而不是直接满仓干。
最后,送大家一张我画的Delta分析框架图,把今天讲的内容串起来:
这张图把整个流程串起来了:从原始数据出发,经过Delta和CVD计算,再到背离识别和关系建模,最后输出交易信号。每一步都有坑,每一步也都有机会。
最后说一句:Delta和CVD不是万能钥匙。我见过有人把Delta当成圣杯,结果亏得裤衩都不剩。记住:任何指标都要结合市场环境。震荡市里Delta背离很准,单边市里反而容易反向。多测试,多复盘,慢慢你就能找到感觉。