3. 价差与滑点:买卖价差计算、滑点成因、流动性对价差的影响

做市商的核心利润来源是什么?说白了,就是「吃价差」。但如果你以为价差只是简单的卖价减买价,那可就太天真了。我在搭建第一版做市策略时,就因为这个认知不足,吃了不少亏。

今天咱们把价差和滑点这两个东西彻底聊透。你想想看,一个做市商如果连自己赚的是什么钱、亏在什么地方都搞不清楚,那跟闭着眼睛开车有什么区别?

3.1 买卖价差:做市商的饭碗

买卖价差(Bid-Ask Spread),就是市场上最高买价和最低卖价之间的差值。公式很简单:

Spread = Ask Price - Bid Price

但实际计算时,我习惯用相对价差,也就是百分比形式:

Relative Spread = (Ask - Bid) / Mid Price × 100%

为什么要用相对价差?因为绝对价差在不同价格水平的资产上没有可比性。比特币一个价差0.1美元,和某山寨币价差0.1美元,意义完全不同。

核心要点:做市商赚的就是这个价差。你挂买单在Bid,挂卖单在Ask,如果有人两边都成交,你就赚到了Spread。但前提是——你得能接住两边的单子。

我在项目中遇到过一种情况:某个小币种价差看起来很大,年化收益算下来很诱人。但实际跑起来发现,买单成交后卖单迟迟不成交,价差是吃到了,但库存风险也上来了。嗯,这里要注意——价差大不一定就是好机会。

3.2 滑点:你看到的未必是你得到的

滑点(Slippage),指的是预期成交价格与实际成交价格之间的差异。做市商最怕的就是这个。

为什么会发生滑点?原因其实就三个:

  1. 订单簿深度不足:你的大单吃掉了最优价位的挂单,只能往更差的价格成交
  2. 市场波动剧烈:从你下单到成交的瞬间,价格已经变了
  3. 网络延迟:你的订单到达交易所时,市场状态已经不同了

我刚开始做高频做市时,犯过一个低级错误。我以为自己的订单是「市价单」,成交速度够快就不会有滑点。结果呢?在波动行情下,一次滑点就把我一周的利润全吃掉了。从那以后,我再也不敢轻视滑点问题了。

避坑指南:我曾经在ETH剧烈波动时用市价单做对冲,结果滑点高达0.3%。你以为你在做市,其实你在给市场送钱。记住:做市商永远应该用限价单,除非你确定流动性足够好。

3.3 流动性对价差的决定性影响

流动性是什么?说白了就是「你想买的时候有人卖,你想卖的时候有人买」。流动性越好,价差越小;流动性越差,价差越大。

咱们用一张图来理解这个关系:

流动性对价差的影响机制 高流动性市场 订单簿深度示意 买盘深度大 价差小 卖盘深度大 ✅ 价差通常 < 0.1% ✅ 大单成交滑点小 ✅ 适合做市策略 ✅ 交易成本低 低流动性市场 订单簿深度示意 价差大 ❌ 价差可能 > 1% ❌ 大单成交滑点大 ❌ 做市风险高 ❌ 交易成本高 流动性越好 → 价差越小 → 做市越容易

这张图很直观地展示了:流动性好的市场,订单簿像一堵厚墙,你的单子进去不会引起价格明显变动。流动性差的市场,订单簿稀稀拉拉,稍微大点的单子就能把价格打穿。

3.4 实战中的价差计算

在实际做市系统中,我一般会这样计算实时价差:

def calculate_spread(orderbook):
    """
    计算当前市场的买卖价差
    orderbook: 包含bids和asks的字典
    """
    if not orderbook['bids'] or not orderbook['asks']:
        return None
    
    best_bid = orderbook['bids'][0][0]  # 最高买价
    best_ask = orderbook['asks'][0][0]  # 最低卖价
    mid_price = (best_bid + best_ask) / 2
    
    absolute_spread = best_ask - best_bid
    relative_spread = (absolute_spread / mid_price) * 100
    
    return {
        'absolute_spread': absolute_spread,
        'relative_spread': relative_spread,
        'mid_price': mid_price,
        'best_bid': best_bid,
        'best_ask': best_ask
    }

