第08章数据的随机化处理

第08章数据的随机化处理

我们对数据的需求永远不会感到满足。

简介

 交易的重点在于理解我们的系统在将来会怎样工作。本章介绍 一种生成合成数据的新方法,它可以生成无限量的数据用来作系统 测试。这种新方法叫做数据的随机化处理,帮助我们克服期货市场 上数据量相对较少的限制。数据的随机化处理可以产生新的价格区 间和新的价格形态,这对于在最广泛的市场运动区间内测试系统是 必须的。这是真正的样本外测试,将使用电子表格和标准普尔500 数据来对这种方法进行详细阐释。我们使用7年长度的瑞士法郎连 续合约来产生56年的合成数据,然后在合成数据 上测试一套波动性 系统,以便使读者切身感受这种测试的优点。

关于自己的系统,我们真正希望了解什么

对于自己的系统我们真正希望了解的是它在未来的表现如何。 理想情况下,我们希望知道盈利和资金回撤是多少。由于不能预见 未来,所以一种比较好的选择是在许多“ 模拟 ” 未来市场运动的数 据集上测试系统。然后,我们只要对这些结果求平均值就可以得到 对未来盈利和资金回撤的合理评估。但是要强调一下,要想获得获 利性和资金回撤量的准确数据是非常困难的。

 对于月资金变化的平均值和标准偏差,仍然可以使用良好的评 估方法。在前面研究资金曲线时,分析了间隔资金变化及其标准偏 差。标准偏差对于预测未来资金回撒是非常有用的。 

作为一名交易者,我们还希望获得一种感觉,那就是系统的设计思想在不同市场上工作时究竟有多好。系统设计方法的舒适水平 甚至比业绩数字更有价值,因 为我们可以毫不犹豫地执行一套熟悉 的系统。获得这种自信的方法之一是在许多不同的数据集上测试该 系统,这些数据集是我们在将来交易中可能会碰到的那种。 

记住一点,所有的计算机测试都产生于无干扰、无情绪的环境 , 交易时没有任何的风险可言。在使用该系统进行真实交易时,交易者 常常变得非常情绪化,因为风险是比较高的。但是我们在测试系统时 永远不会有这种压力。一种解决方案是在许多数据集上测试该系统 , 于是我们可以经历,至少是间接地经历许多不同的市场环境。然后我 们就可以更好地理解系统性能在这些市场上的变化。 

注意所做的系统测试,告诉我们的都是系统在过去的表现。 测试结果根源于我们使用的特定数据集。所以我们愿意在模拟未来 市场运动的数十个甚至上百个数据集测试自己的系统。然而,大多 数活跃的期货市场交易时间还不到20年,市场提供的数据量是有限 的。再加上期货合约还要过期,所以最大的挑战是寻找充足的数据来 充分测试系统。我们可以使用的数据集越多,不管是从数量方面还是 从心理的角度看,测试结果都越有价值。 

本章讨论—种产生不限量数据的新方法,这些数据可以“ 模拟 ” 未来市场运动。使用这种新方法能从历史市场数据中产生不限 量的数据集。这些合成数据概括了有关市场波动性和交易形态的知 识。一旦我们能够获得这种数据,就能够以一种比以前好得多的方 法来充分测试我们的系统。更重要的是,我们能够 “ 真正地经历 ” 许多类型的市场,并且对系统建立自信,而这对于交易成功是至关重要的。

历史数据是序幕:放回抽样

放回抽样的思想大致如下所述。假设这样一种情况,有 100张光 盘,将它们从1~100标 号,然后放入一个包里并打乱顺序。然后我 们晃动这个包,并从中抽出一张光盘,比如说是#21。 现在,在抽出 第二张光盘之前,我们有两种选择,或者把#21放入包中,于是100 张光盘就都在包中,或者从99张光盘中选出另外一张,而不把#21

表8.1 放回抽样示例,注意11个样本的平均值和标准偏差是如何向原始样 本靠近的。

放回包中。 

如果我们把#21放 回,那么我们第二次抽到它的机会就是百 分之一。这就是放回抽样的过程。我们第一次得到#21的概率是 1%。 连续两次取出#21的概率是0.01%。 连续三次取出#21的慨率是 0.0001%,或 者说100万次中可能有一次抽到#21。 但要记住一点,不 要因为连续抽出#21的概率非常小便认为它不会发生。

 下面举一个例子来说明放回抽样的思想(见表8.1)。 使用从1 到10的 10个数字作为我们的 “ 原始 ” 样本,计算出平均值(5.5)和 标准偏差(3.03)。 然后使用微软Excel 5.0的不放回抽样算法来产生 另外的11个样本。如果我们花点时间来研究一下这些样本,就能发 现相同的值出现过不止一次。这些值是从样本中随机抽取的,11个 样本各不相同。但是,我们同时保留了原始样本的“ 印记 ” ,即 最 大值和最小值之差。 

