通过协整股票实现统计套利(第一部分):恩格尔 - 格兰杰检验与约翰森协整检验
引言
本文是两篇系列文章中的第一篇,将演示如何在统计套利交易策略中运用协整方法。一方面,交易者误将统计套利交易策略视作神奇的零风险策略;另一方面,又认为普通散户交易者根本无法在实践中运用。这种误解源于一些大型机构交易者取得的惊人成绩所造就的传说,源于缺乏经验的交易者对交易“圣杯”的永恒追逐,归根结底,也源于人们对统计套利本质的认知不足。
如果策略设计得当,并依托合适的订单执行系统,那么长期来看这类策略能够实现低风险且稳定的盈利。但总体而言,与其他任何交易行为一样,它们同样需要完善的风险管理。需要再次强调的是,统计套利策略并非神奇的零风险策略。
在前一篇文章中,我们实现了一套基于简单相关性的配对交易策略,该策略在回测中表现优异,但在实时模拟账户上运行两周后却惨败收场。或许最清晰、最具教科书意义的例证在于:回测虽有助于评估策略的可行性,却几乎无法反映真实市场的表现。更进一步说,这也清晰地证明了统计套利并非无风险。即便看似前景良好的策略,也需要严谨的风险管理(而我们在示例原型中并未实现),以及合适的订单执行环境 —— 这也正是本文的核心主题。
为何模拟账户的表现会与回测结果相差如此悬殊?我们如何超越仅捕捉两个资产联动性的相关系数,构建更稳健的框架,以识别两个以上资产之间的长期运行规律?我们又该如何跳出简单的配对交易,将投资组合扩展至同一行业的多只股票?
回测大获成功,实盘模拟却一败涂地
最近,我和合伙人偶然跟一位常年在巴西证券期货交易所(B3)做美元合约的交易者聊了聊。她坦言自己很想尝试“某种农产品统计套利策略”,但由于一直学的是技术分析和价格行为这类传统的主观交易手法,缺乏扎实的数学和统计学功底,所以她非常笃定地认为统计套利对她来说“遥不可及”。这也印证了我们在文章开头提到的那种普遍看法:统计套利是普通散户高攀不起的。
长话短说,我们直接切入正题 —— 大家一拍即合,把它当成了朋友间的一个挑战:何不利用业余时间,抱着学习的目的搞一套自动化的统计套利框架出来?但是问题来了:我们既没有顶级的统计学家和数学家,也没有大型机构那种级别的算力,该如何起步呢?其实我们和大多数初学者一样:老老实实去翻学术文献,摸清问题的本质,研究市面上现成的方案,既学习别人成功的经验,也扒一扒失败的教训。
我们迈出的第一步,体现在我近期发布的一篇关于数学家、对冲基金经理吉姆·西蒙斯及其传奇大奖章基金的文章中。在那篇文章里,我们用一个极简的智能交易系统(EA)演示了黄金兑欧元(XAUEUR)与黄金兑美元(XAUUSD)之间的统计套利。
我们此前发布的回测结果如下图所示:
图例1:配对交易EA的回测结果(前一篇文章)
接下来,为了检验该策略在真实市场中的可行性,我们将这个极简版EA在一个零点差、仅收手续费的模拟账户上运行了两周。结果惨不忍睹。

