单元 4 / 6 · 5 分钟阅读

回测与前向测试

回测显示一套策略在过去会有怎样的表现;前向测试则以实时数据加以验证,而实盘结果几乎总是比回测所承诺的更差。

Overfitting: backtest versus live equity Two equity curves over a test period. As model complexity rises, the green in-sample backtest curve grows smoother and higher, while the red out-of-sample live curve improves a little, peaks early, then collapses below break even. The widening gap between them is overfitting. 损益平衡权益时间 →+71%+11%样本内(回测)样本外(实盘)
模型复杂度简单过拟合≈20 参数

过拟合回测一路飙升,实盘却停滞并开始下滑。

回测+71%
实盘+11%
过拟合差距61 点
拖动模型复杂度。越复杂的模型,会把过去描摹得越完美(那条平滑的绿色回测曲线),但它记住的其实是噪声;所以在从未见过的数据上测试的红色实盘曲线,会提早见顶,然后崩塌。那道不断扩大的差距,就是过拟合

将上方图表从 Simple 拖到 Overfit:绿色的回测曲线平滑成一条完美无瑕的线,红色的实盘曲线却早早见顶、随后崩解。这道落差有一个名字,叫过拟合,而如何守在它安全的一侧,正是本单元真正要谈的主题。在你为一条规则或一个模型冒上哪怕一美元风险之前,你要先测试它,而诚实的测试方式恰恰只有两种,另外还有一整份自欺欺人的方法清单。本单元要教你如何分辨两者。一次好的测试能让你免于一个坏主意。一次被操弄的测试(通常是无意间操弄的)则恰恰相反:它交给你自信,让你更快地亏钱。读完本单元,你会知道如何进行一次值得信赖的回测、如何识破那些让亏损策略看起来像印钞机的把戏,以及为什么你测试印出的那个数字,是一个在现实中永远达不到的天花板。

回测:在历史上重播一套策略

回测是指让一套策略在历史数据上运行,以估算它过去会有怎样的表现。你拿起自己的规则,把它们对准几年的价格历史,让它们去“交易”那段历史,看看资金曲线长什么样子。

它是必要的。一套在过去都会亏损的策略,不值得用真金白银去交易,所以回测是你必须先跨过的下限。但跨过下限,并不等于触及上限。回测很容易被操弄成呈现该策略在实盘中根本赚不到的结果,而多数时候,没有人是刻意去操弄它的。错误是悄悄潜入的。

所以,把一次好的回测当成继续深入研究的许可,绝不要当成你会赚钱的证明。本单元其余部分,就是一份清单,列出外表干净的回测会如何欺骗你。

前视偏差:用明天的报纸作弊

前视偏差是指在测试中使用了在模拟决策当下其实还无法取得的信息。测试“知道”某些真实交易者当时还不可能知道的事情,于是做出一个真实交易者不可能做出的决定。

两个经典例子:

  • 用某一天的收盘价去触发一笔你假装在当天早上“开盘时”下的交易。现实中,一天结束之前你并不知道收盘价。
  • 使用重编后的基本面数据,而这些数据其实是在你所测试日期的数周之后才公布的。

哪怕只是极少量未来信息的泄漏,都能把一套平凡的策略,变成一场平滑、轻松盈利的幻想。资金曲线之所以看起来华丽,是因为回测正在悄悄地读着明天的报纸。如果一次回测看起来太干净、太轻松,前视偏差就是你该首先怀疑的对象。

曲线拟合,以及样本内/样本外的解方

第二个巨大的陷阱是曲线拟合。如果你不断调整一套策略的参数,直到它的历史曲线看起来完美无瑕,你并没有找到真正的优势。你只是把策略捏合成过去那些起伏的确切形状,连同那些不会重演的随机噪声一并纳入。曲线之所以漂亮,恰恰是因为你把它塑造成贴合那一段特定历史的样子。

标准的防御手段是样本内对比样本外测试,它比听起来要简单:

  1. 把你的历史数据切成两段。
  2. 样本内: 在第一段上尽情调整策略。
  3. 冻结规则。不再做任何微调。
  4. 样本外: 让那些冻结的规则在第二段上运行,那是策略从未见过的数据。

如果绩效在样本外依然站得住脚,那个优势或许是真的。如果它崩溃了,那你当初拟合的就是噪声,而现在就发现,总好过用真金白银去发现。一条值得随身携带的经验法则:一套拥有数十个参数、曲线又平滑得可疑的策略,在被证明清白之前,一律先当它有罪。

前向测试:诚实的彩排

前向测试,也称为模拟交易,是指让策略在实时数据上运行,而不投入任何真实资金。它是回测诚实的补充,原因只有一个:你无法偷看未来。数据一次一个跳动点地到来,就跟真实交易中一模一样,于是前视偏差与悄无声息的数据窥探,再也无处可藏。

