量化交易中文教材

第 04b 章 非线性检验、建模与预测

本章对应 Tsay 原书第 4 章后半(4.2–4.5 节及附录)。第 04a 章介绍了各种非线性模型,本章回答三个实践问题:数据里到底有没有非线性?如果有,按什么流程建模?非线性模型怎么做多步预测,又如何公平地评估它是否真的比线性模型好?

学习目标

  1. 掌握非参数检验(McLeod–Li、双谱、BDS)和参数检验(RESET、Keenan、Tsay 的 Ori-F、门限检验)的构造思路,知道每种检验对哪类非线性有功效。
  2. 理解门限检验中"冗余参数只在备择假设下出现"的问题,以及 TAR-F 检验如何用排序自回归绕开它。
  3. 能按"线性模型 → 残差检验 → 选模型族 → 估计 → 诊断"的流程建立非线性模型。
  4. 会用参数自助法做非线性模型的多步预测,并解释为什么不能把条件均值直接代回非线性函数。
  5. 会用方向型(\(2\times2\) 列联表 \(\chi^2\))、幅度型(MSE/MAD/MAPE)和分布型(PIT + KS)三类指标评估预测,并理解"状态依赖的预测优势"。

读前导读

这一章在解决什么问题

第 04a 章给了一堆非线性模型,这一章回答使用它们之前和之后的三个问题:数据里真有非线性吗?多步预测怎么做?怎么证明非线性模型真的更好?

这三个问题你在 CFA 里都见过对应的线性版本。第一个问题对应 CFA 二级回归诊断:拟合完回归后检查残差是否有序列相关(Durbin–Watson)、是否异方差(Breusch–Pagan)。本章做的是同一件事,只是要检查的「病」换成了非线性:先拟合 AR 模型,再看残差里有没有线性模型解释不了的结构。大部分参数检验(RESET、Ori-F、TAR-F)都是你熟悉的嵌套模型 F 检验:比较「受限模型」和「加了额外项的模型」的残差平方和,看额外项能否显著降低 SSR。

第二个问题的核心是一个不等式 \(E[g(X)]\neq g(E[X])\)。期权定价里你早就见过:期权的期望收益不等于「把期望股价代入收益函数」,因为收益函数是非线性的(凸的)。非线性时间序列的多步预测也一样,必须模拟很多条路径再取平均,这就是参数自助法,本质上是蒙特卡洛模拟。

第三个问题对应投资绩效评估。CFA 教你别只看收益,要看风险调整后的指标;这里教你别只看胜率,要看方向预测和实际是否真的相关;别只看全样本平均误差,要按市场状态分组看。

需要先想起来的数学

1. F 检验与残差平方和。 \(F=\dfrac{(SSR_0-SSR_1)/g}{SSR_1/(n-k)}\),分子是「加入 \(g\) 个新变量后每个变量平均减少的 SSR」,分母是「完整模型的残差方差估计」。比值大说明新变量有用。CFA 二级的多元回归联合检验就是它。见 第 00 册第 07 章 概率中的分析工具。

2. 卡方分布与列联表。 若两个分类变量独立,则「实际频数 − 期望频数」的标准化平方和近似服从 \(\chi^2\) 分布。期望频数 = 行合计 × 列合计 / 总数。\(2\times2\) 表自由度为 1,5% 临界值 3.84。

3. Jensen 不等式。 若 \(g\) 是凸函数,则 \(E[g(X)]\ge g(E[X])\);凹函数反过来。例:\(X\) 等概率取 0 或 2,\(g(x)=x^2\),\(E[g(X)]=2\),\(g(E[X])=1\)。非线性函数一般两者不等。见 第 00 册第 07 章 概率中的分析工具(常用不等式部分)。

4. 累积分布函数与分位数。 \(F(x)=P(X\le x)\),其反函数 \(F^{-1}(u)\) 就是 \(u\) 分位数。VaR 就是收益分布的一个分位数。PIT 检验要用到「把观测值代入自己的 CDF」这一操作。

5. 傅里叶变换(只需知道是什么)。 把一个关于「时间滞后」的函数改写成关于「频率」的函数,信息不变、视角不同。谱密度是自协方差的傅里叶变换,双谱是三阶矩的傅里叶变换。本章只用到结论,不需要会算。见 第 00 册第 03 章 积分。

怎么读这一章

核心必读:4.8 开头的「先去线性再检验」原则、4.8.1 的 McLeod–Li 和 BDS(理解它们检测什么即可)、4.8.2 的 RESET 和 Ori-F(就是加项 F 检验)、4.8.3 的结果表及「厚尾不等于非线性」、4.10 全部(预测与评估是量化工作中最常用的部分)、4.11 末尾的「状态依赖优势」结论。可以第一次跳过的:双谱检验的公式 (4.39)、BDS 渐近方差 \(\sigma_k^2\) 的表达式、TAR-F 的递归最小二乘细节(知道「排序后变成变点问题」这个思路即可)。建议顺序:4.8.1 → 4.8.2 → 4.8.3 → 4.10 → 4.9 → 4.11。


4.8 非线性检验

非线性的形式千变万化,不存在在所有情形下都最优的检验。这一节的检验分两类:非参数检验不假设备择模型的形式,适用面广但功效分散;参数检验针对某种具体的非线性(如二次项、门限),对该类备择功效高。

一个贯穿始终的原则:先去除线性相依,再检验残差。否则线性 AR 结构会被误判为"非 iid"。

4.8.1 非参数检验

基本思想:线性原假设下,正确设定的线性模型残差应当独立;任何对独立性的偏离都提示模型不足。

残差平方的 Q 统计量(McLeod & Li 1983)。 对 ARMA(\(p,q\)) 残差的平方计算 Ljung–Box 统计量

\[Q(m)=T(T+2)\sum_{i=1}^{m}\frac{\hat\rho_i^2(a_t^2)}{T-i}\ \sim\ \chi^2_{m-p-q}.\]

