量化交易中文教材

第 08b 章 协整、误差修正与配对交易

本章对应 Tsay 原书第 8 章后半(8.5–8.8 节)。第 08a 章处理的都是平稳的收益序列;本章转向价格。单个资产的对数价格通常有单位根,但几个价格的某个线性组合却可能是平稳的——这就是协整。协整把"两个资产长期必须一起走"的经济直觉变成可检验、可估计的统计模型,它是配对交易、期现套利和利率曲线交易的理论基础。单方程的协整估计与检验(EG-ADF、DOLS)见第 05 册第 17b 章,可与本章的 Johansen 系统方法对照。

学习目标

  1. 理解协整的定义、共同趋势和协整向量,能解释为什么对协整系统逐个差分会"过度差分"。
  2. 掌握误差修正模型(ECM)的推导,理解 \(\boldsymbol\Pi=\boldsymbol\alpha\boldsymbol\beta'\) 中 \(\boldsymbol\alpha\)(调整速度)和 \(\boldsymbol\beta\)(协整向量)的含义,以及 \(\mathrm{Rank}(\boldsymbol\Pi)\) 的三种情形。
  3. 掌握 Johansen 方法:偏回归、广义特征值、迹检验与最大特征值检验,知道确定项的五种设定会影响临界值。
  4. 能用 Engle–Granger 两步法和 Johansen 方法检验一对股票是否协整,并从 VECM 推出价差的均值回复速度与半衰期。
  5. 掌握 Tsay 配对交易框架:价差、对冲比、组合收益 \(=\) 价差增量、\(\mu_w\pm\Delta\) 开平仓规则及交易成本门槛 \(2\Delta>\eta\);理解门限协整与期现套利的"无套利区间"。

读前导读

这一章在解决什么问题。 股价本身像随机游走:今天的价格是明天最好的猜测,没有"均值"可以回归。但有些价格之间被经济力量拴在一起:同一家公司的 A 股与 H 股、股指期货与现货、3 个月与 6 个月国债利率。它们各自乱走,彼此的差距却不会无限拉大。协整就是把"各自随机游走、但某个组合是平稳的"这件事写成数学。你在 CFA 里学过期货的持有成本定价和无套利原理:期货价格偏离 \(S e^{(r-q)T}\) 太多就会被套利拉回。协整是这条无套利逻辑的统计版本——"基差"就是协整残差,"被拉回"就是误差修正。

本章的主线是:先说明为什么不能对价格逐个差分后再建 VAR(会丢掉"差距会回归"这条最有价值的信息);再引入误差修正模型(ECM),其中 \(\boldsymbol\beta\) 告诉你哪个组合是平稳的价差(对冲比),\(\boldsymbol\alpha\) 告诉你价差偏离后谁来修正、多快修正;然后讲 Johansen 方法如何从数据里估出 \(\boldsymbol\beta\) 并检验存在几个这样的组合;最后落到期现套利和配对交易。

需要先想起来的数学。

  • 单位根与 I(1)/I(0)。 I(1) 指"差分一次才平稳",比如对数价格;I(0) 指本身平稳,比如收益率、价差。AR(1) 系数 \(\phi=1\) 时就是随机游走(单位根),冲击永不消退;\(|\phi|<1\) 时冲击按 \(\phi^j\) 衰减。这是前面单变量章节的内容,本章默认你已熟悉 ADF 检验。
  • 矩阵的秩与外积。 秩是矩阵中线性无关的行(或列)的个数。列向量乘行向量得到的 \(\boldsymbol\alpha\boldsymbol\beta'\) 叫外积,秩为 1:例如 \(\begin{bmatrix}-1\\-0.5\end{bmatrix}[0.5,\ 1]=\begin{bmatrix}-0.5&-1\\-0.25&-0.5\end{bmatrix}\),第二行恰好是第一行的一半。本章用"秩"来数协整关系的个数。见 第 00 册第 06 章 线性代数速成。
  • 特征值与广义特征值。 普通特征值解 \(|\lambda\boldsymbol I-\boldsymbol A|=0\);广义特征值解 \(|\lambda\boldsymbol B-\boldsymbol A|=0\),等价于求 \(\boldsymbol B^{-1}\boldsymbol A\) 的特征值。Johansen 检验的核心计算就是这个。见第 00 册第 06 章。
  • 对数与半衰期。 若偏离每期乘以 \(\rho\)(\(0<\rho<1\)),\(h\) 期后剩 \(\rho^h\)。令 \(\rho^h=0.5\),两边取对数得 \(h=\ln0.5/\ln\rho\)。例:\(\rho=0.9\) 时 \(h=-0.693/-0.105\approx6.6\) 期。这与债券里"翻倍时间 \(\approx72/\)利率"是同一类计算。见 第 00 册第 04 章 级数与收敛。
  • 偏回归(Frisch–Waugh 定理)。 在多元回归里,想单独看 \(X_1\) 对 \(Y\) 的系数,可以先把 \(Y\) 和 \(X_1\) 都对其他变量 \(X_2\) 回归、取残差,再用残差对残差回归,结果与完整回归中 \(X_1\) 的系数完全相同。Johansen 第一步就是这样"剔除"短期动态。

怎么读这一章。 核心必读:8.6(例子与定义)、8.7.1(为什么不能逐个差分)、8.8.1(\(\boldsymbol\Pi\) 的秩三分法、价差的 AR(1) 形式)、8.11 全节(配对交易框架与 BHP/VALE 实例)以及"量化实战"。8.7.2 的一般形式、8.8.2 的五种确定项设定第一次只需记住"受限常数适合利率和价差,非受限常数适合带漂移的价格"。8.9.1 的 Johansen 估计细节可以先读直觉和第三步结论,等跑过 Python 示例一的手写 Johansen 后再回头看。8.10 门限协整适合对期现套利感兴趣的读者。建议顺序:8.6 → 8.7.1 → 8.8.1 → 8.11 → 示例一 → 回头补 8.9、8.10。


8.6 单位根非平稳与协整

8.6.1 一个启发性的例子

考虑二元 ARMA(1,1):

\[\boldsymbol x_t-\begin{bmatrix}0.5&-1.0\\-0.25&0.5\end{bmatrix}\boldsymbol x_{t-1}=\boldsymbol a_t-\begin{bmatrix}0.2&-0.4\\-0.1&0.2\end{bmatrix}\boldsymbol a_{t-1}.\tag{8.31}\]

AR 矩阵的迹为 1、行列式为 \(0.25-0.25=0\),所以特征值为 0 和 1——有一个单位根,系统非平稳。左乘 AR 多项式的伴随矩阵可以算出

\[\begin{bmatrix}1-B&0\\0&1-B\end{bmatrix}\boldsymbol x_t=\begin{bmatrix}1-0.7B&-0.6B\\-0.15B&1-0.7B\end{bmatrix}\boldsymbol a_t,\]

即每个分量单独看都是 ARIMA(0,1,1),都像随机游走。

现在做线性变换 \(\boldsymbol y_t=\boldsymbol L\boldsymbol x_t\),\(\boldsymbol L=\begin{bmatrix}1.0&-2.0\\0.5&1.0\end{bmatrix}\),\(\boldsymbol b_t=\boldsymbol L\boldsymbol a_t\)。由 \(\boldsymbol y_t=\boldsymbol L\boldsymbol\Phi\boldsymbol L^{-1}\boldsymbol y_{t-1}+\boldsymbol b_t-\boldsymbol L\boldsymbol\Theta\boldsymbol L^{-1}\boldsymbol b_{t-1}\) 得

\[\boldsymbol y_t-\begin{bmatrix}1.0&0\\0&0\end{bmatrix}\boldsymbol y_{t-1}=\boldsymbol b_t-\begin{bmatrix}0.4&0\\0&0\end{bmatrix}\boldsymbol b_{t-1}.\tag{8.32}\]

变换后的两个分量不耦合:\(y_{1t}=x_{1t}-2x_{2t}\) 是 ARIMA(0,1,1),而 \(y_{2t}=0.5x_{1t}+x_{2t}=b_{2t}\) 是白噪声。两个看起来都在随机游走的序列,其单位根全部来自同一个源头 \(y_{1t}\),称为共同趋势(common trend);它们的组合 \(0.5x_{1t}+x_{2t}\) 把这个共同趋势抵消掉了。

推导拆解:(8.32) 的 AR 矩阵可以直接验算。\(\boldsymbol L^{-1}=\frac12\begin{bmatrix}1&2\\-0.5&1\end{bmatrix}=\begin{bmatrix}0.5&1\\-0.25&0.5\end{bmatrix}\)(2×2 求逆:对角互换、非对角变号、除以行列式 2)。先算 \(\boldsymbol L\boldsymbol\Phi=\begin{bmatrix}1&-2\\0&0\end{bmatrix}\)——第二行为零,正是因为 \(\boldsymbol L\) 的第二行 \((0.5,1)\) 乘 \(\boldsymbol\Phi\) 恰好得零向量。再右乘 \(\boldsymbol L^{-1}\) 得 \(\begin{bmatrix}1&0\\0&0\end{bmatrix}\)。MA 矩阵同理。 为什么要乘 \(\boldsymbol L\cdots\boldsymbol L^{-1}\)?把 \(\boldsymbol x_t=\boldsymbol L^{-1}\boldsymbol y_t\) 代入原方程,再整体左乘 \(\boldsymbol L\),就得到关于 \(\boldsymbol y_t\) 的方程,系数矩阵自然变成 \(\boldsymbol L\boldsymbol\Phi\boldsymbol L^{-1}\)。这一步相当于"换一组坐标看同一个系统"。

金融直觉:想象两只同行业股票都被同一个"行业景气度"驱动(共同趋势 \(y_{1t}\)),各自再加一点独立噪声。单看任何一只都像随机游走;但按合适比例做多一只、做空另一只(组合 \(y_{2t}\)),行业景气度的影响恰好对冲掉,剩下的只是围绕常数波动的噪声。这个对冲比例就是协整向量,也就是配对交易里的 \(\gamma\)。

8.6.2 定义

若 \(x_{1t},x_{2t}\) 都是单位根非平稳(I(1)),但存在一个线性组合是单位根平稳(I(0))的,就称二者协整(cointegrated)。一般地,\(k\) 维 I(1) 序列中若单位根个数 \(h\) 满足 \(0<h<k\),则存在 \(k-h\) 个线性无关的平稳组合,称 \(k-h\) 为协整秩,组合系数称为协整向量(cointegrating vector)。上例中协整向量为 \((0.5,1)'\)。协整向量只能确定到一个比例因子,通常把某个分量的系数标准化为 1。

文献:Box & Tiao (1977)、Engle & Granger (1987)、Stock & Watson (1988)、Johansen (1988)。

作者的观点。 Tsay 对协整检验的实用价值有所保留,主要原因是检验常忽略分量的尺度效应(Cochrane 1988;Tiao, Tsay & Wang 1993)。但他认为协整的思想与金融高度相关:诺基亚在赫尔辛基的股价必须与其在纽约的 ADR 同步变动,否则就有套利机会;若股价有单位根,二者必然协整——当然,要考虑交易成本和汇率风险之后才成立。这一观点贯穿后文:协整关系首先应有经济逻辑支撑,统计检验只是验证。


8.7 误差修正形式

8.7.1 为什么不能逐个差分

协整系统中单位根非平稳的分量(\(k\) 个)多于单位根(\(h\) 个)。如果对每个分量都做差分,等于差分了 \(k\) 次,多出的 \(k-h\) 次差分会在 MA 部分引入单位根——过度差分(over-differencing),使 MA 多项式不可逆,估计困难(回忆第 08a 章 VMA 的精确似然问题),而且丢掉了"水平之间存在长期关系"这一最有价值的信息。

Engle & Granger (1987) 的解决方案是误差修正表示。对 (8.31) 两边减 \(\boldsymbol x_{t-1}\):

\[\Delta\boldsymbol x_t=\begin{bmatrix}-0.5&-1.0\\-0.25&-0.5\end{bmatrix}\boldsymbol x_{t-1}+\boldsymbol a_t-\boldsymbol\Theta\boldsymbol a_{t-1}=\begin{bmatrix}-1\\-0.5\end{bmatrix}[0.5,\ 1.0]\,\boldsymbol x_{t-1}+\boldsymbol a_t-\boldsymbol\Theta\boldsymbol a_{t-1}.\]

左边 \(\Delta\boldsymbol x_t\) 平稳,右边的 \([0.5,1.0]\boldsymbol x_{t-1}=y_{2,t-1}\) 也平稳,方程两边"平稳性匹配",MA 多项式保持原样,没有不可逆问题。这就是误差修正模型(error correction model, ECM)。

白话解释:为什么"多差分一次"有害?最简单的例子:白噪声 \(a_t\) 本来已经平稳,再差分一次得 \(a_t-a_{t-1}\),这是 MA 系数恰好为 1 的 MA(1),MA 多项式 \(1-B\) 在 \(B=1\) 处有根,即"不可逆"。不可逆意味着无法用有限个过去观测把新息 \(a_t\) 还原出来,估计和预测都会出问题。协整系统里,价差本身已经平稳,对每只股票分别差分,就相当于把价差也多差分了一次。

金融直觉:ECM 的读法:\(\Delta\boldsymbol x_t=\boldsymbol\alpha\cdot(\text{上期价差})+\cdots\)。本例 \(\boldsymbol\alpha=(-1,-0.5)'\),价差 \(y_{2,t-1}\) 偏高时两个分量都会被往下拉。这正是"基差偏离会被套利修正"的数学写法;只对收益(差分)建模,模型里就没有"基差"这一项,也就看不到这种修正力。

8.7.2 一般形式

\(k\) 维协整 VARMA(\(p,q\))、\(m\) 个协整向量(\(m<k\))时:

\[\Delta\boldsymbol x_t=\boldsymbol\alpha\boldsymbol\beta'\boldsymbol x_{t-1}+\sum_{i=1}^{p-1}\boldsymbol\Phi_i^*\Delta\boldsymbol x_{t-i}+\boldsymbol a_t-\sum_{j=1}^q\boldsymbol\Theta_j\boldsymbol a_{t-j},\tag{8.33}\]
\[\boldsymbol\Phi_j^*=-\sum_{i=j+1}^p\boldsymbol\Phi_i,\qquad\boldsymbol\alpha\boldsymbol\beta'=\boldsymbol\Phi_1+\cdots+\boldsymbol\Phi_p-\boldsymbol I=-\boldsymbol\Phi(1),\tag{8.34}\]

\(\boldsymbol\alpha,\boldsymbol\beta\) 都是 \(k\times m\) 满秩矩阵。(推导:把 \(\boldsymbol\Phi(B)\) 改写为 \(\boldsymbol\Phi(1)B+(1-B)\times\)(其余项),比较 \(B\) 的各次幂系数即可。)

推导拆解:以 VAR(2) \(\boldsymbol x_t=\boldsymbol\Phi_1\boldsymbol x_{t-1}+\boldsymbol\Phi_2\boldsymbol x_{t-2}+\boldsymbol a_t\) 为例,手工走一遍。 第一步,两边减 \(\boldsymbol x_{t-1}\):\(\Delta\boldsymbol x_t=(\boldsymbol\Phi_1-\boldsymbol I)\boldsymbol x_{t-1}+\boldsymbol\Phi_2\boldsymbol x_{t-2}+\boldsymbol a_t\)。 第二步,把 \(\boldsymbol x_{t-2}\) 写成 \(\boldsymbol x_{t-1}-\Delta\boldsymbol x_{t-1}\)(恒等式,没有任何假设):\(\boldsymbol\Phi_2\boldsymbol x_{t-2}=\boldsymbol\Phi_2\boldsymbol x_{t-1}-\boldsymbol\Phi_2\Delta\boldsymbol x_{t-1}\)。 第三步,合并 \(\boldsymbol x_{t-1}\) 的系数:\(\Delta\boldsymbol x_t=(\boldsymbol\Phi_1+\boldsymbol\Phi_2-\boldsymbol I)\boldsymbol x_{t-1}-\boldsymbol\Phi_2\Delta\boldsymbol x_{t-1}+\boldsymbol a_t\)。 对照 (8.34):\(\boldsymbol\alpha\boldsymbol\beta'=\boldsymbol\Phi_1+\boldsymbol\Phi_2-\boldsymbol I\),\(\boldsymbol\Phi_1^*=-\boldsymbol\Phi_2\),与练习 2 的提示一致。可见 ECM 只是 VAR 的代数改写,信息完全相同;新东西在于协整意味着 \(\boldsymbol\Phi_1+\boldsymbol\Phi_2-\boldsymbol I\) 是降秩的,可以拆成"窄"矩阵 \(\boldsymbol\alpha\) 乘 \(\boldsymbol\beta'\)。

直觉。 \(\boldsymbol\beta'\boldsymbol x_{t-1}\) 是上期对长期均衡的偏离("误差"),\(\boldsymbol\alpha\) 告诉我们每个变量如何对这个偏离做出反应("修正")。从统计上看,单位根理论表明 I(1) 序列与 I(0) 序列的样本相关随样本增大趋于 0(Tsay & Tiao 1990),所以平稳的 \(\Delta\boldsymbol x_t\) 只能通过平稳组合 \(\boldsymbol\beta'\boldsymbol x_{t-1}\) 与水平 \(\boldsymbol x_{t-1}\) 发生有意义的关联。ECM 的构造方式不唯一:可以用任意 \(\boldsymbol\alpha\boldsymbol\beta'\boldsymbol x_{t-v}\)(\(1\le v\le p\))并相应修改 \(\boldsymbol\Phi_i^*\)。


8.8 协整 VAR 模型

8.8.1 ECM 与 \(\boldsymbol\Pi\) 的秩

考虑含确定性趋势的 \(k\) 维 VAR(\(p\)):\(\boldsymbol x_t=\boldsymbol\mu_t+\boldsymbol\Phi_1\boldsymbol x_{t-1}+\cdots+\boldsymbol\Phi_p\boldsymbol x_{t-p}+\boldsymbol a_t\),\(\boldsymbol\mu_t=\boldsymbol\mu_0+\boldsymbol\mu_1t\),\(\boldsymbol a_t\) 高斯,各分量至多 I(1)。其 ECM 为

\[\Delta\boldsymbol x_t=\boldsymbol\mu_t+\boldsymbol\Pi\boldsymbol x_{t-1}+\boldsymbol\Phi_1^*\Delta\boldsymbol x_{t-1}+\cdots+\boldsymbol\Phi_{p-1}^*\Delta\boldsymbol x_{t-p+1}+\boldsymbol a_t,\qquad\boldsymbol\Pi=-\boldsymbol\Phi(1).\tag{8.36}\]

反过来,\(\boldsymbol\Phi_1=\boldsymbol I+\boldsymbol\Pi+\boldsymbol\Phi_1^*\),\(\boldsymbol\Phi_i=\boldsymbol\Phi_i^*-\boldsymbol\Phi_{i-1}^*\)(\(i=2,\dots,p\),\(\boldsymbol\Phi_p^*=\boldsymbol 0\))。有单位根时 \(|\boldsymbol\Phi(1)|=0\),\(\boldsymbol\Pi\) 奇异,分三种情形:

  1. \(\mathrm{Rank}(\boldsymbol\Pi)=0\):\(\boldsymbol\Pi=\boldsymbol 0\),无协整,直接对 \(\Delta\boldsymbol x_t\) 建 VAR(\(p-1\))。
  2. \(\mathrm{Rank}(\boldsymbol\Pi)=k\):没有单位根,\(\boldsymbol x_t\) 本身平稳,直接对水平建 VAR。
  3. \(0<\mathrm{Rank}(\boldsymbol\Pi)=m<k\):\(\boldsymbol\Pi=\boldsymbol\alpha\boldsymbol\beta'\),有 \(m\) 个协整向量 \(\boldsymbol w_t=\boldsymbol\beta'\boldsymbol x_t\) 和 \(k-m\) 个单位根,后者构成 \(k-m\) 个共同随机趋势。

所以检验协整就是检验 \(\boldsymbol\Pi\) 的秩。

白话解释:为什么"秩"恰好等于协整关系的个数?\(\boldsymbol\Pi\boldsymbol x_{t-1}\) 出现在等式右边,而左边 \(\Delta\boldsymbol x_t\) 是平稳的,所以 \(\boldsymbol\Pi\boldsymbol x_{t-1}\) 也必须平稳。\(\boldsymbol\Pi\) 的每一行都是 \(\boldsymbol x_{t-1}\) 的一个线性组合,秩为 \(m\) 意味着这些行里只有 \(m\) 个"真正不同"的组合,其余都是它们的线性组合。所以平稳组合恰有 \(m\) 个。 三种情形用二元配对来想:秩 0 表示两只股票毫无关系,各走各的,只能对收益建模;秩 2 表示两个价格本身都平稳(股价里很少见);秩 1 是配对交易想要的情形——有一个平稳价差,同时还有一个共同趋势带着两者一起漂移。

共同趋势。 取 \(\boldsymbol\alpha\) 的正交补 \(\boldsymbol\alpha_\perp\)(\(\boldsymbol\alpha_\perp'\boldsymbol\alpha=\boldsymbol 0\)),左乘 ECM 后误差修正项消失,\(\boldsymbol y_t=\boldsymbol\alpha_\perp'\boldsymbol x_t\) 就是共同趋势。8.6 节例子中 \(\boldsymbol\alpha=(-1,-0.5)'\),\(\boldsymbol\alpha_\perp=(1,-2)'\),\(y_t=x_{1t}-2x_{2t}\),正是 (8.32) 中的 \(y_{1t}\)。

识别。 分解 \(\boldsymbol\Pi=\boldsymbol\alpha\boldsymbol\beta'\) 不唯一:对任意 \(m\times m\) 可逆阵 \(\boldsymbol\Omega\),\((\boldsymbol\alpha\boldsymbol\Omega)(\boldsymbol\beta\boldsymbol\Omega'^{-1})'\) 给出同一个 \(\boldsymbol\Pi\)。常用标准化 \(\boldsymbol\beta'=[\boldsymbol I_m,\boldsymbol\beta_1']\)。

价差的平稳性条件。 二元 VAR(1)、一个协整向量 \(\boldsymbol\beta=(1,\beta_1)'\):\(\Delta\boldsymbol x_t=\boldsymbol\mu_t+(\alpha_1,\alpha_2)'(1,\beta_1)\boldsymbol x_{t-1}+\boldsymbol a_t\)。左乘 \(\boldsymbol\beta'\):

\[w_t=\boldsymbol\beta'\boldsymbol\mu_t+(1+\alpha_1+\alpha_2\beta_1)w_{t-1}+b_t,\qquad b_t=\boldsymbol\beta'\boldsymbol a_t.\]

价差 \(w_t\) 是 AR(1),需 \(|1+\alpha_1+\alpha_2\beta_1|<1\)。这个系数决定了均值回复的快慢,是配对交易中最重要的数之一(见 8.11 节的半衰期)。

8.8.2 确定项的五种设定

协整检验统计量的极限分布依赖确定项 \(\boldsymbol\mu_t\),必须事先选定:

设定 ECM 中的形式 分量的性质 \(\boldsymbol w_t\) 的性质 适用场景
1. 无确定项 \(\boldsymbol\mu_t=\boldsymbol 0\) 无漂移 I(1) 均值 0 少见;某些对数价格
2. 受限常数 \(\boldsymbol\alpha(\boldsymbol\beta'\boldsymbol x_{t-1}+\boldsymbol c_0)\) 无漂移 I(1) 均值非零 利率、价差(无漂移理由)
3. 非受限常数 \(\boldsymbol\mu_0\ne0\) 带漂移 I(1) 可有非零均值 资产价格
4. 受限趋势 \(\boldsymbol\mu_0+\boldsymbol\alpha(\boldsymbol\beta'\boldsymbol x_{t-1}+\boldsymbol c_1t)\) 带漂移 I(1) 含线性趋势 较少
5. 非受限趋势 \(\boldsymbol\mu_0+\boldsymbol\mu_1t\) 二次趋势 含线性趋势 实证中罕见

"受限"的意思是常数(或趋势)只出现在协整关系内部,不会让价格本身产生漂移。


8.9 Johansen 方法:估计与检验

8.9.1 极大似然估计(降秩回归)

给定秩 \(m\),ECM 为 \(\Delta\boldsymbol x_t=\boldsymbol\mu\boldsymbol d_t+\boldsymbol\alpha\boldsymbol\beta'\boldsymbol x_{t-1}+\sum_{i=1}^{p-1}\boldsymbol\Phi_i^*\Delta\boldsymbol x_{t-i}+\boldsymbol a_t\),其中 \(\boldsymbol d_t\) 是确定项(如 \([1,t]'\))。若 \(\boldsymbol\beta\) 已知,这就是普通多元线性回归;难点在于 \(\boldsymbol\alpha\boldsymbol\beta'\) 是降秩的。Johansen 的做法分三步。

第一步:偏回归(集中似然)。 把确定项和短期动态"剔除掉":

\[\Delta\boldsymbol x_t=\boldsymbol\gamma_0\boldsymbol d_t+\sum\boldsymbol\Omega_i\Delta\boldsymbol x_{t-i}+\boldsymbol u_t,\qquad\boldsymbol x_{t-1}=\boldsymbol\gamma_1\boldsymbol d_t+\sum\boldsymbol\Omega_i\Delta\boldsymbol x_{t-i}+\boldsymbol v_t,\tag{8.40–8.41}\]

得残差 \(\hat{\boldsymbol u}_t\)(调整后的 \(\Delta\boldsymbol x_t\))和 \(\hat{\boldsymbol v}_t\)(调整后的 \(\boldsymbol x_{t-1}\))。由 Frisch–Waugh 定理,问题化为

\[\hat{\boldsymbol u}_t=\boldsymbol\alpha\boldsymbol\beta'\hat{\boldsymbol v}_t+\boldsymbol a_t.\]

第二步:广义特征值问题。 记 \(\boldsymbol S_{00}=\frac1{T-p}\sum\hat{\boldsymbol u}_t\hat{\boldsymbol u}_t'\),\(\boldsymbol S_{01}=\frac1{T-p}\sum\hat{\boldsymbol u}_t\hat{\boldsymbol v}_t'\),\(\boldsymbol S_{11}=\frac1{T-p}\sum\hat{\boldsymbol v}_t\hat{\boldsymbol v}_t'\),求解

\[|\lambda\boldsymbol S_{11}-\boldsymbol S_{10}\boldsymbol S_{00}^{-1}\boldsymbol S_{01}|=0,\]

得 \(\hat\lambda_1>\cdots>\hat\lambda_k\) 及特征向量 \(\boldsymbol e_i\)(标准化为 \(\boldsymbol e'\boldsymbol S_{11}\boldsymbol e=\boldsymbol I\))。\(\hat\lambda_i\) 是 \(\hat{\boldsymbol u}_t\) 与 \(\hat{\boldsymbol v}_t\) 之间的平方典型相关系数(canonical correlation),也就是剔除确定项与短期动态后,\(\Delta\boldsymbol x_t\) 与 \(\boldsymbol x_{t-1}\) 的偏典型相关。直觉:哪个水平组合最能"解释"下一期的变化,哪个就是协整方向。

白话解释:先看 \(k=1\) 的情形。此时 \(S_{00},S_{01},S_{11}\) 都是数,方程化为 \(\lambda=S_{01}^2/(S_{00}S_{11})\),这正是 \(\hat u_t\) 与 \(\hat v_t\) 的样本相关系数的平方,也就是"用上期水平回归本期变化"的 \(R^2\)。\(k\) 维时,典型相关的做法是:在 \(\hat{\boldsymbol v}_t\)(水平)的所有线性组合里,找一个与 \(\hat{\boldsymbol u}_t\)(变化)相关性最强的组合,它对应最大的 \(\hat\lambda_1\);再在与它不相关的组合里找次强的,依此类推。 为什么这样能找到协整向量?协整组合(价差)是平稳的,会被误差修正项"拉回",所以它与下一期的变化相关;而含单位根的组合(共同趋势)与下一期变化几乎无关。于是大的 \(\hat\lambda\) 对应协整方向,接近 0 的 \(\hat\lambda\) 对应共同趋势。 计算上,\(|\lambda\boldsymbol S_{11}-\boldsymbol S_{10}\boldsymbol S_{00}^{-1}\boldsymbol S_{01}|=0\) 等价于求矩阵 \(\boldsymbol S_{11}^{-1}\boldsymbol S_{10}\boldsymbol S_{00}^{-1}\boldsymbol S_{01}\) 的普通特征值,Python 示例一中的 M = solve(S11, S01.T @ solve(S00, S01)) 就是这个矩阵。

第三步:读出估计。 \(\hat{\boldsymbol\beta}=[\boldsymbol e_1,\dots,\boldsymbol e_m]\),再按识别约束标准化;\(\boldsymbol\alpha\) 及其他参数由把 \(\hat{\boldsymbol\beta}'\boldsymbol x_{t-1}\) 当作已知回归元的 OLS 得到。最大似然值满足

\[L_{\max}^{-2/T}\propto|\boldsymbol S_{00}|\prod_{i=1}^m(1-\hat\lambda_i).\]

正交补的估计为 \(\hat{\boldsymbol\alpha}_\perp=\boldsymbol S_{00}^{-1}\boldsymbol S_{11}[\boldsymbol e_{m+1},\dots,\boldsymbol e_k]\),\(\hat{\boldsymbol\beta}_\perp=\boldsymbol S_{11}[\boldsymbol e_{m+1},\dots,\boldsymbol e_k]\)。

8.9.2 协整秩检验

由上式,秩为 \(m\) 与秩为 \(k\) 的对数似然之差只取决于第 \(m+1\) 到第 \(k\) 个特征值。

迹检验(trace test):\(H_0:\mathrm{Rank}(\boldsymbol\Pi)=m\) 对 \(H_a:\mathrm{Rank}(\boldsymbol\Pi)>m\),

\[LR_{tr}(m)=-(T-p)\sum_{i=m+1}^k\ln(1-\hat\lambda_i).\tag{8.42}\]

最大特征值检验(maximum eigenvalue test):\(H_0:\mathrm{Rank}=m\) 对 \(H_a:\mathrm{Rank}=m+1\),

\[LR_{\max}(m)=-(T-p)\ln(1-\hat\lambda_{m+1}).\]

若真实秩为 \(m\),第 \(m\) 个以后的 \(\hat\lambda_i\) 应接近 0,统计量就小。由于存在单位根,二者的渐近分布不是卡方,而是布朗运动的泛函,临界值靠模拟得到,并随确定项设定而变。使用方式:从 \(m=0\) 开始依次检验,第一个不被拒绝的 \(m\) 就是协整秩的估计。

推导拆解:迹统计量从似然比来。由 8.9.1 的 \(L_{\max}^{-2/T}\propto|\boldsymbol S_{00}|\prod_{i=1}^m(1-\hat\lambda_i)\),取对数得 \(-\frac2T\ln L_{\max}(m)=\text{常数}+\sum_{i=1}^m\ln(1-\hat\lambda_i)\)。秩为 \(k\)(无约束)与秩为 \(m\) 的模型相减,常数项消掉,只剩 \(\sum_{i=m+1}^k\ln(1-\hat\lambda_i)\)。似然比统计量 \(-2\ln(L_m/L_k)\) 等于把它乘以 \(-T\)(这里用有效样本量 \(T-p\)),就得到 (8.42)。 数值感:国库券例子中 \(\hat\lambda_1=0.0322\),\(-(T-p)\ln(1-0.0322)\approx2380\times0.0327\approx77.8\),正是表中的最大特征值统计量 77.78。\(\hat\lambda\) 看起来很小,但乘以两千多个样本后就非常显著。 白话解释:为什么不是卡方?普通 LR 检验的卡方结论依赖"估计量渐近正态",而在原假设下有些方向是随机游走,相关估计量收敛得更快、分布也不对称(类似 ADF 检验不能用 t 分布临界值)。所以只能查专门的表,并且表随确定项设定而变。

8.9.3 预测

拟合好的 ECM 先预测 \(\Delta\boldsymbol x_t\),再累加得到水平预测。与对差分序列直接建 VAR 相比,ECM 预测强制保持了协整关系,长期预测中各分量不会"走散"。但水平预测的区间仍随步长扩大(共同趋势是单位根)。

8.9.4 实例:美国 3 个月与 6 个月国库券利率

1958 年 12 月至 2004 年 8 月的周度数据,2383 个观测,两序列高度同步。单变量 ADF 统计量 −2.34、−2.33(p≈0.16),不能拒绝单位根。BIC 选 VAR(3),因此 ECM 中滞后差分阶数为 2;没有理由认为利率有漂移,选受限常数。

检验 \(H(0)\) 5% / 1% 临界值 \(H(1)\) 5% / 1% 临界值
迹统计量 83.27 19.96 / 24.60 5.49 9.24 / 12.97
最大特征值 77.78 15.67 / 20.20 5.49 9.24 / 12.97

(特征值 0.0322、0.0023。)\(H(0)\) 被强烈拒绝,\(H(1)\) 不被拒绝,恰有一个协整向量。VECM 估计:协整向量 \((1,-1.0124)\)(标准误 0.0086),即 \(w_t\approx tb3m_t-tb6m_t\),均值约 −0.225;调整系数 \(\boldsymbol\alpha=(-0.0949,-0.0211)'\),t 值 −4.76、−1.18:

\[\Delta\boldsymbol x_t=\begin{bmatrix}-0.09\\-0.02\end{bmatrix}(w_{t-1}+0.23)+\begin{bmatrix}0.05&0.27\\-0.04&0.32\end{bmatrix}\Delta\boldsymbol x_{t-1}+\begin{bmatrix}-0.21&0.25\\-0.03&0.10\end{bmatrix}\Delta\boldsymbol x_{t-2}+\boldsymbol a_t.\]

读法:期限利差偏离均衡时,主要由 3 个月利率去修正(\(\alpha_1\) 显著),6 个月利率基本不动。协整残差在 1980 年代初高利率、高波动时期出现大值。以 2004-08-06 为原点,水平 1 步预测为 (1.4501, 1.7057),10 步为 (1.4722, 1.7078);95% 逐点区间因单位根而很宽。


8.10 门限协整与期现套利

8.10.1 持有成本模型

设 \(f_{t,\ell}\) 为到期日 \(\ell\) 的 S&P 500 期货对数价格,\(s_t\) 为现货成分股对数价格。持有成本模型(cost-of-carry)给出

\[f_{t,\ell}-s_t=(r_{t,\ell}-q_{t,\ell})(\ell-t)+z_t^*,\tag{8.43}\]

\(r_{t,\ell}\) 为无风险利率,\(q_{t,\ell}\) 为股息率。\(z_t^*\) 必须单位根平稳,否则存在持续的套利机会。调整利率和股息后,\(f\) 与 \(s\) 以协整向量 \((1,-1)\) 协整(持有成本定价的细节见第 08 册)。

金融直觉:(8.43) 就是 CFA 里的 \(F=Se^{(r-q)T}\) 取对数后的形式:\(\ln F-\ln S=(r-q)T\)。理论上两边严格相等,\(z_t^*\) 是现实中的定价误差(俗称"基差偏离")。它若有单位根,偏离可以越走越远而不回来,等于说无套利原理失效,所以 \(z_t^*\) 必须平稳。这里协整向量是 \((1,-1)\),由理论直接给定,不需要估计——这是协整在金融里最"硬"的一类应用;配对交易中的 \(\gamma\) 则要靠数据估计,关系也更容易断裂。

但套利只在 \(|z_t^*|\) 足以覆盖交易成本、冲击成本和其他风险时才有利可图。于是市场动态会随是否存在套利而切换:

\[\boldsymbol r_t=\begin{cases}\boldsymbol c_1+\sum_{i=1}^p\boldsymbol\Phi_i^{(1)}\boldsymbol r_{t-i}+\boldsymbol\beta_1z_{t-1}+\boldsymbol a_t^{(1)},&z_{t-1}\le\gamma_1,\\\boldsymbol c_2+\sum_{i=1}^p\boldsymbol\Phi_i^{(2)}\boldsymbol r_{t-i}+\boldsymbol\beta_2z_{t-1}+\boldsymbol a_t^{(2)},&\gamma_1<z_{t-1}\le\gamma_2,\\\boldsymbol c_3+\sum_{i=1}^p\boldsymbol\Phi_i^{(3)}\boldsymbol r_{t-i}+\boldsymbol\beta_3z_{t-1}+\boldsymbol a_t^{(3)},&\gamma_2<z_{t-1},\end{cases}\tag{8.44}\]

其中 \(\boldsymbol r_t=(\Delta f_t,\Delta s_t)'\),\(z_t=100z_t^*\),\(\gamma_1<0<\gamma_2\)。这是第 04a 章 TAR 模型与 ECM 的共同推广——三区制多元门限模型。理论预期:套利只发生在区制 1 和 3,误差修正项在这两个区制显著;中间区制由正常市场力量主导,两价格近似各自随机游走,\(\boldsymbol\beta_2\) 应不显著。这种"只在区间外才协整"的现象称为门限协整(threshold cointegration,Balke & Fomby 1997),\([\gamma_1,\gamma_2]\) 就是经验上的无套利区间。

8.10.2 实证结果

数据为 1993 年 5 月 S&P 500 指数及 6 月期货合约的分钟数据,7060 个观测。设 \(p=8\),在 \(d\in\{1,2,3,4\}\)、\(\gamma_1\in[-0.15,-0.02]\)、\(\gamma_2\in[0.025,0.145]\) 上网格搜索,AIC 选 \(z_{t-1}\) 为门限变量,\(\hat\gamma_1=-0.0226\),\(\hat\gamma_2=0.0377\),三个区制样本量 2234、2410、2408。主要结论:

  1. 中间区制 \(z_{t-1}\) 的系数不显著(\(\Delta f_t\) 方程 t=−0.30,\(\Delta s_t\) 方程 t=0.86),区制 1、3 中 \(\Delta s_t\) 方程的系数高度显著(t=10.47、9.75)——证实门限协整,而且是现货在修正。
  2. \(\Delta f_t\) 在三个区制都负依赖于 \(\Delta f_{t-1}\)(−0.085、−0.039、−0.041),与第 05 章的买卖价反弹一致。
  3. \(\Delta s_t\) 方程中期货的多个滞后收益高度显著:期货流动性更好,期货领先现货(价格发现)。

8.11 配对交易

8.11.1 理论框架

配对交易(pairs trading)是一种市场中性策略,这里讨论的是基于协整的统计套利版本(延伸阅读 Vidyamurthy 2004;Pole 2007)。核心是相对定价:按套利定价理论(APT),风险特征相近的两只股票应有相近的收益;若(适当缩放后的)价格出现差距,可能一只被高估、一只被低估,于是卖高买低,等待错误定价修正。两只股票的"真实价值"并不重要,重要的是它们的相对位置,这个差距称为价差(spread)。

令 \(p_{it}=\ln P_{it}\) 为随机游走。若两只股票由共同成分驱动,则存在 \(\gamma\) 使

\[w_t=p_{1t}-\gamma p_{2t}\]

单位根平稳、围绕 \(\mu_w=E(w_t)\) 均值回复,并满足误差修正形式

\[\begin{bmatrix}\Delta p_{1t}\\\Delta p_{2t}\end{bmatrix}=\begin{bmatrix}\alpha_1\\\alpha_2\end{bmatrix}(w_{t-1}-\mu_w)+\begin{bmatrix}\epsilon_{1t}\\\epsilon_{2t}\end{bmatrix}.\tag{8.45}\]

收益依赖上期对长期均衡的偏离。若价差偏高(\(w_{t-1}>\mu_w\)),股票 1 应跌、股票 2 应涨,所以**\(\alpha_1<0\)、\(\alpha_2>0\),二者异号**。

组合收益等于价差增量。 做多 1 股股票 1、做空 \(\gamma\) 股股票 2,从 \(t\) 到 \(t+i\) 的收益(对数价格意义下)为

\[r_{p}=(p_{1,t+i}-p_{1t})-\gamma(p_{2,t+i}-p_{2t})=w_{t+i}-w_t,\]

与 \(\mu_w\) 无关。这一行公式是配对交易的全部会计学。

半衰期。 由 (8.45),

\[w_t-\mu_w=(1+\alpha_1-\gamma\alpha_2)(w_{t-1}-\mu_w)+(\epsilon_{1t}-\gamma\epsilon_{2t}),\]

即价差是系数 \(\rho_w=1+\alpha_1-\gamma\alpha_2\) 的 AR(1)。偏离衰减一半所需的期数为

\[h_{1/2}=\frac{\ln0.5}{\ln\rho_w}.\]

\(\alpha_1\) 越负、\(\alpha_2\) 越正,回复越快。半衰期决定了持仓时间、资金周转率,也是判断一对股票是否值得交易的首要指标。(这一推导是本教材的补充,与 8.8.1 节的 \(1+\alpha_1+\alpha_2\beta_1\) 一致,\(\beta_1=-\gamma\)。)

推导拆解:价差方程怎么来的。 第一步,按定义 \(w_t-w_{t-1}=\Delta p_{1t}-\gamma\Delta p_{2t}\)(价差的变化 = 腿 1 的收益 − \(\gamma\) 倍腿 2 的收益)。 第二步,代入 (8.45):\(\Delta p_{1t}-\gamma\Delta p_{2t}=(\alpha_1-\gamma\alpha_2)(w_{t-1}-\mu_w)+(\epsilon_{1t}-\gamma\epsilon_{2t})\)。 第三步,两边加上 \(w_{t-1}-\mu_w\),左边变成 \(w_t-\mu_w\),右边系数变成 \(1+\alpha_1-\gamma\alpha_2\)。 第四步,半衰期:无新冲击时偏离 \(h\) 期后变为 \(\rho_w^h\) 倍,令 \(\rho_w^h=0.5\) 取对数即得。当 \(\rho_w\) 接近 1 时,\(\ln\rho_w\approx\rho_w-1\),所以 \(h_{1/2}\approx0.693/(1-\rho_w)=0.693/(\gamma\alpha_2-\alpha_1)\):调整速度之和越大,半衰期越短。

金融直觉:\(\alpha_1<0\) 表示价差偏高时"贵的那只"会跌,\(\alpha_2>0\) 表示"便宜的那只"会涨,两条腿从两边一起把价差拉回。若只有一边动(如 BHP/VALE 中 \(\alpha_2\) 不显著),回归就只靠一条腿完成,速度更慢。这和期现套利中"谁来修正基差"是同一个问题——8.10 节的实证发现修正主要发生在现货一侧。

8.11.2 交易策略

设一次配对交易的总成本为 \(\eta\)(双边佣金、两只股票的买卖价差、融券费用、保证金利息等),目标偏离为 \(\Delta\),要求 \(2\Delta>\eta\):

  • 当 \(w_t=\mu_w-\Delta\) 时,买入 1 股股票 1、卖空 \(\gamma\) 股股票 2;
  • 当 \(w_{t+i}=\mu_w+\Delta\) 时平仓。

组合收益 \(w_{t+i}-w_t=2\Delta\),净利润 \(2\Delta-\eta>0\)。反方向(\(w_t=\mu_w+\Delta\) 时卖空股票 1、买入 \(\gamma\) 股股票 2)对称。只要 \(\Delta\) 相对价差标准差不太大,入场点就会出现;均值回复保证出场点会出现。

变体:回到均值即平仓。 若 \(\Delta>\eta\),可在 \(w_{t+i}=\mu_w\) 时平仓,每笔净利 \(\Delta-\eta\)。持仓更短、交易更频繁,总成本更高。两种规则孰优,取决于半衰期与成本的相对大小。\(\eta\) 本质上是交易门槛。

8.11.3 实例:BHP 与 VALE

BHP Billiton(澳大利亚,自然资源)与 Vale(巴西,金属采矿)同属资源行业,风险因子相近。数据为纽交所日度复权收盘价,2002-07-01 至 2006-03-31,946 个观测,\(p_{1t}\)=BHP,\(p_{2t}\)=VALE。

最小二乘法(Engle–Granger 两步)。 回归得

\[p_{1t}=1.823+0.717p_{2t}+\hat w_t,\qquad\sigma_w=0.044,\ R^2=0.9899.\]

残差围绕 0 在固定范围内波动,ACF 指数衰减。对 \(\hat w_t\) 拟合 AR(2):\((1-0.805B-0.122B^2)\hat w_t=a_t\),\(\sigma_a=0.018\),可分解为 \((1-0.935B)(1-0.130B)\),平稳;ADF 统计量 −6.04,拒绝单位根。

推导拆解(并指出一处符号问题):AR(2) 的分解是求特征方程 \(\lambda^2-0.805\lambda-0.122=0\) 的两个根:\(\lambda=\frac{0.805\pm\sqrt{0.805^2+4\times0.122}}2=\frac{0.805\pm1.066}2\),即 \(0.935\) 和 \(-0.130\)。所以正确的因式分解是 \((1-0.935B)(1+0.130B)\);乘开为 \(1-0.805B-0.1216B^2\),与原式吻合。上文写成 \((1-0.130B)\) 的话,乘开会得到 \(1-1.065B+0.122B^2\),对不上。符号差别不影响结论:两个根的模都小于 1,平稳;主根 0.935 决定了衰减速度,下文用它算半衰期约 10.3 天。

注意:对估计出的残差做 ADF 检验时,应使用 Engle–Granger(MacKinnon)临界值,而不是普通 DF 临界值。因为 OLS 会挑选"看起来最平稳"的组合,残差天然偏向平稳,普通临界值会过度拒绝。两变量含常数时 5% 临界值约 −3.34,远比普通 DF 的 −1.94(无常数)或 −2.86(含常数)严格。原书未展开这一点,本例 −6.04 无论用哪套临界值都显著。

极大似然法(Johansen)。 信息准则选 VAR(1)(R 中 ar 选 2 阶,对应 ca.jo 的 K=2),受限常数下:特征值 0.0415、0.0082;迹统计量 \(H(0)=47.74\)(5%/1% 临界值 19.96/24.60),\(H(1)=7.77\)(9.24/12.97);最大特征值统计量 \(H(0)=39.97\),\(H(1)=7.77\)。协整秩为 1。VECM 为

\[\Delta\boldsymbol x_t=\begin{bmatrix}-0.067\\0.026\end{bmatrix}(w_{t-1}-1.81)+\begin{bmatrix}-0.11&0.07\\0.07&0.04\end{bmatrix}\Delta\boldsymbol x_{t-1}+\boldsymbol a_t,\]

协整向量 \((1,-0.7177)\),\(w_t=p_{1t}-0.718p_{2t}\),均值 1.81,与 LS 结果几乎一致;\(\alpha=(-0.0671,0.0263)'\)(t 值 −4.65、1.57),如预期异号。由此 \(\rho_w=1-0.0671-0.7177\times0.0263\approx0.914\),半衰期约 7.7 个交易日;用 AR(2) 的主根 0.935 计算则约 10.3 个交易日。两者量级一致:价差偏离大约两周回复一半。

交易规则。 \(w_t\) 标准差 0.044,取 \(\Delta=0.045\)(略大于 1 个标准差),正态下偏离至少 \(\Delta\) 的概率约 30%。图 8.19 中价差多次在 \(\mu_w\pm0.045\) 之间穿越,每次配对交易的对数收益为 \(2\Delta=0.09\)。作者强调,更真实的做法应在样本外实施。

选对配对是关键。 应选风险因子相近的股票,用金融理论指导筛选,而不是在成千上万对股票中盲目搜索协整(那样会产生大量伪协整)。


量化实战

应用场景与实务要点

配对交易的完整流水线。

  1. 候选池:同行业、同产业链、同一公司的不同上市地(A/H 股、本地股与 ADR)、ETF 与成分股篮子、同一商品的不同交割月。经济逻辑先行。
  2. 形成期(如过去 1–2 年):对数价格各自做 ADF 确认 I(1);用 Engle–Granger(OLS 求 \(\gamma\) + EG 临界值)或 Johansen 检验协整;估计 VECM,确认 \(\alpha_1,\alpha_2\) 异号,计算半衰期。半衰期太长(数月)资金效率低,太短(1–2 天)可能只是买卖价反弹。
  3. 交易期(样本外):用形成期的 \(\gamma,\mu_w,\sigma_w\) 构造价差和 z 分数,按 \(\mu_w\pm\Delta\) 开平仓,\(\Delta\) 由成本 \(\eta\) 和半衰期共同决定。
  4. 风险控制:协整关系可能断裂(并购、业务转型、监管事件),要设置时间止损(持仓超过 3–4 个半衰期未回复即平仓)和幅度止损;滚动重估 \(\gamma\) 并监控残差 ADF;用第 10 章的时变协方差动态调整价差波动率估计。
  5. 执行与成本:两条腿要同时成交以控制腿差风险;卖空约束(A 股融券券源有限、成本高)常迫使用股指期货、ETF 或只做相对低估的一边。

多资产协整篮子。 Johansen 方法可直接用于 3 个及以上资产(如同一行业的一篮子股票、利率曲线上多个期限),得到多个协整向量;每个协整向量就是一个可交易的平稳组合。

期现套利与基差交易。 8.10 节的门限模型给出数据驱动的无套利区间 \([\gamma_1,\gamma_2]\),可直接用作开仓阈值;"期货领先现货"的发现可用于日内择时和执行。

利率曲线。 3 个月与 6 个月国库券协整、1 年与 3 年国债单向领先,对应期限利差的均值回复交易。

Python 示例一:配对交易全流程(Engle–Granger、Johansen、VECM、半衰期、样本外回测)

按 (8.45) 模拟一对协整股票,参数量级仿 BHP/VALE(\(\gamma=0.72\),\(\mu_w=1.8\),\(\alpha=(-0.05,0.03)'\))。前 750 天为形成期,后 750 天为样本外交易期。Johansen 部分先手写"偏回归 + 广义特征值",再与 statsmodels 对照。

import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller, coint
from statsmodels.tsa.vector_ar.vecm import coint_johansen, VECM

import warnings; warnings.filterwarnings("ignore")
rng = np.random.default_rng(21)

# ---------- 1. 按误差修正模型 (8.45) 模拟一对协整股票(仿 BHP/VALE 的量级) ----------
T = 1500
gamma_true, mu_true = 0.72, 1.8
alpha = np.array([-0.05, 0.03])                    # 异号:价差偏高时 p1 跌、p2 涨
cov = np.array([[0.020**2, 0.6*0.020*0.022],
                [0.6*0.020*0.022, 0.022**2]])
e = rng.multivariate_normal([0, 0], cov, size=T)
p = np.zeros((T, 2)); p[0] = [mu_true + gamma_true * 3.0, 3.0]
for t in range(1, T):
    w_prev = p[t-1, 0] - gamma_true * p[t-1, 1] - mu_true
    p[t] = p[t-1] + alpha * w_prev + e[t]
px = pd.DataFrame(p, columns=["p1", "p2"])

# ---------- 2. 单位根检验:两只股票各自都是 I(1) ----------
for c in px:
    st, pv = adfuller(px[c], regression="c")[:2]
    print(f"ADF {c}: stat={st:.2f}, p={pv:.3f}")

# 只用前一半样本做"形成期",后一半做"交易期"(样本外)
form, trade = px.iloc[:750], px.iloc[750:]

# ---------- 3. Engle-Granger 两步法 ----------
ols = sm.OLS(form.p1, sm.add_constant(form.p2)).fit()
mu_hat, gam_hat = ols.params
w_hat = ols.resid
print(f"OLS: p1 = {mu_hat:.3f} + {gam_hat:.3f} p2,  sd(w) = {w_hat.std():.4f}")
adf_naive = adfuller(w_hat, regression="n")
eg = coint(form.p1, form.p2, trend="c")
print(f"残差 ADF stat={adf_naive[0]:.2f}; 普通 DF 5%临界值={adf_naive[4]['5%']:.2f}; "
      f"EG 5%临界值={eg[2][1]:.2f}; EG p={eg[1]:.4f}")
ar1 = sm.OLS(w_hat.values[1:], w_hat.values[:-1]).fit().params[0]
print(f"价差 AR(1) 系数={ar1:.3f}, 半衰期={np.log(0.5)/np.log(ar1):.1f} 天")

# ---------- 4. Johansen:手工实现偏回归 + 广义特征值,并与 statsmodels 对照 ----------
def johansen_eig(x, k_ar_diff=1):
    dx = np.diff(x, axis=0)
    Y = dx[k_ar_diff:]                       # Δx_t
    Xlev = x[k_ar_diff:-1]                   # x_{t-1}
    Z = np.column_stack([np.ones(len(Y))] +
                        [dx[k_ar_diff - i:-i] for i in range(1, k_ar_diff + 1)])
    proj = lambda A: A - Z @ np.linalg.lstsq(Z, A, rcond=None)[0]
    U, V = proj(Y), proj(Xlev)               # u_t, v_t:剔除常数与短期动态后的残差
    n = len(U)
    S00, S01, S11 = U.T @ U / n, U.T @ V / n, V.T @ V / n
    M = np.linalg.solve(S11, S01.T @ np.linalg.solve(S00, S01))
    lam, vec = np.linalg.eig(M)
    idx = np.argsort(lam.real)[::-1]
    lam, vec = lam.real[idx], vec.real[:, idx]
    trace = [-n * np.log(1 - lam[m:]).sum() for m in range(len(lam))]
    return lam, vec, trace

lam, vec, tr = johansen_eig(form.values, k_ar_diff=1)
beta = vec[:, 0] / vec[0, 0]
print("手工 Johansen: 特征值", lam.round(4), " 迹统计量", np.round(tr, 2),
      " 协整向量", beta.round(4))
jo = coint_johansen(form.values, det_order=0, k_ar_diff=1)
print("statsmodels: 特征值", jo.eig.real.round(4), " 迹统计量", jo.lr1.round(2))
print("  迹检验 90/95/99% 临界值:\n", jo.cvt)

# ---------- 5. VECM(受限常数 'ci'),读调整系数 alpha ----------
vecm = VECM(form.values, k_ar_diff=1, coint_rank=1, deterministic="ci").fit()
b = vecm.beta.ravel(); a = vecm.alpha.ravel()
print("VECM beta =", (b / b[0]).round(4), " 常数项 =", (vecm.const_coint.ravel() / b[0]).round(4))
print("alpha =", (a * b[0]).round(4), " t =", vecm.tvalues_alpha.ravel().round(2))
rho_w = 1 + a[0] * b[0] - gam_hat * a[1] * b[0]    # w_t 的 AR 系数 1+α1-γα2
print(f"由 VECM 推出的价差 AR 系数={rho_w:.3f}, 半衰期={np.log(0.5)/np.log(rho_w):.1f} 天")

# ---------- 6. 样本外交易:Tsay 的 μ±Δ 规则与"回到均值平仓"规则 ----------
def backtest(spread, mu, delta, cost, exit_at_mean):
    pos, entry, trades, pnl, hold, t0 = 0, 0.0, 0, [], [], 0
    for t, s in enumerate(spread):
        if pos == 0:
            if s <= mu - delta:   pos, entry, t0 = 1, s, t     # 多价差:买1股p1、卖γ股p2
            elif s >= mu + delta: pos, entry, t0 = -1, s, t    # 空价差
        else:
            target = mu if exit_at_mean else mu + pos * delta
            if (pos == 1 and s >= target) or (pos == -1 and s <= target):
                pnl.append(pos * (s - entry) - cost); hold.append(t - t0)
                trades += 1; pos = 0
    return trades, np.sum(pnl), np.mean(pnl) if pnl else np.nan, np.mean(hold) if hold else np.nan

spread_oos = trade.p1.values - gam_hat * trade.p2.values
sd_w = w_hat.std()
for rule, flag in (("μ-Δ 进, μ+Δ 出", False), ("μ-Δ 进, μ 出", True)):
    n, tot, avg, h = backtest(spread_oos, mu_hat, 1.0 * sd_w, cost=0.004, exit_at_mean=flag)
    print(f"{rule}: 交易 {n} 次, 累计对数收益 {tot:.3f}, 每笔净 {avg:.4f}, 平均持有 {h:.1f} 天")

输出:

ADF p1: stat=-1.25, p=0.650
ADF p2: stat=-0.98, p=0.761
OLS: p1 = 1.841 + 0.706 p2,  sd(w) = 0.0444
残差 ADF stat=-5.03; 普通 DF 5%临界值=-1.94; EG 5%临界值=-3.34; EG p=0.0001
价差 AR(1) 系数=0.934, 半衰期=10.2 天
手工 Johansen: 特征值 [0.0325 0.0012]  迹统计量 [25.61  0.87]  协整向量 [ 1.     -0.7129]
statsmodels: 特征值 [0.0325 0.0012]  迹统计量 [25.61  0.87]
  迹检验 90/95/99% 临界值:
 [[13.4294 15.4943 19.9349]
 [ 2.7055  3.8415  6.6349]]
VECM beta = [ 1.    -0.713]  常数项 = [-1.8221]
alpha = [-0.0504  0.0222]  t = [-3.14  1.3 ]
由 VECM 推出的价差 AR 系数=0.934, 半衰期=10.1 天
μ-Δ 进, μ+Δ 出: 交易 14 次, 累计对数收益 1.409, 每笔净 0.1006, 平均持有 49.4 天
μ-Δ 进, μ 出: 交易 25 次, 累计对数收益 1.407, 每笔净 0.0563, 平均持有 20.8 天

读结果:

  • 两条价格的 ADF 都不能拒绝单位根,残差却显著平稳——教科书式的协整。EG 临界值 −3.34 比普通 DF 的 −1.94 严格得多,这一差别在边缘案例中决定生死。
  • 手写的 Johansen 与 statsmodels 特征值、迹统计量完全一致,说明 8.9.1 节的三步就是软件内部的全部计算。迹检验:\(H(0)\) 的 25.61 超过 5% 临界值 15.49,\(H(1)\) 的 0.87 小于 3.84,协整秩为 1。注意 statsmodels 的 det_order=0 对应非受限常数情形,其临界值(15.49、3.84)与原书 R ca.jo(ecdet="const") 的受限常数临界值(19.96、9.24)不同,比较软件输出时要先对齐确定项设定。
  • VECM 的 \(\hat\alpha=(-0.050,0.022)'\) 与真值 \((-0.05,0.03)'\) 接近且异号,与 BHP/VALE 一样 \(\alpha_2\) 不显著。由 \(\alpha\) 推出的半衰期(10.1 天)与直接对价差拟合 AR(1) 的结果(10.2 天)一致。
  • 样本外:Tsay 规则(\(\mu\pm\Delta\) 进出)每笔净赚约 \(2\Delta-\eta\approx0.085\) 以上(实际 0.10,因为价格是跳着越过边界的),但平均持有 49 天;"回到均值平仓"每笔约赚一半,交易次数多、持有 21 天,资金周转快得多。按年化资金效率,后者往往更优——这正是 8.11.2 节"变体"讨论的权衡。期末未平仓的头寸未计入。
  • 这是理想化的模拟:真实数据中 \(\gamma\) 会漂移、关系会断裂,必须加入滚动重估和止损。

Python 示例二:门限协整的网格搜索

模拟期现价格:期货是随机游走,现货跟随期货,只有当 \(z_{t-1}=f_{t-1}-s_{t-1}\) 落在 \([-0.3,0.4]\) 之外时才被套利拉回。按 (8.44) 拟合三区制模型(\(p=1\)),在分位数网格上搜索使残差广义方差最小的门限。

import numpy as np
import statsmodels.api as sm

rng = np.random.default_rng(3)

# ---------- 模拟期现门限协整:只有价差超出无套利区间时才被套利拉回 ----------
T, g1, g2 = 7060, -0.3, 0.4            # 真实门限(z 已放大 100 倍)
f = np.zeros(T); s = np.zeros(T)
for t in range(1, T):
    z = f[t-1] - s[t-1]
    kappa = 0.10 if (z <= g1 or z > g2) else 0.0      # 只有区间外才有套利把现货拉向期货
    f[t] = f[t-1] + 0.10 * rng.standard_normal()      # 期货:随机游走(价格发现在先)
    s[t] = s[t-1] + 0.6 * (f[t] - f[t-1]) + kappa * z + 0.08 * rng.standard_normal()
z = f - s
df, ds = np.diff(f), np.diff(s)
Y = np.column_stack([df[1:], ds[1:]])          # r_t,  t = 2..T-1
X_lag = np.column_stack([df[:-1], ds[:-1]])    # r_{t-1}
zlag = z[1:-1]                                  # z_{t-1}

def fit_regimes(c1, c2):
    regs = [zlag <= c1, (zlag > c1) & (zlag <= c2), zlag > c2]
    resid, out = [], []
    for m in regs:
        X = sm.add_constant(np.column_stack([X_lag[m], zlag[m]]))
        fits = [sm.OLS(Y[m, j], X).fit() for j in range(2)]
        resid.append(np.column_stack([fi.resid for fi in fits]))
        out.append((m.sum(), [(fi.params[-1], fi.tvalues[-1]) for fi in fits]))
    E = np.vstack(resid)
    return np.log(np.linalg.det(E.T @ E / len(E))), out

# ---------- 网格搜索门限(按信息准则 / 残差广义方差最小) ----------
grid1 = np.quantile(zlag, np.linspace(0.02, 0.45, 87))
grid2 = np.quantile(zlag, np.linspace(0.55, 0.98, 87))
best = min(((fit_regimes(a, b)[0], a, b) for a in grid1 for b in grid2))
_, c1, c2 = best
print(f"估计门限: gamma1={c1:.3f}, gamma2={c2:.3f}  (真值 {g1}, {g2})")
for name, (n, coefs) in zip(["区制1", "区制2", "区制3"], fit_regimes(c1, c2)[1]):
    (bf, tf), (bs, ts) = coefs
    print(f"{name}: n={n:5d}  z_(t-1) 系数  Δf 方程 {bf:+.4f} (t={tf:+.2f})   Δs 方程 {bs:+.4f} (t={ts:+.2f})")

输出:

估计门限: gamma1=-0.302, gamma2=0.372  (真值 -0.3, 0.4)
区制1: n=  741  z_(t-1) 系数  Δf 方程 +0.0121 (t=+0.27)   Δs 方程 +0.1008 (t=+2.16)
区制2: n= 5434  z_(t-1) 系数  Δf 方程 +0.0065 (t=+0.91)   Δs 方程 -0.0005 (t=-0.07)
区制3: n=  883  z_(t-1) 系数  Δf 方程 +0.0226 (t=+0.46)   Δs 方程 +0.2234 (t=+4.47)

门限被准确找回;中间区制误差修正系数为零(t=−0.07),两个外侧区制 \(\Delta s_t\) 方程显著、\(\Delta f_t\) 方程不显著——与表 8.8 "现货修正、期货不动"的结论同构。外侧区制样本少、\(z_{t-1}\) 取值范围窄,所以系数估计噪声较大(真值 0.10,估计 0.10 与 0.22)。实务中,估计出的 \([\hat\gamma_1,\hat\gamma_2]\) 可与实测的交易成本对照:如果区间宽度明显大于成本,说明还有未被套利的空间或存在其他风险因素。


本章小结

协整描述的是"各自随机游走、组合却平稳"的一组价格,其单位根来自少数共同趋势。对协整系统逐个差分会过度差分,正确做法是误差修正模型 \(\Delta\boldsymbol x_t=\boldsymbol\alpha\boldsymbol\beta'\boldsymbol x_{t-1}+\cdots\):\(\boldsymbol\beta\) 给出平稳组合(价差),\(\boldsymbol\alpha\) 给出各变量对偏离的调整速度。协整秩等于 \(\mathrm{Rank}(\boldsymbol\Pi)\),Johansen 方法通过偏回归把问题化为广义特征值问题,迹检验和最大特征值检验的临界值非标准且依赖确定项设定。门限协整说明套利只在偏离超过成本的区制中起作用,估计出的门限即无套利区间。配对交易是协整最直接的应用:做多 1 股、做空 \(\gamma\) 股的组合收益等于价差增量,以 \(\mu_w\pm\Delta\) 开平仓、要求 \(2\Delta>\eta\),均值回复速度由 \(1+\alpha_1-\gamma\alpha_2\) 和半衰期刻画。成功的关键是有经济逻辑的配对、样本外检验和对关系断裂的风控。

概念 公式 / 要点
协整 分量 I(1),存在 I(0) 线性组合 \(\boldsymbol\beta'\boldsymbol x_t\)
ECM \(\Delta\boldsymbol x_t=\boldsymbol\mu_t+\boldsymbol\alpha\boldsymbol\beta'\boldsymbol x_{t-1}+\sum\boldsymbol\Phi_i^*\Delta\boldsymbol x_{t-i}+\boldsymbol a_t\)
系数关系 \(\boldsymbol\Pi=\boldsymbol\alpha\boldsymbol\beta'=-\boldsymbol\Phi(1)\),\(\boldsymbol\Phi_j^*=-\sum_{i>j}\boldsymbol\Phi_i\)
秩的含义 0:无协整;\(k\):平稳;\(m\):\(m\) 个协整向量、\(k-m\) 个共同趋势
共同趋势 \(\boldsymbol\alpha_\perp'\boldsymbol x_t\)
Johansen 特征值 \(\vert \lambda\boldsymbol S_{11}-\boldsymbol S_{10}\boldsymbol S_{00}^{-1}\boldsymbol S_{01}\vert =0\)
迹检验 \(-(T-p)\sum_{i>m}\ln(1-\hat\lambda_i)\),非标准分布
最大特征值检验 \(-(T-p)\ln(1-\hat\lambda_{m+1})\)
持有成本 \(f-s=(r-q)(\ell-t)+z_t^*\),\(z_t^*\) 平稳
门限协整 中间区制无误差修正,\([\gamma_1,\gamma_2]\) 为无套利区间
配对价差 \(w_t=p_{1t}-\gamma p_{2t}\),\(\alpha_1<0<\alpha_2\)
组合收益 \(w_{t+i}-w_t\)
交易规则 \(\mu_w\pm\Delta\) 开平仓,净利 \(2\Delta-\eta\)
半衰期 \(\ln0.5/\ln(1+\alpha_1-\gamma\alpha_2)\)

练习

基础

  1. 验证 (8.31) 的 AR 矩阵特征值为 0 和 1,并验证 \([0.5,1.0]\boldsymbol x_t\) 在 (8.32) 中是白噪声。
  2. 对 VAR(2) \(\boldsymbol x_t=\boldsymbol\Phi_1\boldsymbol x_{t-1}+\boldsymbol\Phi_2\boldsymbol x_{t-2}+\boldsymbol a_t\),写出 ECM 形式中的 \(\boldsymbol\Pi\) 与 \(\boldsymbol\Phi_1^*\)。 提示:\(\boldsymbol\Pi=\boldsymbol\Phi_1+\boldsymbol\Phi_2-\boldsymbol I\),\(\boldsymbol\Phi_1^*=-\boldsymbol\Phi_2\)。
  3. 用 BHP/VALE 的估计值 \(\alpha=(-0.0671,0.0263)'\)、\(\gamma=0.7177\) 计算价差的 AR 系数和半衰期。 提示:\(\rho_w\approx0.914\),半衰期约 7.7 天。
  4. 解释为什么对 OLS 残差做 ADF 检验不能使用普通 DF 临界值。
  5. 一次配对交易成本 \(\eta=0.6\%\),价差标准差 4%。按 Tsay 规则,\(\Delta\) 至少要多大?若 \(\Delta=1\sigma\),按正态近似,价差偏离超过 \(\Delta\) 的时间比例约为多少? 提示:\(\Delta>0.3\%\);\(\Delta=4\%\) 时比例约 32%。

进阶

  1. 证明在 8.8.1 节的二元 VAR(1) 中,若 \(\alpha_1=\alpha_2=0\),则 \(w_t\) 是单位根过程;并解释 \(\alpha\) 两个分量异号对均值回复速度的影响。
  2. 修改示例一:在交易期中段(第 1100 天)让真实 \(\gamma\) 从 0.72 跳到 0.60,观察固定 \(\gamma\) 策略的亏损,并实现"滚动 250 天重估 \(\gamma\) + 持仓超过 3 个半衰期强制平仓"的改进版本。
  3. 在示例一中改变成本 \(\eta\in\{0.002,0.004,0.008,0.012\}\) 和 \(\Delta\in\{0.5,1,1.5,2\}\sigma_w\),画出两种平仓规则的总收益热力图,找出最优组合并解释。
  4. (原书习题 8.4)以期限利差 \(s_t=r_{10,t}-r_{1,t}\) 为门限变量,检验 1 年与 10 年期利率的门限协整,并建立多元门限模型。
  5. (原书习题 8.7)对 1 年与 3 年期利率:识别 VAR、计算 6 期脉冲响应、做 1–12 步预测;在受限常数下做 5% 水平的 Johansen 检验,建立 ECM 并预测,比较 VAR 与 ECM 的预测差异。

原书推荐习题:8.7(最完整:VAR、冲击响应、Johansen、ECM 与预测比较)、8.4(门限协整的实证设计)。


原书对照

本章小节 原书章节 PDF 页码
8.6 单位根非平稳与协整 8.5 p.448–451
8.7 误差修正形式 8.5.1 p.451–452
8.8 协整 VAR、确定项设定 8.6、8.6.1 p.452–455
8.9 Johansen 估计、检验、预测、国库券实例 8.6.2–8.6.5 p.455–462
8.10 门限协整与套利 8.7 p.462–466
8.11 配对交易、BHP/VALE 实例 8.8 p.466–476
习题 第 8 章习题 p.482–484

(原书印刷页码约等于 PDF 页码减 20。)