第3章 价差与滑点:做市商的核心博弈

做市商这行,说白了就是在价差和滑点之间找饭吃。

我刚开始做市商策略那会儿,总觉得只要把买卖单挂上去就能赚钱。结果呢?被滑点吃得骨头都不剩。今天咱们就聊聊这两个核心概念——价差和滑点,它们是怎么影响你口袋里的钱的。

3.1 买卖价差(Spread)的计算

价差,就是买一价和卖一价之间的差额。简单吧?但这里面的门道可不少。

核心公式:
Spread = Ask Price - Bid Price
或者用相对值:
Relative Spread = (Ask - Bid) / Mid Price × 100%

举个例子。假设某股票当前买一价是100.01,卖一价是100.03。那么:

  • 绝对价差 = 100.03 - 100.01 = 0.02
  • 中间价 = (100.01 + 100.03) / 2 = 100.02
  • 相对价差 = 0.02 / 100.02 × 100% ≈ 0.02%

我个人习惯用相对价差,因为它能跨品种比较。比如比特币的价差可能是0.01%,而某些小盘股可能高达1%。你想想看,同样做一手,赚的完全不是一个量级。

3.2 影响价差的因素

价差不是固定的。它像水一样,随市场温度变化。我总结了几大关键因素:

因素 影响方向 我的经验
流动性 流动性越高,价差越小 我在BTC/ETH上见过0.005%的价差,而某些山寨币能到5%
波动性 波动越大,价差越大 新闻发布前后,价差能扩大3-5倍
交易时间 非主流时段价差更大 凌晨3点的外汇市场,价差能翻倍
订单簿深度 深度越厚,价差越稳定 深度不足时,大单会直接吃掉价差
市场情绪 恐慌时价差急剧扩大 2020年3月,很多品种价差扩大了10倍

这里有个避坑指南:千万别在流动性差的时候做市。我曾经在某个小币种上挂单,结果一个突发消息让价差从0.1%瞬间跳到3%,我的止损单直接被打穿,亏了不小一笔。

3.3 滑点的成因与计算

滑点,就是你预期的成交价和实际成交价之间的差异。说白了,就是市场不给你面子。

滑点公式:
Slippage = Actual Fill Price - Expected Price
正滑点:买贵了或卖便宜了(亏损)
负滑点:买便宜了或卖贵了(盈利)

滑点的成因主要有三个:

  1. 订单簿深度不足——你的单子太大,吃光了最优价位的挂单
  2. 市场波动剧烈——价格在你下单到成交之间发生了变动
  3. 延迟——网络延迟或交易所处理延迟

举个例子。你想以100.00的价格买入1000股,但买一只有200股。你的订单会这样成交:

  • 200股 @ 100.00
  • 300股 @ 100.01
  • 500股 @ 100.02

实际成交均价 = (200×100.00 + 300×100.01 + 500×100.02) / 1000 = 100.013
滑点 = 100.013 - 100.00 = 0.013(每股多花了1.3分钱)

3.4 如何控制滑点风险

控制滑点,是做市商的核心技能之一。我这些年总结了几条实用策略:

我的三大控滑点法则:
  1. 拆单策略——大单拆成小单,分批进场。我习惯把单子拆到订单簿的5-10个价位上。
  2. 时间加权平均价格(TWAP)——把订单均匀分布在时间轴上。比如1000股分10分钟,每分钟100股。
  3. 成交量加权平均价格(VWAP)——根据历史成交量分布来安排订单。成交量大的时段多下,小的时段少下。

代码实现一个简单的拆单逻辑:

def split_order(total_qty, price_levels, order_book):
    """
    将大单拆到多个价位
    total_qty: 总数量
    price_levels: 要拆到的价位数量
    order_book: 当前订单簿
    """
    # 获取每个价位的可用深度
    depths = []
    for level in range(price_levels):
        depth = order_book.get_depth_at_level(level)
        depths.append(depth)
    
    total_depth = sum(depths)
    
    # 按深度比例分配
    orders = []
    remaining = total_qty
    for i, depth in enumerate(depths):
        if remaining <= 0:
            break
        qty = min(int(total_qty * depth / total_depth), remaining)
        if qty > 0:
            orders.append((order_book.get_price_at_level(i), qty))
            remaining -= qty
    
    return orders

嗯,这里要注意:拆单不是万能的。在极端行情下,拆得太细反而会错过时机。我一般会设置一个最大滑点容忍度,比如0.1%。一旦超过这个值,就停止交易,等市场稳定再说。

3.5 知识体系总览

下面这张图,是我对本章内容的总结。你可以把它当作一个思维导图来看:

价差与滑点 买卖价差 (Spread) 计算公式 影响因素 市场深度 滑点 (Slippage) 成因分析 计算方法 风险控制 控制策略 拆单策略 TWAP / VWAP 滑点容忍度设置 核心目标:在价差收益和滑点成本之间找到最优平衡点

你看,价差和滑点就像一对孪生兄弟。价差是你的收入来源,滑点是你的成本支出。做市商的核心,就是让收入大于支出。

最后分享一个我自己的经验:永远不要追求零滑点。那是不可能的。你要做的是把滑点控制在一个可接受的范围内。我一般会把滑点预算设在预期收益的20%-30%。比如预期赚100块,就允许最多30块的滑点损失。超过这个数,要么撤单,要么调整策略。

好了,价差和滑点就聊到这儿。记住一句话:做市商赚的是流动性的钱,亏的是滑点的钱。把这两样搞明白了,你就已经入门了。

专注资料整理