第二章 市场微观结构:订单簿与价差、交易成本与滑点、流动性对套利的影响
各位同学,咱们今天聊点实在的。很多做统计套利的朋友,模型跑得飞起,回测曲线漂亮得不行,一上实盘就亏钱。为什么?说白了,就是没搞懂市场微观结构。你想想看,你的策略是在一个理想化的市场里交易,但真实市场是有摩擦的——有价差、有滑点、有流动性问题。这些东西,才是决定你策略能不能赚钱的关键。
我个人习惯,做任何策略之前,先花一周时间研究这个品种的微观结构。磨刀不误砍柴工,真的。
2.1 订单簿与价差:市场的呼吸
订单簿是什么?就是所有买单和卖单的排队列表。你可以把它想象成一个菜市场——有人喊价买,有人喊价卖,中间那个差价,就是价差(Spread)。
我刚开始做高频套利的时候,总觉得价差就是个常数。后来发现,完全不是那么回事。价差会随着市场情绪、时间、成交量剧烈波动。举个例子,某只股票平时价差只有0.01元,但财报发布前几分钟,价差能扩大到0.05元甚至更多。
核心概念:
- 买一价(Bid):当前最高买入价
- 卖一价(Ask):当前最低卖出价
- 价差(Spread) = Ask - Bid
- 中间价(Mid Price) = (Bid + Ask) / 2
价差就是你的交易成本。你想想看,如果你在买一价买入,在卖一价卖出,一进一出你就亏了一个价差。对于统计套利这种频繁交易的策略来说,价差就是你的天敌。
我曾经做过一个统计套利策略,回测年化收益30%,但实盘跑了一个月,收益只有5%。后来一查,问题就出在价差上。回测时我用的成交价是中间价,但实盘里我根本拿不到那个价格。
2.2 交易成本与滑点:看不见的吸血鬼
交易成本不只是佣金和印花税。真正的交易成本,包括三部分:
| 成本类型 | 说明 | 典型范围 |
|---|---|---|
| 显性成本 | 佣金、印花税、过户费 | 0.01% - 0.1% |
| 隐性成本 | 价差成本 | 0.01% - 0.5% |
| 冲击成本 | 大单交易导致价格变动 | 0.05% - 1%+ |
滑点是什么?就是你下单时的预期价格,和实际成交价格之间的差异。比如你想在10.00元买入,但等你下单时,价格已经跳到10.02元了。这0.02元就是滑点。
为什么会这样?因为市场在动。你的订单需要时间传输到交易所,交易所需要时间撮合,这期间价格可能已经变了。对于高频策略来说,滑点可能是致命的。
我的经验:做回测时,一定要加上滑点模型。我一般用两种方式:
- 固定滑点:每笔交易加0.01元或0.02元
- 比例滑点:按成交金额的0.05%计算
保守一点,用比例滑点更安全。
嗯,这里要注意。滑点不是均匀分布的。市场波动大的时候,滑点会急剧放大。我建议你在回测时,把滑点设成动态的——波动率越高,滑点越大。
2.3 流动性对套利的影响
流动性,说白了就是你能不能快速买卖而不影响价格。流动性好的品种,比如沪深300成分股,你买个几百万,价格基本不动。流动性差的品种,比如某些小盘股,你买10万块,价格可能就跳了1%。
对于统计套利来说,流动性是命根子。为什么?因为套利策略通常需要同时开仓和平仓。如果流动性不足,你开仓时价格滑了,平仓时价格又滑了,一来一回,利润全没了。
避坑指南:我曾经在某个流动性差的期货品种上做跨期套利。模型显示价差偏离了2个标准差,我果断开仓。结果呢?我的买单直接把价格推高了0.5%,平仓时又把价格砸低了0.3%。一算账,亏了。从那以后,我给自己定了个规矩:
- 日均成交量低于1000万的品种,不做
- 买卖盘口深度低于50手的品种,不做
- 价差波动率太高的品种,谨慎做
衡量流动性,我常用这几个指标:
- 买卖价差:越小越好
- 市场深度:看买一到买五、卖一到卖五的总量
- 成交量:日均成交量越大越好
- 换手率:太高或太低都不好
你想想看,如果一个品种的买卖价差是0.1%,你的套利策略预期收益是0.2%,那扣除价差后只剩0.1%了。再扣掉滑点和佣金,可能就变成负的了。所以,流动性差的品种,再好的策略也白搭。
2.4 知识体系结构图
下面这张图,是我自己总结的市场微观结构对套利的影响框架。你看一眼,心里就有数了。
2.5 实战中的代码示例
最后,我给大家一个简单的Python代码,用来计算实际交易中的价差和滑点成本。这个代码我在实盘里用过,很实用。
import pandas as pd
import numpy as np
def calculate_trading_cost(trade_data, spread_col='spread', volume_col='volume', price_col='price'):
"""
计算交易成本
trade_data: DataFrame,包含价差、成交量、价格等字段
"""
# 价差成本
spread_cost = trade_data[spread_col].mean() / 2 # 单边价差成本
# 滑点估计(基于成交量加权)
# 假设滑点与成交量成正比
slippage_factor = 0.0001 # 每100万成交量的滑点比例
slippage = trade_data[volume_col].mean() * slippage_factor / trade_data[price_col].mean()
# 总成本
total_cost = spread_cost + slippage
return {
'spread_cost': spread_cost,
'slippage': slippage,
'total_cost': total_cost
}
# 示例数据
data = pd.DataFrame({
'spread': [0.01, 0.02, 0.015, 0.018],
'volume': [100000, 200000, 150000, 180000],
'price': [10.0, 10.05, 10.02, 10.03]
})
cost = calculate_trading_cost(data)
print(f"价差成本: {cost['spread_cost']:.4f}")
print(f"滑点成本: {cost['slippage']:.6f}")
print(f"总成本: {cost['total_cost']:.4f}")
小技巧:在实际项目中,我会把滑点因子设成动态的。比如,根据过去5分钟的波动率来调整。波动率大的时候,滑点因子调高到0.0005;波动率小的时候,调低到0.00005。这样更贴近真实市场。
好了,这一章的内容就到这里。记住一句话:市场微观结构不是理论,是实实在在的钱。你忽略它,它就吃掉你的利润。