测试环境搭建:硬件环境配置
做量化交易性能测试,环境搭建是第一步。这一步要是没做好,后面测出来的数据全是废的。我见过太多人,花大价钱买了服务器,结果因为环境配置不当,测试结果根本没法复现。
说白了,我们要的是一个「可控」的环境。不是越快越好,而是越稳定、越可复现越好。
CPU 配置:别只看主频
很多人选 CPU 只看主频,觉得 5.0GHz 一定比 3.0GHz 快。其实不然。量化交易的回测和实盘,对 CPU 的要求不太一样。
- 回测场景:大量数据计算,多核并行是关键。我建议选核心数多的 CPU,比如 16 核以上。主频 3.0GHz 以上就够用。
- 实盘场景:低延迟是关键。核心数不用太多,8 核足够,但主频要尽量高,最好 4.5GHz 以上。
- 超线程:建议关闭。我在项目中遇到过,超线程在某些场景下反而导致性能抖动,延迟不稳定。
内存配置:容量 vs 速度
内存这块,很多人只关心容量。其实延迟更重要。
| 参数 | 回测场景 | 实盘场景 |
|---|---|---|
| 容量 | 32GB - 64GB | 16GB - 32GB |
| 频率 | DDR4 3200 以上 | DDR5 5600 以上 |
| 时序 | CL16 即可 | CL14 或更低 |
为什么实盘对内存时序要求高?因为高频交易中,内存访问延迟直接影响订单处理速度。我曾经用 CL16 和 CL14 的内存做过对比,同样的策略,延迟差了 3 微秒。别小看这 3 微秒,在纳秒级竞争的环境下,这就是胜负手。
磁盘配置:NVMe 是标配
磁盘这块没什么好说的,NVMe SSD 是底线。别用 SATA SSD,更别用机械硬盘。
- 回测场景:大量历史数据读取,建议用 PCIe 4.0 的 NVMe,顺序读取 5000MB/s 以上。
- 实盘场景:日志写入频繁,建议用企业级 SSD,带断电保护的那种。
软件环境配置
硬件搞定了,软件环境也得统一。否则换个机器,测试结果就变了,那还测个啥?
操作系统:Linux 是首选
做量化交易性能测试,我强烈建议用 Linux。Windows 的调度器不够稳定,有时候一个后台更新就能让你的延迟飙升 10 倍。
- 推荐发行版:Ubuntu 22.04 LTS 或 CentOS 7.9
- 内核版本:5.15 以上,支持 PREEMPT_RT 补丁更好
- 关键配置:关闭 CPU 频率缩放、关闭 ASLR、设置 CPU 亲和性
嗯,这里要注意。很多人装了 Linux 就直接用默认配置。其实默认配置对性能测试很不友好。我一般会做这几步:
# 关闭 CPU 频率缩放
echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# 关闭 ASLR
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
# 设置进程的 CPU 亲和性
taskset -c 0-3 python backtest.py
Python 版本:别用太新的
Python 版本这块,我踩过坑。Python 3.11 确实比 3.8 快不少,但有些库还没适配好。我建议用 Python 3.9 或 3.10,稳定性和性能都兼顾。
依赖库版本锁定
这个太重要了。我见过有人用 numpy 1.21 测出来的结果,换到 numpy 1.24 就变了。为什么?因为底层 BLAS 库的优化不一样。
我建议用 requirements.txt 锁定所有依赖版本,包括传递依赖。用 pip freeze 生成完整列表:
pip freeze > requirements_full.txt
然后每次测试前,用 pip install -r requirements_full.txt 重建环境。别嫌麻烦,这是保证可复现性的基础。
网络延迟与抖动控制
网络这块,是量化交易性能测试中最容易被忽视的环节。你想想看,你的策略再快,网络一抖,全白搭。
延迟 vs 抖动
这两个概念要分清:
- 延迟:数据从 A 到 B 的时间。比如从你的服务器到交易所,平均 5ms。
- 抖动:延迟的变化幅度。比如有时候 5ms,有时候 50ms,这就是抖动大。
做高频交易,抖动比延迟更致命。为什么?因为你可以通过算法补偿固定延迟,但抖动没法预测。我曾在项目中遇到一个情况,平均延迟只有 2ms,但抖动高达 20ms,结果策略频繁误判,亏了不少钱。
网络环境搭建
做基准测试时,网络环境要尽量模拟真实场景:
- 使用专用网卡:别用板载网卡,用 Intel X710 或 Mellanox ConnectX 系列,支持硬件时间戳。
- 直连交换机:中间不要经过路由器,减少跳数。
- 使用光纤:铜缆在长距离下延迟更高,光纤更稳定。
网络延迟模拟工具
测试时,我们需要模拟不同的网络条件。Linux 自带的 tc 命令就很好用:
# 模拟 10ms 延迟,5ms 抖动
sudo tc qdisc add dev eth0 root netem delay 10ms 5ms
# 查看当前规则
sudo tc qdisc show dev eth0
# 清除规则
sudo tc qdisc del dev eth0 root
用这个工具,你可以模拟从本地回环(0.1ms)到跨洲网络(200ms)的各种场景。我一般会测试三个场景:
| 场景 | 延迟 | 抖动 | 适用场景 |
|---|---|---|---|
| 同机房 | 0.1ms | 0.01ms | 高频交易 |
| 同城 | 1ms | 0.5ms | 普通量化 |
| 跨洲 | 100ms | 20ms | 套利策略 |
网络监控与记录
测试过程中,一定要记录网络状态。我习惯用 ping 和 tcpdump 同时抓取:
# 后台记录延迟
ping -i 0.1 exchange-server | ts '%.s' > network_latency.log &
# 抓包分析
tcpdump -i eth0 -w test_capture.pcap
测试结束后,用 tshark 或 Wireshark 分析 pcap 文件,看看有没有异常重传或丢包。这些都会影响测试结果。
知识体系总览
说了这么多,我画了一张图,把测试环境搭建的核心逻辑串起来。你一看就明白了:
这张图把硬件、软件、网络三个维度串起来了。你照着这个框架去搭建环境,基本不会出大问题。记住,测试环境的核心目标就三个字:可复现。做不到这一点,测出来的数据就是一堆数字,没有任何意义。
公众号:蓝海资料掘金营,微信deep3321