图例2:配对交易EA模拟账户两周交易历史报告
可能原因
在寻找交易策略失效的原因时,我们很容易第一反应就去 “调整参数”。但我们不妨采用更系统化的思路,先深入分析失效的根源。
只是连续两周行情不佳?
会不会只是市场恰好连续两周表现糟糕?毕竟即便在回测中,我们也会遇到一些盈亏持平的阶段,甚至小幅回撤的时期,不是吗?
确实如此,但即便在回测最差的几周里,我们也从未出现过如此密集的连续亏损。在本次实盘模拟测试中,最大连续盈利仅为4次,而最大连续亏损却高达42次!平均连续盈利仅1次,平均连续亏损却达到5次。总而言之,我们所有交易几乎都在亏损!
图例3:配对交易EA在模拟账户中的连续亏损序列
显然,某个环节出现了严重的问题,与我们的回测环境截然不同。此外,配对交易本质上是市场中性策略,意味着它并不依赖标的证券本身的涨跌收益。(配对交易作为统计套利最基础的形式,通常属于市场中性策略。但是我们的学术研究表明,从广义上看,情况并非总是如此。在某些情形下,统计套利仍可能承担市场风险或行业板块风险,具体取决于所采用的对冲方式。这一点我们会在搭建框架的风险/资金管理模块时详细讨论。目前,我们可以先将这套简单的配对交易视为市场中性策略。)
2008年次贷危机期间市场崩盘,吉姆・西蒙斯(Jim Simons)却赚得盆满钵满。大奖章基金并非唯一依靠统计套利的对冲基金。那么,为何同行在暴跌中损失惨重,他们却能盈利数百万?显然,他们有某些做得比竞争对手更出色的地方。尽管其运作模式高度保密,但他们还是留下了一些宝贵线索。这些线索如今看来显而易见,却常常被散户交易者忽视。大奖章团队过去乃至现在,都依赖海量高质量数据驱动。同时,他们投入巨资配备顶尖算力与极速订单路由系统。
因此,“行情差” 大概率并非亏损原因。事实表明:统计套利虽为市场中性策略,却对数据与交易时机极为敏感。
环境发生变化?
会不会由于更换了经纪商,点差不同所致?对于高频短线配对交易,每周数千次开仓,买卖点差很容易成为致命问题。如您所知,外汇经纪商的服务通常通过买入/卖出点差,或按交易量收取一定比例的佣金来盈利。
但我们可以排除点差因素。回测时,我特意使用了高点差账户:黄金平均约为170点,黄金兑欧元约为50点。而模拟账户我改用原始点差+手续费模式,黄金兑美元平均约为20点,黄金兑欧元约为10点。
由于模拟账户的点差更低,所以点差显然不是本次亏损的元凶。
滑点?
套利策略通常对交易时机十分敏感,而我们的配对交易策略对时机更是高度敏感。因此,让我们看一下这家差价合约(CFD)经纪商的成交规则协议中关于订单执行时机的描述。
最后一个最容易想到、也最常见的嫌疑对象:滑点。我们以市价发送即时成交订单,却总有人抢先一步抹平价差。如果确实是这种情况,本身并没有什么问题。这类 “抢先交易” 是合规的。事实上,这本身就是套利领域的常态玩法。这仅仅说明:别人拥有更多或更优质的资源 —— 更好的硬件、托管在经纪商附近的服务器,或是专为高性能优化的更优秀软件,而我们用的只是一个原型策略。我们很可能在速度竞赛中输给了一众对手,他们或多或少都具备上述优势,甚至有人集齐了所有优势。也就是说,一些大型机构玩家把我们简陋的原型策略彻底碾压了。
在《MT5用户指南》中可见,我们可以在回测中模拟网络延迟。
“策略测试器支持在EA运行时模拟网络延迟,以便为测试提供贴近真实的环境。在策略测试中可能会在发出交易请求及执行请求期间插入某个时间延迟。从请求发出到成交执行期间,价格可能发生变动。这样一来,让用户可以评估交易处理速度对交易结果的影响。
在即时成交模式下,用户还可以测试EA对交易服务器重新报价的响应能力。如果请求价格与实际成交价格的差值超过订单中设定的滑点偏差,那么EA会收到一次重新报价。”
我们通过设置随机延迟来实现这一点……
图例4:加入模拟延迟的MT5测试器设置
原因找到了!即便滑点并非唯一元凶,这个常见 “嫌疑犯” 显然是本次失效的主要原因。