对于每个样本,我们还计算出平均值和标准偏差。平均值的范 围从4.30~6.90 ,标准偏差的范围从1.95~3.60,于 是每个样本只是 原始样本平均值和标准偏差的粗略估计。但是,当我们对所有11个 样本计算平均值(5.72)和标准偏差(2.81)时 ,这些值都与原始样 本的统计数据接近。产生的样本越多,对原始样本统计数据的评估就越好。 

将相同的原理用于系统测试,我们可以使用放回抽样来产生 合成数据。这些额外产生的数据将提升我们对系统数据 (比 如说 月资金变化)的平均值和标准偏差的预测能力。使用这些新的数 据,将实现真正的样本外测试,并将扩充的市场行情展现在交易 系统面前。 

放回抽样的思想引出了另一条统计学思想,叫做自举法。自举 法的思想是对一些试验结呆进行放回抽样,以得出我们所感兴趣的 量的统计分布。举例说明,对于来自一套交易系统的⒛0个交易结 果,我们使用放回抽样产生不同的输出结果,然后对这些数据进行 平均,便得出未来交易结果的一个分布。在这个例子中,每个样本 中不同数值的平均值和标准偏差给出一个原始样本平均值和标准偏 差的分布。

读者可以重温对65SMA-3CC系统测试结果的论述,观察一下 所有交易的分布。那2400个测试产生了一份特殊的柱状图或交易分 布图。我们可以借助放回抽样从那2400笔 交易中研究出其他的潜在 分布或柱状图,并试图用它们预测未来业绩。 

使用放回抽样的一个问题是,我们只能从原始样本中抽取数 据,所以,我们只能 “ 看到 ” 那些在原始样本中发生过的事件。这 里我们研究的方法将努力克服这一问题,以便创造出新的价格区间 和价格形态。 

来看一下如何使用放回抽样在一份连续合约上产生其他包含市 场信启、 的连续合约。一旦可以复制市场数据,我们就可以突破数据 集的限制而通向自由测试之路。

数据随机化处理:我们一直需要的所有合成数据

通过对连续合约数据随机化处理得出的数据叫做合成数据,因 为这些数据不是来自公开市场中的真实交易。使用术语 “ 数据随机 化处理 ” 的原因,是这种方法是对数据随机重排以产生新的数列。

我们先来看一下如何总结市场信息。将两条日棒线彼此相邻地 放在一起,然后以第1条棒线的收盘价为参考,分析第2条棒线开盘 价(O)、 最高价(H)、 最低价(L)和收盘价(C)与第1条棒线 收盘价之间的关系。我们可以将这些关系描述如下:

Δ开盘价=开盘价-收盘价[1] 

Δ最高价=最高价-收盘价[1] 

Δ最低价=最低价-收盘价[1] 

Δ收盘价=收盘价-收盘价[1]

此处收盘价[1]表示前一日的收盘价。这些等式概括了市场交易 行为,因 为它们抓取了与上个收盘价相比较的价格形态。在数年的 时间段上,对于这些等式,每个市场都会有一些特性值,它们的基 础是市场波动性、流动性和其他交易形态。我们使用这些公式做放 回抽样时,创造的形态承载了通过相对价格关系定义的市场印记。

下一步是使用随机数发生器来对棒线进行随机化处理。得出新 的棒线排列序列后,我们需要一个起点,通常是前一日的收盘价。 如有必要,可以使用第1棒线的任何数据作为参考。新棒线从前一棒 线中推出,过程如下(新的合成数据用前缀Syn表示):

Syn一收盘价=收盘价[1]+Δ 收盘价

Syn一最高价=收盘价[1]+Δ最高价 

Syn一最低价=收盘价[1]+Δ 最低价 

Syn一开盘价=收盘价[1]+Δ 开盘价

很容易将计算过程编入程序或电子表格。先计算表8.2中 棒线 间的关系,它们基于1995年 12月 标准普尔500的 实际棒线序列(图 8.1)。 棒线间的关系见后四列。11月30日 和11月29日的收盘价之差 为-0.80点 。上日收盘价和今日开盘价、最高价、最低价和收盘价之 差都被列出。这些计算结果包含了价格关系。现在我们可以使用随 机数发生器来对这些数据进行随机化处理。

 为了对这些数据进行随机化处理,先把它们从1到n标号,其中 n为最后一条棒线的标号。然后,使用随机数发生器选择1~n之间 的一个数,那个数便是序列中下一棒线的编号。假设在第10次选择

