统计套利Python实现
计算机科学家对金融产生兴趣并不罕见——而在这些感兴趣的人中,很少有主题能像统计套利一样令人兴奋,但实际实施起来却远非易事。本文旨在填补这一空白,提供一个从头到尾构建配对交易策略及其相关代码的指南。

一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK
计算机科学家对金融产生兴趣并不罕见——而在这些感兴趣的人中,很少有主题能像统计套利一样令人兴奋。然而,尽管这个概念本身引人入胜,但实际实施起来却远非易事。很少有资源会详细介绍设计、编码和测试此类策略的全过程。本文旨在填补这一空白,提供一个从头到尾构建配对交易策略及其相关代码的指南。
1、首先,什么是统计套利?
名称本身提供了一些线索。“套利”指的是利用价格的不效率,“统计”则表明使用历史数据和定量分析来检测这些不效率。统计套利的核心思想是通过分析金融数据中的模式,识别偏离典型行为的情况,并在这些偏离最终修正时获利。
这个想法之所以有意义,是因为市场通常是有效的,因此股票在其大部分时间内相对稳定。虽然每天都有波动,但每只股票的价格通常会在某个美元范围内震荡。当偏差开始出现时(例如,当一只股票以折扣价交易时),市场很快就会自我纠正,价格重新回到其通常的水平,即其均值。这种价格偏差和修正运动被称为“均值回归”。
理论上,这个概念足以让我们开始交易。通过观察单只股票,我们可以确定其通常的价格,并一旦它偏离该价格,就可以根据需要做多或做空该股票。然而,操作单一股票伴随着一系列风险。例如,如果市场崩盘,股票将偏离其通常的价格,并且不会返回,从而给我们带来损失。我们还可以提到这样一个事实,即在较长的时间段内,股票的价格自然倾向于变化,这可能给我们确定异常行为带来问题。

与其监控单个股票的行为,我们可以观察两个股票之间的相对行为。这是一个更好的主意,因为相对行为随着时间的推移更加稳定,尤其是当两只股票属于同一行业或领域时。
为了理解为什么,考虑Visa和Mastercard:两者都是大型支付处理公司,其商业模式、市场条件和经济敏感性都非常相似。由于这一点,它们的股价往往一起波动,虽然相关性不是完美的,但足够强,使我们能够识别并经常利用它们关系中的偏差。虽然单个股票的价格在长期内可能会上升或下降(这使得定义“均值”变得棘手),但两只密切相关股票之间的“价差”往往表现出均值回归的特性。即使两只股票都随着时间上升,它们的价格差异通常会围绕一个稳定的平均值波动。如果这个价差暂时扩大或缩小超出正常范围,我们可以在预期它会回归时采取仓位——即做空相对昂贵的股票,做多相对便宜的股票。
这就是统计套利的核心。
2、市场中立性
统计套利的一个有趣方面是市场中立性,这一特性使该策略对市场冲击具有鲁棒性。假设有一个经济危机,导致整个股市暴跌。Visa和Mastercard都会受到影响而贬值。然而,它们的贬值幅度很可能相似(图1),这使得两者的关系或价差大致保持不变(图2)。


熟悉统计套利的主要概念后,现在是时候深入实施了。文章中使用的完整代码可以在 这个Colab笔记本 中找到,其组织顺序与这里相同。对于这个例子,我们将站在2024年初想要进行交易的人的角度。这意味着我们将使用2023年的数据进行配对形成,并使用2024年的数据进行回测。
3、我们如何确定要交易什么?
3.1 导入数据
我们的第一步是导入股票数据。在撰写本文时,Yahoo已经不再是可靠的数据源,因此我使用FMP收集所需数据并运行测试。我决定专注于科技巨头,即传统的FAANG和Nvidia。导入数据后,我还有一些代码来填充NaN条目,尽管FMP的数据集通常非常完整。生成的表格如下所示:

3.2 价格标准化
然后我们对所有价格进行标准化,使用滑动窗口的z分数标准化。在这里,我们考虑窗口为60天。正式定义如下:

其中P^*_{(i,t)}是股票i在时间t的标准化价格,P_{(i, t)}是原始价格,E(P_({i, t-60)})是过去60天内股票价格的滚动平均值,\sigma_{(i, t-60)}是同一时期的滚动标准差。
现在,我们不再拥有特定日期的股票价格(图4),每个数据点告诉我们的是:相对于其近期历史,每只股票在特定日期距离其均值有多少个标准差?注意这如何连接到我们之前提到的异常行为的概念。均值和标准差都是基于最近60天的数据计算得出的。


