第 08b 章 协整、误差修正与配对交易
本章对应 Tsay 原书第 8 章后半(8.5–8.8 节)。第 08a 章处理的都是平稳的收益序列;本章转向价格。单个资产的对数价格通常有单位根,但几个价格的某个线性组合却可能是平稳的——这就是协整。协整把"两个资产长期必须一起走"的经济直觉变成可检验、可估计的统计模型,它是配对交易、期现套利和利率曲线交易的理论基础。单方程的协整估计与检验(EG-ADF、DOLS)见第 05 册第 17b 章,可与本章的 Johansen 系统方法对照。
学习目标
- 理解协整的定义、共同趋势和协整向量,能解释为什么对协整系统逐个差分会"过度差分"。
- 掌握误差修正模型(ECM)的推导,理解 \(\boldsymbol\Pi=\boldsymbol\alpha\boldsymbol\beta'\) 中 \(\boldsymbol\alpha\)(调整速度)和 \(\boldsymbol\beta\)(协整向量)的含义,以及 \(\mathrm{Rank}(\boldsymbol\Pi)\) 的三种情形。
- 掌握 Johansen 方法:偏回归、广义特征值、迹检验与最大特征值检验,知道确定项的五种设定会影响临界值。
- 能用 Engle–Granger 两步法和 Johansen 方法检验一对股票是否协整,并从 VECM 推出价差的均值回复速度与半衰期。
- 掌握 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):
AR 矩阵的迹为 1、行列式为 \(0.25-0.25=0\),所以特征值为 0 和 1——有一个单位根,系统非平稳。左乘 AR 多项式的伴随矩阵可以算出
即每个分量单独看都是 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}\) 得
变换后的两个分量不耦合:\(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\) 平稳,右边的 \([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\))时:
\(\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 为
反过来,\(\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\) 奇异,分三种情形:
- \(\mathrm{Rank}(\boldsymbol\Pi)=0\):\(\boldsymbol\Pi=\boldsymbol 0\),无协整,直接对 \(\Delta\boldsymbol x_t\) 建 VAR(\(p-1\))。
- \(\mathrm{Rank}(\boldsymbol\Pi)=k\):没有单位根,\(\boldsymbol x_t\) 本身平稳,直接对水平建 VAR。
- \(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\) 是 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 的做法分三步。
第一步:偏回归(集中似然)。 把确定项和短期动态"剔除掉":
得残差 \(\hat{\boldsymbol u}_t\)(调整后的 \(\Delta\boldsymbol x_t\))和 \(\hat{\boldsymbol v}_t\)(调整后的 \(\boldsymbol x_{t-1}\))。由 Frisch–Waugh 定理,问题化为
第二步:广义特征值问题。 记 \(\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'\),求解
得 \(\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 得到。最大似然值满足
正交补的估计为 \(\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\),
最大特征值检验(maximum eigenvalue test):\(H_0:\mathrm{Rank}=m\) 对 \(H_a:\mathrm{Rank}=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:
读法:期限利差偏离均衡时,主要由 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)给出
\(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=(\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。主要结论:
- 中间区制 \(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)——证实门限协整,而且是现货在修正。
- \(\Delta f_t\) 在三个区制都负依赖于 \(\Delta f_{t-1}\)(−0.085、−0.039、−0.041),与第 05 章的买卖价反弹一致。
- \(\Delta s_t\) 方程中期货的多个滞后收益高度显著:期货流动性更好,期货领先现货(价格发现)。
8.11 配对交易
8.11.1 理论框架
配对交易(pairs trading)是一种市场中性策略,这里讨论的是基于协整的统计套利版本(延伸阅读 Vidyamurthy 2004;Pole 2007)。核心是相对定价:按套利定价理论(APT),风险特征相近的两只股票应有相近的收益;若(适当缩放后的)价格出现差距,可能一只被高估、一只被低估,于是卖高买低,等待错误定价修正。两只股票的"真实价值"并不重要,重要的是它们的相对位置,这个差距称为价差(spread)。
令 \(p_{it}=\ln P_{it}\) 为随机游走。若两只股票由共同成分驱动,则存在 \(\gamma\) 使
单位根平稳、围绕 \(\mu_w=E(w_t)\) 均值回复,并满足误差修正形式
收益依赖上期对长期均衡的偏离。若价差偏高(\(w_{t-1}>\mu_w\)),股票 1 应跌、股票 2 应涨,所以**\(\alpha_1<0\)、\(\alpha_2>0\),二者异号**。
组合收益等于价差增量。 做多 1 股股票 1、做空 \(\gamma\) 股股票 2,从 \(t\) 到 \(t+i\) 的收益(对数价格意义下)为
与 \(\mu_w\) 无关。这一行公式是配对交易的全部会计学。
半衰期。 由 (8.45),
即价差是系数 \(\rho_w=1+\alpha_1-\gamma\alpha_2\) 的 AR(1)。偏离衰减一半所需的期数为
\(\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 两步)。 回归得
残差围绕 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 为
协整向量 \((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\)。作者强调,更真实的做法应在样本外实施。
选对配对是关键。 应选风险因子相近的股票,用金融理论指导筛选,而不是在成千上万对股票中盲目搜索协整(那样会产生大量伪协整)。
量化实战
应用场景与实务要点
配对交易的完整流水线。
- 候选池:同行业、同产业链、同一公司的不同上市地(A/H 股、本地股与 ADR)、ETF 与成分股篮子、同一商品的不同交割月。经济逻辑先行。
- 形成期(如过去 1–2 年):对数价格各自做 ADF 确认 I(1);用 Engle–Granger(OLS 求 \(\gamma\) + EG 临界值)或 Johansen 检验协整;估计 VECM,确认 \(\alpha_1,\alpha_2\) 异号,计算半衰期。半衰期太长(数月)资金效率低,太短(1–2 天)可能只是买卖价反弹。
- 交易期(样本外):用形成期的 \(\gamma,\mu_w,\sigma_w\) 构造价差和 z 分数,按 \(\mu_w\pm\Delta\) 开平仓,\(\Delta\) 由成本 \(\eta\) 和半衰期共同决定。
- 风险控制:协整关系可能断裂(并购、业务转型、监管事件),要设置时间止损(持仓超过 3–4 个半衰期未回复即平仓)和幅度止损;滚动重估 \(\gamma\) 并监控残差 ADF;用第 10 章的时变协方差动态调整价差波动率估计。
- 执行与成本:两条腿要同时成交以控制腿差风险;卖空约束(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)与原书 Rca.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)\) |
练习
基础
- 验证 (8.31) 的 AR 矩阵特征值为 0 和 1,并验证 \([0.5,1.0]\boldsymbol x_t\) 在 (8.32) 中是白噪声。
- 对 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\)。
- 用 BHP/VALE 的估计值 \(\alpha=(-0.0671,0.0263)'\)、\(\gamma=0.7177\) 计算价差的 AR 系数和半衰期。 提示:\(\rho_w\approx0.914\),半衰期约 7.7 天。
- 解释为什么对 OLS 残差做 ADF 检验不能使用普通 DF 临界值。
- 一次配对交易成本 \(\eta=0.6\%\),价差标准差 4%。按 Tsay 规则,\(\Delta\) 至少要多大?若 \(\Delta=1\sigma\),按正态近似,价差偏离超过 \(\Delta\) 的时间比例约为多少? 提示:\(\Delta>0.3\%\);\(\Delta=4\%\) 时比例约 32%。
进阶
- 证明在 8.8.1 节的二元 VAR(1) 中,若 \(\alpha_1=\alpha_2=0\),则 \(w_t\) 是单位根过程;并解释 \(\alpha\) 两个分量异号对均值回复速度的影响。
- 修改示例一:在交易期中段(第 1100 天)让真实 \(\gamma\) 从 0.72 跳到 0.60,观察固定 \(\gamma\) 策略的亏损,并实现"滚动 250 天重估 \(\gamma\) + 持仓超过 3 个半衰期强制平仓"的改进版本。
- 在示例一中改变成本 \(\eta\in\{0.002,0.004,0.008,0.012\}\) 和 \(\Delta\in\{0.5,1,1.5,2\}\sigma_w\),画出两种平仓规则的总收益热力图,找出最优组合并解释。
- (原书习题 8.4)以期限利差 \(s_t=r_{10,t}-r_{1,t}\) 为门限变量,检验 1 年与 10 年期利率的门限协整,并建立多元门限模型。
- (原书习题 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。)