PART 2.Trading Systems 3.Backtesting-回测 这一节首先定义回溯测试,然后描述基础的回溯实现,之后阐明几种偏差,还将讨论如何包含交易所的特性使回测更加现实,以及讨论如何在回测设置中正确地建模事务成本,最后将讨论回测性能。 通过丰富的数据可用性,更可靠地提供对未来业绩的预期,而不是对过去业绩的预期,执行此操作的过程称为回测。 为何回测策略 回测是通过将特定的策略算法根据历史财务数据流来进行的,数据流将导致一组交易信号,在策略回测期间每笔交易的利润或亏损的累积成为总损益(PnL),算法策略的需要回测的关键原因如下: ● 过滤:建立算法交易最初的研究阶段是建立一个战略通道,然后过滤掉任何不符合某些标准的策略,回测提供了一种过滤机制,可以帮助消除不符合性能需求的策略。 ● 建模:回测允许我们测试某些市场现象的新模型,如交易成本、订单路径、延迟、流动性或者其他市场微观结构问题。 ● 优化:尽管策略优化充满偏差,但是回测允许通过修改策略参数的量或值并重新计算其性能来提高策略的性能。 ● 验证:回测策略可以确保它没有被错误地实现。 回测为算法交易提供很多优势,但是随着策略使用频率的增加,正确模拟市场和交易所的微观结构效应变得更加困难,导致回测不可靠对所选策略评估更棘手。同样回测充满了各种各样的偏差。 回测偏差 偏差可以影响一个经过测试的策略的性能,且这些偏差倾向于夸大绩效而不是降低绩效,因此回测对于实际性能来说更像策略的一个理想化的上限,从算法交易中消除偏差几乎是不可能的,因此我们需要尽可能减小偏差,下面是四个主要的偏差: 优化偏差 调整或引入额外的交易参数,直到回测数据集上的策略性能非常有吸引力。然而,一旦投入使用,该策略的表现可能会明显不同。优化偏差很难消除,因为算法策略往往涉及很多参数。优化偏差可以通过保持最小化参数的数量和增加训练集的数据点的数量从而降到最低。帮助减轻这种偏差的一种方法是进行敏感性分析,在考虑所有其它因素的情况下,对参数选择进行合理、基本的推理,应该能够得到更平滑的参数表面,如果性能表面不稳定,通常意味着一个参数没有反映一个现象。 前视性偏差 当未来的数据意外地包含在模拟中的某个点上,而该点上的数据实际上并不可用时,就会将前视性偏差引入回测系统。如果我们按时间顺序运行回测,并且到达时间点N,那么如果包含任意点N + k的数据(其中k >0),则会发生前视性偏差。下面是三种引入前视性偏差的情况: ● 技术漏洞:代码中的数据/向量通常有迭代器或索引变量。不正确的通过合并N+k处的数据,这些指数的偏移量可以导致前视性偏差。 ● 参数计算:在计算最优策略参数时,比如两时间之间的线性回归序列,如果使用整个数据集(包括未来的数据)来计算回归序列,应用于交易策略,则未来的数据将被合并,并存在一种前视性的偏差。 ● 最大/最小值:某些交易策略在任何时间段都使用极值,然而这些最大/最小值只能在一个时间段的末尾计算,这是一个前视的值,如果在当前期间使用这些值就会引入偏差。因此使用这些策略的最大/最小值至少落后一个周期。 幸存者偏差 幸存者偏差会导致某些策略类型的性能显著提高,当策略在数据集上测试时,不包括可能在特定时间点选择的全部先前资产,而只考虑那些“存活”到当前时间的资产时,就会发生这种情况。有两种主要的方法可以减轻生存偏差: ● 无幸存者偏差数据集:购买包括退市实体的数据集,尽管它们并不便宜,而且往往被机构公司利用。也可以交易不容易产生生存偏差的资产类,例如某些商品和未来的衍生品。 ● 使用更近期的数据:使用更近期的数据集会有所缓解选择被加权到“幸存者”的可能性,也可以建造通过搜集当前点以后的数据,从而开始构建一个没有幸存者偏差的个人数据集。 认知偏差 当创建五年或者更长时间内进行回测,很容易发现一些指标特性结果令人满意,由于整体形式乐观,承受这样一段时间内的损失是很容易的。然而在实践中,这要困难得多,一项本来会成功的策略,在长期下跌期间会停止交易,从而导致重大损失,与回测相比,性能较差。尽管该战略本质上是算法式的,但心里因素仍可能对盈利能力产生重大影响。关键是要确保,如果你再回测中看到一定比列和持续时间的回撤,那么你应该预期它们会在实时交易环境中发生,并且需要坚持下去,从而再次实现盈利。 交易所问题 ● 订单类型:算法交易员必须做出的一个选择是如何以及何时使用可用的不同交易所订单。它会极大地影响策略回测性能。有两种类型的订单可以执行:市场订单和限价订单。市场订单立即执行交易,作为市场指令执行的大型交易,往往会得到一个混合的价格。市场订单被认为是激进的订单,因为它们几乎肯定会被满足,尽管潜在的成本未知。限价指令为策略提供了一种机制,可以确定交易执行的价格,但要注意,交易可能没有部分或全部完成。限价订单被认为是被动订单,因为它们通常是未完成的,单个交易所的限价订单集合称为限价订单簿,它本质上是按特定大小和价格的买卖订单队列。在进行回测时,正确地建模使用市场或限制订单的效果是非常重要的。 ● 价格整合:廉价或免费的数据集虽然存在生存偏差,但通常也是来自多个交易所的符合价格提要。由于区域交易所的小订单,数据的极值点(即开、关、高、低)非常容易受到“外围”值的影响。这些值有时也更可能是尚未从数据集中删除的tick级别的错误。如果您的交易策略特别广泛地使用了OHLC中的任何一个点,那么回测性能可能与实时性能不同,因为根据您的经纪人和您对流动性的可用访问,订单可能被路由到不同的交易所。解决这些问题的唯一方法是使用更高频率的数据或直接从单个交换器本身获取数据。 ● 外汇交易和电子通讯网络:外汇交易发生在多个场所和电子通信网络(ECN)。一个场地的出价/卖出价可能与另一个场地的出价/卖出价相差很大。人们必须非常小心地使用特定场所的定价信息进行回测,而不是来自多个场所的综合提要,因为这将显著地更能指示您未来可能实现的价格。外汇市场的另一个特性是,经纪商本身没有义务与每个交易参与者分享交易价格/规模,因为这是他们的专有信息。因此,在您的回测中使用买卖报价更合适,并且要非常小心经纪人/场所之间交易成本的变化。 ● 限制做空:有些股票可能没有可用的做空途径,这回严重推高回测的回报,因此要小心在回测中包含此类限制做空的品种,如果你认为你交易的品种存在流动性限制,就不要去做空。 交易成本 在实现交易模型时,新手最常犯的错误之一是忽视(或严重低估)交易成本对策略的影响。尽管人们通常认为交易成本只反映经纪人佣金,但实际上,在交易模型中还有许多其他方式可以累积成本。必须考虑的三种主要费用包括: ● 佣金:算法交易策略产生的最直接的交易成本是佣金和费用。所有策略都要求以某种形式访问交易所,要么直接访问,要么通过经纪中介(“经纪人”)访问。这些服务在每笔交易中都会产生增量成本,称为佣金。代理通常提供许多服务,尽管定量算法只真正利用交易商基础设施。因此,每笔交易的经纪佣金往往很少。经纪商还收取费用,这是清算和结算交易的成本。此外还有区域或国家政府征收的税收。由于佣金、费用和税收通常是固定的,所以在回测引擎中实现它们相对比较简单。 ● 滑点:滑点是指交易系统决定进行交易的时间与交易在交易所实际执行的时间之间的价差。滑点是交易成本的一个重要组成部分,它可以决定一个非常有利可图的策略和一个执行得很差的策略之间的差别。滑点是资产波动性、交易系统与交易所之间的延迟以及执行的策略类型的函数的基础。波动性较高的工具更有可能移动,因此信号和执行之间的价格可能存在很大差异。延迟定义为信号生成和执行点之间的时间差。更高频率的策略对延迟问题更敏感,而延迟上毫秒的改进可以对盈利产生重大影响。策略的类型也很重要。动量系统平均更容易受到下滑的影响,因为它们正试图购买已经朝着预期方向移动的工具。相反的情况适用于均值回归策略,因为这些策略正朝着与交易相反的方向发展。 ● 市场影响:市场影响是交易员因试图通过交易所(和资产)进行交易的供求动态而产生的成本。对一种流动性相对较差的资产下大额订单,可能会对市场产生重大影响。为了解决这一问题,大宗交易被分解成更小的“块”,这些“块”在新流动性到达交易所时定期进行交易。相反,对于标普500指数期货等流动性较高的工具而言,交易量较低的交易不太可能大幅调整“当前价格”。流动性较差的资产的特点是价差较大,即限价指令与当前买入价和卖出价之间的价差的区别。这种价差是与任何交易相关的额外交易成本。价差是总交易成本的一个非常重要的组成部分。 回测与现实 为了模拟更加真实的情况,可以在策略中添加一系列现实影响的因子,比如过度拟合、糟糕的数据清理、对交易成本的错误处理、市场机制的改变和交易约束的危险。忽略这些因子会导致回测的性能与实际的策略部署有很大的不同,因此,人们必须非常清楚,未来的表现不太可能与历史直接相符。 |