3.3 比较选项(价差、零交叉和ADF)
一旦我们有了标准化的价格,接下来就是确定我们要交易的股票对。这是一个三步过程。首先,我们通过计算不同股票对的价差来分析它们的联合行为。然后,通过观察价差穿越零线的次数来判断这对股票是否经常出现价格扭曲。最后,通过应用ADF检验,观察均值回归行为是否真正存在。让我们详细讨论每个步骤。
首先,分析不同股票对的联合行为。我们想了解不同的股票对如何相互关联,因为我们正在寻找资产之间稳定且相关的移动。为此,我们将股票分组为对,并为每一对计算标准化价格的价差。价差告诉我们两只股票之间的差距——不是以美元计算,而是以它们当前价格相对于其近期历史的“异常”程度来衡量。宽的价差意味着一只股票比另一只股票“贵得多”(相对于它通常的价格),而窄的或零的价差意味着它们同步移动。回到基本原理,我们想了解异常的移动,以便在价格回归均值时获利。对于图5中看到的同一对标准化价格,其价差如图6所示。

在进一步讨论价差传达的信息之前,让我们先建立一些关于价差的直觉。在这个练习中,假设你正在观察过去4天的Visa和Mastercard股票,它们的平均交易价格分别为100美元和80美元,标准差分别为10美元和5美元。在第5天,可能会发生以下几种情况:
- 两只股票继续以100美元和80美元的价格交易。这意味着它们的标准化价格将是零(因为它们距离均值的标准差为零),并且它们的价差也将为零。
- Visa以120美元交易,Mastercard以90美元交易。现在,两只股票的标准化价格都将是+2(因为它们高于均值两个标准差),但价差仍然是零。这两种价格同样偏离可能代表了一个影响整个市场的事件,比如新的政策推动了整个股市。
- Visa以130美元交易,Mastercard以85美元交易。现在,Visa的标准化价格是+3,而Mastercard的是+1,这意味着它们之间的价差是+2。鉴于价格往往回归其均值,我们应该期望标准化价格的价差回到0,这意味着是时候开仓了:我们做空昂贵的股票,做多便宜的股票。这意味着我们认为市场会注意到其中一个股票太贵或另一个太便宜,并在修正过程中,我们已经提前布局以捕捉这一运动。
图6显示,第一个数据点的价差约为+2。这意味着至少有一只股票(或者可能是两只)的价格是异常的。可能是Google的股票正常,而Meta的股票比其均值高出两个标准差。也可能是相反的情况,Google的股票比其平均值低两个标准差。也可能是在中间的任何情况。我们不确定。然而,既然存在价格偏差,如果我们对均值回归的想法正确的话,两种价格都将再次收敛到它们的均值,这种运动可能是有利可图的。但我们不要过早下结论。
在我们对不同股票对的价差进行计算之前,先是对价差传达的信息进行了简短的讨论。接下来,我们需要选择哪一对股票最适合交易,通过观察零交叉的数量来帮助做出决策。顾名思义,零交叉计算的是价差穿越零线的次数,从负到正或反之亦然。这是相关信息,因为零交叉的次数越多,这两只股票偏离其通常行为的次数就越多,而且它们会回归到这种行为。大量的零交叉表明有许多机会进行交易。
(注意,这种方法无法捕捉远离零的有限均值反转行为。假设在一段时间内,价差在1个标准差附近波动,范围从0.5到1.5多次。零交叉不会给我们任何关于此的信息,即使我们知道这些运动可以获利。)
在我们的数据集中,在2023年,零交叉最多的股票对是Meta和Nvidia,总共达到了36次零交叉。图7展示了它的样子。顶部是标准化价格的波动,底部是价差的波动。我们还绘制了滚动均值,以直观地展示价差似乎确实周期性地偏离并回归到均值。

虽然零交叉是一个很好的代理指标,但我们还需要确认我们看到的大数量的交叉确实与我们所寻找的统计属性相关联。也就是说,零交叉假设价差以零为中心,这是一种均值回归行为的代理。然而,如果这种均值回归不真实,我们的套利就不会奏效。为了确保价差是可靠的(即确信其行为不会改变),我们可以使用ADF(扩展迪基-富勒)检验,该检验评估时间序列的平稳性。如果我们的价差是平稳的,那么随着时间的推移,其统计属性(如均值和方差)不会发生变化。找到彼此行为相对稳定的资产对于配对交易策略的成功至关重要。鉴于我们通过价差回归均值获利,我们需要确信这种回归会发生。
我们的目标不是详细解释ADF,所以只需说对于Meta-Nvidia对,得到的ADF p值小于0.001,这意味着我们可以拒绝检验的原假设,并假设我们的序列确实是平稳的。对于任何想要深入了解ADF工作原理的人,我推荐观看这个视频和这篇文章。
4、如何决定触发器的位置?
我们找到了一组股票,它们的走势紧密相连。从视觉上看,我们没有发现任何令人担忧的趋势。我们也通过测量序列的平稳性来统计评估这些走势的稳定性。这是个好消息!一旦价格偏离均值,我们就几乎准备好做空昂贵的股票,做多便宜的股票,并在它回归均值时获利。但是,我们需要观察多大的偏离(或回归)才能执行任何操作?回答这个问题更多是一种艺术而非科学,但为了做到这一点,我们再次查看价差。
我们可以从绘制价差的同时,加上滚动均值和标准差开始,这使我们可以观察到运动的位置。这就是图8顶部图表所看到的内容。

