我让未来泄漏进了过去

早期有过一次回测结果,好得本应让我高兴。可盯着它看了几分钟之后,它反而让我深感不安。模拟中的收益又大、又平滑、又干净得过了头——这种表现根本不会出现在真实、嘈杂、充满对抗的市场里。而它之所以不会出现在真实市场里,是因为我的测试在我毫无察觉之间,悄悄地能够看见未来。

并非有意为之。我没有写下 如果你知道接下来会发生什么,就作弊。未来是通过十几道细小、看上去人畜无害的缝隙泄漏进了过去,而其中的每一道,都在奖励我的系统具备一种它在真金白银上场时永远、永远不会拥有的未卜先知。

回测中最诱人的那个 bug

它的通称是前视偏差(look-ahead bias),或者叫泄漏(leakage)。每当你的模拟中某个决策被允许使用某些信息,而在现实里、在做出该决策的那一刻,这些信息根本尚未存在时,它就发生了。

这一点值得停下来细想,因为它比听上去更微妙。回测本应是对历史的一次忠实重演:在每一个时刻,系统只能知道在那一刻确实可知的东西,并且只能据此行动。泄漏,就是那道墙上的任何一条裂缝——任何让明天的信息渗进今天决策的地方。一旦如此,你的回测就不再衡量”这套策略当时会表现如何”,而开始衡量”如果它能偷看,这套策略会表现如何”。

未来是怎样溜进来的

我在这里要小心,不去描述我自己系统的具体细节,所以让我把话停留在这些泄漏所采取的一般形态上,因为它们出奇地常见。

一种经典形式:在决策中使用了一个其实直到你假装做决策的那一刻之后才最终敲定的值。另一种:在准备数据时,用某些统计量——一个平均值、一个区间、一个典型规模——对数据做缩放或归一化,而这些统计量是在整段历史上算出来的,包括在你模拟的那一刻尚未发生的那一部分。再一种:借着事后诸葛的便利去筛选或标注数据,悄悄地以一种只有你已经知道结果才做得到的方式排除掉某些样本。

这其中的每一条,都是单独一行、看上去合情合理的代码。在你写下它的时候,没有一条让人觉得是在作弊。而它们每一条,都向你的系统递去了一小股稳定、源源不断的来自未来的信息。

为什么它如此难以发现

泄漏最残忍的一点,在于它根本不像一个 bug。代码运行起来没有报错。什么都不会崩溃。而它产出的结果也不是一个警报——它是一个漂亮的数字。漂亮的数字在大多数人那里不会触发怀疑。它们触发的是庆祝、一张截图,以及一种隐隐的感觉:你或许真的发现了什么。

这恰恰就是让这类 bug 如此危险的原因。它藏在看起来像成功的结果里,而这正是 bug 能藏身的最糟糕的地方,因为成功是你最没有动力去拷问的那一种结果。崩溃会要求被修复。一条漂亮的资金曲线(equity curve)则邀请你停下不再细看。

蛛丝马迹:好得不真实的结果

很长一段时间里,我唯一可靠的警报就是我自己的难以置信。当一次回测回来时,结果好得离谱地超出你合理能够期待的一切——比市场理应允许的更平滑、更赚钱、更稳定——正确的第一假设不是”我发现了某种了不起的东西”,而是”信息正在某处泄漏,而我得把它找出来”。

这是一个着实有用的先验,而我已经把它持得很牢:在回测里,卓越远远更常是一个 bug 的症状,而非一种优势的证据。市场很难。那些暗示它很容易的结果,通常是在告诉你关于你代码的事,而不是关于市场的事。

寻找泄漏

真正去猎捕泄漏的工作既乏味又毫无光彩可言,而且我没有找到任何能取代它的巧妙捷径。这套纪律是这样的:拿起每一个喂进决策的值,把它逆向追溯到它在现实生活中本会变得可知的那个精确时刻。然后平实地问一句:“在我假装行动的那一瞬间,我真的可能已经拥有这个数字了吗?”

大多数泄漏,当你终于把它逼到墙角时,结果都不过是一个时间戳那么大的作弊——一个在它真正存在之前的那一刻就被用上的值,一次比被允许的范围多探进数据一步的计算。都是细小的缝隙。但一道细小的缝隙,乘以成千上万次决策的反复,就足以凭空制造出一整笔想象中的财富。

更深的原则:尊重时间之箭

在这一切之下,是一条我如今视为近乎神圣的单一原则:尊重时间之箭。回测,本质上是一个承诺——一个你只用过去在当下行动、从不动用未来的承诺。每一次泄漏都是一个被打破的小承诺,是你的代码悄悄向时间前方伸手、给自己开后门的地方。

于是,构建一套可信的模拟到头来远不在于精巧的建模,而远更在于守卫一条边界:在某一时刻已被知晓之物,与仅仅在之后才可知之物之间的那条线。大部分工程努力——没人会就此写出令人钦佩长帖的那一部分——不过是抵御你自己代码那持续不断、随随便便就要偷看的倾向,守住那条边界。

为什么我如今不信任自己最好的结果

这一切带来的持久改变,是我对好消息的态度倒转了过来。一次令人失望的回测就只是令人失望而已;我看一眼,耸耸肩,然后翻篇。而一次惊艳的回测,如今会先让我紧张,再让我高兴。结果越好,我就越用力去找那个炮制出它的泄漏。

这听上去毫无乐趣,有时也确实如此。但它源自一种来之不易的尊重——尊重这场特定的游戏是如何惩罚自欺的。一个系统会对你撒下的最危险的谎,从来不是那些丑陋的失败。而是那些华丽的成功——它们看上去恰恰就是你一直盼望找到的东西,也正因如此,是你最不会想到去怀疑的那一种。

— 不荐信号,不保收益,非投资建议。