第十七章:高频做市与算法交易:做市算法设计、延迟套利、订单类型选择
做市商这行,做到最后拼的是什么?
不是策略多聪明,也不是模型多复杂。说白了,就是两样东西:速度和订单处理能力。
我早年在一家自营交易公司待过,那时候我们做ETF做市,用的是C++写的底层引擎。有一次,一个同事写了个内存分配没优化好的模块,结果每次报价更新多了几十纳秒的抖动。就这几十纳秒,让我们的成交率从65%掉到了40%。你想想看,这损失有多大。
所以今天这一章,咱们就聊聊高频做市里的几个核心问题:算法怎么设计、延迟套利怎么防、订单类型怎么选。
17.1 做市算法的核心设计思路
做市算法,本质上就是一个报价生成器。它根据市场状态,决定什么时候报买价、什么时候报卖价、报多少量。
我个人习惯把做市算法拆成三层:
- 信号层:判断当前是否适合做市。比如波动率太高时,我会暂停报价。
- 定价层:计算合理的买卖报价。这里要考虑库存、订单流、对手方行为。
- 执行层:把报价发出去,同时管理订单生命周期。
下面这张图是我常用的做市算法流程框架:
关键点:做市算法的核心不是预测价格涨跌,而是管理不对称信息流。你报出去的每一笔订单,都是在跟市场里的知情交易者对赌。
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如果阻塞了,整个循环就卡住了。所以我建议用异步非阻塞的方式处理行情接收。
总结一下:高频做市不是靠预测市场赚钱,而是靠提供流动性和管理风险赚钱。算法设计要快、要稳、要能防套利。订单类型选对了,事半功倍;选错了,可能一天就把一个月的利润亏光。
交易系统化学习资料 微信Strategy888888