本文将深入探讨策略回测,为您提供详细的相关内容。 要进行算法回测,需要涉及多个领域的知识,如心理学、数学、统计学、软件开发和市场/交易所微观结构等。由于无法在一篇文章中对这些领域进行全面覆盖,因此我将把它们分为两到三个更小的部分。在本节中,我们将探讨的主题包括:首先,我将为您定义回测,并描述其基本执行方式;接下来,我将详细阐述我们在《量化交易初学者指南》中提到的偏差;然后,我将介绍各种可用的回测软件选项之间的比较。 在随后的文章中,我们将深入研究经常被忽视的策略实施细节。我们还将探讨如何包括交易所的特殊性质,使回测过程更加真实。然后,我们将讨论交易成本,并介绍如何在回测环境中正确地对其进行建模。最后,我们将详细探讨回测的性能,并为您提供一个常见的量化策略示例——均值回归交易。 让我们开始探讨回测的定义以及为何我们应该在我们的算法交易中进行回测。
什么是回测?
算法交易与其他投资类别不同之处在于,由于大量数据可用,我们可以更可靠地从过去的表现中提供有关未来表现的预期。实现这一点的过程被称为回测。 简单来说,回测是通过将您特定的策略算法暴露于历史金融数据流中来进行的,这将导致一组交易信号。每笔交易(在这里我们的意思是两个信号的“往返”)都将有一个关联的利润或损失。在您的策略回测期间,这些利润/损失的累积将导致总利润和损失(也称为“P&L”或“PnL”)。这就是这个想法的精髓,尽管当然,“魔鬼总是藏在细节中”! 进行算法策略回测的主要原因是什么?
- 过滤 - 我们在最初的研究阶段的目标是建立一个策略流程,并过滤掉不符合特定标准的策略。回测为我们提供了另一个过滤机制,因为我们可以排除不符合我们性能需求的策略。以回测算法的角度来看,过滤是一个非常重要的步骤,它可以帮助我们排除低效或不可行的交易策略,从而提高我们的投资回报率。
- 建模 - 回测允许我们安全地测试某些市场现象的新模型,例如交易成本、订单路由、延迟、流动性或其他市场微观结构问题。
- 优化 - 尽管策略优化存在偏差,但回测允许我们通过修改与该策略相关的参数的数量或值并重新计算其绩效来提高策略的绩效。
- 验证 - 我们的策略通常是通过我们的策略流水线从外部获取的。回测策略可确保其未被错误地实施。尽管我们很少能够访问外部策略生成的信号,但我们通常可以访问性能指标,例如夏普比率和回撤特征。因此,我们可以将其与我们自己的实现进行比较。 回测为算法交易提供了许多优势。然而,要直接对一个策略进行回测并不总是可能的。通常情况下,随着交易频率的增加,正确模拟市场和交易所的微观结构效应越来越困难,这会导致回测结果不够可靠,从而使选择策略的评估更加棘手。这在执行系统对策略绩效至关重要的超高频算法中尤为严重。 遗憾的是,回测存在各种偏差。
影响策略回测的偏差
有许多偏差会影响回测策略的表现。不幸的是,这些偏差往往会夸大策略的表现,而不是减少它。因此,你应该始终将回测视为策略实际表现的理想上限。要在算法交易中尽可能地减少偏差,以便能够对我们的算法策略做出明智的决策,但几乎不可能完全消除偏差。 我想讨论四个主要的偏见:优化偏差、前视偏差、幸存者偏差和心理承受偏差。
优化偏差(Optimisation Bias)
可能是所有回测偏差中最隐蔽的一种。它涉及调整或引入其他交易参数,直到回测数据集上的策略表现非常吸引人。然而,一旦实际交易,策略的表现可能会明显不同。 优化偏差很难消除,因为算法策略通常涉及许多参数。由于算法交易策略通常包含许多参数,例如入场/出场条件、回溯周期、平均周期或波动率测量频率,因此消除优化偏差通常很困难。一种减少优化偏差的方法是减少参数的数量,同时增加训练集中的数据点。但是,增加数据点也可能导致问题,因为较早的训练点可能已受到以前的监管环境等因素的影响,因此可能与当前策略不相关。因此,需要谨慎评估回测周期,以确保所选周期能够反映当前市场情况。例如,使用过去的牛市数据来评估在熊市中的表现显然是不合理的。 一种缓解过度优化的方法是进行“敏感度分析 sensitivity analysis”。这意味着逐步改变参数并绘制出表现的“超曲面hypersurface”。在考虑其他因素的情况下,合理选择参数应该导致表现平稳的参数曲面,而参数组合导致回测表现曲面出现突变的情况则应该被排除。当您发现一种具有极好回测结果的策略时,建议牢记此方法。
前视偏差(Look-Ahead Bias)
前视偏差指的是当在模拟交易中,将未来数据错误地包含在模拟中,而在真实交易中该未来数据并不可用。如果我们按照时间顺序运行回测,并且到达时间点 N 时,如果包含了任何时间点 N+k(其中k > 0)的数据,则会发生回测偏差。回测偏差错误可能非常微妙。以下是回测偏差可能出现的三个例子:
- 技术故障 代码中的数组或向量通常需要使用迭代器或索引变量。如果这些索引的偏移不正确,可能会导致前视偏差,即将非零k 值的数据 N+k 纳入计算。
- 参数计算
另一个常见的未来偏差例子是在计算最优策略参数时出现,例如在两个时间序列之间进行线性回归。如果整个数据集(包括未来数据)用于计算回归系数,并因此用于回溯优化交易策略,则未来数据将被纳入考虑,出现未来偏差。因为在回测时,我们不知道未来数据点的情况,所以如果使用这样的参数进行实际交易,其表现可能与回测结果差异很大。 - 极值点 某些交易策略利用任何时间段内的极值点,例如将 OHLC 数据中的高价或低价纳入考虑。但是,由于这些最大/最小值只能在时间段结束时计算出来,如果在当前时间段内使用它们,就会引入前视偏差。因此,在任何使用高/低值的交易策略中,至少需要将高/低值滞后一个时间段。 这通常是导致我们回测效果很好但是实时交易却失败的主要原因。
幸存者偏差(Survivorship bias)
幸存者偏差是一种特别危险的现象,会对某些类型的策略表现造成显著的膨胀。它发生在策略在数据集上的测试时,该数据集并没有包括在特定时间点可能被选择的全部资产,而只考虑那些在当前时间“幸存”的资产。 例如,考虑在2001年市场崩盘之前和之后对一组随机选择的股票测试策略。一些科技股破产了,而另一些则设法维持生存并蓬勃发展。如果我们将该策略限制在仅选择市场低迷期后仍存活的股票中,那么我们将引入“幸存者偏差”,因为它们已经向我们展示了它们的成功。实际上,这只是前瞻性偏差的另一个具体案例,因为未来的信息正在被纳入过去的分析中。 有两种方法避免这个问题:
- 消除偏差的数据集 消除偏差的数据集指的是一些数据集,其中包含了已经退市的实体,可以避免生存偏差的影响。在股权数据的情况下,这些数据集并不便宜,通常只被机构公司使用。相比之下,雅虎财经数据并不消除偏差,这可能会影响一些零售算法交易员的结果。另外,一些资产类别,例如某些商品(及其期货衍生品),不容易受到生存偏差的影响,可以作为交易的选择之一。
- 使用最新的数据
对于股票来说,使用最新的数据集可以减少所选的股票选择加权到“幸存者”的可能性,因为在较短时间内整体股票退市的可能性较小。您也可以开始构建一个个人的生存偏差免费数据集,通过从当前时点开始收集数据。经过3-4年的时间,您将拥有一个坚实的生存偏差免费的股票数据集,以进一步回测其他策略。
心理承受偏差(Psychological Tolerance Bias)
这种特殊的现象在量化交易中往往不被广泛讨论,然而,在更具自由度的交易方法中,它被广泛讨论。这种现象有多种名称,但我决定称之为“心理承受偏差”,因为它捕捉到了问题的实质。在创建回测时,如果回溯5年或更长时间,很容易看到净值曲线呈上升趋势,计算复合年回报率、夏普比率,甚至最大回撤等指标,从而对结果感到满意。例如,该策略的相对最大回撤可能为25%,最大回撤持续时间为4个月,对于动量策略而言,这并不罕见。很容易让人自认为能够承受这样的亏损期,因为整体的情况看起来是不错的。但是,实际上,这要困难得多! 当回测显示最大回撤达到25%时,实盘交易很可能会出现类似或更严重的回撤和回撤周期,而这些回撤期间往往会给投资者带来心理上的巨大压力。之所以将这种现象称为“偏差”,是因为当策略在回撤期间停止交易时,其实这种策略在其他时期是成功的,但相比于回测结果,实际表现往往会远远不如。因此,即使该策略基于算法,心理因素仍然会对其盈利能力产生重大影响。总之,投资者应该注意,如果回测显示有一定百分比和周期的回撤,那么在实际交易中也可能会遇到相似的情况,需要坚持下去以达到盈利。
回测软件包
回测策略的软件包非常丰富。从完全集成的机构级复杂软件到需要从头开始编写几乎所有内容(或获取合适的“插件”)的编程语言(如C ++,Python和R)。作为量化交易者,我们关注的是能够“拥有”自己的交易技术堆栈与开发方法的速度和可靠性之间的平衡。以下是软件选择的关键考虑因素:
- 编程技能
环境的选择在很大程度上取决于您编写软件的能力。我认为,对于长期的盈亏(P&L),掌控整个技术栈比尽可能地将其外包给供应商软件更具影响力。这是由于使用供应商软件时存在外部错误或特殊情况的下行风险,如果您对"技术栈"拥有更多的控制权,那么这些问题通常会很容易解决。
- 执行能力交互
某些回测软件,例如TradeStation,直接与经纪公司相结合。我不太喜欢这种方法,因为降低交易成本通常是提高夏普比率的一个重要组成部分。如果您被绑定到特定的经纪公司,那么如果需要,转换到新经纪公司可能会更加困难。交互经纪提供了一个稳健的 API,尽管界面稍显晦涩。
- 自定义
类似MATLAB或Python这样的环境在创建算法策略时提供了非常灵活的选择,因为它们提供了几乎任何可想象的数学运算的优秀库,同时也允许必要时进行广泛的自定义。这对于策略回测领域的深度研究者来说是非常重要的。
- 策略复杂度
某些软件并不适合进行大量的数字计算或数学复杂度。比如Excel。虽然它适用于简单的策略,但无法真正应对大量资产或更复杂的算法,速度也比较慢。
- 偏差最小化
某些软件或数据是否更容易导致交易偏见?如果您想要自己创建所有的功能,就需要确保不会引入错误,导致偏差。
- 开发速度
策略回测领域的深度研究者认为,开发速度很重要。不应该花费数月时间来实现回测引擎,原型设计应该只需要几周时间。确保您的软件不会在获取少量执行速度百分比的同时,严重阻碍您的进展。
- 执行速度
如果您的策略完全依赖于执行速度(如HFT/UHFT),那么像C或C++这样的语言是必要的。然而,在这些领域,您将涉及到Linux内核优化和FPGA使用,这超出了本文的范围!
- 成本
许多可编写算法交易策略的软件环境都是完全免费和开源的。事实上,许多对冲基金在整个算法交易堆栈中使用开源软件。此外,Excel和MATLAB都相对便宜,甚至有免费的替代品。
以上是选择软件包的标准。接下来我想介绍一些常见的软件包,以及它们之间的比较:
我个人偏爱 Python,因为它提供了适合我的需求和策略的定制程度、开发速度、测试能力和执行速度。如果我需要速度更快的,我可以直接从我的 Python 程序“投入”C++。许多量化交易员喜欢的一种方法是用 Python制作策略原型,然后以迭代方式将执行速度较慢的部分转换为 C++。最终整个算法都是用 C++ 编写的,可以“单独交易”!