第三章 价差与滑点:买卖价差的构成、滑点的成因与计算、如何降低滑点

做市商这行,说白了就靠两样东西吃饭:价差滑点

价差是我们的利润来源,滑点则是我们的成本黑洞。我见过太多新手做市商,价差算得门儿清,结果全被滑点吃掉了。今天咱们就把这两个东西彻底拆开看看。

一、买卖价差的构成

先问个问题:为什么同一个币,不同交易所的价差不一样?

答案很简单——价差不是凭空定的,它由三部分构成

价差 = 订单处理成本 + 存货风险成本 + 逆向选择成本

1. 订单处理成本

这是最基础的部分。交易所要收手续费,服务器要跑,网络要通。这些成本最终都会体现在价差里。

我记得刚入行时,有个老交易员跟我说:「你每下一单,交易所都在赚你的手续费。如果你不把这块成本算进价差里,那你就是在给交易所打工。」

嗯,这话我记到现在。

2. 存货风险成本

做市商手里必须持有库存。但库存是有风险的——价格可能暴跌。

举个例子:你手里有100个ETH,报价价差是0.1%。突然市场暴跌5%,你手里的库存瞬间亏了5%。这0.1%的价差能补回来吗?显然不能。

所以,波动越大的品种,价差必须越大。这不是黑心,这是风控。

3. 逆向选择成本

这个最隐蔽,也最致命。

什么叫逆向选择?就是对手方比你更懂行情。你挂了个买单,结果对方是知道内幕消息的大户,他卖给你是因为他知道马上要跌了。

我曾在某个小币种上吃过这个亏。当时价差设得很小,结果被一个量化基金连续吃掉好几笔。等我反应过来,库存已经亏了6位数。

从那以后,我养成了一个习惯:对于信息不对称严重的品种,价差至少放大50%

二、滑点的成因与计算

滑点,就是「你看到的成交价」和「实际成交价」之间的差距。

为什么会这样?

说白了就三个原因:

  1. 流动性不足——盘口太薄,一单下去直接打穿
  2. 延迟——你看到的价格已经是100ms前的了
  3. 市场冲击——你的单子太大,把价格推走了

滑点的计算公式

我一般用这个公式来估算滑点:

滑点 = (实际成交均价 - 预期成交价) / 预期成交价 × 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个,脚本自动把价差缩小了,结果那波行情我几乎没吃到滑点。

四、核心知识体系

下面这张图是我自己整理的价差与滑点知识框架,你可以保存下来反复看:

价差与滑点 买卖价差构成 订单处理成本 存货风险成本 逆向选择成本 滑点成因与计算 流动性不足 延迟 市场冲击 如何降低滑点 拆单分批进场 选择流动性好时段 使用限价单 监控盘口动态调整 核心:价差是利润,滑点是成本,控制好滑点才能赚钱

最后说一句:价差和滑点是一枚硬币的两面。价差设大了,滑点小了,但成交少了。价差设小了,成交多了,但滑点大了。

怎么平衡?

我的经验是:先保证不亏,再考虑赚钱。把滑点控制住了,价差可以慢慢调。滑点控制不住,价差再大也是白搭。

嗯,今天就聊到这儿。记住一句话:做市商不是赌方向,是赚流动性的钱。而流动性,就藏在价差和滑点的缝隙里。


专注资料整理