21.7 大数据的测试方法
拥有许多参数的交易策略,其中每一个参数的取值范围都很广泛,其将导致大规模的测试——数十万(甚至数百万)次的测试结果需要优化处理。对此,我们不可能使用任何形式的顺序将测试时间缩短到合理的范围。然而,有些搜索方法可以快速找到可能的解决方案,其中的两个是:基因演算方法和蒙特卡罗抽样法。
21.7.1 基因演算方法
关于应用基因演算方法查找参数的模式已在第20章中的第20.11节中讨论过。基因演算方法是一个非常实用且功能强大的搜索工具。 [1] 在继续解析之前,你最好先阅读第20章中的相关描述。
在之前的讨论中,我们将趋势和震荡指标组合成相应的交易策略,并且我们可以应用每个结构性的规则而随机地改变。在相应的范例情境当中,相关的规则将被修改,但是参数值是未知的,这里只能指定参数值的范围。交易策略以及计算值的范围可被定义为:
(1)长期移动平均趋势为30~250天,增幅为5;
(2)长期移动平均线的百分比波幅为0.5%~4.0%,增幅为0.25%;
(3)短期移动平均线趋势为3~30天,增幅为3;
(4)包络短期移动平均线的百分比值为0.1%~1.5%,增幅为0.1%;
(5)入场时刻相关的RSI指标为5~20天,增幅为1;
(6)RSI超买和超卖阈值,超买区间为40~95,超卖区间为(-40)~(-95)(如果相应数值是对称的,则只需一组),增幅为5;
(7)百分比止损点为0.25%~3.0%,增幅为0.25%;
(8)标的资产的移动平均趋势为5~50天,增幅为5。
上述这8个参数似乎无关,但总共需要2332800000次测试,每秒10次测试,处理时间为64800小时,超过7年!接下来所要讨论的步骤将按照第20章所描述的那样进行。
1.初始化模式
(1)创建一个8种单元格的字符串来表示每个参数,字符串是一组被称为染色体的参数值。
(2)为字符串中的每个单元格分配一个随机数,其用于确定系统将使用哪个参数值。
(3)创建一个1000~5000个字符串的池,越大越好。
2.增殖模式
(4)应对每个字符串计算目标函数(例如信息比率的排名次序)。
(5)字符池需要按目标函数以降序排列。
(6)由排名最高的字符串生成多重副本并将其添加到新的字符池中。
(7)新的字符池按最高的目标函数排序并排列至最佳的5000个字符串;新的字符池可以取代旧的字符池,所以系统只有一个字符池。
3.配对模式
(8)从字符池中随机选择两个未曾选择的字符串。
(9)应用1~8的随机数将字符串的单1元格划分成左右两部分。
(10)第一个字符串的左端用第二个字符串的左端切换,创建两个新的字符串。
(11)配对过程需要一直持续到10%~15%的字符串已经构成相应的组合。
4.突变情境
(12)从字符池中随机选择一个字符串。
(13)随机选择8个单元格中的一个。
(14)根据分配给相关单元格的参数值的范围,随机选择一个新值,以之替换之前的值。
(15)突变程序继续,直到10%的字符串中的一个单元格被改变。
5.收敛模式
(16)最好的目标函数或分数于每次通过检验时可被保存,并且与字符串相关的参数值也会被保存。
(17)基因演算方法过程在步骤(4)中继续,直到目标函数收敛。当经过多次检验之后,目标函数不会呈现显著增加的现象。
(18)基因演算方法的过程需要重复5次,其应从初始化开始,从而生成不同的子集串。
(19)在5次检验之后,先前使用的最高目标函数所保存的字符串能够提供相关的解析方法。
我们可以保留一系列最佳结果,这将会提高你对成功交易的认知度,例如,如果最好的20个字符串都集中在类似的解决方案当中,那么其可能会变得更加强大;如果前20的单元格差别很大,那么测试结果的完整性则是有问题的。
对于具有8个参数和超过20亿个组合的交易策略而言,基因演算方法应该在100遍之内收敛。我们需要将前述这个过程重复5次,从而使单元格子集情境出现的次数增加到500,而计算机的时间可能会持续30分钟。我们不能保证最大组合情境会被发现,要想提高发现最大值的概率,你可以添加一个较大的字符池并重新进行更多次数的测试。然而,从简短搜索之中所选择的参数值就已经很好了,我们永远不会知道测试结果如何接近且发现最大值,因为没有人会进行全面测试。在第24章当中,你可以发现应用于投资组合资产配置的基因演算方法,以及更为详细的范例情境。
21.7.2 蒙特卡罗抽样法
基因演算方法解决方案所相关的问题是,它只有在最大测试结果之下才能返回初始状态,而这里没有关于稳健成功模式所需的深度信息——获取最成功的参数值是有帮助的,但它们常常是不充分的。当总测试次数太大时,蒙特卡罗抽样法则可创建统计学意义上的有效测试子集:于比较小的一组测试当中,相应的结果可以被分析,其情境就好像是一种完整的测试过程。
蒙特卡罗模拟法(MCS)是由著名的数学家约翰·冯·诺依曼(John von Neuman)和斯坦尼斯·乌拉姆(Stanislaw M.Ulam)创建的,他们在第二次世界大战后不久就设计了这种方法,从而模拟原子武器的运行过程。有一个范例情境能够说明,我们可以应用蒙特卡罗方法来寻找一个非常不规则的海岸线的湖面——从上方拍摄湖的图片,并确定比例(例如1″=100英尺);将图片看成10″×10″且在计算机屏幕上显示为彩色,湖泊呈蓝色、环境呈绿色;然后,将图像与网格相叠加,从而使每英寸画面具有100个像素(有时甚至需要更多的精度),尺寸为1000×1000,以之显示整个屏幕,而其中未知的部分是湖泊。现在选择1~1000的两个均匀随机数来表示x和y的坐标,第一个值为135和441。这里需要记住的是:统一的随机数具有相等的概率,它们是1~1000的任何值。相关的位置(135,441)被标记在显示屏上,计算机能够确定其是落在湖中还是岸上,我们以1000对随机数重复前述过程。计算机的工作完成后,程序计数了520对湖泊,因此,所显示区域的52%是湖泊,即52万平方英尺。如果需要更多的精度,那么网格将被分成更多的像素且生成更多的随机对。前述过程的工作原理是因为,落在湖中的一对随机数的概率等于湖面积与整个图像的比例。 [2]
随机数也可于交易策略的测试之中生成参数值。我们应用基因演算方法解决方案内相同的8个参数,同时,从相应参数特定范围的列表中为每个参数随机挑选一个值,这与基因演算方法中所使用的字符池的初始化步骤是相同的:每选择一个数值时,计数器就会递增,而每个参数都有一个计数器,其用于测试过程当中所使用的每个可能值之上。在第一个字符串与相关性能统计信息一起被创建并保存于相应列表之后,所使用的每个随机值的计数器就会增加1个单位;在1000个随机字符串之后,任何参数中的数值列表的总计数将是1000个单位。
结束测试的第一个契机会出现在参数列表中所有的值均呈正态分布时。相对于真正的随机选择模式而言,每个值应具有大致相同的计数单位。因为参数8有10个值,所以在1000个字符串之后,每个值应该具有近似于100的计数单位。如果有20个值,则计数单位将是50。一旦程序满足了最小的分布标准,那么所生成的范例情境就会变得更好。尽管学术界人士认为样本数据的统计质量(比如方差)可能与整个集合有很大差异,然而我们现在是可以分析相应字符串的,就像它们是整个的测试集一样。
和基因演算方法的解决方案一样,你可以运行蒙特卡罗程序,即多次取样。如果最好的结果是相似的,那么你可以确信,较小的样本数据会使整个集合的情境表现良好。其实,随机值的应用还有一些额外的优势,即其可以避免锚定那些原以为是良好的,但却是不公平的数值。
[1] 推荐读者阅读Murray A.Ruggiero,Jr.,“Using Genetic Algorithms for Trading Applications,”Chapter 20 in Cybernetic Trading Strategies(New York:John Wiley & Sons,1997).
[2] 改编自Wolf von Ronik,“System Testing via Monte Carlo,”Futures(April 2001)。