第十七章:高频做市与算法交易:做市算法设计、延迟套利、订单类型选择

做市商这行,做到最后拼的是什么?

不是策略多聪明,也不是模型多复杂。说白了,就是两样东西:速度订单处理能力

我早年在一家自营交易公司待过,那时候我们做ETF做市,用的是C++写的底层引擎。有一次,一个同事写了个内存分配没优化好的模块,结果每次报价更新多了几十纳秒的抖动。就这几十纳秒,让我们的成交率从65%掉到了40%。你想想看,这损失有多大。

所以今天这一章,咱们就聊聊高频做市里的几个核心问题:算法怎么设计、延迟套利怎么防、订单类型怎么选。

17.1 做市算法的核心设计思路

做市算法,本质上就是一个报价生成器。它根据市场状态,决定什么时候报买价、什么时候报卖价、报多少量。

我个人习惯把做市算法拆成三层:

  1. 信号层:判断当前是否适合做市。比如波动率太高时,我会暂停报价。
  2. 定价层:计算合理的买卖报价。这里要考虑库存、订单流、对手方行为。
  3. 执行层:把报价发出去,同时管理订单生命周期。

下面这张图是我常用的做市算法流程框架:

高频做市算法核心流程 信号层 波动率检测 · 流动性判断 定价层 库存管理 · 报价偏移 执行层 订单发送 · 生命周期管理 库存与成交反馈 输入:订单流 逐笔成交 · 深度快照 输入:行情数据 Level2 · 逐笔委托 输入:风控参数 敞口限额 · 撤单频率 输出:买卖报价 价格 · 数量 · 订单类型

关键点:做市算法的核心不是预测价格涨跌,而是管理不对称信息流。你报出去的每一笔订单,都是在跟市场里的知情交易者对赌。

17.2 延迟套利:做市商的天敌

延迟套利,也叫延迟套利攻击。什么意思呢?

假设你在A交易所做市,报价是100.01买、100.03卖。另一个交易所B,价格是100.02买、100.04卖。正常情况下,套利者会从A买、往B卖,赚1分钱差价。

但延迟套利更狠。他们利用你的报价更新延迟——比如你的系统从收到行情到更新报价,需要500微秒。套利者就在这500微秒里,用你还没更新的旧报价成交。

我曾经见过一个案例:某做市商在股指期货上,因为网络延迟比对手慢了200微秒,结果每天被延迟套利吃掉3%的利润。后来他们换了FPGA网卡,才把延迟压到50微秒以下。

避坑指南:我曾经犯过一个错误——只优化了交易引擎的延迟,没管行情接收的延迟。结果行情到了,报价还没更新,照样被套利。记住:行情延迟 + 计算延迟 + 发送延迟,三者必须一起优化。

防御延迟套利,我建议从这几个方向入手:

  • 降低自身延迟:用FPGA或GPU做行情解析,用内核旁路技术(如DPDK)收发网络包。
  • 引入随机延迟:在报价更新时加一个微小的随机抖动,让套利者无法精确预测你的更新时机。
  • 价格保护机制:如果发现某笔成交的价格明显偏离市场,立即暂停该品种的报价。
  • 多交易所协同:如果你同时在多个交易所做市,确保报价之间的价差合理,不给套利者留空间。

17.3 订单类型选择:用对工具才能赢

做市商用的订单类型,跟普通交易者不太一样。我们不光要成交,还要控制风险。

下面这张表是我常用的订单类型对比:

订单类型 适用场景 优点 缺点
限价单(Limit) 常规做市报价 控制成交价格,提供流动性 可能不成交,暴露订单意图
冰山订单(Iceberg) 大额做市,隐藏真实量 减少市场冲击,隐藏意图 执行速度慢,容易被探测
市价单(Market) 紧急平仓、对冲 立即成交 滑点大,成本高
止损单(Stop) 风控触发 自动止损 可能被触发后滑点严重
Peg订单(Pegged) 跟随市场最优价 自动调整报价,减少人工干预 依赖交易所支持,延迟较高

我个人习惯,做市时90%以上的订单都用限价单。为什么?因为做市商赚的就是买卖价差,你报市价单等于把利润让给别人。

但有一种情况例外——库存失衡。比如你手里积压了大量多头仓位,这时候如果市场突然下跌,你就要用市价单快速减仓。别犹豫,保命要紧。

小技巧:我建议在代码里给每种订单类型设一个优先级标签。比如限价单优先级最低,市价单优先级最高。这样在系统负载高时,可以自动丢弃低优先级的订单请求,保证风控指令优先执行。

17.4 实战中的算法交易细节

说几个我在项目中踩过的坑:

第一个坑:订单生命周期管理

做市算法每秒可能要发几百笔订单。如果订单管理不好,会出现「幽灵订单」——你以为撤单了,其实交易所还没处理完。结果就是超量成交,库存瞬间爆仓。

我的做法是:维护一个订单状态机,每个订单从创建到成交或撤单,都有明确的状态流转。而且一定要做超时重查,比如每100毫秒检查一次未确认的订单。

第二个坑:报价频率控制

有些交易所对撤单率有惩罚。比如你撤单率超过80%,交易所会限制你的报价权限。

我建议在算法里加一个报价节流器:如果市场波动不大,就降低报价更新频率;如果波动大,反而要减少报价,避免频繁撤单。

第三个坑:多品种协同

如果你同时做市多个相关品种(比如沪深300ETF和股指期货),要注意跨品种套利的风险。你的ETF报价可能被用来套利期货,反过来也一样。

我习惯在算法里加一个协方差矩阵,实时监控各品种之间的价差关系。一旦发现异常,就暂停相关品种的报价。

// 伪代码:做市算法核心循环
while (market_open) {
    // 1. 获取最新行情
    order_book = get_market_data(symbol);
    
    // 2. 检查是否适合做市
    if (!is_marketable(order_book)) {
        cancel_all_orders(symbol);
        continue;
    }
    
    // 3. 计算最优报价
    bid_price = calculate_bid(order_book, inventory);
    ask_price = calculate_ask(order_book, inventory);
    
    // 4. 检查风控
    if (!risk_check(bid_price, ask_price, inventory)) {
        cancel_all_orders(symbol);
        continue;
    }
    
    // 5. 发送订单
    send_limit_order(symbol, BUY, bid_price, bid_qty);
    send_limit_order(symbol, SELL, ask_price, ask_qty);
    
    // 6. 管理已有订单
    manage_outstanding_orders(symbol);
    
    // 7. 等待下一个周期
    sleep(microseconds(50));
}

这段代码看起来简单,但实际生产环境里,每一步都可能出问题。比如get_market_data如果阻塞了,整个循环就卡住了。所以我建议用异步非阻塞的方式处理行情接收。

总结一下:高频做市不是靠预测市场赚钱,而是靠提供流动性管理风险赚钱。算法设计要快、要稳、要能防套利。订单类型选对了,事半功倍;选错了,可能一天就把一个月的利润亏光。


无相订单流研究社 微信Lucian808555