核心指标定义:延迟、吞吐量、错误率、资金敞口、滑点
做高频交易系统,说白了就是跟时间赛跑。我见过太多团队,一上来就堆硬件、上FPGA,结果连最基本的指标都没定义清楚。嗯,这其实是个大坑。
今天咱们就把这五个核心指标掰开揉碎了讲。我个人习惯是,先定义清楚「什么是好」,再去谈「怎么做到好」。你想想看,连目标都没有,优化个什么劲儿?
一、延迟(微秒级)
延迟是高频交易的命根子。我把它定义为:从行情数据到达网卡,到交易指令发出网卡,这中间的全部耗时。
注意,我说的是「网卡到网卡」,不是「应用层到应用层」。为什么?因为内核协议栈那几微秒的抖动,足以让你在抢单时输得精光。
延迟分解(典型值)
- 网卡硬件延迟:0.5 - 1 μs
- 内核旁路(DPDK/ Solarflare):1 - 3 μs
- 业务逻辑处理:2 - 5 μs
- 订单编码与发送:0.5 - 1 μs
- 全链路目标:< 10 μs
我在项目中遇到过一件事:某次回测跑得飞起,实盘却总是慢半拍。查了三天,发现是日志打印阻塞了I/O线程。你想想看,一个 print() 调用能吃掉 50 μs,这在高频系统里简直是灾难。
我的测量建议
别用 time.time(),精度不够。用 time.perf_counter_ns() 或者直接读 CPU 的 TSC 寄存器。我曾经用 Python 的 time.time() 测延迟,结果测出来的数据比实际大了 10 倍——因为 GIL 切换把时间算进去了。
二、吞吐量(每秒笔数)
吞吐量就是系统能扛多大并发。说白了,行情来了你得接得住,订单来了你得发得出去。
我一般用两个维度来衡量:
- 行情吞吐:每秒能处理多少笔行情 tick。国内期货市场,行情快照每秒 2-4 次,但深度数据可能每秒上千笔变动。
- 订单吞吐:每秒能发出多少笔交易指令。注意,这里包括撤单和改单。
| 系统等级 | 行情吞吐(笔/秒) | 订单吞吐(笔/秒) |
|---|---|---|
| 入门级 | 5,000 | 500 |
| 进阶级 | 50,000 | 5,000 |
| 顶级 | 500,000+ | 50,000+ |
注意:吞吐量和延迟是跷跷板。你拼命压吞吐,延迟就会飙升。我见过有人把队列长度设到 10 万,结果吞吐上去了,延迟从 5 μs 变成了 500 μs——这在高频交易里等于自杀。
三、错误率
错误率不是简单的「报错次数/总请求数」。在高频交易里,错误分三种:
- 协议错误:报文格式不对、校验码错误。这种错误通常是你代码的 bug。
- 业务错误:资金不足、持仓不够、价格超出涨跌停。这种是策略逻辑问题。
- 系统错误:连接断开、内存溢出、CPU 过载。这种是架构问题。
我个人习惯把错误率控制在 万分之一以下。注意,这里说的是「系统错误」,不是「业务错误」。业务错误是策略该管的事,系统错误才是你的责任。
我曾经踩过的坑
有一次系统报错率突然从 0.01% 飙升到 5%。查了半天,发现是某个行情源的数据格式变了,解析器没做兼容处理。从那以后,我要求所有解析模块必须带「熔断机制」——连续 3 次解析失败,自动切换到备用数据源。
四、资金敞口
资金敞口,说白了就是「你当前暴露在风险中的资金量」。高频交易里,敞口控制比盈利更重要。
我把它拆成三个层级:
- 单笔敞口:一笔订单的最大亏损。通常设为账户净值的 0.5% - 1%。
- 日内敞口:一天内累计的最大亏损。我一般设 3% - 5%,到了就强制平仓。
- 跨品种敞口:多个品种之间的相关性风险。比如你做螺纹钢和热卷,它们走势高度相关,敞口要合并计算。
实时监控技巧
别等收盘再算敞口。我习惯在内存里维护一个「敞口快照」,每笔成交后立即更新。用 Redis 或者共享内存都行,关键是延迟要低。我曾经用 MySQL 算敞口,结果查询一次要 50 ms——等查出来,行情早变了。
五、滑点监控
滑点就是「预期成交价」和「实际成交价」之间的差值。高频交易里,滑点往往是最大的成本。
我把它分成两类:
- 显性滑点:买卖价差造成的。比如你看到买一价是 100,下单后成交在 101,这 1 块钱就是显性滑点。
- 隐性滑点:市场冲击造成的。你一个大单砸下去,把价格推高了,后面的订单全吃亏。
监控滑点,我一般用这个公式:
滑点 = (实际成交均价 - 预期成交价) / 预期成交价 * 10000 # 单位:BP
举个例子:你预期在 100 元成交 100 手,实际成交均价是 100.05 元。那么滑点就是 (100.05 - 100) / 100 * 10000 = 5 BP。
注意:滑点不是越小越好。有时候为了抢单,你不得不接受更大的滑点。关键是「可控」——你得知道当前滑点是多少,能不能接受。我见过有人把滑点监控设成 0,结果系统频繁撤单重发,反而造成了更大的延迟。
知识体系总览
下面这张图,是我做高频监控系统时的核心框架。五个指标互相影响,缺一不可。
这五个指标,说白了就是一套「体检系统」。延迟是心跳,吞吐量是肺活量,错误率是白细胞,资金敞口是血压,滑点是血糖。哪个指标出问题,系统都得「住院」。
我个人习惯是,把这五个指标做成一个实时仪表盘,每 100 ms 刷新一次。一旦某个指标超过阈值,立即告警。嗯,下一节咱们就聊聊这个仪表盘怎么做。
一句话总结
延迟要低、吞吐要高、错误要少、敞口要控、滑点要盯。这五个指标,就是高频交易系统的「五维健康度」。
公众号:蓝海资料掘金营,微信deep3321