交易策略 · 17 分钟阅读

如何测试交易策略的稳健性

学习如何使用未见数据、模拟、参数偏移、执行成本及相关工具来测试交易策略的稳健性。

如何测试交易策略的稳健性
本页内容13 个部分
  1. 01什么是持久的交易策略
  2. 02盈利不等于持久性
  3. 031. 留出系统从未见过的历史数据
  4. 042. 模拟同一历史记录的不同变体
  5. 053. 微调设置
  6. 064. 从其他位置开始测试
  7. 075. 让执行情况比你预期的更糟
  8. 086. 尝试同类工具
  9. 09什么才算通过?
  10. 10表明交易策略过度拟合噪声的迹象
  11. 11EA Studio 中的稳健性测试
  12. 12遵循序列
  13. 13常见问题

当一个策略的表现能够经受住对其构建假设的合理变更时,该策略就是稳健的。你可以通过一次改变一个假设并观察其变化来进行测试:保留策略在开发过程中从未见过的历史数据,从不同的起始点重新运行模拟,微调指标设置,扩大点差,增加滑点,以及尝试可比的交易品种。一个持久的策略在大多数此类变化中都能保持可接受的盈利能力。而脆弱的策略只要一个假设发生变动就会崩溃,这通常意味着其规则是拟合了开发数据的随机性,而非捕捉到了可重复的市场行为。这些检查并不能提升策略本身,但它们能告诉你该记录的业绩值得多少信任,这才是更有意义且更有用的。

检查项变更内容失败意味着什么
未见数据评估窗口规则针对开发样本进行了调优
模拟变化同时进行多项随机变更表现取决于一个精确的事件序列
设置偏移指标输入优势处于极窄的临界点,而非平台期
起始日期偏移测试开始位置结果取决于一个幸运的开盘阶段
执行成本点差、滑点、成交利润空间过窄,无法在真实经纪商环境下生存
可比品种交易代码可能是某个数据集的特性,但请参见下文的说明

什么是持久的交易策略

持久性不是一个分数。它描述的是当你对输入进行合理变更时(如设置、评估窗口、数据源、假设点差、执行质量或交易品种),仍能持续产生可接受输出的交易策略。脆弱性则是相反的情况,从外观上看两者并无二致,直到你开始寻找它。脆弱的策略在开发时使用的精确条件下表现良好,但在任何其他条件下表现都很差。

这种区别至关重要,因为构建一个看似盈利实则亏损的策略的方法非常多。Bailey、Borwein、López de Prado 和 Zhu 正式论证了这一机制:在尝试相对较少的配置后,很容易达到极高的模拟表现;而你尝试的配置越多,获胜配置仅仅是搜索过程中的一种人为产物(而非真实优势)的可能性就越高(见《美国数学学会通知》,2014年5月,第61卷第5期)。自动化生成使情况变得更糟,因为软件可以在一个下午内评估数千种规则组合。

因此,问题永远不是“在测试中是否赚钱”,而是“如果世界发生微小变化,该结果会有多少留存”。下文的每一项检查都是通过故意破坏一个假设并测量其造成的损害,来回答这个问题的不同版本。

有两个习惯能让任何稳健性评估更加诚实。在运行任何程序之前,先确定你的接受标准,因为在看到输出结果后再选择阈值只是另一种形式的拟合。此外,记录你在确定一个方案之前尝试了多少个变体,因为这个计数本身就是关于你该相信多少结果的证据。

盈利不等于持久性

这两个概念经常被混淆,包括在本页的早期版本中,其标题承诺展示系统是否盈利。盈利性回答的是关于单次模拟的狭义问题。而持久性则是询问该答案是否经得起推敲。

盈利性测试持久性检查
询问系统在特定模拟中是否盈利询问表现是否能经受住合理变化
可能完全依赖于一组经过调优的输入故意测试替代输入值
通常只检查单一的历史配置检查多种场景,包括不利场景
强劲的结果仍可能是搜索过程中的人为产物旨在揭示这种人为产物

本指南后文的例子比任何表格都更能说明这一点。一个基于 GBPUSD 构建并调优的策略在净值曲线上看起来非常有说服力,但一旦延长测量跨度,或者尝试相关货币对,表现就会恶化。原始利润数据并没有造假,它只是在回答一个本不该单独提出的问题。

1. 留出系统从未见过的历史数据

第一个检查是最古老且仍然最有信息量的:在未参与创建规则的数据上评估规则。将你的历史数据拆分,在第一部分数据上进行开发,并保持剩余部分封存,直到规则最终确定。如果封存部分的表现与开发部分的表现相似,那么这就是有意义的证据。如果表现崩塌,则说明规则描述的是第一部分数据,而非市场本身。