表8.3 使用表8.2中计算出的棒线间关系得出的标准普尔500指数的随机 化数据。假设第1条棒线(表中棒线4)之前的收盘价为608.05。 

时,我们选择的是棒线5,那么原始数据中的棒线5便成了新序列中 的棒线10。 棒线可以不止一次重复出现,例如,在第歹次选择时 , 我们可能又选择了棒线 5。 我们可以产生所需长度的棒线序列。 

这里我们使用1995年 11月29日的收盘价608.05作为参考,使用微 软Excel中 的抽样函数产生新的棒线序列。新序列为:4,5,8,1, 3,10,10,8,9,1。 所以,从收盘价608.05开始,我们接着放入原 始数据中的棒线4,然后是棒线5,然后是棒线8,等等。

表8.3所示为用于计算新合成数据的电子表格。第一列是由放 回抽样抽取的棒线编号。接下来的四列是表8.2中 的每条棒线之间 的关系。最后四列是通过加上棒线间关系从前一收盘价得出的合成 数据。

 在表8.2中 ,12月 5日 的数据变为棒线4,市场在收盘时涨了 3.95点 。在表8.3中 ,棒线4是新序列的第1条棒线。上一收盘价假 设为608.05。 于是新收盘价为3.95+608.05,即 612.00。 新最低价为 608.05-0.95,即 607.10。 新最高价为4.7+608.05,即 612.75。 这些 便是第一行中的合成数椐。第2条棒线的收盘价为612.00+1.05,即 613.05。 现在读者可以完成剩余的计算过程。经过随机化处理后的数 据产生了一个新的合成棒线形态,见图8.2。

 新的棒线序列(图8.2)显示出上升走势,向上靠近630区域。注意原始数据中的最后六条棒线显示的却是整固形态。原始数据中 的最后一条棒线(图8.1中 的棒线10)在图8.2中 为棒线砑6和棒线7。 我 们可以看出,棒线序列中最高价和最低价与先前棒线的相对关系对 于两个序列来说是相似的。于是,我们已经把原始棒线10的 市场行 为概括后在另一序列中重新使用,并生成了新的合成数据。 

当然,生成的样本越多,我们看到的形态变化就越多。以1995 年标准普尔500期货数据为原始样本的另一组合成数据见图8.3,从中 可以看出形态的变化。新形态与原始数据相比,包含了一个较为狭 窄的价格区间,并且在末期似乎要出现一个突破。

 所以,我们可以使用数据随机化处理方法产生各种各样的图表 形态。因为连续合约代表较长时间的市场行为,因此它们在产生合 成数据方面表现得不错。如果交易者愿意,也可以将该方法用于独 立合约,然后使用合适的展期日把它们串在一起。

 随着棒线数据数量的增加,可以生成更多类型的形态,于是数

图8.2标准普尔500期货合约日线图,源自表8.3中 的合成数据。

 8.3 使用棒线序列6,5,4,2,1,9,10,8,7,3得到的标准普尔500期货合约的合成数据。

图8.4使用连续合约的日线数据(上部曲线)生成的瑞士法郎合戍数据 (下部 曲线)。

据随机化处理的威力也不断显现出来。如果我们有5年或7年的连续 合约数据,就可以生成100年 的数据,然后在这些数据上对系统进行 测试,以使系统经历各种各样的市场行情。由于这些形态是将来可 能碰到的,所以这是我们可以实现的最严格的样本外测试。 

从图8.4中可以看出,数据随机化处理方法使我们突破了数据不 足的限制。第一,原始数据中具有几个交易区间,而合成数据中则 出现几轮趋势,表明可以产生新的价格形态。第二,合成数据超出 了原始数据的价格区间,于是数据随机化处理可以生成新的价格区 间和价格形态,这对于在市场可能出现的最广泛的运动范围内测试 系统是必需的。

在合成数据上测试一套波动性系统

此处我们在合成数据上测试一套波动性系统,以便说明数据 随机化处理方法的实际应用。因为货币市场最近已经出现瞬时的、 压缩的运动,所以波动性系统是—个不错的选择。交易者们可能认 为突然的、压缩的价格运动是当今期货市场的一个主要部分。但 是,对历史数据的分析将说服他们,以前这种行情也出现过。如果 交易系统使用了重度平滑的数据(译者注:指对价格数据进行多次 平均,使指标变得更加平滑),那么在交易这种市场运动时常常比 较困难。许多交易者已经注意到,瞬时运动还出现在趋势转折点附 近。所以,我们可能找到一种基于波动性的方法来辨识顶部或底 部。对于波动性的定义,可以采用多种方式。 