滚动均值和STD随时间变化的事实意味着这些带状区域不稳定,使可视化变得更加困难。然而,如果我们记住我们的目标是观察价差距离均值有多少个标准差,那么通过计算标准化价差,即图8底部图表,这一点就变得清楚了。
从标准化价差中,我们可以直观地看到大量活动发生在距均值0.5到1.5个标准差之间。这就是我们将放置触发器的地方。剩下的唯一未解决的问题是如何具体安排它们。
我决定使用多个进入和退出点来减少我们的风险,同时最大化每次运动的利润。具体来说,当标准化价差不太远离均值时,我会开一个大仓位,并投入40%的可用资本。接下来,如果标准化价差稍微更远,我会开一个小仓位,只分配20%的资本。最后,如果标准化价差太远,我会设置止损,关闭所有仓位。这种结构的原因是,价差越接近均值,我们对其回归的信心就越强,愿意投入的资金也就越多。另一方面,价差太远可能是一个信号,表明其中一家公司遭受了个别影响(例如,糟糕的财报),这改变了它的行为,使策略变得无用。这就是止损存在的原因。
我称这个大仓位为“贪婪”,并在标准化价差在0.5到1.5个标准差之间时设置进入触发器。贪婪仓位在价差回归到距均值0.5个标准差以内时关闭。另一方面,较小的、谨慎的仓位在价差大于1.5个标准差但小于止损时打开。谨慎仓位在价差回归到小于1.5个标准差时关闭。最后,我随意将止损设置为4个标准差。
5、回测和结果
为了回测策略,我从头开始用Python编写了代码,实现了我们在时间序列数据上定义的规则。代码可以在关联的Colab笔记本中找到。我创建了两个核心类来处理开仓和平仓的逻辑,以及一个用于跟踪价格和操作的系统。通过利用面向对象编程(OOP),我们可以使代码更快、更易读。
回测使用这些假设和10000美元的资本来估计该策略在2024年的表现。结果总结如下:
- 最终余额:$11663.66
- 期间利润:16.64%
- 夏普比率:0.089
- 最大回撤:-45.37%
- 胜率:70.18%
- 每笔交易的平均利润:$29.19
- 暴露比例:65.47%

16.64%的利润和70.18%的胜率都很显著。然而,该策略隐藏着大量危险,我们的风险管理非常差。最大回撤为-45.37%,这意味着在某个时刻,我们几乎损失了一半的资本,我们承担的风险和获得的回报之间的平衡(由夏普比率表示)非常差。
为了让策略更好,有几个低垂的果实我们可以应用:
- 基于时间的止损:鉴于我们使用的是标准化价差,如果价格偏离但均值回归没有快速发生,标准化价差会缓慢回到零,但美元价格不会按我们预期的方式进行,我们会累积损失。通过设置一个止损,防止我们持有仓位太久,我们可能会减少一些损失。
- 改进的触发器:虽然我们有两个触发器,但它们非常确定性。我们会在价差大于0.5个标准差时开贪婪仓位,并在小于0.5个标准差时关闭它。这意味着我们可能会在0.51个标准差时开仓,在0.49个标准差时平仓,这效率不高。增加开仓和平仓之间的距离可以提高我们在每次操作中获得的利润。
- 更好的仓位大小:在当前实现中,贪婪仓位总是使用40%的可用资本,谨慎仓位使用20%。有可能优化我们放在每个仓位上的资金量,使其成为价差距离均值的函数。这可以帮助我们进一步降低仓位的风险。
- 更好的配对选择:零交叉是最简单的配对选择方法,但还有更稳健(且著名的)配对选择方法,例如使用协整。
6、结束语
统计套利触及了数学、金融和计算的交汇点。在这篇文章中,我们探索了其最基础的形式之一:基于零交叉的配对交易。虽然这只是进入统计套利世界的简单切入点,但也有更高级的技术可供使用。
例如,基于协整的配对交易是一种广泛研究的增强方法,近年来机器学习方法越来越多地被应用于识别和利用交易机会。
然而,无论方法变得多么复杂,核心思想始终不变:通过识别偏离典型模式的行为并定位回归常态的机会,统计套利试图将不效率转化为利润。
原文链接:Statistical Arbitrage From Scratch
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。