图例5:加入模拟延迟后的回测结果图表
我们可以尝试在代码中设置最大允许滑点偏差,但这一限制会彻底破坏我们的策略。要实现盈利,我们几乎需要瞬时捕捉到目标价格。除此之外,设置最大滑点偏差的功能通常仅对专业账户开放,这也偏离了我们的核心目标 —— 为普通散户交易者开发统计套利框架。
核心问题:订单执行
套利可以通过买卖任何东西获利,从烤面包机到代币,从大宗商品到货币,以及介于两者之间的所有商品。我们可以想象,套利早在人类开始物物交换时就已存在,甚至早于我们今天所知的货币出现。原理很简单:如果烤面包机在A市场的价格偏低,我们就可以在A市场买入,再到标价“合理”的B市场卖出。只要价差足以覆盖交易成本,我们就能以极低的风险获利。
问题在于,低风险利润会吸引大量参与者。风险收益比越高,入场的人就越多。当我们谈论金融市场(大宗商品、外汇)中的套利时,利润空间巨大,争抢低价资产的交易者也会蜂拥而至,所有人都在抢在对手之前下单。对 “抢先下单、优先成交” 的需求,最终催生了高频交易(HFT) 的基础设施、技术与操作模式。您或许也明白,高频交易门槛极高,且成本不菲。
这里的核心问题在于普通散户交易者没有足够资源在速度上战胜大型机构。即便抛开“缺乏高水平统计学家与数学家团队来开发模型”这一问题不谈,如今,我们至少仍需要服务器托管、高性能代码、以及能在几毫秒内发送/路由订单的经纪商……
回测结果仅展示了策略在理想订单执行环境下的理论可行性。也就是说,我们的订单在实际操作中是瞬时成交的。没有网络延迟,没有经纪商服务器故障。
显而易见,这种模式并不适合普通散户。作为普通散户,如果想从金融市场套利中获利,就必须跳出这套简单的配对交易原型,寻找其他方案。我们需要探索不那么依赖交易速度的规律与市场异常现象。
从相关性到协整
此前,我们按照吉姆・西蒙斯的描述理解金融市场 —— 它是一个持续变化的谜题。这个谜题要求交易者不断适应,才能最大化收益、最小化亏损。我们构建了一个极简的双资产 “投资组合”:黄金兑美元和黄金兑欧元,并以两者兑美元报价的均值偏离作为追踪的统计关系。将价差扩大作为入场信号,价差回归均值作为出场信号。
目前,我们的统计套利 “组合” 非常局限,所用的统计关系也很单一。此外,既然速度是无法掌控的因素,那么现阶段就不必在这上面做无用的优化。我们必须先提升自身能力,再去纠结无法控制的事情。我们需要扩展投资组合。在筛选工具中加入更多统计关系,用更多统计指标作为交易触发信号。
我们此前挑选配对的标准是相关性。我们将范围限定在主要外汇品种中,选择特定时间周期内相关性最高的配对。现在,将协整纳入投资组合的构建与筛选中。
根据统计学家的观点:
“相关性仅捕捉短期关系,而协整捕捉长期均衡关系。两个变量可能高度相关但不协整,反之亦然。”—— 亚历山大(2001)
相关系数告诉我们,黄金兑美元和黄金兑欧元的价格同步同向波动的程度。而协整检验会检测资产之间长期有效的等价关系。除此之外,使用相关系数时,我们只能局限于两个资产;但进行协整检验时,没有这一限制 —— 我们可以同时测试多个备选投资组合。这让协整检验完美适配我们的需求。
作为交易者或EA的开发者,我们无需掌握协整检验背后的数学原理。我们将使用MT5的Python集成进行数据分析与组合筛选,直接调用专业库中现成的Python函数即可。此外,我撰写本文时参考的AI助手(包括MT5内置的GPT),能够助您高效开发相关简易脚本。
作为交易者,我们只需理解协整的含义,以及如何用它识别机会 —— 尤其在股票市场,协整的实用性和有效性远高于外汇市场。而作为EA开发者,我们只需学会使用最优库、解读检验结果,就能迭代优化策略。使用高质量库(Python生态在数学、统计、机器学习领域拥有大量优质库),能够帮我们节省时间、避免错误,还可能获得更优的表现。
如果您想深入学习这个主题,我推荐阅读上文引用的卡罗尔・亚历山大的著作,尤其是第12章,整章都在讲解协整。在该书中,亚历山大梳理了协整在金融领域的应用历史,以及在包括外汇在内的不同市场的适用性。此书是该领域公认的权威参考资料。
接下来,我们将学习如何在不同资产类别中应用两种最受推荐的协整检验方法 ——恩格尔‑格兰杰检验与约翰森检验,以及如何解读它们的检验结果。
恩格尔‑格兰杰协整检验
恩格尔‑格兰杰协整检验可用于评估两种资产之间的协整程度。其目的是回答一个核心问题:这两种资产之间是否存在长期均衡关系?从交易者与EA开发者的角度来看,这项检验能够告诉我们两种资产的价差是否具备均值回归特性。但是检验结果并非简单的 “是” 或 “否”。与我们之前介绍的皮尔逊相关检验非常相似,它会返回一个相对数值(p值)。我们需要将这个数值与其他资产对的结果进行对比,才能判断哪一组的协整关系最强。
p值的含义:当不存在协整关系时,观察到当前数据的概率。也就是说,p值越小,协整关系越强。业界常用的判断阈值如下:当p值 < 0.05时,通常视为中等强度的协整信号;当p值 < 0.01时,视为强协整信号;当p值 > 0.05时,视为无协整关系。与所有交易策略一样,您需要根据自身实际应用场景微调这些阈值。
使用知名的statsmodels库的Python代码实现这两种协整检验。
“一个Python模块,提供用于估计多种不同统计模型、执行统计检验以及进行统计数据探索的类与函数。”
from datetime import datetime, timedelta import MetaTrader5 as mt5 import pandas as pd import numpy as np from statsmodels.tsa.stattools import coint import matplotlib.pyplot as plt # connect to MetaTrader 5 terminal if not mt5.initialize(login=********, server="MetaQuotes-Demo",password="********"): print("initialize() failed, error code =",mt5.last_error()) quit() # Forex majors - check your Market Watch names symbols = ['EURUSD', 'GBPUSD', 'USDJPY', 'AUDUSD', 'USDCAD', 'NZDUSD', 'USDCHF']
我们将在主要外汇品种中寻找协整性最强的货币对。我们并不预期能找到高度协整的组合。而仅仅是为了演示恩格尔‑格兰杰检验的实际应用方法。
# define the timeframe and the number of days timeframe = mt5.TIMEFRAME_D1 # Daily n_days = 600 utc_to = datetime.now() utc_from = utc_to - timedelta(days=n_days)
我们将使用utc_from和utc_to这两个变量,通过mt5.copy_rates_range函数获取600个交易日的品种报价数据。一年有大约250个交易日。
# download historical data for each symbol data = {} for symbol in symbols: # Make sure the symbol is available in Market Watch mt5.symbol_select(symbol, True) # Get historical rates rates = mt5.copy_rates_range(symbol, timeframe, utc_from, utc_to) if rates is None or len(rates) == 0: print(f"No data for {symbol}.") continue df = pd.DataFrame(rates) df['time'] = pd.to_datetime(df['time'], unit='s') df.set_index('time', inplace=True) data[symbol] = df['close']
在这个for循环中,我们获取每个交易品种的收盘价,将其转换为Pandas数据帧(DataFrame),并把"time"数组设置为表格数据的索引。
将所有数据帧合并,并删除可能导致结果失真的缺失值行之后,我们开始执行协整检验。
# Store cointegration test results results = [] # Test all unique pairwise combinations for cointegration pairs = [(a, b) for i, a in enumerate(data.columns) for j, b in enumerate(data.columns) if i < j] print("Cointegration test results (Engle-Granger):") for a, b in pairs: score, pvalue, _ = coint(data[a], data[b]) results.append((a, b, pvalue)) print(f"{a} vs {b} | p-value: {pvalue:.4f}")
索引(['EURUSD', 'GBPUSD', 'USDJPY', 'AUDUSD', 'USDCAD', 'NZDUSD', 'USDCHF'], dtype='object')
协整检验结果(恩格尔‑格兰杰检验)
EURUSD与GBPUSD | p值:0.3183
EURUSD与USDJPY | p值:0.6990
EURUSD与AUDUSD | p值:0.9308
EURUSD与USDCAD | p值:0.9206
EURUSD与NZDUSD | p值: 0.9741
EURUSD与USDCHF | p值:0.4342
GBPUSD与USDJPY | p值:0.3273
GBPUSD与AUDUSD | p值:0.7995
GBPUSD与USDCAD | p值:0.6264
GBPUSD与NZDUSD | p值:0.7810
GBPUSD与USDCHF | p值:0.0238
USDJPY与AUDUSD | p值:0.6299
USDJPY与USDCAD | p值: 0.5620
USDJPY与NZDUSD | p值:0.6398
USDJPY与USDCHF | p值:0.2377
AUDUSD与USDCAD | p值:0.1260
AUDUSD与NZDUSD | p值:0.2920
AUDUSD与USDCHF | p值:0.5980
USDCAD与NZDUSD | p值:0.0052
USDCAD与USDCHF | p值:0.8574
NZDUSD与USDCHF | p值:0.6384
最具有协整关系的货币对:USDCAD 和NZDUSD(p=0.0052)
一旦找到协整性最强的两组货币对,我们就可以决定是否将它们纳入配对交易组合。由下图清晰可见,价差呈现均值回归特征,但问题在于:这样的交易是否值得?