样本外评估(Out-of-sample evaluation)有一个弱点。说实话,你只能使用每个预留部分一次。一旦你查看了预留结果,调整了规则并再次查看,该数据就变成了开发集的一部分,而将这个循环重复数十次,就会将真正的测试变成一种缓慢且伪装后的优化。

滚动验证(Rolling validation)通过重复移动分割点来解决这个问题:在一个窗口上进行开发,在下一个区块进行评估,然后移动整个框架,并在整个历史记录中重复此过程。其输出是相对于每个开发步骤而言具有“未来日期”的数据评估链,这更接近于策略实际使用的方式。我们的前进分析(walk forward analysis)指南详细介绍了其机制、窗口大小的选择以及效率比,因此本指南将其视为一个命名的检查项,而不是重复那些材料。

在选择分割方式时,应考虑市场状态(market regimes),而不是图方便的日历日期。如果开发窗口仅包含趋势行情,而评估期仅包含震荡行情,将会产生一个你无法解释的失败,因为两种情况同时发生了变化。在包含两者的足够宽泛的跨度内进行回测,然后在其中进行分割,可以保持比较的意义。

有一点值得强调,因为它经常被误解。验证过程并不会改变策略,它只是在衡量策略。如果你的软件在过程中重写了输入参数,那么你是在进行优化而非验证,此时输出结果不能被视为持久性的证据。

2. 模拟同一历史记录的不同变体

蒙特卡洛方法(Monte Carlo methods)会获取你评估时使用的单一路径,并生成许多个替代版本,然后报告系统在整个分布中的表现,而不仅仅是发生在那个特定路径上的表现。其价值在于该分布所揭示的内容:一个能在大多数变体中存活下来的策略,其表现与一个只能在你的文件所记录的精确事件序列中存活的策略是截然不同的。

构建了本页面最初记录的工作流的 Petko Aleksandrov 直言不讳地指出其目的:模拟试图在投入任何资金之前就破坏策略。这个框架是正确的。你不是在寻找确认,你的目的是寻找该策略失效时的交易条件。

可以改变的变量分为三组:

  • 市场条件。 将点差(Spread)以及基础价格序列本身,替换为来自不同供应商或外汇经纪商馈送的数据。
  • 执行质量。 包括跳过入场、延迟成交,以及在入场和出场时的滑点。
  • 系统输入。 包括指标设置以及评估开始的 K 线(bar)。

每种变体都隔离了不同的失败模式,并且在出现问题时具有不同的含义。这就是为什么如果不知道哪些模拟失败了,仅仅阅读总结性的通过率几乎没有任何意义。如果失败集中在执行组,则表明系统对成交质量过于敏感,这属于经纪商和工具的问题,你可能可以解决。如果失败集中在输入组,则表明存在过拟合,这通常是无法解决的。

我们的关于蒙特卡洛模拟证明了什么以及它不能证明什么的文章进一步探讨了该方法的局限性,包括一个重要的点:对你自己的历史记录进行重采样,无法告诉你系统在历史从未包含过的条件下会如何表现。

3. 微调设置

将每个指标输入向两个方向分别移动微小的幅度,然后比较结果。你想要看到的是一个“平台”(plateau),这意味着相邻的值会产生大致相似的行为,且所选值位于一个稳定区域的中间。相反,你要避免的是“尖峰”(spike):即所选值的表现远优于其两侧紧邻的设置。

为什么这种形状如此重要?因为当你绘制图表时,尖峰就是“拟合随机性”的表现。市场并不关心你的移动平均线是设置为 34 还是 33 或 35。如果你的结果对此敏感,说明该数值捕捉的是针对你数据文件的特定特征,而不是一种会重复出现的行为。

应逐一处理指标,而不是同时移动多个输入,因为同时改变多个参数会掩盖到底是哪个参数导致了结果。记录每个设置下的输出,以便能直观看到表面的形状,而不是仅凭记忆。这种参数敏感性测试运行成本极低,且每分钟计算带来的信息量几乎超过了其他任何方法。

这种检查既快速又具有极强的诊断性。在许多情况下,它还能为你提供更好的最终配置,因为从尖峰移动到附近的平台中心,虽然会损失一些模拟利润,但能换取显著的持久性。这种权衡几乎总是值得的,而那些拒绝这种权衡的交易者,往往是那些在为无法解释的数字进行辩护的人。

敏感性分析是自动化构建程序进行最隐蔽且危险的工作之处。一个以 1 为增量逐步遍历输入的优化器会非常高效地找到单一最佳值,而这种“高效”恰恰是问题所在:通过这种方式找到的最佳值通常只是一个尖峰的顶点。

