3. 价差与滑点管理:固定价差与动态价差策略、滑点产生的原因、如何控制滑点
做市商的核心利润来源是什么?说白了就是「吃价差」。但价差不是你想设多少就设多少,设大了没人来吃单,设小了你自己亏钱。更麻烦的是滑点——你挂单时看到的价格,成交时却变了。这俩问题不解决,做市系统就是个摆设。
我个人习惯把价差和滑点放在一起讲,因为它们本质上是一件事的两面:价差决定了你的盈利空间,滑点决定了你的实际成交成本。今天我们就来拆解这两个核心问题。
3.1 固定价差策略
固定价差,就是不管市场怎么波动,你的买卖价差始终维持在一个固定值。比如你设定 BTC/USDT 的价差为 0.1%,那么买一价 10000,卖一价就是 10010。
优点:
- 逻辑简单,实现容易
- 收益稳定可预期
- 适合低波动市场
缺点:
- 市场波动大时容易被「吃掉」
- 无法适应流动性变化
- 极端行情下可能亏损
我在项目中遇到过这样一个案例:一个做市团队在 ETH 上设了 0.05% 的固定价差,平时跑得挺好。结果某天突然出现大单砸盘,价差瞬间被击穿,他们还没来得及撤单就被吃掉了。嗯,这就是固定价差的致命伤——它不会「看脸色」。
3.2 动态价差策略
动态价差,就是根据市场状态实时调整价差。说白了,市场波动大的时候我拉开价差保护自己,市场平稳的时候我缩小价差吸引订单。
常见的动态调整因子:
| 因子 | 说明 | 调整方向 |
|---|---|---|
| 波动率 | 近期价格波动的标准差 | 波动率↑ → 价差↑ |
| 订单簿深度 | 买一卖一附近的挂单量 | 深度↓ → 价差↑ |
| 成交量 | 近期成交活跃度 | 成交量↑ → 价差↓ |
| 时间因子 | 不同时段的市场特征 | 非活跃时段 → 价差↑ |
你想想看,如果市场突然剧烈波动,你还用固定价差,那不是等着被收割吗?动态价差的核心逻辑就是:不确定性越高,我要求的风险补偿就越高。
我曾经在开发一个做市系统时,把动态价差设计成这样的公式:
# 动态价差计算示例
def dynamic_spread(mid_price, volatility, depth, volume):
base_spread = 0.001 # 基础价差 0.1%
# 波动率调整
vol_factor = 1 + volatility * 10
# 深度调整
depth_factor = 1 + (1 / (depth + 1)) * 0.5
# 成交量调整
vol_factor = 1 - min(volume / 1000, 0.5)
spread = base_spread * vol_factor * depth_factor * vol_factor
return spread
这个公式不复杂,但效果很明显。波动率翻倍时,价差自动扩大 10 倍;深度不足时,价差也会相应扩大。嗯,这里要注意:调整系数不能太激进,否则价差忽大忽小,反而影响做市效果。
3.3 滑点产生的原因
滑点,就是你看到的价格和实际成交价格之间的差异。为什么会这样?
主要原因有三个:
- 网络延迟: 你的订单从发出到到达交易所,中间有几十到几百毫秒的延迟。这期间价格可能已经变了。
- 订单簿变化: 你看到买一价 10000,但当你下单时,可能已经被别人抢走了,你只能成交在 10001 或 9999。
- 流动性不足: 你的订单太大,吃掉了最优价格后,只能往更差的价格成交。
我记得有一次做回测,发现某个策略的理论收益是 0.2%,但实盘跑下来只有 0.05%。查了半天,发现滑点吃掉了大部分利润。说白了,滑点是做市商的隐形杀手。
3.4 如何控制滑点
控制滑点,说白了就是「减少不确定性」。我总结了几个实战方法:
方法一:使用限价单
市价单是滑点的最大来源。我建议所有做市策略都使用限价单,只在指定价格成交。虽然可能无法完全成交,但至少不会出现「预期 10000,成交 10010」的尴尬。
方法二:设置滑点容忍度
有些场景下你不得不使用市价单(比如对冲风险),这时候可以设置滑点容忍度。比如:
# 滑点容忍度控制
max_slippage = 0.001 # 最大容忍 0.1%
if actual_price > expected_price * (1 + max_slippage):
cancel_order() # 滑点超限,撤单
方法三:优化网络延迟
这个说起来简单做起来难。我的经验是:
- 把服务器部署在交易所机房附近(同城或同区域)
- 使用专线或低延迟网络
- 减少不必要的中间层(比如不要用 HTTP,直接用 WebSocket)
方法四:拆分大单
如果你的订单量很大,别一次性砸进去。拆成小单,分批成交。这样虽然慢一点,但滑点会小很多。
3.5 价差与滑点的协同管理
价差和滑点不是孤立的。你设的价差越大,滑点的影响就越小;反之亦然。我一般会这样协同管理:
# 价差与滑点协同管理
def calculate_effective_spread(base_spread, expected_slippage):
# 有效价差 = 基础价差 - 预期滑点
effective_spread = base_spread - expected_slippage
# 如果有效价差为负,说明这个策略不赚钱
if effective_spread < 0:
log.warning("有效价差为负,建议调整策略")
return None
return effective_spread
你想想看,如果你预期滑点 0.05%,但你只设了 0.03% 的价差,那不是在亏钱吗?有效价差必须大于零,这是做市商的基本底线。
3.6 实战中的取舍
说了这么多,最后给你一个实战中的取舍建议:
- 高流动性品种: 用动态价差,设小一点,靠量取胜
- 低流动性品种: 用固定价差,设大一点,靠价差保护
- 波动剧烈时: 主动扩大价差,甚至暂停做市
- 平稳行情时: 缩小价差,多赚点
嗯,价差和滑点管理,说白了就是「风险与收益的平衡」。没有完美的策略,只有适合当前市场的策略。我个人的习惯是:宁可少赚,不要亏本。滑点控制不好,再好的价差策略也是白搭。