它主要检测条件异方差,与 Engle 的 ARCH-LM 检验渐近等价(第 03a 章 3.3 节)。自由度扣除 \(p+q\) 是因为用的是估计出来的残差。

双谱检验(bispectral test)。 双谱是三阶矩的 Fourier 变换。对线性序列 (4.1),三阶矩为 \(c(u,v)=g\sum_k\psi_k\psi_{k+u}\psi_{k+v}\)(\(g=E a_t^3\)),其双谱为

\[b_3(w_1,w_2)=\frac{g}{4\pi^2}\Gamma[-(w_1+w_2)]\Gamma(w_1)\Gamma(w_2),\qquad \Gamma(w)=\sum_{u\ge0}\psi_ue^{-iwu}.\]

与谱密度 \(p(w)=\frac{\sigma_a^2}{2\pi}|\Gamma(w)|^2\) 组合,得到

\[\frac{|b_3(w_1,w_2)|^2}{p(w_1)p(w_2)p(w_1+w_2)}=\text{常数(对所有 }(w_1,w_2)\text{)}.\tag{4.39}\]

所以检验"标准化双谱是否处处为常数"就是检验线性;若进一步为零(\(g=0\)),则与高斯性相容。双谱检验需要较大样本才有可接受的功效。

白话解释:不必会算双谱,抓住思路即可。线性过程的所有统计性质都由同一组权重 \(\psi_k\) 和冲击 \(a_t\) 的分布决定。谱密度(二阶矩的频域版本)里出现 \(|\Gamma(w)|^2\),双谱(三阶矩的频域版本)里出现三个 \(\Gamma\) 的乘积。把双谱的平方除以三个谱密度,所有 \(\Gamma\) 恰好约掉,只剩下与 \(g^2/\sigma_a^6\) 成比例的常数,也就是冲击偏度的平方。所以对线性序列,这个比值不随频率变化;比值随频率变化就说明三阶结构不能由「同一组线性权重」解释,即非线性。\(i\) 是虚数单位,\(e^{-iwu}\) 是频率为 \(w\) 的周期波,傅里叶变换就是看序列中各个频率的成分有多强。

