历史回测
金魔方智能交易攻略(12)-历史回测
作者:仁心慧能
前两节我们介绍了测评报告,测评报告是由历史回测产生的统计结果。
历史回测(BackTest)的意义
编写好交易策略后,不要以为就可以等着发财了,除非“确认”这套策略应该有效,不然毫无意义。
有多种方式测试所准备应用的策略是否有效,可以直接用实战来测试,但万一失败会很受伤,
也可进行模拟交易,但费时费力。最有效的方法,就是先用历史数据进行测试,通过了,再进行模拟交易或实战测试。
用历史数据进行测试,可以了解到交易策略在实际运用中可能遇到的状况和大体的绩效。
一套策略如果不适用于过去的市场状况,就更没理由相信它适用于未来。在拿资金冒险之前,
应该首先了解交易策略的各种可能的表现。
值得注意的是,历史测试的绩效并不等于未来绩效,一套策略在测试过程中,即使表现完美,
也不能保证在实际运用中不会发生严重亏损,但只要经过适当的测试,就可以了解到策略可能发生的
最严重亏损的程度,避免实战时才发现,自己的资金无法承受或交易风格不愿意承受这类损失,
而导致被迫中途放弃一套原本可以成功的策略。
在测试过程中,应该把历史数据分为两部分,一部分用来调整交易策略或参数的数据,称为样本内数据;
另外一部分对策略来说是全新的“陌生”数据用来做真正的测试,称为样本外数据。
在测试策略尤其是短线、高频策略时,要重视交易成本,对于交易佣金和滑移价差,预估、设置必须符合实际。
当市场出现突发消息、价格大幅波动时,滑移价差往往很大,此时实际交易的表现可能远不如模拟交易。
一些看起来不错的策略,考虑佣金和滑价后却亏钱。千万不要忽视这些必然发生的成本,否则测试结果是不靠谱的。
由于历史测试往往是以最近成交价作为开平仓价格,对于不活跃的缺乏流动性的品种来说,由于买卖价差大,
最近成交价显然不能作为能够实际成交的价格,所以也应该设定较大的滑移价差。
运用历史数据进行测试,其功能如同试婚,这并不保证婚姻成功,但这是一种很好的方式可以增进对双方关系的信心,
并避免一些不愉快的意外。通过历史测试,可以了解该策略的运作程序与限制。
应注意两个倾向,第一种想尽快赚钱而迫不及待地展开交易,因此很少用历史数据测试其策略以验证有效性。
另一个倾向是认为,过去有杰出表现的策略在未来也一定能够带来利润,过去绩效越佳,用于实际交易时,
博取丰厚利润的机会也越大。上述两种想法都同样危险。
历史数据
历史数据的正确性,是确保真实交易信号的关键,是得出有意义结论的基础。
测试所用的历史数据,应该充分反映实际的市场状况,包括各种可能发生的情形,需要知道该策略在上升趋势、
下跌趋势、区间盘整、剧烈波动等各种市场状况的表现。如果数据太少,很难判断测试结果究竟是偶然因素造成的,
还是交易策略确实有效。持仓时间越长,相应需要越长时间的数据。测试期间的交易笔数应足够多,
否则不能归纳出任何有意义的统计结论。
但是,数据越多未必意味着越好,回溯的时间越久,其结果可能越不能反映最近的市场动态。
为了数据的连续性,股票数据需要进行除权处理,期货数据需要解决合约到期的问题。
期货合约涉及到交易截止日前换月移仓的问题,由于合约间的基差,如果只是简单地接上后续合约的价格数据,
往往会出现跳空缺口,需要进行平准连续处理,生成人工合成的合约。
一种方法是对每个合约的价格序列进行持仓量或成交量加权平均,计算出该品种的价格指数,
这种指数反映整个市场价格重心的走势,避免价格跳空。它的优点是价格相当平滑,可以消除合约转换之间的价格缺口,
缺点是与实际可交易的合约价格并无关联。可以利用指数来测试,再用实际合约价格产生交易信号,
或者用指数产生交易信号,用实际价格来下单。这使得测试以及实际交易都很繁琐,难以实现。
另一种方法是将不同时段的主力合约的价格序列直接进行连接。在实际交易中,我们希望交易流动性最好的主力合约,
当之后的某个合约的成交量逐渐增加并大于当前成交量逐渐减少的主力合约时(一般是连续3天,对于会快速换月的
品种例如股指则是1天),之后的这个合约成为新的主力合约,数据相应切换到这个新的主力合约。
旧合约与新合约的价格往往存在一定的差异,这个差值有可能形成巨大的跳空缺口,使技术指标和交易信号的计算产生错误,
需要对数据序列进行平准连续处理,我们的处理方法是把切换日前的数据统一加上切换日前的收盘价差,
这样就实现了两个合约之间的平滑过渡。由于资金利息和商品期货的仓储费用,后续新合约的价格在多数情况下高于旧合约,
加减差价的连续处理基本不会导致历史数据变成零值或负值。这种处理我们也称之为“复权处理”,
在软件中与股票类别共用复权处理菜单。在国内品种中,只有沪铜由于在04-06年初一直保持较大的负基差,
导致其01、02年的复权处理数据出现负价格,如下图所示:
注意,带帽的S图标表示经过复权处理的主连数据,点击复权处理按钮或在主菜单选择不复权,
则相同位置的S图标不带三角帽。鼠标移动到图标可看到换月价差数据。
这种处理方式带来的问题是,价格经过人为的加减修改,连续数据与其对应的实际合约数据相差某个数值。
如果指标计算、交易信号或止盈止损用到价格的百分比时,会与实际情况不符,所以应注意策略中是否用了
比值计算导致与当时真实状况不一致的结果。只要不用比值的算法,例如,移动平均交叉,平均真实波幅ATR、
价格形态或其它类似指标及其产生的交易信号,基本上完全相同,不受影响。
另外,当缺乏或忽略分笔明细数据时,应注意K线开高低收发生的先后顺序对交易信号和结果的影响。
在历史测试中,有两种方法解决此问题,第一种方法,限制一周期(bar)内仅能开仓一次,止损、止盈单则至次周期才有效,
确保历史测试的明确性和唯一性。但其缺陷是,行情波动剧烈时,在开仓的同一周期内,可能希望平仓或反手,
如果必须等到次周期,可能会增加亏损、减少盈利。另一种是我们采用的方法,根据高、低价与开、收盘价的关系,
来推测高、低价发生的先后顺序。如果开盘价较接近最高价,则价格走势是开盘价到最高价,再到最低价,再到收盘价;
如果开盘价较接近最低价,则价格走势是开盘价到最低价,再到最高价,再到收盘价。如果在同一周期内同时满足止盈、止损条件,
则按这个假设的走势判断是止盈平仓还是止损平仓。更为严格的假设是,同一个周期中达到止盈和止损,如果没有真实分笔明细数据,
一律作为止损处理。
更好的解决方案当然是以真实的带买卖盘的分笔数据对K线进行插值计算。