Local EPUB Text
系统的测试方法
测试一个模拟系统绝对是有必要的,而测试过程可能是枯燥乏味的,因为很多交易想法都不成功。由于这个工作如此耗费时间和令人沮丧,因此很多分析师选择捷径,比如不进行样本外测试,但最终这些系统会毁了他们。这个过程的第一步是确认用于测试的数据是正确的,以及之后用于系统实时运行的数据是一样的。第二步是为选择的模型确定规则,作为系统的基础和优化所选变量的规则。这些规则要包括进场和出场信号,然后在根据首轮测试结果增加其他过滤器。如果没有前向测试的安排,就需要保留大量被称作“样本外数据”的数据,用于之后对系统稳健性的检验。一旦一个可行系统做好了充分优化,就用所得参数对样本外数据进行测试,看看系统能否很好地处理未知数据,而不仅仅是曲线拟合或数据挖掘的结果。这是系统设计中最让人提心吊胆的部分,因为一旦样本外数据检验失败,就需要重新开始设计系统。这时候,大多数新手都会放弃。
干净数据
对于任何系统的准确评估来说,数据必须无可挑剔。没有正确的数据,系统测试就会徒劳无功。测试数据应该与系统实时运行时所用的数据一样。测试和实际运行中,不仅数据要相同,数据源也要一样。不同的数据供应商的数据来源不同,这对于短线系统来说问题较大。在短线交易中,交易的顺序对于执行和形态分析都很重要。
要求用于测试的数据的数量要依据系统的周期而定。一般的原则是数据要充分,能够提供至少30~50个进场和出场信号,能够覆盖市场上涨、下跌和盘整时期。这样做是为了确保测试时有充分的数据记录,覆盖不同的市场条件。
实时交易者对于实时接收的“混乱的”数据处理存在诸多困难,在测试数据时明白这一点很重要。数据的清楚明了是交易系统生效的另一个重要前提。任何报价不准确的情况和数据异常情况都会对系统测试的结果有影响,显示出的结果与实际情况不符。梳理数据不是一件容易的差事,常常需要专业数据供应商的帮助。
期货系统对数据的特殊要求
虽然股票数据的过往调整情况不多,包括红利支配、分拆、配股等,但是期货市场还有其他更重要的问题:究竟采用何种合约进行测试?多数期货合约生命周期有限,不可能用于所有系统的测试。到期合约价格和临近时间到期合约的价格不同,更加增加了期货合约测试的难度。这些合约价格很少一致,而且很难再细分成更小的符合实际情况、可以用于长期价格分析的数据。比如说,为了测试日线交易,至少要求两年或者更长的日线数据,但是没有哪一项合约的期限会长到可以获得两年的数据用于测试。当然,也可以用时间最接近的合约系列测试,只是会有合约期限的限制。只要交易系统设定按照分钟交易,不要求更长期限的日线交易信号就可行。
为了解决这个问题,有两种方法可以将合约价格分为若干个期限,形成连续的时间流。这种方法名为永久性合约(perpetual contracts)和持续性合约(continuous contracts)。这两种方法都不是完美的,但这却是长线价格研究通常使用的方法。
永久性合约也称永远远期合约(constant forward contract),即加入了最近的两个合约价格来解决问题。每个价格都根据与最近合约的到期日(如90日)的接近程度进行加权处理。比如说,假设今天是12月初,离大宗商品期货12月合约的到期日只有几天,离3月到期的3月合约还有3个多月。那么90天的永久性合约就可以把每个合约的当前价格乘以各自对应的期限加权的权重。12月到期的商品合约到期日比3月的合约的到期日更接近,也就是说,随着12月到期日的接近,12月的商品合约的权重越来越少,过了12月到期日后,这个永久性合约就相当于只有3月的合约价格了。接着当3月到期日逐渐接近,3月到期合约的权重也越来越少,而临近的6月合约权重逐渐增大。这一过程给出了变化平缓但不真实的合约价格,它免去了结转合约之间巨大价差缺口的问题,只是实际操作中我们无法对永远远期合约进行交易。正如施瓦格指出的,“永远远期系列合约的价格形态,很大程度上可以从实际交易合约的价格形态中推算出来,但这却是不得已而为之的下下策”(1996年,第664页)。
持续性合约又名按照价差不断调整的合约,是更加现实的做法,但是这种合约每到到期日,或者每到结转日期都会进行价格调整,因此持续性合约的价格总是与实际价格不符。持续性合约在过去的某个时点开始,价格由接近的合约决定。根据交易者通常的转期日来确定持续性合约的转期日,例如到期前10天。最后,还要确定累计调整系数(cumulative adjustment factor)。随着时间的推移,不同的合约都结转到下一个合约,这种合约之间的价差累计后,持续性合约的价格也跟着调整。通过这种方法的使用,持续价格就是交易者跟踪系统信号所需要的成本。这类价格没有被扭曲,同时价格也会形成自己的趋势和形态。唯一的区别是持续性合约的价格并不是实际价格,例如百分比变化并不精确。因此,这种方法说明了在持续性合约期间系统可能发生的情况,或者说系统设计者需要了解的事项。
施瓦格说过:“关联的期货价格系列只能精确地反映一种价格水平,要么是最近期货合约的价格水平,要么是持续性期货合约的价格运动。但是不可能两样都体现出来……”(1996年,第669页)对期货交易感兴趣的同学可以查阅《施瓦格谈期货:技术分析》(Schwager on Futures:Technical Analysis)一书,学习更多与此有关的技巧。
测试方法和工具
幸运的是,在我们测试交易系统的时候,并不需要再去发明什么工具,很多交易软件产品中都包含测试单元。有些测试功能可用,有些测试完全不靠谱。在购买测试软件前,你要了解测试方法和软件的测试报告。几乎所有的这一类程序都有可能忽略关键的分析数据,而且术语和公式的定义各不相同。例如,回撤(draw down)一词根据对应的是日内数据、收盘数据,还是交易收盘数据等,就有不同的含义。要正确解释测试结果,你无须了解各种软件中所有术语的含义。牢记这一点,系统分析师还必须确定需要的信息是什么、采用何种评价标准更有用、测试结果的表现形式等。
测试参数区间
首先开展的系统测试是看系统是否有价值。如果确定有价值,系统可能存在的问题是什么。启动测试程序后,应该检查初步选定的参数值是否正确,要判断这些参数的区间范围,观察它们在未来发生的概率和特征。参数区间又称为参数范围,可以让我们大概了解参数价值是否与系统契合。如果参数值变化不大,而结果却出现了巨大的影响和波动,则这个参数可能不适用于将来的交易。这个参数应该舍弃。当参数变动很小,结果也一样或者类似时,就说明参数范围是稳定的。显然这正是我们所需要的系统特征。
技术分析知识22-1
设计HAL系统
现在我们来看一个设计交易系统的简单案例。假设我们打算选定美国IBM公司普通股作为交易对象,传统上,这是一只波动范围不大的蓝筹股。我们决定将从一个叫作商品通道指数(CCI)的震荡指标入手。CCI类似随机指标,其中包括一个波动性部件,因此能更准确地识别超买和超卖情况。这些信号来自优化确定的CCI交叉位。
请看2005~2015年中期IBM股票的月线图(见图22-1)。我们可以看到很多上涨、下跌周期和交易区间。这正好为我们提供了分析和测试的合适数据,因为其中包括了市场上可能出现的三种趋势:上涨、下跌和盘整。图像中包含了9年多的数据,约2250天,让我们有充分的空间发掘各类信号。
图22-1 美国IBM公司普通股股价(月线图:2005年1月~2015年6月)
通常CCI的区间为-300~+300,但是边界并不特别清晰。用到的变量是移动平均线的长度和两条信号线的水平。
假设账户金额为30 000美元,每次进场或出场的佣金和滑点是每股10美分,即每股总计20美分。进场限制每笔交易为100股,而且只能建立一个100股头寸。我们知道这个系统在过去2年都运作得不错,在这个练习里,我们想知道改变参数是否能够提高业绩表现。
这一系统的收益曲线如图22-2所示。默认长度参数为14,信号水平是-100和+100。收益曲线(equity curve)是指账户中收益(纵坐标)和时间(横坐标可以用交易数量或者时间表示)的图像。图22-2中,横坐标是时间。看图可以发现,这个系统的表现比较混杂,很容易被当成另一种震荡指标。但是,如果我们优化其参数,并进行前向检验,也许可以找到一个更可靠的公式,不仅在过去是可行的,而且也适用于未来。
图22-2 使用布林带均值回归模型交易IBM股票的收益曲线(周线图:2004年1月2日~2015年6月29日)
表22-1是采用标准布林带参数运行系统的一次结果。
表22-1 HAL初始测试数据 (金额单位:美元)
资料来源:TradeStation。
现在我们来看一下这些数据,观察其中表现出的HAL系统的特点。
净利润:总利润和总损失的差额。这个系统中整体净利润是负值,而做多的净利润为正,这个问题可以用两种方式解决:在卖空时采用不同的参数,或者只用于做多。如果我们只采用其做多信号,这个系统过去就是可靠的,尽管不是非常好。我们决定优化其做空和做多信号,并进行前向测试。
总利润和总亏损:前者是指从盈利交易中获得的利润总额,后者是指所有亏损交易遭受损失的总和。
盈利因子:总利润比总损失比率的绝对值。它表明了系统的盈利能力。本例中,每损失1美元,盈利0.94美元。换言之,这是一个亏损系统。如果只做多,盈利为1.29,较好的系统一般在2.00以上。
再看交易笔数:本系统产生了139笔交易:69笔多头交易,70笔空头交易。投资者若要寻找可靠的数据,那么这些交易数目已经足够。一般来讲,至少需要30~50笔交易,才可以完成系统测试。
盈利交易占比:所有盈利交易笔数占所有交易笔数的百分比,本例中是57.55%的交易盈利。而这个系统是亏损的,说明亏损交易中存在问题,尽管笔数不多,但是损失比盈利交易更严重。
交易平均净利润:每笔交易的平均利润。如果这个数值较低,表明系统的交易成本较大。这个系统中是负值,说明交易成本过高。
最大盈利交易占总利润比例或最大亏损交易占总利润比例能让我们了解利润或损失是由某一笔交易造成的。在本例中,盈利最大交易的利润占总利润的百分比是5.92%。考虑到交易笔数超过了139,这个比例还是合理的。
最大连续亏损交易笔数很重要,因为一长串的连续损失肯定会引起大幅度的回撤,给系统带来巨大的风险。本例中最大连续亏损交易数目为连续4笔。这说明测试期内发生了两次“反复被打脸”,可以通过设置止损位加以控制。
盈利头寸平均天数或亏损头寸平均天数的数据表明,HAL系统显然在亏损交易上存在问题。亏损交易的时间一般较短,经验法则是大约四分之一时间是花在亏损交易上的,但是对于长持有期,系统没有尽快卖出亏损股。
买入并持有回报率(80.7%)是假设投资人第一天买入,然后在整个交易区间持有的收益率。
账户回报率(-40.41%)是由最大回撤确定的最小账户的总收益。该比率应该与买入持有回报率进行比较,判断系统是否优于什么都不做(买入持有)的做法。本例中,系统交易没有比买入持有更优秀。当然两相比较并不像看起来那么简单,这两种方法都没有引入风险这一概念。买入持有方法的风险很大,回撤的幅度甚至可以达到100%,而这个系统交易的风险要小得多,但还是出现了亏损。
每月平均回报和回报标准差用来确定收益的波动率。本系统的月平均收益回报是-31.63美元,但是标准差却是887.80美元,波动范围非常大。理想状态下,系统的月收益标准差应该小于月收益的5倍。本例中的标准差是月收益的31.5倍,远大于临界值,可能是因为亏损笔数较多。
夏普比率是衡量投资组合或交易系统收益和风险的比率。第21章介绍了收益比较的比率,这里调整为无风险的长期国债收益率比收益率的标准差(后者用来替代风险)。之前提过风险不仅包括波动性,还包括资本损失的风险。夏普比率没能考虑到回撤和收益率倾斜的偏差等因素。例如当投资收益率向上偏差的程度越大,就越不可能由夏普比率来反映情况(夏普比率一般假定收益率呈现正态分布)。这些问题也说明了系统设计者对夏普比率退避三舍的原因。设计其他收益风险比率更加现实。本系统中,夏普比率接近0,表明回报没有超过无风险的美国长期国债回报。
系统最大回撤幅度是收益曲线偏离峰值的最大幅度。假设未来收益与测试周期的收益一样,这就是系统可能遭受的资本损失的最大风险。
我们当然希望交易系统不会遭遇回撤,这一点很正常;我们也希望通过系统交易获得的利润,能比可能遭受的回撤大得多。大的回撤幅度降低了人们对系统的信任,导致系统被提前放弃。HAL在最大回撤时录得负收益,较好的水平是超过1.00,这是一个系统之间比较的标准。
交易最大回撤幅度是净年化收益百分比与最大交易回撤幅度的比率,有时称作最大负向偏移。最大系统回撤可能包括许多笔交易,单笔交易风险也需要用来衡量系统表现,并在亏损时加以隔离。
如果可以解决较长时间亏损交易和做空损失问题,HAL系统还是可以使用的。做多的功能令人满意,如果亏损情况得到改善,还是不错的。但是这个系统在做空时表现不佳。在市场处于牛市时,出现这种情况并不奇怪,但仍然令人感到失望。接下来我们来看一看如何通过优化参数和改变模型逻辑来提升这一系统的表现。