3、买卖价差分析:绝对价差、相对价差、有效价差、实现价差的计算与解读
买卖价差,说白了就是市场流动性的「过路费」。
你想想看,做交易最怕什么?不是价格涨跌,而是你想买的时候没人卖,想卖的时候没人买。价差就是衡量这个「摩擦成本」的核心指标。我个人习惯把价差分成四类来看:绝对价差、相对价差、有效价差、实现价差。每一类都有自己的脾气,咱们一个一个拆。
3.1 绝对价差(Absolute Spread)
这是最直观的指标。就是卖一价减去买一价。
绝对价差 = 卖一价 - 买一价
举个例子:某股票买一挂10.00元,卖一挂10.02元,那绝对价差就是0.02元。
嗯,这里要注意:绝对价差受价格水平影响很大。茅台一股2000块,价差0.5元很正常;但一只2块钱的ST股,价差0.5元就离谱了。所以光看绝对值不够,还得看相对值。
3.2 相对价差(Relative Spread)
相对价差 = 绝对价差 / 中间价 × 100%
中间价 = (买一价 + 卖一价) / 2
这个指标剔除了价格水平的影响,可以跨品种比较。比如茅台相对价差0.025%,而某小盘股相对价差0.5%,说明后者的流动性差了一个数量级。
| 品种 | 买一价 | 卖一价 | 绝对价差 | 相对价差 |
|---|---|---|---|---|
| 贵州茅台 | 2000.00 | 2000.50 | 0.50 | 0.025% |
| 某小盘股 | 10.00 | 10.05 | 0.05 | 0.498% |
| 沪深300ETF | 4.000 | 4.002 | 0.002 | 0.050% |
你看,绝对价差上茅台是0.50元,小盘股才0.05元,但相对价差茅台反而小得多。这就是为什么机构做跨品种流动性对比时,一定用相对价差。
3.3 有效价差(Effective Spread)
有效价差衡量的是「实际成交成本」。它不只看挂单,还看你的成交价格。
有效价差 = 2 × |成交价 - 中间价|
为什么叫「有效」?因为很多时候你没法按买一卖一成交。比如你急着买入,可能得吃卖二甚至卖三的价。有效价差就是算你实际付出的成本。
举个例子:中间价10.01元,你以10.03元买入,那有效价差就是2 × |10.03 - 10.01| = 0.04元。比绝对价差0.02元大了一倍——说明你付出了额外的流动性成本。
3.4 实现价差(Realized Spread)
这个指标有点意思。它衡量的是「做市商赚了多少」。
实现价差 = 2 × (成交价 - 事后中间价) (对于买入交易)
事后中间价一般取成交后5分钟或1小时的中间价。为什么?因为做市商提供流动性后,价格可能会朝不利方向变动。实现价差扣除了这部分「逆向选择成本」,剩下的才是做市商真正落袋的利润。
我举个例子你就明白了:
- 中间价10.00元,你以10.01元买入(吃单)
- 5分钟后,中间价变成10.00元
- 实现价差 = 2 × (10.01 - 10.00) = 0.02元
这意味着做市商赚了0.02元。但如果5分钟后中间价跌到9.99元,实现价差就变成0.04元——做市商赚得更多,因为他成功「把货出给了你」。
3.5 四种价差的逻辑关系
这四种价差不是孤立的,它们构成了一个完整的分析链条:
3.6 实战中的计算代码
说了这么多,咱们直接上代码。这是我个人常用的价差计算函数:
import pandas as pd
import numpy as np
def calculate_spreads(trade_df, quote_df, lookback_minutes=5):
"""
计算四种价差
参数:
trade_df: 成交数据,含 time, price, side
quote_df: 行情数据,含 time, bid, ask
lookback_minutes: 实现价差的事后回溯分钟数
"""
# 1. 绝对价差
quote_df['absolute_spread'] = quote_df['ask'] - quote_df['bid']
# 2. 相对价差
quote_df['mid_price'] = (quote_df['bid'] + quote_df['ask']) / 2
quote_df['relative_spread'] = quote_df['absolute_spread'] / quote_df['mid_price']
# 3. 有效价差
merged = pd.merge_asof(trade_df, quote_df, on='time', direction='nearest')
merged['effective_spread'] = 2 * abs(merged['price'] - merged['mid_price'])
# 4. 实现价差
quote_df['future_mid'] = quote_df['mid_price'].shift(-lookback_minutes)
merged = pd.merge_asof(merged, quote_df[['time', 'future_mid']], on='time', direction='nearest')
# 买入交易:实现价差 = 2 * (成交价 - 事后中间价)
merged['realized_spread'] = np.where(
merged['side'] == 'buy',
2 * (merged['price'] - merged['future_mid']),
2 * (merged['future_mid'] - merged['price'])
)
return merged[['time', 'absolute_spread', 'relative_spread',
'effective_spread', 'realized_spread']]
3.7 解读要点
算出来之后怎么看?我总结了几条经验:
- 绝对价差 > 0.1元:对于A股主板,这个水平说明流动性偏紧,大单进去容易滑点
- 相对价差 > 0.5%:对于主流品种,这个值偏高。我一般会把这个作为「不可交易」的阈值
- 有效价差 / 绝对价差 > 2:说明市场深度严重不足,你的订单在「吃单」而不是「挂单」
- 实现价差持续为负:做市商在亏钱,说明市场有强烈的信息不对称。这时候要小心,可能是内幕交易的前兆
嗯,价差分析这块就讲到这里。记住一句话:价差是流动性的「温度计」,但不是全部。下一层我们还要看深度和弹性,才能拼出完整的流动性画像。
公众号:蓝海资料掘金营,微信deep3321