4. 从其他位置开始测试

将评估的第一根 K 线向前或向后移动并重新运行。一个具有真实优势的交易策略不应过度在意测量起始位置。如果一个系统的净值曲线是建立在一段幸运的开盘期之上,那么它会立即显现出这种依赖性,因为移除那段时期就会移除大部分结果。

这个机制很容易理解。假设你的测试前八周包含了一个完美符合规则的强趋势行情。在那之后的一切可能都很平庸,但早期的收益支撑了曲线,使得统计数据看起来很健康。一旦将起始点移过这些周,真相就会显现。

不要只运行一次,而是从不同点运行多次检查,并观察结果的分布情况,而不是只看单次运行的最佳或最差结果。起始点之间的一致性才是信号。在多次表现不佳的运行中出现一次表现良好的运行,这与在多次失败的模拟中出现一次盈利的模拟是一样的信息——也就是说,这并不令人鼓舞。

5. 让执行情况比你预期的更糟

每一次模拟都会对成本做出假设,而且这些假设在默认情况下都是过于乐观的。将点差扩大到超过经纪商公布的平均值,在进场和出场时加入滑点,并延迟或跳过部分成交,然后看看还剩下什么。

那些通过微小收益进行频繁交易的策略在这里面临的风险最大,因为成本在每个结果中所占比例更高。一个平均每笔盈利仅为几个点(pips)的剥头皮交易策略,可能因为一个误差不到 1 个点的点差假设,就从盈利变为亏损;而且当这类系统活跃时(如新闻期间或交易时段交替时),点差往往会扩大。长周期策略能更从容地吸收执行摩擦,尽管它们会承担隔夜融资成本。

有两点实际建议。在可能的情况下,使用来自多个数据源的数据进行测试,因为不同数据源在跳动点(tick)细节以及如何表示缺口方面存在差异;如果一个系统只能在某个特定供应商的文件上运行,这本身就在向你传递信息。此外,要将历史数据的质量视为测试的一部分,而不是背景:真实的跳动点行为、周末缺口和展期效应都属于严肃评估的范畴,这就是为什么价格数据的质量值得像关注规则本身一样受到重视。

6. 尝试同类工具

在相关的交易品种上运行相同的规则(保持不变)。如果一个基于 GBPUSD 构建的策略在 EURGBP 或 AUDUSD 上表现出可辨识的特征,这提供了额外的证据,证明它捕捉到的不仅仅是单一数据集的特性。如果它在其他地方都产生亏损,那么这就是一个需要重新审视其构建方式的理由。

现在谈谈注意事项,因为这项检查最容易被夸大。在其他品种上的失败并不自动意味着为单一货币对设计的系统失效。不同工具确实具有不同的特征:流动性概况、交易时段行为、典型波动性和相关性结构各不相同,针对其中一个进行调优的规则集可能确实无法迁移。请将跨品种结果视为一种增加或减少信心的压力测试,而不是将其视为“策略必须在任何地方都有效才值得交易”的准则。

进行比较时要合理。相关的外汇货币对是货币策略的正确邻居。黄金、原油和股指则不是,在这些领域进行测试产生的结果容易诱导你过度解读。忽略相关性也会产生相反的影响:EURUSD、GBPUSD 和 AUDUSD 共享大量的美元风险敞口,因此在三个品种上都通过测试,其证据强度其实比看起来要弱。

本页面最初的演示是一个很好的例子。那个以 1 为步长进行调优的 GBPUSD 系统,在尝试的所有对比对中都显示出亏损,结合其在更长周期内的恶化表现,这使其成为最可能的解释。不是确定无疑的解释,而是最可能的解释。

什么才算通过?

这是旧版页面从未回答过的问题,它值得一个直接的回答:所谓的“通过”,是指在大多数合理的变动下,策略的核心行为依然得以保持,而不是指每一次模拟都保持盈利。

期望完美的记录是一个错误的准则,追求完美会让你重新陷入试图检测的“拟合问题”。某些变动应该是失败的。如果一个系统能经受住你抛给它的任何执行假设(包括那些极度糟糕的假设),那么它报告的是错误而非优势的可能性更大。

鲁棒性测试寻找的是成比例的退化。输入的微小变化应该产生输出的微小变化。来自微小扰动的剧烈恶化才是真正重要的信号,这比任何单次运行中的绝对数值都更重要。

在观察之前,先设定好接受标准。提前决定好必须达到的模拟比例、你能容忍多少回撤扩张,以及在放弃该系统之前,利润因子可以下降多少。事后选定的阈值,往往总是那些你的系统恰好能达标的数值。