这段代码看起来简单,但实际使用时有个坑——你得考虑订单簿的「真实深度」。我见过有人只看最优价差,结果一成交发现第二档、第三档的价差完全不一样。

个人经验:我建议在计算有效价差时,考虑订单簿前3-5档的加权平均。比如这样:

def weighted_spread(orderbook, levels=3):
    """考虑多档深度的加权价差"""
    total_bid_vol = sum(b[1] for b in orderbook['bids'][:levels])
    total_ask_vol = sum(a[1] for a in orderbook['asks'][:levels])
    
    weighted_bid = sum(b[0]*b[1] for b in orderbook['bids'][:levels]) / total_bid_vol
    weighted_ask = sum(a[0]*a[1] for a in orderbook['asks'][:levels]) / total_ask_vol
    
    return weighted_ask - weighted_bid

3.5 滑点的量化与监控

滑点这东西,你不量化它,它就会悄悄吃掉你的利润。我一般会在做市系统中加入滑点监控模块:

class SlippageMonitor:
    def __init__(self, threshold=0.001):  # 0.1%阈值
        self.threshold = threshold
        self.slippage_log = []
    
    def record_slippage(self, expected_price, actual_price, volume):
        slippage = abs(actual_price - expected_price) / expected_price
        self.slippage_log.append({
            'slippage': slippage,
            'volume': volume,
            'timestamp': time.time()
        })
        
        if slippage > self.threshold:
            self.alert(f"滑点超标: {slippage*100:.3f}%")
        
        return slippage
    
    def average_slippage(self, window=100):
        recent = self.slippage_log[-window:]
        return sum(s['slippage'] for s in recent) / len(recent) if recent else 0

为什么要监控滑点?因为滑点就是做市商的隐形杀手。你算好的价差利润是0.1%,结果滑点吃掉0.08%,那你还赚什么?

3.6 流动性评估的实用方法

评估流动性,我一般看三个指标:

指标 计算方法 说明
价差宽度 (Ask - Bid) / Mid 越小流动性越好,通常<0.1%为优
订单簿深度 前N档的总挂单量 深度越大,大单冲击成本越小
Amihud非流动性指标 |收益率| / 交易量 衡量价格对交易量的敏感度

我个人最常用的是「订单簿深度」这个指标。为什么?因为它最直观。你打开一个交易对的订单簿,看看前五档有多少量,心里就有数了。

注意:有些交易所会刷深度数据,看起来挂单很多,但一成交就撤单。我曾经在某个二线交易所吃过这个亏——看着深度不错,结果一进去单子全撤了,直接把我晾在风里。所以,评估流动性时最好结合历史成交数据一起看。

3.7 实战中的价差策略选择

不同流动性的市场,做市策略完全不同:

  • 高流动性市场(如BTC/USDT):价差小,但成交量大。适合薄利多销,挂单贴近最优价,靠高频成交赚钱。
  • 中等流动性市场:价差适中,可以适当放宽挂单距离,吃更大的价差,但要控制库存风险。
  • 低流动性市场:价差大,但风险也大。我一般建议新手别碰,老手也要严格控制仓位。

嗯,说到这我想起一个案例。有次我在一个流动性极差的代币上做市,价差高达2%。我心想这利润不错啊,结果一晚上被一个大户来回吃了三次,库存全被洗出去了。从那以后,我对低流动性市场就格外谨慎了。

最后总结一句话:价差是你的收入,滑点是你的成本,流动性是你的生存环境。三者缺一不可,搞懂了它们,做市商的路才算真正开始。


公众号:蓝海资料掘金营,微信deep3321