交易所做市:策略与系统
深入解析做市原理、盈利机制、数据采集、策略设计(对称式、库存偏斜、Avellaneda-Stoikov模型)、数学模型、风险管理、系统架构与部署——附带交互演示。
1. 什么是做市?
做市商在交易所持续挂出买单和卖单(bid/ask),通过买卖价差获利,同时为其他参与者提供流动性。做市商是流动性市场的基石——没有他们,价差会很大,滑点很高,交易成本昂贵。
金融生态系统中的角色
市场生态由多种参与者组成,各自扮演不同角色。做市商提供双边流动性并赚取价差。吃单者通过跨越价差即时交易。套利者保持各交易所价格一致。交易所提供基础设施并收取手续费。
指定做市商 vs 算法做市商
指定做市商(DMM)与交易所签订正式协议:享受手续费折扣和返佣,但需履行在线率和价差义务。独立/算法做市商无正式协议,纯粹依靠策略和技术竞争。
加密货币 vs 传统金融
2. 订单簿与微观结构
订单簿是任何交易所的核心数据结构。它维护所有未成交的买单(bid)和卖单(ask),按价格层级组织。理解订单簿的微观结构是做市的基础。
订单簿结构
订单类型
行情数据级别
队列位置与价格-时间优先
大多数交易所使用价格-时间优先(FIFO):同一价格的订单按下单时间顺序成交。在某一价格层级排在第一位意味着你比后来的订单先被成交。这就是速度重要的原因——即使在加密市场也是如此。做市商如果取消并重新下单,会失去队列位置,这是有成本的。
交互演示:订单簿模拟器
3. 做市如何盈利
做市商从买入价和卖出价之间的差价——买卖价差中赚钱。但实际利润比简单的价差捕获更复杂,因为逆向选择、库存风险和手续费都会侵蚀利润。
买卖价差
如果做市商报价 bid = $100.00,ask = $100.10,价差为 $0.10。如果有人卖给做市商(成交买单),然后另一个人买入(成交卖单),做市商每单位赚取 $0.10——一个完整的往返交易。
实现价差 vs 报价价差
报价价差是你挂出的价差。实现价差是扣除两次成交之间价格变动后的实际收益。如果你在 $100.00 买入,但当你卖出时,最优卖价已经变成 $100.05,你的实现价差只有 $0.05。
盈亏分解
每次往返交易利润
计算示例
价差 = 1 tick ($0.01),挂单返佣 = 0.02%,吃单手续费 = 0.05%,价格 = $100。每次往返:$0.01 + 2 × $0.02 - 逆向选择。如果每天做10,000次往返,每次净赚 $0.005 = 每天 $50 利润。放大到 $1M 名义金额,数字就有意义了。
Maker-Taker 费用模型
大多数交易所向吃单者(跨越价差的人)收费,向做市商(提供流动性的人)支付返佣。一些交易所提供基于交易量的阶梯费率:交易量越大,返佣越高。在最高等级,挂单返佣可以达到 -0.01% 到 -0.02%。
交互演示:盈亏计算器
4. 数据采集与市场信号
做市系统的智能来自它消费的数据。原始市场数据被转化为驱动报价决策的信号。数据管道的质量和速度直接决定盈利能力。
原始市场数据
衍生信号
跨市场数据
其他交易所的价格(用于套利检测)、指数价格、资金费率(永续合约)以及与BTC/ETH的相关性。如果BTC在Binance变动,你在OKX上的山寨币报价需要立即更新。
宏观信号
数据基础设施
与交易所的WebSocket连接、增量更新的订单簿状态管理、检测到数据间断时的快照重建(通过序列号跟踪),以及多数据源间的时间戳同步。
5. 核心策略:对称做市
最简单的做市策略是在中间价两侧对称地挂出买单和卖单。这是理解更高级方法的起点。
工作原理
- 计算中间价:mid = (best_bid + best_ask) / 2
- 选择半价差:例如 half_spread = 0.05%
- 在 mid - half_spread 处挂买单
- 在 mid + half_spread 处挂卖单
- 当任一侧成交后,重新挂单
- 持续重复
选择价差宽度
更宽的价差 = 更少的成交风险 + 每笔更多的利润,但成交量较低。更窄的价差 = 更多的成交但更多的逆向选择。最优价差需要根据波动率、竞争和风险偏好来平衡。
多档报价
不是只在一个价格层级报价,而是在多个层级以不同数量报价。第1档(最接近中间价)数量最小,更深的档位数量更大。这在限制最优价格风险的同时提供了更多深度。
每档数量
问题:库存累积
对称报价在均值回归、低波动的市场中效果很好。但在趋势行情中,一侧反复成交而另一侧不成交——累积大量方向性头寸。如果趋势继续,累积的库存会产生重大亏损。
交互演示:对称做市模拟器
6. 库存管理与偏斜
库存风险是做市的核心问题。如果你累积了太多某种资产而价格下跌,你就会亏钱。库存偏斜通过调整报价来鼓励减少头寸的成交。
核心问题
别人卖的时候你买,别人买的时候你卖。在下跌趋势中,你的买单不断被成交——你累积的库存在贬值。在上涨趋势中,你的卖单不断被成交——你卖光了所有东西错过了上涨,或者更糟,做空了。
库存偏斜
调整报价以鼓励减少库存的成交。如果你多头持仓,让卖价更有竞争力(更低)以吸引卖方。如果你空头持仓,让买价更有竞争力(更高)以吸引买方。
- 多头库存 → 降低卖价(鼓励卖出),提高买价(阻止买入)
- 空头库存 → 降低买价(鼓励买入),提高卖价(阻止卖出)
- 中性库存 → 对称报价
偏斜公式
Gamma 参数
目标库存
目标可以是零(delta中性)或正/负值(方向性偏好)。纯做市时目标 = 0。看多的做市商目标 > 0(愿意持有一些多头头寸)。
仓位限制
库存最大值的硬性上限(例如 ±$100,000 名义金额)。当库存达到限制时,完全停止在该侧报价。这是防止无限风险敞口的最后防线。
对冲策略
交互演示:库存偏斜对比
7. Avellaneda-Stoikov 模型
Avellaneda-Stoikov(AS)模型是最优做市的基础学术框架。它通过最大化终端财富的期望效用来计算最优买卖价格,平衡价差捕获与库存风险。
问题形式化
做市商希望最大化 E[U(W_T)],其中 U 是效用函数(通常是指数型:U(w) = -e^{-γw}),W_T 是时间 T 的终端财富,γ 是风险厌恶参数。
关键参数
保留价格(无差异价格)
保留价格是做市商对持有当前库存无差异的价格。它根据库存偏离中间价:如果你多头持仓(q > 0),你的保留价格低于中间价(你对资产的估值更低,因为你已经持有太多)。
最优价差
最优价差有两个组成部分:(1) 库存风险补偿(γσ²τ),随着T的临近而减小;(2) 与订单到达率相关的部分(ln项)——到达频率越低 → 价差越宽以补偿等待。
最优买卖价
最终报价以保留价格(不是中间价!)为中心,加上最优价差。这在一个优雅的框架中同时处理了价差大小和库存偏斜。
加密市场的实际修改
- 用滚动窗口替代 T-t(例如 τ = 300秒)——加密市场没有收盘
- 添加最小价差约束——不能在tick size内报价
- 添加最大库存约束——硬性仓位限制
- 根据观察到的成交率动态估计 k,而非假设恒定
- 使用EWMA波动率代替静态 σ——适应变化的市场条件
- 添加延迟缓冲——稍微加大价差以考虑过期报价
交互演示:Avellaneda-Stoikov 模型
8. 逆向选择与毒性检测
逆向选择是做市商最大的敌人。当知情交易者在价格即将变动时与你成交——你在价格上涨前卖出,或在价格下跌前买入——就发生了逆向选择。检测和避免有毒订单流至关重要。
什么是逆向选择?
你在 $100.10 挂了卖单。一个知情交易者(知道一个大买单即将到来)吃掉了你的卖单。价格立即涨到 $100.50。你在 $100.10 卖出,现在市场在 $100.50——你每单位亏损 $0.40。你 $0.05 的价差本应是利润,但逆向选择把它变成了 $0.35 的亏损。
衡量逆向选择
毒性信号
防御措施
- 检测到毒性信号时加大价差
- 高毒性期间减少报价数量
- 在新闻事件或极端波动期间完全撤单
- 使用断线取消功能防止停机期间的过期报价
- 优化延迟——更快地对逆向信号做出反应意味着更少的亏损
- 实施非对称衰减:减少被扫单一侧的数量
做市商的困境
你希望被噪音交易者(随机流,有利可图)成交,避免被知情交易者(有毒流,代价高昂)成交。但你无法总是实时区分两者。你能做的最好的是统计检测:监控你的成交,衡量逆向选择,并相应调整防御。
9. 数学框架与核心公式
本节汇总了做市中使用的所有关键数学公式。每个公式都给出了其用途、输入和实际解释。
中间价估计
| Name | Formula | Notes |
|---|---|---|
| 简单中间价 | (best_bid + best_ask) / 2 | 基本方法;忽略订单大小 |
| 微观价格 | P_ask × V_bid / (V_bid + V_ask) + P_bid × V_ask / (V_bid + V_ask) | 按订单量加权;更好的公允价值估计 |
| VWAP中间价 | 对前N档按成交量加权平均 | 考虑完整订单簿深度 |
波动率估计
| Name | Formula | Notes |
|---|---|---|
| 已实现波动率 | σ = std(log_returns) × √(N_periods) | 标准方法;仅使用收盘价 |
| Parkinson | σ_P = √(1/(4N×ln2) × Σ(ln(H_i/L_i))²) | 使用最高-最低价范围;更高效的估计器 |
| Garman-Klass | 结合开盘、最高、最低、收盘价 | 最高效的单日估计器 |
| EWMA | σ²_t = λσ²_'{'{t-1'}' + (1-λ)r²_t | 指数加权;快速适应状态变化 |
订单到达与成交概率
| Name | Formula | Notes |
|---|---|---|
| 泊松过程 | P(t时间内N次成交) = (λt)^N × e^'{'-λt'}' / N! | 模拟随机订单到达 |
| 成交概率 | P(fill) = A × e^'{'-k×δ'}' | 概率随距中间价的距离呈指数衰减 |
最优报价(Avellaneda-Stoikov)
| Name | Formula | Notes |
|---|---|---|
| 保留价格 | r = s - q × γ × σ² × τ | 根据库存风险调整中间价 |
| 最优半价差 | δ*/2 = γσ²τ/2 + (1/γ)×ln(1 + γ/k) | 平衡风险与成交概率 |
风险指标
| Name | Formula | Notes |
|---|---|---|
| 风险价值(VaR) | VaR_α = -μt + z_α × σ × √t | 置信度α下时间t内的最大亏损 |
| 预期不足(CVaR) | ES_α = -μt + σ√t × φ(z_α)/(1-α) | 超过VaR的平均亏损 |
| 最大仓位 | Q_max = VaR_limit / (z_α × σ × √t) | 从风险预算推导仓位限制 |
绩效指标
| Name | Formula | Notes |
|---|---|---|
| 夏普比率 | SR = (R_portfolio - R_f) / σ_portfolio | 风险调整后收益;做市>2为佳 |
| 成交率 | 成交数 / 总报价数 × 100% | 报价被执行的百分比 |
| 实现价差 | 每次往返的实际盈亏 | 逆向选择后的真实盈利能力 |
10. 策略变体与扩展
除了基本的对称式和库存偏斜做市,还存在许多策略变体。每种策略在复杂度、风险和潜在收益之间有不同的权衡。
| 策略 | 描述 | 复杂度 | 适用场景 |
|---|---|---|---|
| 网格做市 | 在固定价格间隔(网格间距)下单。从网格范围内的均值回归中获利。风险:价格突破网格范围,留下水下头寸。 | 低 | 震荡市场 |
| 多档报价 | 在多个价格层级以递减数量报价。捕获更多成交量但增加更差价格的库存风险。 | 低-中 | 流动性好的市场 |
| 跨交易所做市 | 在交易所A报价,在交易所B对冲。从不同场所的价差差异中获利。需要与两个交易所的快速连接。 | 高 | 碎片化市场 |
| 统计套利做市 | 使用协整或与参考资产的相关性来估计公允价值。围绕模型公允价值而非简单中间价报价。 | 高 | 相关联的交易对 |
| 趋势感知做市 | 使用交易流检测短期趋势。将报价倾向于趋势方向——趋势侧更紧,反趋势侧更宽。 | 中 | 趋势市场 |
| 价差曲线 | 不同数量级别使用不同价差宽度。小单量用更紧的价差(竞争流量),大单量用更宽的价差(收取仓储风险费)。 | 中 | 所有市场 |
自适应与机器学习策略
现代做市系统根据实际表现持续调整参数。在线学习算法调优gamma、价差和数量。强化学习方法可以从经验中学习最优策略,但需要谨慎处理金融市场的非平稳性。
11. 风险管理框架
风险管理是盈利的做市商和破产的做市商之间的分水岭。没有适当风险控制的做市系统是一颗定时炸弹——一次极端事件可以抹去数月的利润。
仓位限制
亏损限制
熔断机制
对冲规则
终止开关
每个做市系统都必须有终止开关。自动触发的基于回撤、仓位限制或错误计数。手动的允许运维人员通过仪表板立即停止交易。交易所级别的全部取消API在断线时提供最后的安全网。
操作风险
- API频率限制——控制订单更新频率以保持在限制之内
- WebSocket断线——断线时取消所有订单,重连时协调状态
- 序列号间断——检测并在数据间断时重建订单簿
- 时钟漂移——同步各数据源的时间戳
交互演示:风险管理仪表板
12. 系统架构与部署
生产级做市系统是由专业组件组成的分布式管道。每个组件都有明确的职责,系统必须快速、可靠且可观测。
核心组件
技术栈
延迟考量
部署拓扑
单交易所配置每个交易所运行一个进程。多交易所部署使用协调进程加每交易所工作进程。热备保证故障转移。所有组件应发出指标用于监控(Prometheus + Grafana 是常见技术栈)。
13. 回测与模拟
回测在用真金白银冒险之前,在历史数据上验证你的策略。但做市的回测比方向性策略难得多,因为成交模拟本质上是不确定的。
为什么要回测?
- 在部署真金之前验证策略逻辑
- 估计预期盈亏、夏普比率和回撤
- 在历史数据上调优参数(价差、gamma、数量)
- 对极端历史事件进行压力测试(闪崩、级联清算)
数据需求
回测陷阱
始终确保信号计算只使用决策时可用的数据。
模拟队列位置。模拟部分成交。假设最坏情况:只有当价格穿过你的价格层级时才成交。
使用前向验证。保持参数少而直观。在样本外数据上测试。
包含所有费用。添加真实延迟(如10ms)。为大额订单模拟滑点。
模拟方法
关键评估指标
| 指标 | 描述 |
|---|---|
| 净盈亏 | 扣除所有费用后的总利润——底线 |
| 夏普比率 | 年化风险调整收益——做市策略>2为佳 |
| 最大回撤 | 最大峰谷下跌——最坏情况有多糟? |
| 成交率 | 被执行的报价百分比——太低说明价差太宽 |
| 库存利用率 | 平均|库存| / 最大库存——你承受了多少风险? |
| 利润因子 | 毛利润 / 毛亏损——做市>1.5为健康 |
模拟交易
回测之后,在实时数据上使用模拟成交运行完整系统,然后再部署真实资金。模拟交易可以发现回测遗漏的问题:API行为、频率限制、重连逻辑和实时延迟。
14. 管理者视角:运营做市团队
管理做市业务需要组合级别的视角。不仅仅是关于单个交易——而是关于资金分配、绩效归因、扩展和整体业务管理。
资金分配
- 根据预期成交量、波动率和目标仓位规模为每个交易对分配资金
- 期货/永续做市的保证金要求(通常可用5-20倍杠杆)
- 为回撤缓冲预留资金——建议预留最大预期回撤的3-5倍
- 永远不要将超过5-10%的总资金分配给单个交易对
绩效监控
扩展运营
交易所关系
- 做市商计划:手续费折扣(-0.01% 挂单费),专用API限额,优先支持
- SLA要求:95%+在线率,最大价差宽度,最小报价深度
- 一些交易所免费为指定做市商提供市场数据
- 协商API频率限制提升(标准限制的2-5倍)
监管考量
- 各司法管辖区的加密监管不同:MiCA(欧盟),MAS(新加坡),SEC/CFTC(美国)
- 如果被指定为做市商:在线率义务,最大价差,最小报价量要求
- 机构做市商的AML/KYC要求
- 记录保存和审计追踪要求——记录一切
竞争格局
主要的加密做市商包括 Jump Crypto、Wintermute、GSR 和 DWF Labs。竞争将价差推向零——要生存,你需要:(1) 卓越的技术(更低延迟),(2) 更好的风险管理,(3) 独特的信号/alpha,或 (4) 在竞争较少的交易对中找到利基。
15. 实战部署清单
部署做市系统是一个分阶段的过程。在没有充分验证的情况下匆忙上线是失败的最常见原因。
第一阶段:研究与开发(2-4周)
- 选择目标交易所和交易对——从一个交易对开始
- 搭建数据采集系统(WebSocket → 时序数据库)
- 实现订单簿管理器和信号计算管道
- 构建具有真实成交模拟的回测框架
- 实现并回测基础策略(从对称做市开始)
第二阶段:模拟交易(1-2周)
- 在实时数据上使用模拟成交部署策略
- 监控成交率、盈亏和库存行为
- 与回测结果对比(实盘应该更差但方向一致)
- 根据模拟交易观察调优参数
第三阶段:实盘交易(谨慎启动)(2-4周)
- 以最小数量启动(1手/最小可能订单量)
- 运行1周——对比实盘盈亏与模拟交易预期
- 逐步增加数量(如果表现稳定每周翻倍)
- 实现完整风险管理:仓位限制、回撤限制、终止开关
第四阶段:扩展(持续进行)
- 根据实盘数据添加库存偏斜或AS模型优化
- 实现逆向选择检测和防御措施
- 扩展到更多交易对和/或交易所
- 构建自动化监控、告警和仪表板
常见新手错误
- 在策略验证之前投入过多资金——从最小量开始
- 盈亏计算不考虑手续费——手续费可以把盈利策略变成亏损策略
- 忽视库存风险('它会涨回来的')——不会,至少不总是
- 没有终止开关 → 闪崩或交易所故障时灾难性亏损
- 在回测数据上过度优化 → 实盘表现差(过拟合)
16. 总结与参考
核心要点
- 做市从买卖价差中获利同时提供流动性——这是一种服务,不是投机
- 真正的挑战是逆向选择:知情交易者扫走你的过期报价
- 通过偏斜进行库存管理至关重要——永远不要让库存失控
- Avellaneda-Stoikov模型为最优报价提供了有原则的框架
- 数据管道质量直接决定盈利能力——垃圾进,垃圾出
- 波动率估计是最重要的信号——它驱动价差宽度和仓位规模
- 风险管理不可妥协:仓位限制、回撤限制和终止开关
- 做市回测比方向性策略更难——成交模拟是关键挑战
- 从小开始,充分验证,逐步扩展——没有捷径
- 跨交易所策略增加复杂度但也带来机会(套利 + 更多成交量)
- 竞争格局激烈——你需要明确的优势才能生存
- 将做市视为一项业务:资金分配、绩效归因和运营卓越