在进行操作时,请同时将风险限制纳入标准。如果一个策略仅在违反你回撤容忍度的仓位规模下才能达标,那么它实际上并没有通过测试。将这两个决策分开处理的交易者,往往会在注资账户之后而非之前才发现其中的冲突。验证与风险控制回答的是不同的问题,且在开始实盘交易之前,两者都必须得到满足。

像下面演示中显示的 20 个中通过 19 个这样的软件,是在应用其自身的内部标准。这些计数对于在同一工具内比较策略很有用,但它们不是可迁移的标准。在依赖任何内置阈值之前,请阅读其计算方式的文档,因为一个你无法解释其推导过程的数字,并不是你可以据此采取行动的证据。

还有一个原则,来自前文引用的同一学术研究:你在选择当前策略之前所测试的组合数量,也应纳入你的评估。Bailey 和 López de Prado 将这种调整正式化为‘缩减夏普比率’(deflated Sharpe ratio),它对性能数据进行了针对选择偏差和背后试验次数的修正(《投资组合管理杂志》,40(5),2014)。很少有零售平台实现这一点。其核心思想在非正式应用时成本极低:你搜索得越多,任何单一的获胜者就越不应让你感到惊艳。

表明交易策略过度拟合噪声的迹象

以下五种信号,任何一种都应让你减速:

  1. 当增加更多历史数据时,表现大幅恶化。 这是最明显且最常见的迹象。
  2. 微小的输入变化导致巨大的输出变化。 即上述提到的尖峰形态。
  3. 结果高度依赖于评估的起始点。 一个幸运的区间带动了其后的所有结果。
  4. 大多数模拟变体均失败。 特别是当失败集中在输入组而非执行组时。
  5. 行为无法延续到可比的工具上。 虽然证据强度弱于其他项,但仍值得注意。

如果同时出现两个或更多此类情况,则是重建而非调整的有力证据。调整一个未能通过这些检查的系统,通常意味着更仔细地将其再次拟合到相同的数据上。

EA Studio 中的稳健性测试

本页最初记录的工作流自动完成了上述大部分序列,值得观察这些部分是如何映射到框架之中的。

在 Reactor 中,生成的策略会经过优化,然后进行验证。这两个阶段的区别在于:优化会修改生成器产生的内容,而验证阶段不会修改任何内容。它仅报告系统是否存活。任何失败的项目永远不会进入 Collection。

共有三种检查可用。第 1 节中描述的滚动评估首先运行,如果结果明显差于原始结果,则表明生成的版本过度拟合。模拟阶段运行第 2 节中描述的变体,市场、执行和输入组可以独立选择。多市场运行会根据你选择的任何符号进行第 6 节中的比较,并设有必须通过验证的工具数量。

Aleksandrov 的配置倾向于随机化指标输入和随机化起始 K 线,这是一个合理的默认设置:这两者结合可以覆盖最重要的拟合失败模式,也是暴露 GBPUSD 案例的检查项。在该演示中,2 组模拟中有 19 组通过了验证,这听起来很强,但当你结合更长窗口内的恶化情况以及对比对上的损失来看,结论就不同了。综合来看,这三个结果讲述了一个一致的故事。

他对优化器(Optimizer)的结论值得重复,因为这与通常的销售说辞相反:该工具强大到足以产生危险,因为它能如此高效地找到最佳输入,以至于它会乐意把尖峰顶点交给你。随后的验证才是让这种强大变得有用的关键。关于每项控制的机制,Monte Carlo 文档 完整涵盖了相关设置。

关于通用工具的一个观点。自动化构建器使策略稳健性的评估变得廉价,这才是其真正的价值:生成步骤是常规性工作,而验证步骤才是判断力仍然发挥作用的地方。无论你使用哪个平台进行回测,本指南中的序列都同样适用,因为所提出的问题属于方法论,而非任何特定产品。

来自同一环节的实用提示:缩短数据时间范围可以显著加快生成速度,但代价是测试的条件会减少。这是一种真实的权衡,而非免费的优化。你的评估窗口越短,本指南中各项检查所承载的权重就越高。

遵循序列

  1. 在开始之前,先以书面形式固定标准。
  2. 利用你历史数据的一部分进行开发,并封存其余部分。
  3. 在封存的部分进行评估,或者在完整记录上运行滚动前向测试。
  4. 改变输入值,并确认你处于平台期而非尖峰期。
  5. 从几个不同的替代起始 K 线重新运行。
  6. 在原有的经纪商广告参数基础上,进一步降低执行假设的质量。
  7. 尝试使用可比的工具,并将结果视为证据而非定论。
  8. 在做出选择前,统计测试过的变体数量,并进行相应的折减。
  9. 先在模拟账户上部署,并在投入资金前,将实盘表现与模拟记录进行对比。

