周四,4 月 2 日,美东时间 16:02。模拟账本看起来正是我们设计的样子:做多约 $240,000 的 BTCUSDT 永续合约,按 beta 加权做空 COIN、MSTR、MARA 和 RIOT 一篮子,残差不到 $500。上周五的对冲任务已在 15:45 跑完。16:00 UTC 的资金费率只是个舍入误差。我下线时心想,我们终于有了一个不只是在复刻 Nasdaq beta 的加密货币仓。
周五是耶稣受难日。我之所以反应过来,只是因为加密货币群还在发爆仓截图,而股票群安静成了一种没人坐在椅子上的安静。NYSE 和 Nasdaq 休市。Binance 没有。从周四现货收盘到周五美东时间 16:00,永续合约跌了 4.8%。那天股票空头并不作为一个市场存在。它们只是风险面板里的一排周四价格。
风险机器人还是发了。
对冲篮子 beta:0.04。残差 1d:−$11,184。状态:NEUTRAL
我还留着那张截图。一位同事把它打印出来,贴在我们几乎不用的办公室冰箱上。那颗绿色的 NEUTRAL 承担了太多工作。机器人用手头最后的股票成交来算 beta,那是周四的收盘竞价,对照的却是已经走了 24 小时的 BTC 标记价。冻结的标记价是周四的一张照片。把这张照片叫做对冲,就是带着裸露的加密货币仓位走进复活节周末,再拿一份报告祝贺你自己。
周一现货市场开盘。篮子跳空低开,但不是 4.8%,也不是齐步走。COIN 开在 −2.1%。MSTR 跌得更多。MARA 跌得更少。整个上午我们都在往一本多活了整整一个我们无法对冲的交易时段的账本里交易,然后把当初给这套设计背书的回测拉出来,问了它一个不客气的问题。上一个耶稣受难日你做了什么,再上一个呢,以及每一个股市歇着、BTC 却在假期里照常交易的工作日,你又做了什么?
写出第一版的研究 agent 把所有数据重采样成 15 分钟 K 线并做了前向填充。笔记本里用了 Pandas freq='B',看起来像个成熟的选择,直到你想起来它实际在做什么。'B' 表示周一到周五。耶稣受难日是周五。2026 年的六月节是周五。独立日调休日是周五。这个日历函数并没有日历。它只有一个星期过滤器。
对冲任务在每周五美东时间 15:45 运行,正常一周里这是朝现货收盘交易的合理时点。耶稣受难日永远是周五。在 2023–2026 这段窗口里,这个任务对上了 4 个耶稣受难日、六月节、7 月 3 日的全日休市,以及 4 个感恩节次日交易时段——那些交易日的收市铃早已在 1:00 PM 响过。10 个周五交易时段。每一次模拟器都接受了股票订单。成交价是周四收盘价,或把周五最后一笔常规成交前向带到现在,打扮成流水里的实时成交。加密货币标记价按实时跑。残差序列因此把一条腿根本没有机会回应的波动,记成了对冲功劳。
周末是同一个 bug,只不过发生在我们至少喝着啤酒拿来开过玩笑的时间表上。节假日是没人拿来开玩笑的那个版本,因为笔记本写着交易日,而耶稣受难日在体感上仍然像是成熟金融系统在运转的一天。银行开门。Fedwire 在线。券商 API 可以看起来醒着,却仍然没有地方把 COIN 订单送出去。
提早收盘更安静,在流水里也更不客气。2025 年 11 月 28 日,感恩节次日,NYSE 在 1:00 PM 收盘。我们的任务仍在 15:45 醒来,看着一根已经把 12:59 最后一笔成交扛了将近 3 小时的 15 分钟序列,然后「交易收盘」。成交模型甚至还向我们收取了收盘竞价滑点。16:00 并没有竞价。竞价发生在 13:00,没有我们。那天下午,模拟盘有更诚实的失败:新订单被拒绝,在途订单因提早收盘被取消,成交率为 0。
| 交易时段 | 现货市场 | 回测成交 | 模拟盘 |
|---|---|---|---|
| 2026 年耶稣受难日 | 全天休市 | 篮子按周四收盘价成交 | 拒单;标记价从周四起已过时 |
| 2026 年六月节 | 全天休市 | 同一个周五任务,同样的幽灵成交 | 后来在回放里才抓住 |
| 2026 年 7 月 3 日 | 休市(7 月 4 日调休) | 周五 15:45 对着周四成交价 | 没有可接入的现货交易时段 |
| 2025 年 11 月 28 日 | 1:00 PM 收盘 | 15:45 再平衡,12:59 最后成交,竞价滑点 | 13:00 之后拒单 |
| 普通周六 | 休市 | 前向填充的股票 K 线,实时永续 | 冻结的标的,实时永续 |
我们用按场馆划分的交易时段文件重新跑了这本账:常规时段、节假日、提早收盘、16:00 对 13:00 的收盘,以及每个标记价上的过时小时计数器。进入已关闭现货时段的订单不会按最新价成交。它们会被拒绝。如果任何对冲腿过时超过几个小时,风险面板不允许打印 NEUTRAL。单元测试很丑,我喜欢:拿一个普通周五,把它涂成休市,断言 COIN 成交为 0、篮子打上过时标记。然后再把 13:00 涂成收盘,断言 15:45 的任务连竞价模型看都不看一眼。
残差 Sharpe 从 1.14 变成了 0.61。这两个数字我都不当成开仓的理由。我把这个缺口当成一份供认。我们一直称为对冲残差的很大一部分,其实是加密货币的假期波动,收在股票空头腿只是上一交易时段纪念品的那些日子里。周末也干过一部分这种活,我们在谈话里已经打过折。节假日藏在交易日重采样里,那是一个尴尬得多的藏身之处。
我们仍然跑周五 15:45 的任务。它现在读一份 2026 年有 12 行的文件,其中 2 行还没发生。感恩节是 26 日。第二天,现货市场在 13:00 死去。我把那个 1:00 PM 收盘在日历里写了两遍,用了两个不同的名字,因为我信不过 11 月的自己,也因为如果我放任不管,pandas 仍会高高兴兴地把那个周五叫做交易日。
← 全部文章


