回溯测试被认为是金融交易者工具集中的一个重要工具。想一想,在你购买任何东西之前,无论是手机还是汽车,你是不是都需要查看品牌历史、功能等,并检查它是否物有所值。同样的原则也适用于交易。
本文分为以下几个部分:
●什么是回测?
●回测交易策略的关键决策
●回测平台
●编程语言的选择
●回测类型
●如何进行回测?
●回测评估参数
●回测偏差
什么是回测?
回测交易策略是根据历史数据测试交易假设/策略的过程。
通过使用历史数据,你可以回测并查看你的假设是否正确。它有助于评估交易策略的可行性,通过发现它在历史数据上的表现,然后再在真实市场上实施。
回测交易策略的关键因素
选择正确的市场/资产细分
你可以查看各种因素,以决定哪种市场或资产最适合你要进行的交易类型。无论是长期还是短期来看,这些因素都可能是你愿意承担的风险、希望获得的利润以及即将投资的时间。
例如,加密货币交易可能比其他交易风险更大,但可以提供更高的回报,反之亦然。因此,选择合适的市场和资产类别进行交易是一个至关重要的决定。
一旦你决定了要投资的细分市场,你就要开始尝试找到有关它们的一些信息。
涵盖各种市场条件的数据
市场上的价格容易受到多种因素的影响,因此会根据情况的不同而不断波动。这些因素可能包括货币政策、公司年度报告的发布、通货膨胀率等重大公告。
这里要考虑的关键点是市场不会总是以类似的方式运行,这就是为什么我们需要在各种市场条件下测试交易策略的原因,以便我们知道策略在这些条件下的表现。
纳入交易成本
在回测时考虑各种佣金、点差和滑点是很重要的。在没有这些成本的情况下,该策略很可能表现良好,但在包含这些成本后,它会极大地影响策略盈利能力。
回测平台
有一些平台可以提供对历史数据执行回测的功能。
在选择回测平台之前要考虑的要点是:
零售交易回测平台
TradeStation
TradeStation 提供跨多个资产类别的电子订单执行。它允许从图表交易和实时盈亏P&L投资组合管理进行交易。TradeStation 使用“EasyLanguage”来创建图表和开发算法交易策略。顾名思义,这种语言很容易学习,因为它与英语非常相似,因此非常适合编码初学者。
MetaTrader
主要产品是外汇交易平台。这些是用专有语言编写的自定义脚本,可用于自动交易。
NinjaTrader
NinjaTrader 是一款免费软件,它使用非常广泛且文档丰富的 C# 编程语言和 DotNet 框架。它可用于股票、期货和外汇市场的高级图表、策略回测和模拟交易。
Blueshift
Blueshift是一个免费且全面的交易和策略开发平台,还支持回溯测试。它帮助交易者更多地关注战略制定而不是代码,并提供集成的高质量分钟级别数据。其基于云的回测引擎使交易者能够在 Python 编程环境中开发、测试和分析交易策略。
Amibroker
Amibroker 是一款交易分析软件,可以进行投资组合回测和优化,并拥有一系列良好的技术指标来分析策略。它使用“AmiBroker 公式语言(AFL)”来制定和实施交易策略和指标。
基于网络的平台
QuantConnect
支持多种语言编程。目前提供对美国股票和外汇报价数据的访问,并且正在添加新的数据库。它支持高速回测,它并行使用数百台服务器。
Deltix 支持股票、期权、期货、货币和自定义合成工具。提供开放灵活的架构,允许与多个数据源(例如彭博、汤姆森/路透社等)进行无缝和稳健的集成。被量化基金、自营交易公司等广泛使用。由于软件许可费用超出了他们的预算,所以没有太多的零售交易者使用这个回测软件。
Quanthouse
与 Deltix 一样,Quanthouse 由于高额的许可费,也主要由机构使用。它为跨工具和投资组合交易方收集数据、策略制定、历史回溯测试和实时执行提供一体化解决方案。
AlgoTrader
这是一家总部位于瑞士的公司,为基于 Web 的前端的系统提供开源和商业许可。支持外汇、期权、期货、股票、ETF、商品、合成工具和自定义衍生品点差等,允许完整的历史回溯测试和甚至复杂的事件处理。
编程语言的选择
它在开发回测平台时发挥着重要作用。不同的语言有不同的优缺点,根据需要仔细权衡,可以在很大程度上提高系统的性能。
我们在下面简要讨论了一些最常用的语言:
Python
Python是一种免费的开源跨平台语言。它为几乎所有可以想象的任务提供了一个丰富的库和一个专门的研究环境。执行速度对于日内交易者来说绰绰有余,基于分钟及以上的时间框架上进行交易。
C++
它为管理内存和优化执行速度提供了最大的灵活性,但可能会产生细小的bug并且比较难学。
C# 和 Java
两者都是开发回测的不错选择,因为它们具有本机 GUI 功能、数值分析库并提供快速的执行速度。
MATLAB
MATLAB 是拥有多个用于科学计算数值库的商业 IDE。它具备很快的执行速度,但对零售交易者的吸引力仍然较低,因为它相当昂贵。
R
R 是一个专用的统计脚本环境,它是免费的、开源的、跨平台的,并包含大量免费可用的统计包,用于执行极其高级的分析,但除非操作被矢量化,否则缺乏执行速度。
回测类型
可以通过两种方式对模型进行回测:矢量化或事件驱动。让我们通过一个例子来理解这两种方法。
矢量化方法是一种快速测试策略的粗略方法。建立基于研究的量化回测框架,不考虑交易的委托成交行为,与真实市场情况差距比较大。
与矢量化方法相比,事件驱动的系统具有许多优点,一是事件驱动回测可以用于历史回测和实时交易,而矢量化的回测必须一次获得所有数据才能进行统计分析;二是使用事件驱动的回测不会出现前瞻性偏见,因为将市场数据接收视为“事件”,可以用市场数据“滴灌”来复制订单管理和投资组合系统的行为方式;三是事件驱动的回测允许对如何执行订单和产生交易成本进行定制。由于可以构建自定义交易处理程序,因此可以轻松处理基本的市场和限价订单。
尽管事件驱动的回测系统具有许多优点,但与简单的矢量化系统相比,两大缺点也比较突出:一是实施和测试要复杂得多,有更多的“活动组建”(模块),导致引入错误的机会更大;二是执行速度较慢,进行数学计算时,无法利用最佳的矢量化运算。
如何进行回测?
Python中的矢量化回测
在本文的这一部分,我们将演示如何在 Python 中基于移动平均线回测交易策略。
我们将使用一个简单的移动平均线,它的计算方法是将最近 n 天的价格相加,然后除以天数。
交易规则假设当短期移动平均线(50 天移动平均线)超过长期移动平均线(200 天移动平均线)时,我们买入。
当短期移动平均线低于长期平均线时,我们卖出。
回测此策略的步骤是:
获取价格数据
我们从雅虎财经获取每日股价数据。
微软收盘价
计算移动平均线
我们将计算收盘价的 50 天和 200 天移动平均线。我们将使用熊猫滚动和均值方法来计算移动平均值。
生成交易信号
如前所述,我们将在 50 天移动平均线大于 200 天移动平均线时买入,在 50 天移动平均线低于 50 天移动平均线时做空。
多头和空头信号
绘制收益曲线
我们将计算并绘制策略的累积回报。
回测评估参数
我们进行了回测,现在是时候根据某些参数来衡量其性能了。
以blueshift上的回测情况来看,
让我们尝试了解一些指标。
年化回报
它是一项投资在一年多的时间内获得的回报。
年化回报 = ((1 + 累积回报) ^ (252/交易日数)) – 1
累积回报
累积回报是投资的总回报。
累计收益=((终值-初值)/初值)*100
年化波动率
波动率是对给定市场指数或投资组合回报分散性的统计衡量。
年化波动率 = 日波动率 * 252 的平方根
夏普比率
夏普比率是每单位波动率的超额收益。超额收益是总收益减去无风险收益率。一般来说,无风险回报是指无风险资产的回报,如政府债券。
夏普比率 = 超额回报 / 波动率
更高的夏普比率是首选,因为每单位风险的回报更高。
最大回撤
它是投资组合从高峰期损失的最大值。这是该策略可以造成的最大损失。
最大回撤 =(谷值 - 峰值)/峰值
回测偏差
一个好的回测者应该意识到,会有些可能会彻底改变你回测结果的偏见。
现在让我们了解其中的一些。
过去是未来预测的衡量标准
回溯测试假设过去的表现是未来表现的衡量标准。例如,假设您想测试基于互联网 IPO 表现优于整体市场这一概念的策略。
如果您要在 90 年代末的互联网繁荣时期测试此策略,该策略的表现将显着优于市场。然而,在泡沫破灭后尝试同样的策略会导致惨淡的回报。
在回测交易策略时必须考虑到“过去的表现并不一定能保证未来的回报”。
过度拟合/优化偏差
像任何其他模型一样回测容易过度拟合。在历史数据上测试模型时,你无意中尝试用拟合参数来获得最佳结果。但是,你在历史数据集上得到了最好的结果,当你在未知的数据集上部署相同的模型时,它可能无法给出相同的结果。
回测时如何避免过拟合?
避免过度拟合的最好方法是将数据集划分为训练数据集和测试数据集(类似于机器学习)。你在训练数据集上回测交易策略,并使用你在训练数据集上使用的相同参数在测试数据集上运行策略,以确保策略的有效性。
前瞻偏差
前瞻偏差是在信息实际发生之前在分析中使用的信息。在制定策略时,你可以访问整个数据,因此在某些情况下,可能会包含在测试时间段内无法使用的未来数据。
一个看似微不足道的疏忽,例如假设收益报告在前一天可用,可能会导致回溯测试期间的结果出现偏差。你需要确保不使用仅在未来可用的数据,以避免前瞻偏差。
幸存者偏差
在对策略进行回溯测试期间,你通常倾向于在当前范围而不是历史数据库对策略进行回溯测试。
有一个著名的例子用来说明幸存者偏差。如果使用科技公司的股票来制定策略,但在互联网泡沫破灭后获取数据,那么与你在泡沫破灭之前包含数据的情况截然不同。
如何在回测时避免幸存者偏差?
其中一种方法是购买昂贵的无幸存者偏差数据。另一种方法是仅使用不超过 5 年的最近数据(不是很可靠的方法)
FAQ
问:如何解释回测结果?
有多种性能参数可用于评估和解释回测结果。一些绩效指标是夏普比率、回撤、年化回报和波动性。
问:如何区分好的和坏的回测结果?
要知道回测结果是好是坏,是需要对其进行测试。其中一种方法是将数据集划分为训练数据集和测试数据集。在训练数据集中,你可以创建和优化策略参数。在测试数据集上,你可以分析性能。
如果该策略在测试数据上表现良好,则表明该策略是好的。如果性能不是最优的,则可能是你过度拟合了参数,需要重新评估模型。
问:回测的时间段应该是多久?
回测的时间段取决于你头寸的平均持有时间。如果交易的策略持有期超过一个月,那么最好使用较长的时间段,最好是 15 年。
如果你正在创建日内策略,那么 10 年是一个很好的时间。然而,当你开始交易时,这种运行良好 10 年的策略可能不再有效。因此,在样本外数据集上测试你的策略非常重要。
最后
回溯测试被证明是算法交易的最大优势之一,因为它允许我们在实际市场中,实际实施之前测试我们的策略。