图例6:加元兑美元(USDCAD)与新西兰元兑美元(NZDUSD)的协整价差走势图(含均值与两倍标准差)
黑色虚线代表价差的均值。这是长期均衡水平。两条红色虚线代表两倍标准差(STD)区间。它们是判断价差处于异常高位或低位的交易信号阈值,因此标准差倍数是策略优化的重要参数。
对冲比率
请注意计算长期价差时使用的-1.54这个数值。
价差 = USDCAD - (-1.54) × NZDUSD
或
USDCAD + 1.54 × NZDUSD
该数值即为对冲比率。这是通过线性回归统计估算出的最优比率,能让加元兑美元与新西兰元兑美元形成平稳价差—— 即围绕固定均值上下波动,这是均值回归策略的核心。使用该对冲比率,可以确保价格在同一尺度下对比,校正两者的波动率与方向关系。
价差能够反映相对定价偏差。在配对交易术语中:当价差高于 +2倍标准差时,代表处于历史高位,可考虑做空价差;当价差低于-2倍标准差时,代表处于历史低位,可考虑做多价差。
基于该数据构建市场中性交易组合:每买入1个单位加元兑美元,就同时卖出1.54个单位新西兰元兑美元(根据信号方向可反向操作)。当价差向均值回归时,我们平仓离场,同时关闭这两个头寸。
您可以将这段代码直接应用于任何市场、任何资产类别。只需修改代码顶部的交易品种名称,即可直接运行使用。
约翰森协整检验
约翰森协整检验旨在回答与恩格尔‑格兰杰检验相同的核心问题:这些资产是否存在共同的长期均衡关系?在实际应用中(尤其针对我们的研究目标),两者最主要的区别在于:约翰森检验可同时分析两个以上的资产,并能判断这N个资产是否共享一组共同的均值回归价差。您可以将它视为一个强大的工具,专门用于检验同一行业内的一组股票(如石油股、科技股等)是否存在协整关系。它能帮助我们找到3只、4只甚至更多只股票(或任意资产),共享一组稳定的长期均衡关系。
该检验会判断:即使原始序列本身非平稳,是否存在变量的线性组合是平稳(均值回归)的,并估算变量之间存在多少组协整关系。这个数量被称为协整秩。
检验会输出两个核心统计量:迹统计量和临界值。
每一个可能的协整秩(0、1、2……N−1,其中N为序列数量)都会对应一个迹统计量。迹统计量越大,代表协整关系的证据越强。临界值是用于对比迹统计量的判断阈值,其大小取决于:
- 被检验的变量数量
- 样本数据长度
- 置信水平(90%、95% 或 99%)
在我们的具体场景中,变量数量就是被测试的交易品种数量。
# Johansen Test from datetime import datetime, timedelta import MetaTrader5 as mt5 import pandas as pd import numpy as np from statsmodels.tsa.stattools import coint from statsmodels.tsa.vector_ar.vecm import coint_johansen import matplotlib.pyplot as plt # Create a matrix for the test log_prices = data.apply(np.log) johansen_result = coint_johansen(log_prices, det_order=0, k_ar_diff=1) # Trace statistics and critical values print("\nJohansen Test Results (Trace Statistic):") for i, stat in enumerate(johansen_result.lr1): cv = johansen_result.cvt[i, 1] # 5% critical value print(f"Rank {i}: Trace Stat = {stat:.2f} | 5% CV = {cv:.2f} | {'Significant' if stat > cv else 'Not significant'}")
我们可以通过以下设置查看其他置信水平的结果:
johansen_result.cvt[i, 0]代表90%置信水平
johansen_result.cvt[i, 2]代表99%置信水平
在95%置信水平(5%临界值)的情况下,我们使用与恩格尔‑格兰杰检验相同周期、日线(D1)时间框架,对主要外汇品种进行测试得到的结果如下。
索引(['EURUSD', 'GBPUSD', 'USDJPY', 'AUDUSD', 'USDCAD', 'NZDUSD', 'USDCHF'], dtype='object')
约翰森检验结果(迹统计量):
协整秩 0:迹统计量 = 105.25 | 5% 临界值 = 125.62 | 不显著
协整秩 1:迹统计量 = 68.10 | 5% 临界值 = 95.75 | 不显著
协整秩 2:迹统计量 = 42.01 | 5% 临界值 = 69.82 | 不显著
协整秩 3:迹统计量 = 25.83 | 5% 临界值 = 47.85 | 不显著
协整秩 4:迹统计量 = 11.73 | 5% 临界值 = 29.80 | 不显著
协整秩 5:迹统计量 = 5.74 | 5% 临界值 = 15.49 | 不显著
协整秩 6:迹统计量 = 0.58 | 5% 临界值 = 3.84 | 不显著
不出所料,这7个主要的外汇品种之间不存在显著的协整关系。
但如果我们对知名的谷歌(Google)和英伟达(Nvidia)股票在小时线(H1)时间框架 上进行检验(如下所示),在相同时间段和置信区间下,得到了显著的协整结果。
索引(['NVDA', 'GOOGL'], dtype='object')
观测数量:5769
变量数量:2
约翰森检验结果(迹统计量):协整秩 0:迹统计量 = 18.71 | 5% 临界值 = 15.49 | 显著
协整秩 1:迹统计量 = 0.29 | 5% 临界值 = 3.84 | 不显著
协整性最强的配对(恩格尔‑格兰杰检验):

