一、做市引擎概述

什么是做市交易

做市交易,说白了就是「两边报价,赚差价」。

你想想看,一个交易市场里,有人想买,有人想卖。但这两拨人往往不会同时出现。做市商干的事就是:同时挂出买单和卖单,给市场提供流动性。

举个例子。假设比特币现价 30000 美元。我作为做市商,挂一个 29990 的买单,再挂一个 30010 的卖单。有人卖给我,我赚了 10 美元的价差?不,我其实是在等下一个买家以 30010 买走。这一来一回,10 美元就是我的利润。

听起来简单?嗯,这里要注意。真正的做市远不止「低买高卖」这么简单。我在项目中遇到过最头疼的问题——你挂的单子可能被市场瞬间吃掉,然后价格朝不利方向狂飙。这就是做市的核心风险:库存风险。

核心要点:做市交易的本质是提供流动性,赚取买卖价差。但你要承担库存风险和信息不对称风险。

做市引擎的核心功能

一个成熟的做市引擎,至少得干这几件事:

  • 行情接入——实时获取市场深度、成交数据。延迟要低,数据要准。
  • 信号生成——根据市场状态,决定报价的价位和数量。这是大脑。
  • 订单管理——挂单、撤单、改单,全生命周期跟踪。我曾经因为订单状态同步不及时,导致重复成交,亏了一笔大的。
  • 风险控制——库存上限、最大亏损、报价偏离度。没有风控的做市引擎,就是裸奔。
  • 绩效统计——赚了多少?胜率如何?滑点多大?这些数据反过来优化策略。

我个人习惯把做市引擎分成三层:数据层、策略层、执行层。数据层负责清洗行情,策略层负责算报价,执行层负责跟交易所打交道。

避坑指南:我曾经在数据层偷懒,直接用交易所的原始 tick 数据。结果发现有些 tick 是乱序的,导致策略信号频繁抖动。后来我加了一层数据对齐和去重逻辑,问题才解决。

做市策略的基本类型

做市策略不是只有一种。根据你的目标和风险偏好,可以选不同的玩法。

策略类型 核心逻辑 适用场景
对称报价 买卖价差固定,两边同时挂单 高流动性、低波动市场
非对称报价 根据库存偏向调整报价 库存需要平衡时
动态价差 价差随波动率、深度变化 波动较大的市场
事件驱动 围绕大单、新闻、交割等事件调整 有明确事件节点时

你可能会问:哪种策略最好?其实没有标准答案。我在项目中试过对称报价,简单稳定,但遇到单边行情就亏。后来换成动态价差,收益高了,但参数调起来很头疼。

嗯,这里要提醒一句:别迷信复杂策略。我见过有人用深度学习做报价,结果过拟合得一塌糊涂。有时候,一个简单的动态价差策略,配上好的风控,反而更赚钱。

做市引擎的架构设计

聊到架构,我习惯画一张图来理清思路。下面是我常用的做市引擎架构图:

做市引擎架构设计 数据层 行情接入 数据清洗 数据对齐 缓存管理 策略层 信号生成 报价计算 库存管理 风险控制 执行层 订单管理 撤改单 成交回报 日志记录 监控与告警层 反馈优化

这张图里,数据层在最底下,往上依次是策略层、执行层。监控层横跨所有层级,随时盯着。

我个人习惯把监控层单独拎出来。为什么?因为做市引擎一旦跑起来,你不可能一直盯着屏幕。监控层会自动检测异常:比如报价偏离过大、库存超限、网络断开。一旦出事,立刻告警。

注意:架构设计里最容易忽略的是「反馈回路」。策略层产生的信号,会影响执行层;执行层的成交数据,反过来又影响策略层的库存计算。这个闭环如果设计不好,很容易出现「死循环」或者「信号滞后」。

代码层面,我一般用事件驱动架构。每个模块独立运行,通过消息队列通信。这样好处是:某个模块挂了,不会拖垮整个系统。我曾经用多线程硬编码,结果一个线程卡死,整个引擎都停了。后来改成异步事件驱动,稳多了。

# 伪代码示例:做市引擎核心循环
class MarketMakerEngine:
    def __init__(self):
        self.data_layer = DataLayer()
        self.strategy_layer = StrategyLayer()
        self.execution_layer = ExecutionLayer()
        self.monitor = Monitor()
    
    def run(self):
        while True:
            # 1. 获取最新行情
            tick = self.data_layer.get_tick()
            
            # 2. 生成报价信号
            signal = self.strategy_layer.generate_signal(tick)
            
            # 3. 执行报价
            self.execution_layer.place_orders(signal)
            
            # 4. 监控检查
            self.monitor.check_risk()
            
            # 5. 等待下一个周期
            time.sleep(0.1)

嗯,这个例子很简化。实际项目中,每个步骤都有大量细节。比如数据层要处理乱序 tick,策略层要算库存偏移,执行层要处理撤单失败。但核心思路不变:分层、解耦、可监控。

我的经验:做市引擎的架构,宁可「重」一点,也别「轻」了。我见过有人用几十行代码就搭了个做市机器人,结果上线第一天就爆仓。架构的冗余,是为了应对你没想到的极端情况。

好了,这一章我们聊了做市交易的本质、引擎的核心功能、策略类型和架构设计。这些都是基础,但基础不牢,后面全是坑。下一章我们会深入信号生成的具体算法,到时候再细聊。


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