常见问题

交易策略的稳健性(Robustness)意味着什么? 

这意味着当你改变构建规则时的条件时,规则的表现依然可以接受:例如不同的测量窗口、略微不同的设置、较差的执行情况或另一个数据源。脆弱的策略仅在它们被调优时的单一配置下表现良好。这种区别很重要,因为两者在单一的净值曲线上看起来完全一样,只有当你刻意改变某些变量并测量结果时,两者的差异才会显现。

在这些检查产生意义之前,我需要多少历史数据? 

需要足够覆盖多种不同市场状况的数据,而不仅仅是固定的月数。如果一个货币策略仅在趋势行情中进行评估,那么即使该趋势段包含再多 K 线,它也未经过震荡或高波动条件的测试。目标是至少包含一个清晰的趋势、一个震荡区间和一个波动冲击,理想情况下跨越数个日历年。较短的窗口并非毫无用处,但它们对上述模拟变体和执行检查的要求会更高。

策略通过了所有检查,但在实盘中仍会亏损吗? 

是的,如果认为不会亏损,则是误解了这些方法的作用。这些方法衡量的是记录结果对假设的依赖程度;它们无法告诉你策略所利用的行为是否会持续。环境在变,点差在变,优势也会衰减。验证的作用是提高记录结果反映真实情况的概率,这很有价值,但它不等同于保证。在投入实盘资金前进行模拟部署仍是明智的最后一步,并在之后持续监控实盘表现与模拟记录的差异也是合理的。

蒙特卡洛模拟与重新运行回测有什么区别? 

重新运行会产生相同的输出,因为数据和规则没有改变。而蒙特卡洛模拟会生成许多个经过修改的相同历史版本,通过改变点差、成交、输入或起始点,报告的是结果的分布,而非单一数值。其输出回答的是不同的问题:不是“这个交易策略赚了多少”,而是“这个数字在多大程度上取决于事件发生的具体路径”。

我应该在不相关的工具上测试我的系统吗? 

通常不建议。可比工具能提供有用的证据,因为它们与你构建的工具具有广泛的共同特征;而不相关的工具在波动性、流动性和交易时段行为上差异巨大,因此在那里的失败几乎无法证明任何问题。在黄金或股指上测试货币策略,可能会产生让你倾向于过度解读的输出。尽量在同一领域内测试,并记住,高度相关的货币对所提供的确认度往往比看起来要弱。

优化(Optimisation)与验证(Validation)的区别是什么? 

优化是寻找能改善记录结果的输入值,这会改变策略。验证是衡量一个已完成的策略在改变条件下的生存能力,它不会改变任何东西。在自动化开发中,混淆这两者是最常见的流程错误,因为一个在你认为是在进行测试时不断调整输入的工具,会在你不知情的情况下,悄悄地让你的交易策略进一步拟合同一组数据,尽管它看起来是在进行验证。在信任平台的输出之前,请检查其在每个阶段的具体操作。

这些检查也适用于手动策略吗? 

原理是通用的,尽管工具不同。手动交易者仍然可以保留部分历史数据,在不同时期评估规则,测试结果对入场标准的敏感度,并计入现实成本。手动操作难以复制的是软件能廉价生成的海量模拟变体,这限制了第四和第五项检查的深度。概念是完全可以迁移的,只是运行速度不同。

通过这些检查是否可以取代风险管理? 

不,将它们视为可以互换的常见错误。验证告诉你记录的结果在多大程度上可以被信任;而风险控制则决定了当这种信任被证明是错误时该如何应对。无论测试结果如何,仓位规模、单笔交易最大损失以及相关风险敞口限制仍然是必要的。那些因为策略通过了所有检查就跳过这些步骤的交易者,只是将风险转移到了一个不那么显眼的地方。

交易外汇及其他保证金产品具有重大的损失风险,并不适合每位投资者。以上内容均不构成财务建议。通过任何验证检查仅描述了过去的行为,并不代表未来的表现。

分享这篇文章

WhatsApp
Petko Aleksandrov

关于作者

Petko Aleksandrov · Chief Mentor & Founder

Founder of EA Academy and Algo Trading Space with over 100,000 students educated globally. Petko combines practical trading experience with rigorous testing methodology, setting new standards for transparency in the algorithmic trading industry.

查看个人资料 →

Comments

No comments yet. Be the first to comment!

Leave a Comment

Your email address will not be published. Required fields are marked with *

如何测试交易策略的稳健性:完整指南