第 04b 章 非线性检验、建模与预测
本章对应 Tsay 原书第 4 章后半(4.2–4.5 节及附录)。第 04a 章介绍了各种非线性模型,本章回答三个实践问题:数据里到底有没有非线性?如果有,按什么流程建模?非线性模型怎么做多步预测,又如何公平地评估它是否真的比线性模型好?
学习目标
- 掌握非参数检验(McLeod–Li、双谱、BDS)和参数检验(RESET、Keenan、Tsay 的 Ori-F、门限检验)的构造思路,知道每种检验对哪类非线性有功效。
- 理解门限检验中"冗余参数只在备择假设下出现"的问题,以及 TAR-F 检验如何用排序自回归绕开它。
- 能按"线性模型 → 残差检验 → 选模型族 → 估计 → 诊断"的流程建立非线性模型。
- 会用参数自助法做非线性模型的多步预测,并解释为什么不能把条件均值直接代回非线性函数。
- 会用方向型(\(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 统计量
它主要检测条件异方差,与 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\)),其双谱为
与谱密度 \(p(w)=\frac{\sigma_a^2}{2\pi}|\Gamma(w)|^2\) 组合,得到
所以检验"标准化双谱是否处处为常数"就是检验线性;若进一步为零(\(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})'\),定义
即 \(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 统计量
其中渐近方差
\(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})'\)。
-
OLS 得拟合值 \(\hat x_t\)、残差 \(\hat a_t\) 和 \(SSR_0=\sum\hat a_t^2\);
-
把 \(\hat a_t\) 对 \(\mathbf X_{t-1}\) 和 \(\mathbf M_{t-1}=(\hat x_t^2,\dots,\hat x_t^{s+1})'\) 回归,得 \(SSR_1\);
-
\[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\)。检验就是回归
中 \(\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 时,可以构造专门的检验:
-
似然比检验。 给定 \(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\) 对其滞后的依赖关系,只是把方程按门限变量从小到大排列。检验步骤:
- 用前 \(m\) 个排序方程(如 \(m=30\))做 OLS;
- 对第 \(m+1\) 个方程计算预测残差并标准化;
- 用递归最小二乘把新方程纳入,更新估计;重复直到用完数据;
- 把标准化预测残差 \(\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 建模流程
非线性建模不可避免地带有主观判断,但有一个可遵循的一般流程:
- 先建立充分的线性模型,在其残差上做非线性检验。金融序列常用残差平方的 Ljung–Box 统计量和 ARCH-LM 检验探测条件异方差,用 4.8 节的其他检验探测均值非线性。
- 非线性显著时选模型族。选择取决于经验与问题本身:有明确门限机制(如政策干预)选 TAR;有隐状态叙事(如经济周期)选 MSA;只是波动不对称就选 TAR-GARCH/EGARCH。
- 波动率模型:ARCH 阶数可由平方序列 PACF 确定;GARCH/EGARCH 通常只考虑 (1,1)、(1,2)、(2,1) 等低阶。
- TAR 模型:按 Tong (1990)、Tsay (1989, 1998) 的程序选延迟 \(d\)、门限和各区制阶数。
- 样本足够大时,可先用 FAR、MARS 等非参数方法探索,再确定参数形式。
- 在竞争模型间选择:信息准则(AIC),或 Chen, McCulloch & Tsay (1997) 的广义几率比。
- 用于预测前必须做模型检验:标准化残差及其平方无序列相关,必要时对残差再做非线性检验(第 05 章的门限 ACD 就是这样发现的)。
4.10 非线性模型的预测
4.10.1 为什么不能"代入迭代"
线性模型的多步预测可以递推:把 1 步预测值代回模型就得到 2 步预测。非线性模型这样做是错的,因为
以式 (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\):
- 从设定的新息分布中抽一个新息;
- 用模型、数据和已模拟的 \(x_{T+1},\dots,x_{T+i-1}\) 计算 \(x_{T+i}\);
- 重复直到 \(x_{T+\ell}\),得到一条路径;
- 重复 \(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\) 大说明模型优于随机猜测。对第 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\)。列联表检验正好排除了这种情况。
幅度型度量。
不同步长可能选出不同模型。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):
非线性检验(对 \(\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):
门限变量是两季度前的变化。区制 1(失业率下降或小幅上升)经济稳定,滞后 2 系数不显著,几乎是 AR(1)。区制 2(失业率跳升)对应收缩期,是带正常数的 AR(2),其特征多项式有一对复根,意味着周期性和较高的转折概率——所以失业率大幅上升的阶段较短,推论是美国经济收缩期比扩张期短。
马尔可夫转换模型:
状态 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。
结论:
- 全样本平均来看,TAR 与线性模型 MSE 相近但偏差更小;MSA 的 MSE 最大、偏差最小。
- 原点在收缩期时,TAR 在 MSE 和偏差上都明显优于线性模型(4、5 步 MSE 降低 28%);MSA 也有改进但不如 TAR。
- 原点在扩张期时,线性模型最好。
- 非线性模型的价值集中在收缩期——恰恰是人们最需要预测的时候。
教学启示:非线性模型的优势往往是状态依赖的,总体平均指标可能把它掩盖掉。评估时应按状态分组。
量化实战
应用场景
- 信号的残差诊断。 线性因子模型或 AR 模型拟合后,对残差跑 McLeod–Li、BDS、Ori-F、TAR-F。若只有 McLeod–Li/BDS 显著,说明剩下的是波动结构,可用于风险模型而非收益预测;若 TAR-F 显著,值得去找门限型信号。
- 非线性多步预测与情景生成。 门限、状态转换模型的多步预测、预测区间、"未来 \(h\) 期内跌破某水平的概率"都应该用参数自助法模拟。
- 回测评估的三把尺子。 方向型:列联表 \(\chi^2\) 检验,防止被高胜率误导;幅度型:MSE/MAD,不要对收益用 MAPE;分布型:PIT + KS,检验预测分布是否校准,这也是 VaR/分位数模型回测的基础。
- 按状态分组评估。 因子 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]\) |
练习
基础
- 为什么非线性检验要在线性模型残差上做?如果直接对一个 AR(1) 序列 \(x_t=0.8x_{t-1}+a_t\) 做 BDS 检验会怎样? 提示:线性相依本身就违反 iid,BDS 会显著,误报非线性。
- \(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\)。
- 某策略过去 100 天中预测涨 70 次(实际涨 45 次)、预测跌 30 次(实际跌 12 次)。计算胜率,并用列联表 \(\chi^2\) 检验它是否显著优于随机。 提示:列联表 实际涨行 (45, 18),实际跌行 (25, 12);胜率 57%;\(\chi^2\approx0.17\)(p≈0.68),不显著——57% 的胜率几乎全部来自"多数时间预测涨、市场也多数时间涨"。
- 解释 TAR-F 检验中"冗余参数"问题指什么,TAR-F 如何回避它。
进阶
- 用本章的
tar_f函数,分别取延迟 \(d=1,2,3\) 检验式 (4.8) 的模拟序列,观察哪个 \(d\) 的 F 统计量最大;这可以作为选择延迟参数的依据。 - 对第 04a 章习题中的马尔可夫转换 GARCH,用参数自助法求 5 步收益的 1% 分位数(需要同时模拟状态链和 GARCH 递推)。
- 设计一个模拟实验:真实过程是两区制 SETAR,比较 TAR 模型与线性 AR 模型的滚动 1 步预测 MSE,并按预测原点所处区制分组报告。是否复现 4.11 节"优势集中在某一区制"的现象?
- (原书习题 4.1、4.2 改编)用
arch包对模拟的不对称 GARCH 数据拟合 GJR-GARCH(o=1),检验杠杆项是否显著;再自写似然,拟合第 04a 章 4.3.3 节的 TAR-GARCH,比较两者的对数似然和残差平方的 \(Q(10)\)。 - (原书习题 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。)