图例7:英伟达(NVDA)与谷歌(GOOGL)的协整价差走势图(含均值及两倍标准差)
由此可见,约翰森检验显示GOOGL与NVDA存在显著协整关系,但恩格尔‑格兰杰检验的p值大于0.05,表明不存在协整。为何会出现这种矛盾的结果?这又意味着什么?
只把两个品种的顺序颠倒,再运行一遍相同的代码,您就会发现恩格尔‑格兰杰检验与约翰森检验之间一个很有意思的区别。
索引(['GOOGL', 'NVDA'], dtype='object')
观测数量:5769
变量数量:2
约翰森检验结果(迹统计量):
协整秩 0:迹统计量 = 18.71 | 5% 临界值 = 15.49 | 显著
协整秩 1:迹统计量 = 0.29 | 5% 临界值 = 3.84 | 不显著
协整性最强的配对(恩格尔‑格兰杰检验):GOOGL与NVDA | p 值:0.0403

图例8:谷歌(GOOGL)与英伟达(NVDA)的协整价差走势图(含均值及两倍标准差)
由此可见,恩格尔‑格兰杰检验对变量顺序非常敏感,而约翰森检验则不受顺序变化的影响。如果深入研究约翰森检验的细节,您就会发现,在某些情况下它确实会对顺序表现出一定敏感性,尤其是在样本量较小或处于统计显著性边缘时。但一般来说,理论上它不受变量顺序影响。如果您发现改变顺序后结果不一致,首先应尝试增加样本数据量。这也是我们将周期从日线(D1)改为小时线(H1)的原因 —— 为检验提供更大的样本量。
了解到恩格尔‑格兰杰检验对变量顺序敏感后,您在使用时必须对两种顺序都进行测试,并通过图表直观观察价差是否呈现均值回归,以此综合评估结果。
检验价差的平稳性
价差是一个时间序列,为了确认它具备均值回归特性,我们需要检验它的平稳性。也就是说,我们需要验证它的均值、方差和协方差是否不随时间推移而改变。如果时间序列是平稳的,使用ARIMA等模型进行建模和预测会更加容易。
我们用于协整检验的同一个Python库,也提供了现成的平稳性检验函数:增广迪基‑富勒(ADF)检验和夸德茨基-菲利普斯-施密特-辛(KPSS)检验。
from statsmodels.tsa.stattools import adfuller (...) adf_result = adfuller(spread)
对价差进行ADF检验:
ADF统计量:-3.0946
p值:0.0270
临界值:
1%: -3.4315
5%: -2.8620
10%: -2.5670
✅ 价差是平稳的(拒绝原假设)。
from statsmodels.tsa.stattools import kpss (...) def run_kpss(series, regression='c'): statistic, p_value, lags, crit_values = kpss(series, regression=regression, nlags='auto') (...) # Run KPSS test on the residuals run_kpss(spread, regression='c') # 'c' = test for level stationarity (use 'ct' for trend)
对价差进行KPSS检验:
KPSS统计量:2.2702
p值:0.0100
使用滞后阶数:44
临界值:10% :0.347
5% : 0.463
2.5% : 0.574
1% : 0.739
❌ 价差不平稳(拒绝平稳性原假设)。
我们似乎再次得到了相互矛盾的结果。ADF检验表明我们的价差是平稳的,但KPSS检验却不认同。不用慌。statsmodels库的维护者非常细心,为我们提供了清晰的说明,教我们如何解读这两种检验所有可能组合下的结果。这里,我直接引用statsmodels官方文档,因为我认为没有比这更简洁、清晰的解释了。
“情况 1:两项检验均判定序列非平稳 → 序列非平稳。
情况 2:两项检验均判定序列平稳 → 序列平稳。
情况 3:KPSS显示平稳、ADF显示非平稳 → 序列为趋势平稳。需要去除趋势,使序列变为严格平稳。对去趋势后的序列进行平稳性检验。
情况 4:KPSS显示非平稳、ADF显示平稳 → 序列为差分平稳。 需要使用差分法使序列平稳。对差分序列进行平稳性检验。”
现在我们已知,我们的价差属于差分平稳,而非严格平稳。这又意味着什么?这意味着这个时间序列可能会发生漂移,但变化本身是稳定的。只需对连续值进行差分处理,就能将它转换为严格平稳的时间序列。不出所料,这种技术就叫做差分法。它能去除趋势与季节性,让时间序列更适合高效分析与预测。
我们需要把价差变成严格平稳吗?许多时间序列模型要求数据必须平稳,但我们的场景不需要。在我们的协整配对交易策略中,不会使用预测模型。
我们完全不会进行预测,但不妨了解:协整分析并不会在协整检验后就结束。
结论
本文中,我们在面向普通散户交易者的统计套利框架搭建上又向前迈进了一步。我们为投资组合构建的统计工具库新增了两种方法:恩格尔‑格兰杰检验与约翰森协整检验。我们了解了每种检验的预期作用,以及如何对其结果进行最基础的解读。同时,我们也学习了如何通过增广迪基‑富勒(ADF)检验和夸德茨基-菲利普斯-施密特-辛(KPSS)检验来判断价差的平稳性。
这是介绍基础工具两篇系列文章中的第一篇。下一篇文章将在此入门基础上进行补充,针对一组协整外汇品种,以及同一行业内的一篮子协整股票,完成策略实现、回测与优化。
我敢说,本文最有价值的内容并非工具介绍、函数用法,甚至也不是示例代码。真正核心的知识点在于:如果您是一名散户交易者,并非数学或统计专业出身,也不是专职开发者,那么在开发统计套利策略时,您最宝贵的技能,就是对所交易资产或资产组合的深刻理解。
您对市场的认知是无价的,因为艰深的数学与统计工作早已由高水平专业人士完成,并且这些成果在众多开源库中免费开放使用,包括MT5平台的MQL5库,以及能帮助你正确实现策略的强大AI助手。
经验总结:如果您的资源有限,请远离依赖交易速度的策略,尝试运用您的市场认知,以更具创造性的方式挖掘数据价值。
参考文献
- 亚历山大,C.(2001)。《市场模型:金融数据分析指南》,威利出版社。
- 恩格尔,R. F.与格兰杰,C. W. J.(1987)。 协整与误差修正:表示、估计与检验,计量经济学。
- 加特夫,E.,戈茨曼,W. N.与鲁文霍斯特,K. G.(2006)。《配对交易:相对价值套利法则的表现》,金融研究评论。
- 约翰森,S.(1988)。协整向量的统计分析,经济动态与控制。
| 附件 | 描述 |
|---|---|
| coint.ipynb | 此文件为精简版Jupyter笔记本,内含Python代码,可对一组交易品种执行单一恩格尔‑格兰杰协整检验。 |
| coint_googl_nvda.ipynb | 此文件为扩展版Jupyter笔记本,内含Python代码,可对理论上无数量限制的交易品种同时执行恩格尔‑格兰杰检验与约翰森协整检验,并附带价差平稳性检验。 |
| helper_quotes_to_db.ipynb | 此文件为辅助工具,用于将下载的品种报价保存至sqlite3数据库。同样为内含Python代码的Jupyter笔记本。其作用是避免重复下载数据,并支持离线工作。 |
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/18702
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
新手在交易中的10个基本错误
混沌优化算法(COA)
有趣的文章!我以前 也做过类似的项目,在实际执行中也遇到过问题。)
但这篇文章写得很好。这个话题的新手会很容易理解。