21.16 系统稳健性相关问题的概述
我们现在回到稳健性所相关的问题——早些时候,我们列出了“稳健性搜索”的重要标准,其必须具有一个完美的前提条件,而在显示测试结果之时,我们需要得出这样的结论:大量的盈利测试模式是稳健性所相关的很好的衡量指标。在测试过程中,我们需要设置预期值,同时对有效参数值进行假设,而且也必须使用现实的成本。另外,测试过程需要使用样本内和样本外的数据且以科学的方式进行。
如果我们通过样本内数据难以获取成功的结果,那么接下来就需要样本外数据的测试结果,这个概念已经被证实了。我们可以重新测试所有的数据,然后以一个较小的交易成本开始相关的交易。
实际上,一个稳健的交易策略是指多年应用一组与各类市场工具相关的广泛的参数值,进而产生持续的良好的测试结果。稳健性在过去是用来描述一个系统或方法的术语,它在许多市场条件下是有效的,我们对此深信不疑。在最好的情况下,一个稳健的系统对温和变化的参数值是不敏感的。
如果某种策略的基本前提是相应交易规则没有附带参数值,而其在特定的时间内相对于一组特定的交易工具而言是成功的且具有大量的交易样本,那么此种策略也是稳健的。在理想情况下,如果一个长期移动平均系统是稳健的,那么不熟悉该系统的人所选择的计算周期应该为100~300天,同时指定市场工具和时间间隔并预期系统所显示的交易净利润,如此将最有可能生成稳健的情境,而其前提条件是所有参数值在很大比例上都是盈利的。
当我们观测稳健性指标时,最高的利润率或最佳的风险比率则变得不那么重要了,并且专注于这些理念会分散你的注意力。相反,所有重要测试的平均值是非常重要的,其中包括:平均净利润、平均交易数、平均损失、每笔交易的平均利润。此外,所有测试的收益标准差将于相应范围之内提供一个很好的一致回报性的理念。
以下是一个清单和简要的说明,其概述了测试步骤,评估了测试结果,选择了参数值,同时监控实际的交易,它符合一个稳健型交易策略的要求。 [1]
(1)决定测试什么——测试要被应用于检验现有的想法,而不是用于发现。
a.基本前提是否可靠?它应该基于对市场的仔细观察或者意识到推动市场的不同因素之间的相关性或者判断不同市场之间的相关性。它可以使用顺势指标、震荡指标和其他技术来实现相应的目标,但是它还要试图捕捉人类的行为模式或经济发展的基本过程。
b.你能编辑所有的交易规则吗?编程系统要保证所有的突发事件都被考虑。规则甚至可以解析特殊情况,比如戏剧性价格冲击后的危机干预模式,在这种情况下,我们需要应用一套不同的规则。
c.这种策略是否只有在特定条件下才有意义?一个策略可以适用于一组较小的特定情况,而如果相关情境足够多,那么相应的模式可以从一组不同的测试数据中提取。当这种情况较少时,我们可以基于一个明确的市场现象事先进行解析,通过测试发现的不会变得更加重要。
d.对预期结果进行预期。我们可以根据策略的交易规则粗略地估计交易次数、盈利交易百分比甚至净利润,它们都应该在测试开始前记录下来,然后进行测试来确认这些估计值。
e.批判地看待好的测试结果。在一个与期望值不同的模式中,如果获得好的测试结果,那可能意味着相应规则被错误地制定,或者你误解了这种方法的风险,而此时是在行情前向运行之前重新考虑相关问题的最好阶段。虽然我们总是试图了解和修复坏的测试结果,而在接受好的结果之时却不质疑其是否可能是一种错误的倾向——由于错误原因所得到的良好结果仍然是一个错误。
(2)确定测试的方法——在测试过程开始之前,我们需要确定许多必要的步骤。
a.选择测试工具和方法——选择一个测试平台,例如TradeStation平台、MetaStock平台或Ninja Trading平台,它们可以加快测试过程且保持客观性,这些平台的程序可以在做出当前决定之前防止相关策略项下数据的前瞻性;同时,它们也可以杜绝BASIC语言、C语言甚至是电子表格编程时所发生的错误。许多完美的策略是由于偶然发现明天的价格而被创造出来的。
b.尽可能多地使用正确的数据。更多的数据是最好的,但是如果只能获得少量的数据,那它应该包括各种各样的价格模式,如牛市行情和熊市行情、价格冲击事件以及持续的横盘区间。
c.将数据分成样本内和样本外的集合,确保没有过度拟合的唯一方式就是保留大部分的测试数据;一旦使用了样本外数据,那么相应程序则无法更改。
d.选择适用于相关策略的参数值范围。比如交易策略的性质、长期或短期的破位情境都会决定应予测试的参数值。另外,测试只包括对策略有意义的数值范围,这有助于验证相应的概念;同时,其可避免发现一个孤立的且可能会分散和误导我们的盈利情境。
e.决定测试参数的顺序。不是所有的参数都应该同时被测试,我们应该首先测试最重要的参数,判定其基本结构是否能够盈利。诸如顺势交易系统的计算周期一类的参数值的测试结果将有一个广泛的区间,而相应测试结果可能表明短期交易在扣除交易成本后不会盈利。其他参数(如止损)则是提炼后的风险简介。我们不应把损失的方法转化为有利可图的方法,它们稍后会被测试。
f.确保参数测试值的分布情境正确。测试趋势周期的等额增量的模式可能会造成误导。3日和4日移动平均线之间的差异是33%,而99日和100日均线之间的差异仅为1%,当1~100日测试周期的步长为1时,其与长期平均的测试结果被赋予更大权重的模式有异曲同工之效。商业测试平台可能不允许测试当中出现不等值的增量,所以给相应结果赋予权重因子的方式可以改善分布的形态。
g.定义成功的标准。最高净利润并不是衡量测试是否成功的最佳标准。风险调整后收益的可靠性、交易的频繁程度以及入场时间机制的良好结合方式可能是客观的标准。
h.以可视化的形式呈现测试的结果。测试结果的表格被程序所处置的顺序是一个很难评价的格式。图表通过电子表格的可获性能够使每个参数的数值与所有其他参数值交互地进行可视化的演示。而哪些参数是稳定的、哪些是不正确执行的结果就变得清晰了。二维和三维等高线图以及散射图可以更好地查看参数之间的相互作用,它们以易于读取的颜色显示每个参数值于同一时间内的灵敏度。
(3)评估测试结果。我们需要仔细地检查测试结果,从而可以避免许多不必要的工作。查看单个测试结果(一个参数组合值的测试结果)的良好样本,甚至选定几个参数值进行个别交易的方式将洞察相关交易策略的好与坏。统计资料不足以确保程序的正确执行。相关交易如果出现特别大的损失、太多的止损情境以及盈利不足的状况,那就表明其没有看到细节研究之中的问题。
a.验证计算的合理样本。因为计算机做的计算并不一定是正确的,所以我们需要告诉计算机应该怎么操作,可是人们总会犯错。现在,我们必须记住木匠的操作规程,即测量两次,切割一次。
b.有足够的交易可以获取可靠的测试结果吗?只有少数交易表现出优异情境的测试结果本身就是一个问题。当没有足够的数据时,我们没有办法确定测试结果是稳健的。
c.交易系统能够为大多数参数组合生成利润吗?稳健性的最佳保证形式是,即使回报和风险各不相同,大多数参数也会生成盈利性的测试结果。
d.更改规则是否能够提高整体测试的表现?当添加一个特殊的规则用于提高绩效或纠正一个特定的问题之时,所有测试的平均统计数据必须得到改善,而标准差应保持不变;或者,所有测试的标准差必须下降,而平均收益保持不变。两类收益结构的变化必须是一个整体性的改善,否则如果相应变化只针对单一的问题,那就是一种过度拟合的情境。
(4)选择特定参数值进行交易。选择用于交易的最终值是一件非常困难的事。我们没有确切的方法能够知晓所选择的最终值在未来的表现如何。测试过程试图将凭运气或巧合而获得的成功与稳健性的表现分离开来。
a.最后的参数选择可以包括所有的数据。好的测试程序要求同时使用样本内和样本外数据,一旦测试完成,最终测试的模式就可以在所有数据之上运行。我们要尽可能地保持当前的状态,从而提高成功交易的概率。
b.测试要从广泛的成功领域中选择参数值,而不是着重一个有利润的峰值。任何种类的峰值情境是一种特例,其不太可能重复出现。我们要选择那些于不敏感的、一致性的区域中呈现平均回报的最终参数值。
c.利润必须在整个测试期间均匀分配。最好的参数值会随着时间的推移而显示出一致性。在20世纪90年代的牛市行情中,股指期货有高利润的趋势,但是在最近几年,其利润曲线是衰减的。一组显示于近期年份之中逐渐增强行情表现的数值是更可取的,然而,显示衰减收益率的数值在整个测试期间的均匀性是最好的。
d.核实测试当中是否有来自价格冲击事件而生成的不成比例的利润。在实际交易中,避免大的价格冲击是不可能的,因为你永远不知道它们什么时候会来。不显示价格冲击所造成的大(负)的股票变动的历史性的测试结果的方式是不现实的,会导致过度拟合,其所选择的最终值可能会生成避免所有价格冲击的保守性的测试结果。更糟糕的是,那些从50%以上的价格冲击事件中获利或者从最大的价格冲击事件中获利的测试结果都将错误地低估风险。在实际交易中,从价格冲击事件之中获取暴利的情境远低于50%。
e.将风险扩大到个人可接受的风险水平。收益与相应的风险水平彼此关联。例如,最终的系统表现显示风险调整后的年化收益率为50%,而相关的年化风险为20%、月度收益的标准差是1个单位,如此,该系统在一年内损失40%的概率为2.5%,而一个交易者只接受20%损失的概率为2.5%,这将需要减小一半的杠杆,所以预期年化收益率要降低到25%的水平。
f.当在两组参数值之间进行选择时,我们要选择一个在市场上作用时间较少的参数。产生可比的收益率且在市场上有较少时间的参数值的做法是最好的。退出市场是抵御价格冲击的唯一措施,如果一个策略在当时只持有60%的头寸,那么其规避价格冲击事件的概率为40%。离场策略往往不会反向做单,我们要将买单和卖单进行分离,从而改善点差,促进相关的流动性。
g.样本外数据的表现必须通过测试来检验。在开始交易之前,一个样本外测试过程应该确认系统可以执行以前从未见过的数据。如果没有可用的最近期的样本数据,那可以使用类似市场的测试或旧数据,虽然此种模式没有测试最近期行情数据的好,但是,当应用类似的指标时,其所表现的进一步衰减情境则是模型被过度拟合的强烈的信号。
(5)交易与绩效监测。一个系统的发展过程从来没有完成——市场有持续的评估模式,其变化不断地发生在波动率、市场之间的相互性以及新市场引入机制变更的过程当中。观察相应变化对交易程序影响的唯一方法是仔细监测系统信号和相应的执行价格。从评估当中,资金可以重新分配,下单方式可以改变,同时市场能够推出更好的交易规则。如果不监测交易并将测试结果与期望值进行比较,那就没有理由说系统的执行过程是正确的。
a.相关交易要使用完全相同的规则进行测试。根据编程的理念,简单的版本通常是方便的,但是交易会面临一套更复杂的规则,或者在没有测试的情况下,系统可以添加新的规则,因为测试过程需要太长的时间,而这似乎是一个无关紧要的改变,但其却会导致完全不同的测试结果。如果测试方法和交易方法不完全相同,则系统就没有评估交易是否成功的依据。
b.在测试中使用相同的数据。于最活跃的交割月伊始所测试的、期货连续回调的价格序列不会为每一份合约提供相同的结果。一些人为的连续价格系列比实际价格平滑,其似乎表现更好,但是,它不是真正的数据,至少它不包括滚算合约的成本。外汇数据是一个独特的问题,因为测试数据可能代表一组银行的报价,而任何报价机上的数据均来自不同的银行——相应的变化很大。使用外汇现货数据的测试与期货的不一样。当测试数据和交易数据相同时,我们就能够获取最好的交易结果。
c.监测系统和实际买价/卖价之间的点差。相应点差值(系统价格和实际市场执行之间的差异)可以将理论上有利可图的交易转化为实际交易的损失,监测这种差异将告知现实的执行成本、最大的交易量以及最好的交易时间。
关于测试的最后综述
测试是你探知一个交易策略能否成功的唯一途径,但它不能保证收益。测试可以在许多层面上进行,它可以和检验一组适用于以往数据且未被选择的参数值的模式一样简单,也可以和基于同时测试而相互依存的参数值的多维分析方法一样复杂。
我们要遵循一个健全程序和测试评估方法,从而发现稳健性的解决方案,进而提高测试成功的机会。坏的测试系统是一个悲剧,它浪费的是时间和资源,并且其会导致一个系统几乎没有成功的机会。
测试的范围是判断的问题。简单的测试可以概括绩效相关的配置简介并提供风险和回报的理解方法。复杂的测试可能介绍过程中的细微错误,就像复杂的交易策略可能会由于其复杂性而产生问题一样。我们要以简单的形式开始,慢慢地增加复杂性并尽快地停止相应的操作。
这里要记住的是:即使我们非常努力,实时结果也可能不会像历史结果那样好,历史性的行情模式永远不会以同样的方式重复。最好的系统规则和最好的参数值是最简单的且最一般的,它们可能会比理想的优化的测试结果所表现出的收益要低、风险也更大,但是,它们更有可能代表未来的回报。
其他对测试和绩效评估感兴趣的读者可以参看基因演算方法(一种新的搜索技术),其大部分内容主要在第20章、24章当中被探讨;同时,第23章的大部分情节对此也进行了讨论,特别是第23.4节。
[1] 更详细的“稳健性测试”的解析方法可以参考Perry Kaufman,Smarter Trading(New York:McGraw-Hill,1995)。