21.4 完整性的测试模式
长期测试周期的使用保证了良好的行情样本,其中包括长时间的横盘行情、牛市行情和熊市行情以及各种规模的价格冲击事件。随着更多的数据被使用,相应测试结果很可能会显示出更大的利润和更大的损失,而更多的数据会生成更大的价格运行模式、更大的价格冲击情境以及更复杂的行情模式。
冒着得罪某些人的风险,我这里要说:测试过程当中经常会出现一定程度的作弊行为。我们承认开发系统可能有所不同,为了获取可信的测试结果,其中存在正确的方法和错误的方法,而本节将概括最可接受的方法。
21.4.1 样本内数据和样本外数据
基本的科学方法是从样本内数据开始的,其测试的是相关的理念。样本内数据构成了可用数据总量的一部分,其已经预留了测试的结构。在通常情况下,样本内数据大约占50%,其余部分将用于样本外测试或用于检验过程。例如,如果有20年的数据,那么样本内的数据可能是:
(1)第一个10年的;
(2)最后10年的;
(3)均等替代周期的,例如第一个5年,然后是11~15年;
(4)交替随机的时间序列的。
排除第一个50%的数据的做法是非常普遍的,但是如果市场行情发生动态的变化,从而使波动率加大,进而改变相应的属性,那么数据的平稳性就会受到影响。而使用最后50%数据的做法所面临的情境也是如此。同时,于过往的或较新的市场行情之上选择参数值的做法也是不合理的。
替代周期可以提供更好的行情变化样本,其良好的测试结果将需要某种类型的适应性规则。当使用交替周期时,系统实际上要计算所有数据的性能,但其只显示样本周期的测试结果。另外,测试结果应始终显示为日间变化情境,而不是总利润——如果你进入总利润选项,那么一个样本期结束和下一个样本期开始之间的差额将显示该交易方式是否在间隔期间扣除了相应的损失,而这样的结果是具有欺骗性的。相反,日常回报率则可以被组合成一个连续数据流,我们可以对其进行分析。
交替随机周期是最有效的测试方法,但是这些区间必须在开发过程的初始阶段进行并且不会改变。如果在两个不同的系统之上操作,那么每个系统都将具有独特的测试数据集合。前述这种方式并不总是为所创建的每种方法测试相同的数据,要创建随机测试周期需要一个小程序,其可在电子表格之中生成,即
·确定样本周期的时间步长,然后乘以2。我们需要设置,这里只有2个样本内周期,以及2个样本外周期;
·样本内数据是否先到先得?我们的设置是——是(yes);
·然后,相对于20年的数据而言,其间每个部分大约是5年。我们则需设置——最短的是2年,最长的是8年。
·从第一天开始第一个采样。
·找到一个随机数(在0和1之间),并将该值乘以6,即形成采样周期内的年度范围;如果随机数为0.72,则将调整值4.32加上2年周期当中的最小值,如此所给出的第一期步长为6.32年;
·在接下来的两个字段内进行重复计算,最后一段是剩余的数据序列。
一旦计算出相关数值,那么相关的区间间隔则可以被配置给特定的数据,而所有的样本测试都将使用该数据。我们可以根据需要使用前述这些数据,也可以更改规则和参数并对程序性能进行详细的检查。另外,相应数据可以被毫不留情地扭曲,而相关测试结果的评估模式将在下一节中讨论。
21.4.2 样本外数据
测试完成之后,应用样本外数据验证相应结果的时刻就开始了,这是关键的部分。同时,在使用样本外数据之前,你必须尽全力创建一个良好的系统,因为这里没有给你留下第二次机会。
我们最好只在终极测试之中使用样本外数据且其中不包括样本内数据。在样本外数据当中,其所拥有的且与样本内数据相同的成功素材很少,在更多的时候,其会给出大约50%的样本内数据的测试结果。因为有50%的新数据包含于原始测试之中且没有发现相关的价格变动情境,所以其效应往往会更差。信息比率从2.0下降到1.0的样本外数据的测试结果实际上是相当不错的,但是,当相关比率从2.0下降到0.4时会发生什么状况呢?当对细节进行检查时,你就会意识到,此类测试忽略了一个非常极端的波动情境并添加了一个简单的波动率过滤指标——将比率增加到1.0,而这就是一种完全进入相关程序的模式。同时,一旦使用了样本外的数据,你就无法修复任何内容,这就是所谓的反馈机制。另外,样本外数据的测试结果总是过度拟合的,而且,系统运行的机会也会直线下降,你可以花费大量时间使用样本内数据,但一旦使用样本外数据,麻烦也就开始了。
21.4.3 相应测试的演进过程
从样本内数据的测试中选择参数值,然后将测试结果应用于样本外数据的重复过程已经被开发成一个相关的演进模式 [1] (也被称为前向测试和盲目模拟模式),在许多方面,其与现实中的情况是相似的。我们选择回调数据的参数,然后使用,这个过程的进展情况如下:
(1)选择总测试期,例如1988~2007年20年的日间数据;
(2)选择单期测试区间的步长,例如2年;
(3)从最先的一个两年周期开始测试,例如1988~1989年;
(4)从测试结果中选择最佳参数值;
(5)使用步骤4中所选的参数值来寻找临近6个月的数据(1990年上半年)且测试其效应,在整个测试过程中积累样本外数据的效应情境;
(6)如果以更多数据进行测试,你可把测试区间延长6个月(第二次测试将从1988年下半年到1990年上半年),然后测试数据,否则转至步骤(8);
(7)重复步骤(4);
(8)逐步测试的结果是步骤(5)中单期样本外测试的累积值。
上述过程清楚地模拟了传统的设计和测试的方法,其使用的是样本内数据和样本外数据,看起来比较直观可信。
1.短期的乖离情境
测试的演进过程可能会偏向于引入更快捷的交易模式。因为样本内的测试方法只使用了2年的数据,所以长期的交易模式可能只会在此期间内进行数次交易。而如果在整个2年内出现牛市行情,那么任何长期的趋势都会取得相同的测试结果,但是,如果没有足够的数据,测试就无法发现且计算出最佳的周期。因此,我们很难评估相应头寸的风险。
短期乖离的问题可以通过连续的测试区间且从短期-长期的转换模式当中获取最佳的参数值来识别,例如,如果测试5~50天移动平均线,那你将会发现:相应周期显示10天为最佳,其次是50天周期,然后是15天周期。前述这种不规律的行为方式是因为数据的间隔太短,如此,你可以通过将测试间隔从2年延长至5年的方式来纠正。较长的测试间隔相对于消除短期乖离情境而言会有很大的裨益,但是,它们必须与开发者所设想的趋势类型相一致。而且,它还需要在初始时刻使用额外的数据,而这些数据不能在最终的测试结果之中使用。
2.反馈机制
在测试程序的演进过程之中,最重要的问题是反馈。上一节对样本外测试的问题进行了探讨,即测试的演进过程当中的每个应用程序都要使用所有的数据,其中,最终效应是由样本外的那部分数据确定的。所以,如果不止一次地进行测试,那就没有什么样本外数据了,而此种情境则违反了科学的测试理念。为了避免前述这种情况,我们可以于最后的测试之中留出额外的数据,但是,这会减少可用于测试和验证的数据量。
[1] 在Robert Pardo,Design,Testing and Optimization of Trading Systems(New York:John Wiley & Sons,1992)中,全面介绍了测试的演进过程和最佳的搜索技术。