前向测试还会检验那些回测草草带过的枯燥细节:你的订单类型、你的时机掌握,以及当市场正在波动时成交究竟如何运作。许多“完美”的回测,正是在这些执行假设上土崩瓦解。

把它想成投入真金白银前的最后一道关卡。略过它,正是一次漂亮的回测沦为一个难看的实盘账户的原因。

为什么实盘总是比回测更差

这里有一个令人不安的规律:回测结果与实盘结果之间的落差是真实存在的、可以预期的,而且几乎总是朝同一个方向。实盘更差。有三股力量造成这种情况。

力量它是什么为什么回测会漏掉它
成本手续费、买卖价差、资金费天真的回测往往假设成本为零
滑点你预期的价格与你实际成交价格之间的差距在回测当成风平浪静、实则急速或稀薄的市场中,它会扩大
市场状态转变造就你那批数据的市场条件已不复存在历史无法容纳一个尚未发生的市场

正因如此,在投入资金之前,前向测试的时间要足够长,长到能看见大量交易至少一次市场条件的转变。要数的是交易笔数与经历的市场条件范围,而不是日历上的天数。一套快节奏的策略也许只需要几周;一套慢节奏的往往需要数个月。真正的问题从来不是“它已经运行了多久?”,而是“它已经熬过了多少?”

悄悄扼杀一次回测的成本计算

一次回测报告某策略在一个 $10,000 的账户上每年赚 +40%,曲线华丽平滑,一年交易 300 次。这次回测假设成本为零。现在,加入现实。

假设每一笔完整往返的交易,在手续费与价差上大约要花掉成交金额的 0.1%。300 笔交易下来,大约就是 300 x 0.1% = 成交额的 30% 被成本吃掉。再加上在急速时刻每笔交易几个基点的滑点,情况更糟。

把成本算进去重新计算,那个 +40% 的回测,实盘上现实地看也许会落在更接近 +8% 到 +10% 的水准。一套本来看起来只是平庸的策略,一旦诚实计入成本,可能翻转成净亏损。逻辑本身毫无改变。唯一的差别,是把回测忽略掉的成本算了进来。这就是为什么在你兴奋起来之前,要先扣除实际成本与滑点,也是为什么前向测试(成本在此无可回避)才是真正的试金石。

切分样本内与样本外的更干净做法

基本的切分(在第一段上调整,冻结后在第二段上测试)足以抓出大多数的曲线拟合。如果你想更严格,就让样本外那一段真正保持封存:

  • 在你查看任何结果之前就决定好切分方式,而不是之后。
  • 在样本外数据上只测试一次。如果你不断偷看、调整、重测,那段“未曾见过”的数据也会慢慢变成样本内,整个好处便逐渐流失殆尽。
  • 宁可选一套在两段数据上都只是稳定不错的策略,也不要一套在其中一段耀眼夺目、在另一段却摇摇欲坠的策略。在它从未见过的数据上保持一致,才是你真正想要的信号。
前向测试多久才算“够长”?

没有固定的天数,因为两套策略的交易速度可能天差地别。诚实的衡量标准是对多样情境的暴露程度

  • 足够多的交易笔数,让一段好运连胜无法美化整体记录。十几笔交易几乎说明不了什么;几百笔才开始有意义。
  • 至少一次市场条件的转变,好让你看过这套策略在盘整与趋势中、在平静与恐慌中的表现,而不只是在它恰巧启动时的那一种市场情绪里。

一套高频策略也许几周内就能同时满足这两点。一套慢节奏的波段策略则可能需要许多个月。如果你的前向测试自始至终只见过一种市场,那你其实还没有真正测试过它。

快速知识测验

为什么回测是必要的,却不足以单独成事? 一套策略至少要能在过去存活下来,才值得拿去交易,所以回测是下限。但回测很容易被前视偏差、曲线拟合,以及被忽略的成本所扭曲,因此通过一次回测,并不能证明你在实盘上会赚钱。

用一个例子说明,什么是前视偏差? 在测试中使用了决策当下无法取得的信息,例如用当天的收盘价去触发一笔“开盘时”的交易,而那个收盘价是任何真实交易者当时都还无法得知的。

为什么实盘结果几乎总是不如回测? 有三股力量是回测通常会低估的:成本(手续费、价差、资金费)、滑点(成交比预期更差),以及市场状态转变(造就你那批历史数据的市场条件已经改变)。

资料来源

  • CFA Institute, "Backtesting and Simulation",在历史数据上测试一套策略以估算其绩效的定义。
  • arXiv (academic), "Look-Ahead-Freedom as Temporal Non-Interference",使用在模拟决策时点无法取得的信息。
  • Notices of the AMS (academic), "Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance",曲线拟合描述的是噪声而非底层的关联,因而无法推广到新数据。
  • CME Group, "About the Trading Simulator",在正式上线之前,于实时数据上进行不投入真实资金的前向测试。