第 6 课 · 两个无聊细节如何差点毁掉一切:时区与移仓

【这课你会明白什么】

  • 同一笔成交为什么有三个”几点了”,夏令时怎么坑人
  • 一桩真实的侦探案:165 笔交易如何一锤定音地证明”翻译没错”
  • 合约”搬家”会在数据里挖出多大的坑,以及我们怎么缝

正文

上半场:时区

同一笔成交,有三个”几点了”:数据文件内部记 UTC(全球统一的标准时间,不搞任何拨钟把戏);交易所按芝加哥时间定规则(MES 的交易所 CME 在芝加哥);而你的软件界面显示北京时间

坑在夏令时:美国一年拨两次钟,芝加哥夏天比 UTC 慢 5 小时、冬天慢 6 小时。谁要是死记”芝加哥=北京减 13 小时”,一年要错半年。项目铁律:内部一律用 UTC,只在边界处转换,转换交给专业的时区程序库,永不手算。

顺带两个交易所概念:日盘(RTH)=芝加哥 08:30–15:00,美股现货开市的时段,成交最厚、行为最有规律;交易日从前一天 17:00(芝加哥)就开始了——所以北京时间周二清晨的成交,属于”周二”这个交易日。

时区错了会怎样?所有”开盘后 60 分钟”这类规则全部错位,整栋楼歪掉。所以项目做了一次侦探式验证。我们写了个”翻译程序”把原始档案译成表格(它是第 11 课的部件之一),但不能自己出题自己阅卷。恰好有一份独立证据:2025-10-16 的一份交易日志,165 笔成交,每笔旁边记着当时的买一/卖一快照——这份快照和数据文件来源完全独立。推理:如果翻译全对,那么应该存在一个固定时差,让这 165 笔在逐笔数据里 ±2 秒内都能找到一模一样的(买一, 卖一)组合。把 ±14 小时内所有候选时差全试一遍:

候选时差 匹配率
−8 小时(界面=北京时间) 100.0%
次优候选 3.0%

100% 对 3%,一锤定音:数据内部是 UTC,界面是北京时间,翻译无误。副产品:日志里 20:30 那波剧烈成交,正是美东 08:30 的经济数据发布——两个时钟对上了。

下半场:合约到期与移仓

每张期货合约有寿命:一年四张,3、6、9、12 月到期,代码 H / M / U / Z(MESM25 = 2025 年 6 月合约)。到期前约 8 天,全市场把持仓搬到下一张合约——这叫移仓

做十几年的研究,必须把一段段合约缝成一条连续的价格线。麻烦来了:同一时刻,9 月合约和 6 月合约价格并不相等,差额叫基差——大体等于”多持有三个月的资金利息减股息”。算一笔:指数 6100、利率高出股息约 3.5%(年化)、剩 0.25 年:6100 × 3.5% × 0.25 ≈ 53 点

如果把两段合约直接首尾相接,接缝处会凭空出现一根 53 点的”跳涨”——假跳空:不是行情,是基差。实测我们的数据:一次接缝 +53.50 点(和理论的 53 对上了),下一次 +58.25 点。不处理的话,做多策略每次移仓白捡 53.5 点 × $5 ≈ $267 的假利润,十个月两次移仓就是 $534 的系统性造假——足够把一个亏钱策略化妆成赚钱的。

缝法(术语叫复权,back-adjust):利用新旧合约在移仓前同时都有成交的重叠时段,取上千根”同一分钟”的两合约价差,用其中位数把历史段整体平移,跳空就被熨平了。附赠一次免费质检:同一合约恰好有两个独立下载的文件,用同样方法测它们之间的”拼接价差”——结果恰好 0.00。两条独立数据链严丝合缝,等于整条流水线又自检了一遍。

【与我们项目的连接】

时区结论记录在 reports/tradelog_validation.md(165 笔、100% 对 3%);+53.50、+58.25、0.00 都是实测值。这两个”无聊细节”后来都升级成了制度:内部 UTC 是决策 D2;复权在十六年数据上做了 92 次,移仓价差串起来竟复刻出十六年的利率变迁史(第 13 课见)。

【三个自测问题】

  1. 为什么”芝加哥时间=北京时间减 13 小时”是错的?
  2. 接缝处那根 +53.5 点的跳涨是什么?不是什么?
  3. “100% 对 3%”这个对比,为什么能一锤定音?

(答案:1. 美国有夏令时,芝加哥与北京的时差一年切换两次(13 与 14 小时各半年),死数必错半年。2. 是两张合约之间的基差(持有成本),不是任何真实的行情变动。3. 如果翻译有任何系统性错误,不可能存在一个时差让 165 笔独立记录全部严丝合缝;次优候选只有 3%,说明匹配不是巧合堆出来的。)