BDS 检验(Brock, Dechert & Scheinkman 1987)。 它直接检验 iid,借用了混沌分析中的关联积分(correlation integral)。构造序列的 \(k\)-历史 \(\mathbf X_t^k=(x_t,\dots,x_{t+k-1})'\),定义

\[C_k(\delta)=\lim\frac{2}{T_k(T_k-1)}\sum_{i<j}\mathbb 1\big(\|\mathbf X_i^k-\mathbf X_j^k\|_\infty<\delta\big),\]

即 \(k\) 维空间中距离小于 \(\delta\) 的点对比例。若 \(x_t\) iid,\(k\)-历史在 \(k\) 维空间中"没有模式",于是 \(C_k(\delta)=[C_1(\delta)]^k\)。直观例子:\([0,1]\) 上 iid 均匀分布,2-历史落入方块 \([a,b]^2\) 的概率应等于 \(x_t\) 落入 \([a,b]\) 概率的平方。

白话解释:\(\|\cdot\|_\infty\) 是「各坐标差的绝对值取最大」,两个 \(k\)-历史距离小于 \(\delta\) 意味着它们每一个对应分量都相差不到 \(\delta\)。若 iid,「第 1 个分量接近」「第 2 个分量接近」……这 \(k\) 个事件相互独立,概率相乘,所以 \(C_k=C_1^k\)。数值例子:若随机两天收益相差不到 \(\delta\) 的概率 \(C_1=0.4\),那么 iid 下连续三天的走势片段两两「形状相似」的概率应是 \(0.4^3=0.064\)。如果实际算出 0.10,说明相似的走势片段比纯随机时多,序列中存在可重复的模式。这里的 \(\lim\) 是让样本量 \(T\to\infty\) 时的极限,实际用样本比例代替。

金融直觉:这和技术分析「历史会重演」的说法相反相成。BDS 检验的正是「相似的 \(k\) 日形态是否比随机情形下更常出现」。但它的原假设是 iid,波动聚集也会让「平静的几天」扎堆、「剧烈的几天」扎堆,同样推高 \(C_k\)。所以 BDS 显著只能说明「有某种依赖」,不能说明「形态可用于预测方向」。

BDS 统计量

\[D_k(\delta,T)=\frac{\sqrt T\{C_k(\delta,T)-[C_1(\delta,T)]^k\}}{\sigma_k(\delta,T)}\ \xrightarrow{d}\ N(0,1),\tag{4.41}\]

其中渐近方差

\[\sigma_k^2(\delta)=4\Big[N^k+2\sum_{j=1}^{k-1}N^{k-j}C^{2j}+(k-1)^2C^{2k}-k^2NC^{2k-2}\Big],\]

\(C=\int[F(z+\delta)-F(z-\delta)]dF(z)\),\(N=\int[F(z+\delta)-F(z-\delta)]^2dF(z)\)。(精读笔记据抽取文本把 \(N^k\)、\(N^{k-j}\) 记作下标,此处按原论文改为幂次。)使用要点:先用线性模型去除线性相依再做 BDS;结果可能对 \(\delta\)、\(k\) 敏感,常取 \(\delta\) 为残差标准差的 0.5–2 倍、\(k=2,\dots,5\)。BDS 对任何偏离 iid 的情形都有功效,包括条件异方差,所以"BDS 显著"不能说明是均值非线性。

4.8.2 参数检验

RESET 检验(Ramsey 1969)。 线性 AR(\(p\)):\(x_t=\mathbf X_{t-1}'\boldsymbol\phi+a_t\),\(\mathbf X_{t-1}=(1,x_{t-1},\dots,x_{t-p})'\)。

  1. OLS 得拟合值 \(\hat x_t\)、残差 \(\hat a_t\) 和 \(SSR_0=\sum\hat a_t^2\);

  2. 把 \(\hat a_t\) 对 \(\mathbf X_{t-1}\) 和 \(\mathbf M_{t-1}=(\hat x_t^2,\dots,\hat x_t^{s+1})'\) 回归,得 \(SSR_1\);

  3. \[F=\frac{(SSR_0-SSR_1)/g}{SSR_1/(T-p-g)},\qquad g=s+p+1,\tag{4.44}\]

    线性、正态下服从 \(F(g,T-p-g)\)。

\(\hat x_t\) 的各次幂之间以及与 \(\mathbf X_{t-1}\) 高度共线,实践中常用 \(\mathbf M_{t-1}\) 的主成分。

Keenan (1985) 检验只用 \(\hat x_t^2\),并把第二步拆成两步以去除共线:先把 \(\hat x_t^2\) 对 \(\mathbf X_{t-1}\) 回归得残差 \(\hat u_t\),再把 \(\hat a_t\) 对 \(\hat u_t\) 回归,检验系数为零。

Ori-F 检验(Tsay 1986)。 为提高功效,把 \(\mathbf M_{t-1}\) 换成所有二次项与交叉项:\(\mathbf M_{t-1}=\operatorname{vech}(\mathbf X_{t-1}\mathbf X_{t-1}')\)(只取滞后变量部分),例如 \(p=2\) 时 \(\mathbf M_{t-1}=(x_{t-1}^2,x_{t-1}x_{t-2},x_{t-2}^2)'\),维数 \(g=p(p+1)/2\)。检验就是回归

\[x_t=\mathbf X_{t-1}'\boldsymbol\phi+\mathbf M_{t-1}'\boldsymbol\alpha+e_t\]

中 \(\boldsymbol\alpha=0\) 的偏 F 检验,线性原假设下服从 \(F(g,\,T-p-g-1)\)。

推导拆解:为什么加二次项就能检验非线性?设真实条件均值是某个光滑函数 \(f(x_{t-1},\dots,x_{t-p})\)。在 0 附近做二阶泰勒展开:

\[f(\mathbf x)\approx f(\mathbf 0)+\sum_i\frac{\partial f}{\partial x_i}x_i+\frac12\sum_{i,j}\frac{\partial^2 f}{\partial x_i\partial x_j}x_ix_j.\]
常数项和一阶项就是线性 AR;二阶项正是 \(x_{t-i}x_{t-j}\) 这些平方与交叉项。线性原假设等价于「所有二阶偏导为零」,也就是 \(\boldsymbol\alpha=0\)。所以 Ori-F 是「用二阶泰勒近似去探测非线性」,对那些近似二次的非线性最有效。\(\operatorname{vech}\) 是把对称矩阵下三角(含对角线)的元素按列拉成一个向量,避免 \(x_{t-1}x_{t-2}\) 和 \(x_{t-2}x_{t-1}\) 重复计入,因此个数是 \(p(p+1)/2\)。RESET 只用 \(\hat x_t\) 的幂,相当于只沿「拟合值」这一个方向检查弯曲,自由度少但可能漏掉其他方向的非线性。 Luukkonen, Saikkonen & Teräsvirta (1988) 再加入三次项,得到对平滑转移备择更有功效的 LST 检验。

门限检验。 当备择是两区制 SETAR 时,可以构造专门的检验:

\[H_0:\ x_t=\phi_0+\sum_{i=1}^{p}\phi_ix_{t-i}+a_t;\qquad H_a:\ x_t=\begin{cases}\phi_0^{(1)}+\sum\phi_i^{(1)}x_{t-i}+a_{1t}, & x_{t-d}<r_1,\\ \phi_0^{(2)}+\sum\phi_i^{(2)}x_{t-i}+a_{2t}, & x_{t-d}\ge r_1.\end{cases}\]
  • 似然比检验。 给定 \(r_1\),原假设和备择下的似然都容易算,对数似然比 \(l(r_1)\) 是 \(r_1\) 的函数。麻烦在于:原假设下根本没有门限,\(r_1\) 无定义——它是只在备择下出现的冗余参数(nuisance parameter)。于是 \(\sup_{v<r_1<u}l(r_1)\) 的渐近分布不再是 \(\chi^2\),临界值依赖 \([v,u]\) 的选择,通常靠模拟得到(Chan 1991;Andrews & Ploberger 1994)。

    白话解释:\(\sup\)(上确界)在这里就是「在区间内取最大值」。问题出在「取最大」:对每个候选门限都做一次似然比检验,再挑最显著的那一个,相当于做了几十次检验只报告最好的结果。即使数据真是线性的,总有某个门限碰巧让似然比偏大,所以 \(\sup l(r_1)\) 在原假设下系统性地比 \(\chi^2\) 大,用 \(\chi^2\) 临界值会过度拒绝。这和回测中「试了 100 个参数只报告最好的夏普」是同一个数据挖掘问题,解决办法也类似:用模拟得到「取最大之后」的分布,临界值相应提高。

  • TAR-F 检验(Tsay 1989)。 关键洞察是:把回归方程按门限变量 \(x_{t-d}\) 的大小重新排序,SETAR 就变成一个变点(change point)问题。设 \(x_{(1)}\le\dots\le x_{(T-d)}\) 为门限变量的次序统计量,写成排序自回归(arranged autoregression)

    \[x_{(j)+d}=\beta_0+\sum_{i=1}^{p}\beta_ix_{(j)+d-i}+a_{(j)+d},\tag{4.47}\]

    \(x_{(j)}<r_1\) 时 \(\beta=\phi^{(1)}\),否则 \(\beta=\phi^{(2)}\)。排序不改变 \(x_t\) 对其滞后的依赖关系,只是把方程按门限变量从小到大排列。检验步骤:

    1. 用前 \(m\) 个排序方程(如 \(m=30\))做 OLS;
    2. 对第 \(m+1\) 个方程计算预测残差并标准化;
    3. 用递归最小二乘把新方程纳入,更新估计;重复直到用完数据;
    4. 把标准化预测残差 \(\hat e\) 对回归元 \((1,x_{(m+j)+d-1},\dots,x_{(m+j)+d-p})\) 回归,计算常规 F 统计量。

    线性原假设下,排序后的回归没有变点,标准化预测残差近似 iid、与回归元不相关,F 统计量渐近服从 \(F(p+1,\,T-d-m-p)\)。如果存在门限,越过门限后预测残差会系统性地偏离,并与回归元相关。

    白话解释:举例说明「排序」。原始方程按时间排列:第 5 期方程(门限变量 \(x_4=0.3\))、第 6 期(\(x_5=-1.2\))、第 7 期(\(x_6=0.9\))……按门限变量从小到大重排后,顺序变成第 6 期、第 5 期、第 7 期……每个方程本身没变(左边仍是 \(x_t\),右边仍是它自己的滞后),只是换了「出场顺序」。重排之后,所有门限变量小于 \(r_1\) 的方程排在前面、大于 \(r_1\) 的排在后面,门限就成了这个新序列中的一个「断点」。接下来的做法类似于结构突变的 CUSUM 检验:用前面的方程估计系数,逐个预测后面的方程;在断点之前预测误差是纯噪声,越过断点后系数变了,预测误差开始带有规律。整个过程不需要知道断点在哪里,因此没有冗余参数问题。

    TAR-F 的优点:不需要知道门限 \(r_1\),不受冗余参数问题困扰,也不依赖区制个数。缺点:若真实模型确实是新息分布已知的两区制 SETAR,它的功效不如似然比检验。

4.8.3 应用:模拟序列与股票收益

原书对 5 个序列做检验(对真实序列先拟合 AR 模型取残差;BDS 取 \(k=2,\dots,5\);F 检验延迟 \(d=1\)):

数据 Q(5) Q(10) BDS (\(\delta=1.5\hat\sigma\), \(k=2\ldots5\)) Ori-F TAR-F
模拟 \(N(0,1)\) 3.2 6.5 −0.32, −0.14, −0.15, −0.33 1.13 0.87
模拟 \(t_6\) 0.9 1.7 −0.87, −1.18, −1.56, −1.71 0.69 0.81
CRSP 等权指数残差 2.9 4.9 9.94, 11.72, 12.83, 13.65 5.05 6.77
CRSP 市值加权指数残差 1.0 9.8 8.61, 9.88, 10.70, 11.29 4.95 6.85
IBM 残差 0.6 7.1 4.96, 6.09, 6.68, 6.82 1.32 1.51

结论:Ljung–Box 统计量确认各残差无序列相关;模拟序列的 BDS 和 F 检验都不显著;真实收益的 BDS 高度显著,F 检验对两个指数显著、对 IBM 不显著。总体而言,股票收益是非线性的;但 IBM 的非线性可能主要来自条件异方差(BDS 显著而 Ori-F、TAR-F 不显著),而指数的非线性还涉及均值。注意 \(t_6\) 序列虽然厚尾,但 iid,所以检验不显著——厚尾不等于非线性。


4.9 建模流程

非线性建模不可避免地带有主观判断,但有一个可遵循的一般流程:

  1. 先建立充分的线性模型,在其残差上做非线性检验。金融序列常用残差平方的 Ljung–Box 统计量和 ARCH-LM 检验探测条件异方差,用 4.8 节的其他检验探测均值非线性。
  2. 非线性显著时选模型族。选择取决于经验与问题本身:有明确门限机制(如政策干预)选 TAR;有隐状态叙事(如经济周期)选 MSA;只是波动不对称就选 TAR-GARCH/EGARCH。
  3. 波动率模型:ARCH 阶数可由平方序列 PACF 确定;GARCH/EGARCH 通常只考虑 (1,1)、(1,2)、(2,1) 等低阶。
  4. TAR 模型:按 Tong (1990)、Tsay (1989, 1998) 的程序选延迟 \(d\)、门限和各区制阶数。
  5. 样本足够大时,可先用 FAR、MARS 等非参数方法探索,再确定参数形式。
  6. 在竞争模型间选择:信息准则(AIC),或 Chen, McCulloch & Tsay (1997) 的广义几率比。
  7. 用于预测前必须做模型检验:标准化残差及其平方无序列相关,必要时对残差再做非线性检验(第 05 章的门限 ACD 就是这样发现的)。

4.10 非线性模型的预测

4.10.1 为什么不能"代入迭代"

线性模型的多步预测可以递推:把 1 步预测值代回模型就得到 2 步预测。非线性模型这样做是错的,因为

\[E[g(X)]\ne g(E[X]).\]

以式 (4.8) 的 TAR 为例:2 步预测需要 \(E[f(x_{T+1})\mid F_T]\),而 \(x_{T+1}\) 可能落在任一区制,代入法却默认它就等于其条件均值、落在确定的区制。本章代码中,从 \(x_T=-0.8\) 出发,3 步预测的自助法均值为 0.675,代入法给出 0.300,差了一倍多。

推导拆解:用 (4.8) 手算 2 步预测,看差距从哪里来。 第一步:\(x_T=-0.8<0\),所以 \(x_{T+1}=-1.5\times(-0.8)+a_{T+1}=1.2+a_{T+1}\),即 \(x_{T+1}\sim N(1.2,1)\)。1 步预测为 1.2,没有问题。 第二步:\(x_{T+2}=\phi(x_{T+1})x_{T+1}+a_{T+2}\),\(\phi\) 取 0.5 或 \(-1.5\) 取决于 \(x_{T+1}\) 的符号。代入法认为 \(x_{T+1}=1.2>0\),得 \(0.5\times1.2=0.6\)。 第三步:正确做法是对 \(x_{T+1}\) 的分布求期望。\(x_{T+1}<0\) 的概率是 \(\Phi(-1.2)\approx11.5\%\),这部分路径会被 \(-1.5\) 翻成正值。对 \(X\sim N(\mu,1)\) 有 \(E[X\mathbb 1(X\ge0)]=\mu\Phi(\mu)+\varphi(\mu)\)、\(E[X\mathbb 1(X<0)]=\mu[1-\Phi(\mu)]-\varphi(\mu)\)(\(\Phi\)、\(\varphi\) 为标准正态 CDF 与密度)。代入 \(\mu=1.2\):前者 \(\approx1.256\),后者 \(\approx-0.056\)。于是

\[E(x_{T+2}\mid F_T)=0.5\times1.256+(-1.5)\times(-0.056)\approx0.712,\]
与代码中自助法的 0.708 一致,而代入法的 0.6 低估了。差额来自那 11.5% 落入负区制的路径,代入法把它们完全忽略了。

金融直觉:这和期权定价完全一样。看涨期权价值是 \(E[\max(S_T-K,0)]\),不是 \(\max(E[S_T]-K,0)\);平值期权后者为零,前者却为正。只要函数在某处「拐弯」,不确定性本身就会改变期望值。

4.10.2 参数自助法

参数自助法(parametric bootstrap)的前提是模型(动态结构和新息分布)已充分检验,并把估计参数当作已知。设预测原点 \(T\)、步长 \(\ell\):

  1. 从设定的新息分布中抽一个新息;
  2. 用模型、数据和已模拟的 \(x_{T+1},\dots,x_{T+i-1}\) 计算 \(x_{T+i}\);
  3. 重复直到 \(x_{T+\ell}\),得到一条路径;
  4. 重复 \(M\) 次(原书用 \(M=3000\)),得 \(\{x_{T+\ell}^{(j)}\}_{j=1}^{M}\)。

点预测取样本均值;这 \(M\) 个实现同时构成 \(x_{T+\ell}\) 的经验预测分布,可给出区间和概率预测。

4.10.3 预测评估

评估分三类:

  • 方向型(directional):明天涨还是跌;
  • 幅度型(magnitude):年末指数点位是多少;
  • 分布型(distributional):到年末上涨至少 10% 的概率是多少。

数据分为估计子样本和预测子样本;也可用滚动预测(rolling forecasting):每次把预测原点前移一步,把新数据纳入估计。这就是量化中的 walk-forward 回测。

方向型度量。 把 \(m\) 个预测整理成 \(2\times2\) 列联表:

预测涨 预测跌 合计
实际涨 \(m_{11}\) \(m_{12}\) \(m_{10}\)
实际跌 \(m_{21}\) \(m_{22}\) \(m_{20}\)
合计 \(m_{01}\) \(m_{02}\) \(m\)

检验统计量

\[\chi^2=\sum_{i=1}^{2}\sum_{j=1}^{2}\frac{(m_{ij}-m_{i0}m_{0j}/m)^2}{m_{i0}m_{0j}/m}\ \sim\ \chi^2_1,\]

它检验"预测方向与实际方向独立"。\(\chi^2\) 大说明模型优于随机猜测。对第 04a 章例 4.8 的 8–4–1 网络,列联表为:实际涨 (12, 2),实际跌 (8, 2)。\(\chi^2=0.137\),p 值 0.71——网络预测涨还行,预测跌很差,整体不显著优于随机游走。

推导拆解:手算这个 \(\chi^2\)。行合计:实际涨 14、实际跌 10;列合计:预测涨 20、预测跌 4;总数 24。 第一步:若预测与实际独立,期望频数 = 行合计 × 列合计 / 总数:\(14\times20/24=11.67\),\(14\times4/24=2.33\),\(10\times20/24=8.33\),\(10\times4/24=1.67\)。 第二步:实际与期望的差在 \(2\times2\) 表中绝对值都相同,为 \(|12-11.67|=0.33\)。 第三步:\(\chi^2=0.33^2\times(1/11.67+1/2.33+1/8.33+1/1.67)\approx0.111\times1.234\approx0.137\)。 自由度为 1,因为行列合计固定后,只要填了一个格子,其余三个就确定了。0.137 远小于 3.84,所以不能拒绝「预测与实际独立」。直观上:网络 24 次里预测涨 20 次,在实际涨的 14 天里预测涨 12 次(86%),在实际跌的 10 天里也预测涨 8 次(80%),说明它基本只是「总是喊涨」。

注意:高胜率不等于有预测能力。如果市场 60% 的时间上涨,永远预测"涨"也有 60% 胜率,但 \(\chi^2=0\)。列联表检验正好排除了这种情况。

幅度型度量。

\[\text{MSE}(\ell)=\frac1m\sum_{j=0}^{m-1}[x_{T+\ell+j}-x_{T+j}(\ell)]^2,\quad \text{MAD}(\ell)=\frac1m\sum|x_{T+\ell+j}-x_{T+j}(\ell)|,\quad \text{MAPE}(\ell)=\frac1m\sum\left|\frac{x_{T+j}(\ell)}{x_{T+j+\ell}}-1\right|.\]

不同步长可能选出不同模型。MAPE 在真实值接近 0 时会爆炸,不适合收益率序列。

分布型度量。 设 \(u_T(\ell)\) 是实际观测 \(x_{T+\ell}\) 在事前预测分布中的分位(即概率积分变换 PIT)。模型充分时 \(\{u_{T+j}(\ell)\}\) 应是 \(U[0,1]\) 的样本,可用 Kolmogorov–Smirnov 检验。参数自助法得到的经验分布正好可以计算 PIT。这一思想在第 07a 章的 VaR 回测中还会出现。

推导拆解:为什么 PIT 应该均匀分布?设 \(X\) 的 CDF \(F\) 连续且严格递增,令 \(U=F(X)\)。对任意 \(u\in(0,1)\):

\[P(U\le u)=P(F(X)\le u)=P(X\le F^{-1}(u))=F(F^{-1}(u))=u.\]
第二个等号用了「\(F\) 单调递增,两边同时取反函数不等号方向不变」,第三个等号就是 CDF 的定义。\(P(U\le u)=u\) 正是 \(U[0,1]\) 的 CDF。

金融直觉:把它当作「所有分位数的 VaR 回测同时做」。若模型说今天收益落在自身预测分布 5% 分位以下的概率是 5%,那么长期下来 PIT 小于 0.05 的天数应占 5%;PIT 小于 0.5 的天数应占 50%,依此类推。如果 PIT 在 0 和 1 附近扎堆,说明模型低估了尾部(厚尾没建好);如果在 0.5 附近扎堆,说明模型高估了波动。KS 检验就是比较 PIT 的经验 CDF 与对角线 \(y=u\) 的最大偏离。


4.11 应用:美国季度失业率

数据:美国季度民用失业率(季调),1948–1993。它逆周期波动,并且上升快、下降慢。令 \(\Delta x_t=x_t-x_{t-1}\)。

线性基准(季节 ARIMA):

\[(1-0.31B^4)(1-0.65B)\Delta x_t=(1-0.78B^4)a_t,\qquad\hat\sigma_a^2=0.090.\]

非线性检验(对 \(\Delta x_t\) 用 AR(5)):Ori-F 2.80 (p=0.0007),LST 2.83 (p=0.0002),TAR-F(\(d=1,2,3,4\))分别 2.41 (0.030)、2.16 (0.050)、2.84 (0.012)、2.98 (0.009),全部拒绝线性;对 \(p=2,\dots,10\) 也都拒绝。

TAR 模型(Montgomery et al. 1998):

\[\Delta x_t=\begin{cases}0.01+0.73\Delta x_{t-1}+0.10\Delta x_{t-2}+a_{1t}, & \Delta x_{t-2}\le0.1,\\ 0.18+0.80\Delta x_{t-1}-0.56\Delta x_{t-2}+a_{2t}, & \text{否则}.\end{cases}\]

门限变量是两季度前的变化。区制 1(失业率下降或小幅上升)经济稳定,滞后 2 系数不显著,几乎是 AR(1)。区制 2(失业率跳升)对应收缩期,是带正常数的 AR(2),其特征多项式有一对复根,意味着周期性和较高的转折概率——所以失业率大幅上升的阶段较短,推论是美国经济收缩期比扩张期短。

马尔可夫转换模型:

\[\Delta x_t=\begin{cases}-0.07+0.38\Delta x_{t-1}-0.05\Delta x_{t-2}+\epsilon_{1t}, & s_t=1,\\ 0.16+0.86\Delta x_{t-1}-0.38\Delta x_{t-2}+\epsilon_{2t}, & s_t=2,\end{cases}\]

状态 1、2 的条件均值分别为 −0.10(扩张)和 0.31(收缩),转移概率 \(P(s_t=2\mid s_{t-1}=1)=0.084\),\(P(s_t=1\mid s_{t-1}=2)=0.126\)。状态 2 与 TAR 的区制 2 类似。

滚动预测比较:从原点 \(T=83\)(1968Q2)开始,每次用截至原点的数据重估三个模型,做 1–5 季度预测(非线性模型用参数自助法),原点逐季前移。相对 MSE(线性模型 = 1):

预测原点所处状态 模型 1 步 2 步 3 步 4 步 5 步
全部 TAR 1.00 1.04 0.99 0.98 1.03
全部 MSA 1.19 1.39 1.40 1.45 1.61
收缩期 TAR 0.85 0.91 0.83 0.72 0.72
收缩期 MSA 0.97 1.03 0.96 0.86 1.02
扩张期 TAR 1.06 1.13 1.10 1.15 1.17
扩张期 MSA 1.31 1.64 1.73 1.84 1.87

线性模型的绝对 MSE(全部样本)为 0.08、0.31、0.67、1.13、1.54。偏差方面,全部样本中线性模型的平均预测误差为 0.03 到 0.33(系统性低估失业率上升),TAR 为 −0.10 到 −0.01,MSA 为 0.00 到 −0.12。

结论:

  1. 全样本平均来看,TAR 与线性模型 MSE 相近但偏差更小;MSA 的 MSE 最大、偏差最小。
  2. 原点在收缩期时,TAR 在 MSE 和偏差上都明显优于线性模型(4、5 步 MSE 降低 28%);MSA 也有改进但不如 TAR。
  3. 原点在扩张期时,线性模型最好。
  4. 非线性模型的价值集中在收缩期——恰恰是人们最需要预测的时候。

教学启示:非线性模型的优势往往是状态依赖的,总体平均指标可能把它掩盖掉。评估时应按状态分组。


量化实战

应用场景

  1. 信号的残差诊断。 线性因子模型或 AR 模型拟合后,对残差跑 McLeod–Li、BDS、Ori-F、TAR-F。若只有 McLeod–Li/BDS 显著,说明剩下的是波动结构,可用于风险模型而非收益预测;若 TAR-F 显著,值得去找门限型信号。
  2. 非线性多步预测与情景生成。 门限、状态转换模型的多步预测、预测区间、"未来 \(h\) 期内跌破某水平的概率"都应该用参数自助法模拟。
  3. 回测评估的三把尺子。 方向型:列联表 \(\chi^2\) 检验,防止被高胜率误导;幅度型:MSE/MAD,不要对收益用 MAPE;分布型:PIT + KS,检验预测分布是否校准,这也是 VaR/分位数模型回测的基础。
  4. 按状态分组评估。 因子 IC、策略夏普按高/低波动、涨/跌市分组统计。一个总体上平庸的模型,可能在危机中价值很大(4.11 节)。

Python 示例

代码实现 Ori-F 与 TAR-F 检验(基于排序自回归和递归最小二乘),并与 Ljung–Box、McLeod–Li、BDS 比较它们对三种模拟序列(线性 AR、TAR、GARCH)的反应;然后演示参数自助法预测与代入法的差别,复现原书方向预测的列联表检验,最后用 PIT + KS 评估分布预测。

import numpy as np
from scipy import stats
from statsmodels.tsa.stattools import bds
from statsmodels.stats.diagnostic import acorr_ljungbox

rng = np.random.default_rng(7)
T = 1000

def sim(kind, T=T, burn=300):
    x = np.zeros(T + burn); a = rng.standard_normal(T + burn); s2 = 1.0
    for t in range(2, T + burn):
        if kind == "AR":                       # 线性 AR(2)
            x[t] = 0.5*x[t-1] - 0.3*x[t-2] + a[t]
        elif kind == "TAR":                    # 式 (4.8)
            x[t] = (-1.5 if x[t-1] < 0 else 0.5)*x[t-1] + a[t]
        elif kind == "GARCH":                  # 均值线性、方差非线性
            s2 = 0.05 + 0.10*x[t-1]**2 + 0.85*s2
            x[t] = np.sqrt(s2)*a[t]
    return x[burn:]

def design(x, p):
    T = len(x)
    X = np.column_stack([np.ones(T-p)] + [x[p-i:T-i] for i in range(1, p+1)])
    return x[p:], X

def ori_f(x, p):
    """Tsay (1986) Ori-F:在 AR(p) 上加入所有二次项与交叉项,检验其联合显著性"""
    y, X = design(x, p)
    lags = X[:, 1:]
    M = np.column_stack([lags[:, i]*lags[:, j] for i in range(p) for j in range(i, p)])
    e0 = y - X @ np.linalg.lstsq(X, y, rcond=None)[0]
    Z = np.column_stack([X, M])
    e1 = y - Z @ np.linalg.lstsq(Z, y, rcond=None)[0]
    g, n = M.shape[1], len(y)
    F = ((e0@e0 - e1@e1)/g) / (e1@e1/(n - p - g - 1))
    return F, stats.f.sf(F, g, n - p - g - 1)

def tar_f(x, p, d=1, m=None):
    """Tsay (1989) TAR-F:按门限变量 x_{t-d} 排序做递归最小二乘,预测残差对回归元回归"""
    y, X = design(x, p)
    z = x[p-d:len(x)-d]
    idx = np.argsort(z, kind="stable")                 # 排序自回归
    y, X = y[idx], X[idx]
    n, k = X.shape
    m = m or max(30, n // 10)
    e_std = []
    for j in range(m, n):                              # 递归:用前 j 个排序样本预测第 j+1 个
        XtX_inv = np.linalg.inv(X[:j].T @ X[:j])
        b = XtX_inv @ X[:j].T @ y[:j]
        resid = y[:j] - X[:j] @ b
        s2 = resid @ resid / (j - k)
        f = y[j] - X[j] @ b
        e_std.append(f / np.sqrt(s2 * (1 + X[j] @ XtX_inv @ X[j])))
    e_std = np.array(e_std); Xr = X[m:]
    e1 = e_std - Xr @ np.linalg.lstsq(Xr, e_std, rcond=None)[0]
    F = ((e_std@e_std - e1@e1)/k) / (e1@e1/(len(e_std) - k))
    return F, stats.f.sf(F, k, len(e_std) - k)

print(f"{'序列':<6}{'LB-Q(10) p':>12}{'McLeod-Li p':>13}{'BDS(m=2) z':>12}{'Ori-F p':>10}{'TAR-F p':>10}")
for kind in ["AR", "TAR", "GARCH"]:
    x = sim(kind); p = 2
    y, X = design(x, p)
    res = y - X @ np.linalg.lstsq(X, y, rcond=None)[0]   # 先去除线性相依
    q = acorr_ljungbox(res, lags=[10])["lb_pvalue"].iloc[0]
    ml = acorr_ljungbox(res**2, lags=[10])["lb_pvalue"].iloc[0]
    z_bds, _ = bds(res, max_dim=2, epsilon=1.5*res.std())
    print(f"{kind:<6}{q:>12.3f}{ml:>13.3f}{float(np.atleast_1d(z_bds)[0]):>12.2f}"
          f"{ori_f(x, p)[1]:>10.3f}{tar_f(x, p)[1]:>10.3f}")

# ---------- 参数自助法多步预测:TAR 模型 ----------
def tar_step(xprev, a):
    return (-1.5 if xprev < 0 else 0.5)*xprev + a

x_T = -0.8; M = 5000; H = 3
paths = np.zeros((M, H))
for j in range(M):
    xp = x_T
    for h in range(H):
        xp = tar_step(xp, rng.standard_normal()); paths[j, h] = xp
naive = [x_T]
for h in range(H):
    naive.append(tar_step(naive[-1], 0.0))             # 错误做法:把条件均值代回非线性函数
print("\n预测原点 x_T = -0.8")
for h in range(H):
    print(f"  {h+1} 步: 自助法均值 {paths[:, h].mean(): .3f} | 代入法 {naive[h+1]: .3f} | "
          f"90% 区间 [{np.quantile(paths[:, h], .05): .2f}, {np.quantile(paths[:, h], .95): .2f}]")

# ---------- 方向预测的 2x2 列联表卡方检验(原书例:神经网络方向预测) ----------
tab = np.array([[12, 2], [8, 2]])      # 行:实际涨/跌;列:预测涨/跌
chi2, pval, _, _ = stats.chi2_contingency(tab, correction=False)
print(f"\n方向预测列联表 chi2 = {chi2:.3f}, p = {pval:.2f}")

# ---------- 分布预测评估:PIT + KS ----------
x = sim("TAR", T=600)
pit_good, pit_bad = [], []
for t in range(1, len(x)):
    mu_true = (-1.5 if x[t-1] < 0 else 0.5)*x[t-1]
    pit_good.append(stats.norm.cdf(x[t] - mu_true))           # 正确的条件分布
    pit_bad.append(stats.norm.cdf(x[t], 0.6, x.std()))        # 忽略动态的无条件正态
print(f"PIT-KS p 值: 正确模型 {stats.kstest(pit_good, 'uniform').pvalue:.3f}, "
      f"无条件正态 {stats.kstest(pit_bad, 'uniform').pvalue:.4f}")

关键输出:

序列      LB-Q(10) p  McLeod-Li p  BDS(m=2) z   Ori-F p   TAR-F p
AR           0.798        0.917       -0.66     0.524     0.588
TAR          0.837        0.000       10.12     0.000     0.000
GARCH        0.702        0.000        2.47     0.541     0.608

预测原点 x_T = -0.8
  1 步: 自助法均值  1.196 | 代入法  1.200 | 90% 区间 [-0.46,  2.81]
  2 步: 自助法均值  0.708 | 代入法  0.600 | 90% 区间 [-1.05,  2.47]
  3 步: 自助法均值  0.675 | 代入法  0.300 | 90% 区间 [-1.19,  2.57]

方向预测列联表 chi2 = 0.137, p = 0.71
PIT-KS p 值: 正确模型 0.654, 无条件正态 0.0310

这张表把各检验的分工展示得很清楚:三个序列的 AR 残差都"看起来像白噪声"(Ljung–Box 都不显著);线性 AR 通过所有检验;TAR 被所有非线性检验拒绝(AR(2) 残差平方也相关,因为门限结构会让残差的条件方差依赖滞后值);GARCH 只被 McLeod–Li 和 BDS 抓到,Ori-F、TAR-F 不显著——它的非线性在方差,不在均值。1 步预测时自助法与代入法一致(1 步只用到已知的 \(x_T\)),2 步以后两者分道扬镳。列联表结果与原书的 0.137、p=0.71 完全一致。


本章小结

检验非线性要先剥离线性结构,再在残差上用多种检验交叉验证:McLeod–Li 盯住二阶(波动)依赖,BDS 对一切偏离 iid 的情形敏感,Ori-F 针对二次型均值非线性,TAR-F 针对门限型非线性且不受冗余参数问题困扰。建模遵循"线性 → 检验 → 选族 → 估计 → 诊断"的流程。非线性模型的多步预测必须用参数自助法,因为 \(E[g(X)]\ne g(E[X])\)。预测评估要同时看方向、幅度和分布,并按状态分组——失业率的例子说明,非线性模型可能只在收缩期胜出,但那正是最重要的时刻。

检验 / 方法 原假设 / 用途 分布或要点
McLeod–Li \(Q(m)\) 残差平方无自相关 \(\chi^2_{m-p-q}\);等价于 ARCH-LM
双谱检验 标准化双谱为常数 同时检验线性与高斯性
BDS \(D_k(\delta,T)\) iid \(N(0,1)\);对条件异方差也敏感
RESET / Keenan 无 \(\hat x_t^k\) 型非线性 \(F(g,T-p-g)\)
Ori-F 无二次项与交叉项 \(F(p(p+1)/2,\ T-p-g-1)\)
TAR-F 排序自回归无变点 \(F(p+1,\ T-d-m-p)\)
门限 LR 两区制 SETAR 冗余参数,非标准分布,模拟临界值
参数自助法 多步预测 模拟 \(M\) 条路径,取均值和分位
列联表 \(\chi^2\) 方向预测与实际独立 \(\chi^2_1\)
MSE / MAD / MAPE 幅度误差 MAPE 不适用于收益
PIT + KS 预测分布校准 PIT 应服从 \(U[0,1]\)

练习

基础

  1. 为什么非线性检验要在线性模型残差上做?如果直接对一个 AR(1) 序列 \(x_t=0.8x_{t-1}+a_t\) 做 BDS 检验会怎样? 提示:线性相依本身就违反 iid,BDS 会显著,误报非线性。
  2. \(p=3\) 时 Ori-F 检验加入多少个二次项?写出 \(\mathbf M_{t-1}\)。 提示:6 个:\(x_{t-1}^2,x_{t-1}x_{t-2},x_{t-1}x_{t-3},x_{t-2}^2,x_{t-2}x_{t-3},x_{t-3}^2\)。
  3. 某策略过去 100 天中预测涨 70 次(实际涨 45 次)、预测跌 30 次(实际跌 12 次)。计算胜率,并用列联表 \(\chi^2\) 检验它是否显著优于随机。 提示:列联表 实际涨行 (45, 18),实际跌行 (25, 12);胜率 57%;\(\chi^2\approx0.17\)(p≈0.68),不显著——57% 的胜率几乎全部来自"多数时间预测涨、市场也多数时间涨"。
  4. 解释 TAR-F 检验中"冗余参数"问题指什么,TAR-F 如何回避它。

进阶

  1. 用本章的 tar_f 函数,分别取延迟 \(d=1,2,3\) 检验式 (4.8) 的模拟序列,观察哪个 \(d\) 的 F 统计量最大;这可以作为选择延迟参数的依据。
  2. 对第 04a 章习题中的马尔可夫转换 GARCH,用参数自助法求 5 步收益的 1% 分位数(需要同时模拟状态链和 GARCH 递推)。
  3. 设计一个模拟实验:真实过程是两区制 SETAR,比较 TAR 模型与线性 AR 模型的滚动 1 步预测 MSE,并按预测原点所处区制分组报告。是否复现 4.11 节"优势集中在某一区制"的现象?
  4. (原书习题 4.1、4.2 改编)用 arch 包对模拟的不对称 GARCH 数据拟合 GJR-GARCH(o=1),检验杠杆项是否显著;再自写似然,拟合第 04a 章 4.3.3 节的 TAR-GARCH,比较两者的对数似然和残差平方的 \(Q(10)\)。
  5. (原书习题 4.6)收益率曲线倒挂的存在使期限利差可能是非线性的。用模拟或真实的 3 年期与 1 年期利率构造利差 \(s_t\) 及其变化 \(\Delta s_t\),分别做 Ori-F 与 TAR-F 检验并为显著者建立门限模型。

原书推荐习题:4.6(期限利差的非线性检验与门限建模,最贴近利率交易)、4.5(神经网络方向预测,可配合列联表检验)、4.1、4.2(门限 GARCH 的杠杆效应检验)。


原书对照

本章小节 原书章节 PDF 页码
4.8.1 非参数检验 4.2.1 p.226–229
4.8.2 参数检验(含 TAR-F) 4.2.2 p.229–233
4.8.3 应用(表 4.2) 4.2.3 p.233–234
4.9 建模流程 4.3 p.234–235
4.10 预测与预测评估 4.4 p.235–238
4.11 美国季度失业率(表 4.3、4.4) 4.5 p.238–242
RATS 与 R/S-Plus 程序 附录 A、B p.242–244
习题 第 4 章习题 p.244–246

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