第三章 价差与滑点:买卖价差的构成、滑点的成因与计算、如何降低滑点
做市商这行,说白了就靠两样东西吃饭:价差和滑点。
价差是我们的利润来源,滑点则是我们的成本黑洞。我见过太多新手做市商,价差算得门儿清,结果全被滑点吃掉了。今天咱们就把这两个东西彻底拆开看看。
一、买卖价差的构成
先问个问题:为什么同一个币,不同交易所的价差不一样?
答案很简单——价差不是凭空定的,它由三部分构成。
价差 = 订单处理成本 + 存货风险成本 + 逆向选择成本
1. 订单处理成本
这是最基础的部分。交易所要收手续费,服务器要跑,网络要通。这些成本最终都会体现在价差里。
我记得刚入行时,有个老交易员跟我说:「你每下一单,交易所都在赚你的手续费。如果你不把这块成本算进价差里,那你就是在给交易所打工。」
嗯,这话我记到现在。
2. 存货风险成本
做市商手里必须持有库存。但库存是有风险的——价格可能暴跌。
举个例子:你手里有100个ETH,报价价差是0.1%。突然市场暴跌5%,你手里的库存瞬间亏了5%。这0.1%的价差能补回来吗?显然不能。
所以,波动越大的品种,价差必须越大。这不是黑心,这是风控。
3. 逆向选择成本
这个最隐蔽,也最致命。
什么叫逆向选择?就是对手方比你更懂行情。你挂了个买单,结果对方是知道内幕消息的大户,他卖给你是因为他知道马上要跌了。
我曾在某个小币种上吃过这个亏。当时价差设得很小,结果被一个量化基金连续吃掉好几笔。等我反应过来,库存已经亏了6位数。
从那以后,我养成了一个习惯:对于信息不对称严重的品种,价差至少放大50%。
二、滑点的成因与计算
滑点,就是「你看到的成交价」和「实际成交价」之间的差距。
为什么会这样?
说白了就三个原因:
- 流动性不足——盘口太薄,一单下去直接打穿
- 延迟——你看到的价格已经是100ms前的了
- 市场冲击——你的单子太大,把价格推走了
滑点的计算公式
我一般用这个公式来估算滑点:
滑点 = (实际成交均价 - 预期成交价) / 预期成交价 × 100%
但实际项目中,我更关心的是预期滑点,也就是在下单前就能算出来的滑点。
这里给一个实用的估算方法:
预期滑点 ≈ (订单数量 / 盘口深度) × 价差
举个例子:盘口深度是100个BTC,价差0.1%,你想买10个BTC。
预期滑点 ≈ (10/100) × 0.1% = 0.01%
这个数字看起来不大,但如果你买50个BTC呢?
预期滑点 ≈ (50/100) × 0.1% = 0.05%
直接翻了5倍。
三、如何降低滑点
这个问题我研究了整整三年。说实话,没有银弹。但有几个实战技巧非常管用。
技巧1:拆单
这是最基础也最有效的方法。
把一个大单拆成几十个小单,分批进场。虽然总时间变长了,但每笔的滑点都小得多。
我习惯用这个策略:
def split_order(total_qty, max_slice_qty):
slices = []
remaining = total_qty
while remaining > 0:
slice_qty = min(max_slice_qty, remaining)
slices.append(slice_qty)
remaining -= slice_qty
return slices
# 比如我要买100个BTC,每单最多5个
slices = split_order(100, 5)
# 返回 [5, 5, 5, ... 共20个5]
嗯,代码很简单,但实战中要考虑时间间隔。我一般每单间隔200-500ms,太快了容易被识别成机器人。
技巧2:选择流动性好的时段
这个你可能觉得是废话,但很多人就是做不到。
我见过有人非要在凌晨3点做市,结果盘口薄得像纸,一单下去滑点0.5%。何必呢?等白天流动性回来了再做不行吗?
避坑指南:我曾经在某个山寨币上犯过这个错。当时觉得24小时做市能多赚点,结果凌晨时段被滑点吃掉了一半利润。后来我学乖了:流动性差的时段,要么不做,要么把价差放大3倍。
技巧3:使用限价单而非市价单
市价单是滑点的最大来源。你想想看,市价单等于告诉市场:「不管什么价格,我都要成交。」那对方肯定往死里宰你。
限价单就不一样了。你挂个价格,爱卖不卖。虽然成交慢一点,但滑点几乎为零。
我做市商这么多年,90%的单子都是限价单。只有遇到极速行情需要抢跑时,才会用市价单。
技巧4:监控盘口深度动态调整
这个比较高级,但效果最好。
实时监控盘口的前10档深度,如果发现某一侧深度突然变薄,立刻调整报价策略。
我写过一个简单的监控脚本:
def monitor_depth(orderbook):
bid_depth = sum([level['qty'] for level in orderbook['bids'][:10]])
ask_depth = sum([level['qty'] for level in orderbook['asks'][:10]])
if bid_depth < threshold:
# 买单深度不足,缩小买单价差
adjust_spread('bid', spread * 0.8)
if ask_depth < threshold:
# 卖单深度不足,缩小卖单价差
adjust_spread('ask', spread * 0.8)
这个脚本帮我避免了好几次大滑点。有一次盘口深度突然从100个BTC掉到10个,脚本自动把价差缩小了,结果那波行情我几乎没吃到滑点。
四、核心知识体系
下面这张图是我自己整理的价差与滑点知识框架,你可以保存下来反复看:
最后说一句:价差和滑点是一枚硬币的两面。价差设大了,滑点小了,但成交少了。价差设小了,成交多了,但滑点大了。
怎么平衡?
我的经验是:先保证不亏,再考虑赚钱。把滑点控制住了,价差可以慢慢调。滑点控制不住,价差再大也是白搭。
嗯,今天就聊到这儿。记住一句话:做市商不是赌方向,是赚流动性的钱。而流动性,就藏在价差和滑点的缝隙里。