时间戳精度:毫秒级 vs 微秒级 vs 纳秒级
做回测系统,时间戳精度这个问题,我几乎每次跟人聊都会被问到。
「我的策略用毫秒级够不够?」「要不要上纳秒?」
说实话,这个问题没有标准答案。但有个原则我一直记着:精度不是越高越好,够用就行,但千万别不够用。
三种精度,到底差在哪?
先看一组直观的数据:
| 精度等级 | 时间单位 | 1秒内可区分的事件数 | 典型应用场景 |
|---|---|---|---|
| 毫秒级 | 1ms = 10⁻³s | 1000 | 日频、分钟级策略 |
| 微秒级 | 1μs = 10⁻⁶s | 1,000,000 | 高频、Tick级策略 |
| 纳秒级 | 1ns = 10⁻⁹s | 1,000,000,000 | 极高频、硬件加速回测 |
你想想看,毫秒级精度下,一秒钟只能区分1000个事件。如果你的策略在1秒内收到了2000笔订单,那就有1000笔的时间戳会「撞车」——它们会被认为发生在同一时刻。
这可不是小事。订单顺序一旦乱了,回测结果可能完全走样。
不同策略对精度的真实需求
1. 毫秒级:适合低频、日频策略
我个人习惯,做日频策略或者分钟级策略时,毫秒级完全够用。
举个例子,你每天收盘后做一次调仓,或者每5分钟判断一次买卖信号。这种情况下,订单之间的时间间隔至少是分钟级的,毫秒级的精度绰绰有余。
我在项目中遇到过有人用毫秒级精度跑高频策略,结果回测收益曲线漂亮得不像话,实盘却亏得一塌糊涂。为什么?因为毫秒级精度下,很多本应先后发生的订单被合并到了同一毫秒,回测系统误以为它们可以同时成交——这在实盘里根本不可能。
2. 微秒级:高频策略的黄金标准
做Tick级策略或者中高频策略,我建议直接上微秒级。
为什么?因为交易所的行情数据,很多本身就是微秒级时间戳。比如国内期货市场的CTP接口,时间戳精度就是微秒级。你用毫秒级去处理微秒级的数据,相当于主动丢弃了信息。
我记得有一次帮朋友优化一个期货高频策略。他原来的回测系统用毫秒级,回测结果年化收益30%。我帮他改成微秒级后,收益直接掉到12%。他吓一跳,问我是不是改错了。
我说:「没改错。微秒级精度下,那些被毫秒级掩盖的订单冲突、滑点、延迟问题,全都暴露出来了。这才是真实的市场。」
3. 纳秒级:极高频和硬件回测的领域
纳秒级精度,说实话,大部分软件回测系统用不上。
为什么?因为软件层面的时间戳获取本身就有几十纳秒到几微秒的抖动。你想想看,你用一个精度1纳秒的时钟,但获取这个时钟的操作本身就要花100纳秒——这精度还有什么意义?
我曾经试过在纯软件回测系统里用纳秒级时间戳。结果发现,同一笔订单在不同线程里获取的时间戳,前后能差出几百纳秒。这根本不是精度问题,而是系统本身的噪声。
纳秒级精度真正发挥作用的地方,是FPGA硬件回测或者专用硬件加速的场景。在这些场景下,时间戳的获取和订单的处理都在硬件层面完成,抖动可以控制在纳秒级别。
精度选择的决策树
我画了一张图,帮你快速判断该用哪种精度:
精度选择背后的代价
精度越高,代价越大。这不是危言耸听。
- 存储成本:纳秒级时间戳需要64位整数存储,毫秒级只需要32位。数据量大了以后,差距是几倍甚至几十倍。
- 处理开销:高精度时间戳的排序、比较、索引,都比低精度要慢。我实测过,微秒级排序比毫秒级慢了约30%。
- 系统复杂度:高精度意味着你需要处理时钟同步、NTP校准、漂移补偿等问题。毫秒级精度下,这些都不是事。
一个真实的坑
我曾经接手过一个回测系统,时间戳用的是毫秒级。跑日频策略没问题,但一跑高频就出怪事——回测收益高得离谱,但实盘完全相反。
排查了很久,发现问题出在毫秒级精度上。同一毫秒内到达的订单,系统随机排序。而回测时恰好把有利的订单排在了前面,导致回测结果严重失真。
后来我把时间戳改成微秒级,问题立刻消失了。嗯,这个教训我记到现在。
总结一下:毫秒级适合日频和分钟级策略,微秒级是高频策略的标配,纳秒级留给硬件回测。别贪高,也别省低。选对了精度,回测结果才有参考价值。
公众号:蓝海资料掘金营,微信deep3321