做市商策略
做市商策略 (Market Maker Strategy)是一个典型的高频交易策略,其核心目标不是预测市场的长期方向,而是通过为市场提供流动性,从买卖价差(Bid-Ask Spread)中赚取微小但频繁的利润。
核心职能: 一个健康的金融市场需要随时都有人愿意买,也随时有人愿意卖。做市商就是这样的参与者,他们主动、持续地向市场报出自己的买入价(Bid)和卖出价(Ask)。
盈利模式: 做市商的利润来源,正是其报出的卖出价与买入价之间的差额,即买卖价差 (Bid-Ask Spread)。假如做市商以6344的价格卖出的同时,希望能以6333的价格买入,如果双边都成交,他就赚取了11个点的价差。这是一个积少成多的过程。
核心风险:库存风险与逆向选择
做市商并非稳赚不赔,它面临着巨大的风险,其中最核心的是:
库存风险 (Inventory Risk):
场景: 当市场出现单边下跌行情时,做市商的买单会不断被“聪明”的交易者成交,导致做市商积累了大量亏损的多头头寸(库存)。
场景: 当市场单边上涨时,做市商的卖单会不断被成交,导致其积累大量亏损的空头头寸。
本质: 做市商的目标是维持一个中性的、零风险的库存。一旦库存失衡,做市商就从一个流动性提供者,被迫变成了一个承担方向性风险的投机者。
逆向选择 (Adverse Selection):
场景: 拥有信息优势或速度优势的交易者,总是在对做市商最不利的时候来与你交易。例如,当他们知道价格即将上涨时,他们会迅速吃掉你的卖单。
本质: 做市商永远在和比自己“更快”或“更聪明”的对手方博弈,这要求做市商必须拥有极低延迟的交易系统和复杂的报价模型来保护自己。
策略逻辑
我们来介绍一个最简化、最基础的被动做市商模型,它的逻辑非常纯粹:
第一步:数据源: 订阅Tick级别的数据。这是最高频率的数据,包含了每一次最优买卖价(盘口)的变动。做市商策略必须工作在这样的高频数据上。
第二步:定义交易行为
开多仓: 在当前的买一价 (Best Bid Price) 挂一个限价买单。
开空仓: 在当前的卖一价 (Best Ask Price) 挂一个限价卖单。
平多仓: 在当前的卖一价 (Best Ask Price) 挂一个限价卖单。
平空仓: 在当前的买一价 (Best Bid Price) 挂一个限价买单。
第三步:执行循环
策略的目标是始终尝试在市场上同时持有一个多头仓位和一个空头仓位(或者说,始终挂着一个买单和一个卖单)。
如果没有多仓,就去挂买单。如果有了多仓,就去挂卖单尝试平仓。
如果没有空仓,就去挂卖单。如果有了空仓,就去挂买单尝试平仓。
只要买单成交后,对应的平仓卖单也能成交,一个完整的“低买高卖”循环就完成了,策略赚取了一个买卖价差。
策略代码
下面是一个非常简化的代码示例,展示了做市商策略的核心逻辑:
1 | # coding=utf-8 |
部分代码解释:
- tick 是一个字典(dict), 通常包含以下主要字段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14tick = {
"symbol": "CZCE.CF801", # 合约代码
"time": "2025-10-17 13:30:01.123", # tick 时间
"last": 1234.5, # 最新成交价
"volume": 100, # 最新成交量(通常是单笔成交量)
"quotes": [ # 当前盘口快照
{
"bid": [1234.0, 1233.5, 1233.0, ...], # 买一到买五价格
"bid_volume": [10, 15, 20, ...], # 买一到买五手数
"ask": [1235.0, 1235.5, 1236.0, ...],# 卖一到卖五价格
"ask_volume": [5, 10, 8, ...] # 卖一到卖五手数
}
]
}
需要注意的是,本演示策略只是用作示例,在现实中,以买一和卖一挂单不一定会成交,实际收益率也达不到示例水平。做市商策略对交易系统的延迟要求极高,且需要非常复杂的风险控制和资金管理逻辑,建议有一定量化交易经验的用户再进行尝试。