常见的经验是使用最近真实价格区间的数倍来定义价格运动的 上下边缘。此处采用一种较为简单的方法,只使用当日最高价和最 低价之差作为价格区间的度量。次日买进止损价位为当日最高价加 上两倍的当日最高价和最低价之差。类似的,卖出止损是当日最低 价减去当日最高价和最低价之差的两倍。我们在同一天碰到两种入 场订单的可能性极小(但并非完全不可能)。

 上述入场点的定义相当具有一般性,并且没有针对任何市场进 行优化。读者可以使用大于2的倍数来获得较少的入场机会,或者使 用小于2的倍数来获得较多入场机会。我们假设这些反复无常的震荡

图8.5高于当日最高价或低于当日最低价两倍于高低价差的价位,提供了进人 压缩式价格运动的良好人场点。但是,市场经常会在没有很大波动性的 情况下出现大型运动。 

出现在转折点附近,所以测试一种任意指定的趋势跟随出场:在交 易第20天的收盘时出场。首先,使用连续合约来观察测试结果,然 后在经过数据随机化处理的瑞士法郎合成数据上测试该系统,目 的 是看一下这套简单系统的工作情况,以及合成数据的使用方法。

从图8.5中 可以看出,在 1995年12月 的瑞士法郎合约上波动性 入场是如何实现的。在9月份,该系统在一个强有力的反弹中获 利。第20日收盘时的出场将我们带出了整固区。然而,该系统没有 在8月 份的抛售中及时做空,那笔交易几乎没有获利。注意先前的 多头交易击中了3000美元的初始止损。通过设计,市场从一段整固 区出来进入另工段整固区或另一轮趋势的短期爆发市场行情最适合 这种系统。  

我们首先使用瑞士法郎从1989年6月 30日 到1995年6月30日 的实 际数据来测试该系统,允许100美元的滑移价差和佣金,使用3000美 元的初始止损。然后使用数据随机化处理程序来对这些数据进行处 理,生成另外8份连续合约数据。我们在合成数据上对相同的系统 进行测试,系统规则没有任何变动,测试结呆见表8.4。 为了清楚起 见,合成数据的名字中有“syn"的字样。

在1956年合成数据上的测试结果表明,可能出现明显优于或劣

于测试结果的未来业绩。对于这种结果的出现,不必大惊小怪。独 立合成数据上的业绩变化范围更大。但是,8份合成数据上的平均业 绩(最后一行)接近于原始测试周期上的业绩(第一行)。 这种结 果类似于表8.1中所示结果,随机样本的平均统计量接近于原始样本 的平均统计量。

当我们对更多合成数据上的测试结果进行平均时,更好地评估 系统 “ 真实 ” 业绩或最可能业绩。我们还可以求出合成数据测试结 果的标准偏差,以量化未来业绩的变化范围。例如,表8.4中所示合 成数据的标准偏差为20523美元(没有列出)。 借助该数据,可 以 使用均方差分析来选择投资组合,这些策略运用了现代投资组合理 论的思想。我们可以尝试为一组系统找出投资组合所带的权重,对 于一个特定的预期标准偏差,这组系统可能实现给定水平的预期盈 利。我们还可以使用标准偏差为破产风险的计算提供一个相关的范 围。合成数据的另一种用法是预测给定系统未来资金回撒的范围。 所以,合成数据可以用来预测未来业绩。   

合成数据有一个重要的局限性。由于我们使用的是放回随机抽 样方法,所以我们的形态不代表实际市场行为。例如,合成数据可 能出现不代表市场心理或任何供需平衡的形态。因此,我们应该生 成多个数据集,然后在这些数据集上对系统业绩求平均值。平均业 绩将更好地代表系统潜在的未来业绩。

 小结

总之,数据的随机化处理提供了一种测试系统的新方法,使系 统测试可以在许多不同的市场行情上进行。我们可以在这种模拟测 试中观察系统模型的表现,对于系统的运作获得更多自信,并且学 习如何识别系统的失效。我们可以使用自己的洞察力来设计滤网 , 提高系统性能,减少交易数量,以及为交易系统设计一个中性区域 (译者注:即在市场外观望)。 还可以绘制资金曲线来检验标准偏 差的间隔预测,从而提高对未来资金回撤的预测能力。对市场行情 进行主观评价,看系统在哪些行情中表现特别好,在哪些行情中表现特别差。