你发现了一项清晰的结果:你的加密策略大部分收益都来自 UTC 时间 13:00 到 14:00。你检查了费用,重新跑了回测,也对信号进行了模拟交易。现在你正准备推出美股版本,而表现最好的时段似乎是纽约时间 09:30–10:30。
在相信任何一个结果之前,先检查时钟发生了什么变化。美国夏令时会让纽约开盘时间相对于 UTC 前后移动 1 小时。如果特征、交易时段标签和订单各自采用了不同的时间定义,策略利用的可能只是日历边界,而非可重复的市场模式。
你不必放弃时段研究。你需要先明确假设针对的是哪种时钟,然后让回测的每个环节都统一使用它。
先说明这个时段的含义
“第一个小时”听起来很明确,直到你说清楚参照的是哪种时钟。它可能指纽交所开盘后的前 60 分钟、纽约当地民用时间 09:30–10:30,或一个固定的 UTC 时段。这些定义在一年中的部分时间里一致,但夏令时切换前后就会出现分歧。
对于美股假设,使用交易所当地的交易时段时间:纽约时间 09:30 无论纽约处于 EST 还是 EDT 都是 09:30。对于加密假设,固定的 UTC 时段可能才是你要研究的变量。加密货币全天候交易,没有交易场所的开盘铃声可作为判断依据。
在调参之前先写明定义。“在常规交易时段开盘后的第一个小时交易”可以检验。“在信号表现最好的时段交易”则会让优化器连同策略一起挑选时钟定义。
时钟不一致是怎么悄悄出现的
假设你的美股数据以 UTC 存储,特征代码按 UTC 小时对行分组,而执行规则在纽约时间 09:30 开仓。夏令时切换后,市场开盘时间会从 UTC 14:30 移到 13:30。按 UTC 小时分桶并标记为“第一个小时”的特征,现在对应的是交易时段中的另一段时间。
用时间戳构建 K 线时也会遇到类似陷阱。如果先按 UTC 重新采样,再把标签转换成纽约时间,可能会出现意料之外的边界。春季切换时,某个当地小时并不存在;秋季切换时,某个当地小时会出现两次。秋季那个星期日的当地时间 01:30 存在歧义,除非时间戳带有 UTC 偏移量或以 UTC 表示。
对于加密策略,日历仍可能产生影响。一个按 UTC 小时运行的策略可能连续数月都与美国市场活动重合,之后又在美国切换时钟时看起来发生了偏移。这并不意味着策略无效,但会改变你能得出的结论。你测得的可能是固定 UTC 时段的模式,它有时恰好与美股开盘重合,而非与开盘直接相关的效应。
将交易时段时钟纳入测试
将事件时间戳保留为 UTC,作为权威记录。需要当地交易时段字段时,根据具名时区(如 America/New_York)推导,并使用能处理历史规则变化的时区数据库。不要硬编码“UTC 减 5”或“UTC 减 4”:这两种偏移都无法全年定义纽约时间。
| 决策 | 美股示例 | 加密示例 |
|---|---|---|
| 假设采用的时钟 | 距常规交易时段开盘的分钟数 | UTC 当天小时 |
| 时段依据 | 交易所日历,包含节假日和提前收盘安排 | 连续 UTC 日历 |
| 下单时机 | 信号出现后的下一个可执行事件 | 信号出现后的下一个可执行事件 |
接着单独测试夏令时切换前后的几周。比较每次切换前后的表现,并检查最佳时段是跟随市场交易时段,还是固定在 UTC 时间。如果你搜索了许多小时、日期和偏移量来寻找最佳结果,也要把这项搜索纳入过拟合评估;时钟选择本身也是一次试验。
时区是一套规则,不是要减去的小时数。保存 UTC 事件;需要时再推导当地市场时间。
模拟运行需要确认什么
将策略转入模拟交易时,同时记录事件的 UTC 时间戳和相对于交易时段的分钟数。这样可以快速发现策略以为开盘时间是 09:30、实际却在当地时间 10:30 才触发的情况。还要检查节假日和提前收盘安排;如果把常规交易时段日程照搬到每个工作日,系统会在交易所休市的日子里凭空生成交易。
时钟切换时,不要急着平移信号,只为让收益曲线看起来和以前一样。先核实你声明的假设、日历和下单时机。如果结果随市场交易时段移动,你就了解了交易时段行为的一些情况。如果结果仍固定在同一个 UTC 小时,你也发现了另一种规律。回测应当保留这一区别。
← 全部文章


