量化交易中文教材

第 12a 章 MCMC 方法与贝叶斯推断

本章对应 Tsay 原书第 12 章 12.1–12.6 节。前面各章的估计几乎都是极大似然。可是一旦模型里有大量看不见的量——缺失的数据点、可能是异常值的观测、每天的潜在波动率、市场所处的区制——似然就要对这些量积分,常常算不出来。马尔可夫链蒙特卡罗(Markov chain Monte Carlo, MCMC)换了一个思路:把看不见的量也当作"参数",从它们的联合后验分布中抽样,再用样本做推断。本章讲 MCMC 的基本工具(Gibbs 抽样、共轭先验、Metropolis–Hastings、Griddy Gibbs),以及三个基础应用:带时间序列误差的回归、缺失值插补、加性异常值检测。第 12b 章用这些工具估计随机波动率模型和 Markov 转换模型。

学习目标

  1. 说明 MCMC 的基本思想:构造一个平稳分布等于后验分布的马尔可夫链;理解数据增广把潜变量当作参数的做法。
  2. 会写 Gibbs 抽样的步骤,知道 burn-in、分块抽样和收敛诊断的作用。
  3. 熟记常用共轭先验的后验公式(正态均值、正态精度、Beta–Bernoulli、Gamma–Poisson、逆卡方–方差),理解"后验精度 = 先验精度 + 数据精度"。
  4. 会用 Metropolis、Metropolis–Hastings 和 Griddy Gibbs 处理没有闭式条件后验的参数。
  5. 能独立推导并编程实现带 AR 误差回归的 Gibbs 抽样,以及 AR 模型中缺失值和加性异常值的条件后验。

读前导读

这一章在解决什么问题。 你熟悉的估计方法是"写出似然、求最大值"。它要求似然能算出来。可是当模型里有一大堆看不见的东西——哪些报价是坏点、停牌那几天的真实价格、每天的潜在波动率——似然就要对所有这些未知量求积分,几百维、几千维,根本算不动。MCMC 换了个办法:不求最大值,而是生成一大批参数的随机样本,让这批样本的分布恰好等于后验分布。有了样本,均值、标准差、分位数、任何函数的分布都只是简单统计。你在 CFA 里见过的蒙特卡罗模拟(用随机路径给期权或 VaR 定价)是"已知分布、抽样算数";MCMC 是"分布只知道形状、不会直接抽样,就设计一条随机游走去逼近它"。

贝叶斯的部分你可以这样理解:先验是"看数据之前的判断",数据带来新证据,后验是两者按可信度加权的结果。这和 Black–Litterman 把市场均衡收益和投资者观点按精度加权是同一回事,也像审计里结合内控评估(先验)和实质性测试结果(数据)形成结论。

需要先想起来的数学。

  • 条件概率与贝叶斯定理。\(P(A|B)=P(B|A)P(A)/P(B)\)。分布版本 \(f(\theta|X)\propto f(X|\theta)P(\theta)\) 里的 \(\propto\) 读作"正比于",意思是差一个与 \(\theta\) 无关的常数,最后靠"总概率为 1"补回来。见 第 00 册第 07 章 概率中的分析工具。
  • 积分作为"求总和"。\(f(X)=\int f(X|\theta)P(\theta)d\theta\) 是把所有可能的 \(\theta\) 按先验加权求和,离散情形就是 \(\sum_\theta\)。它只是归一化常数,MCMC 的妙处正在于不用算它。见 第 00 册第 03 章 积分。
  • 配方。\(a\mu^2-2b\mu+c=a(\mu-b/a)^2+\text{常数}\)。正态密度的指数是二次函数,凡是"指数部分对 \(\mu\) 是二次"的分布,配方后就能读出均值 \(b/a\) 和方差 \(1/a\)。共轭先验的推导几乎都靠这一招。
  • 矩阵求逆与精度矩阵。多元情形下"精度"是协方差矩阵的逆 \(\Sigma^{-1}\)。公式 \(\Sigma_*^{-1}=\Sigma_o^{-1}+n\Sigma^{-1}\) 就是标量 \(1/\sigma_*^2=1/\sigma_o^2+n/\sigma^2\) 的矩阵版本。见 第 00 册第 06 章 线性代数速成。
  • Gamma 函数与几个分布。\(\Gamma(\alpha)\) 是阶乘的推广,\(\Gamma(n)=(n-1)!\);它只出现在归一化常数里,读公式时可以忽略。Beta 分布描述 0 到 1 之间的概率(如胜率),Gamma 分布描述正数(如精度、强度),卡方分布 \(\chi^2_v\) 是 \(v\) 个独立标准正态的平方和。

怎么读这一章。 必读:12.1.2(MCMC 的核心想法)、12.2(Gibbs)、12.3 中的 Result 12.1、12.1a、12.3、12.8(其余共轭结果可以当查表用)、12.4.1–12.4.2(Metropolis 和 MH)、12.5(第一个完整的 Gibbs 推导,是后面所有推导的模板)。12.1.3 的 EM 历史、Result 12.4–12.7、Griddy Gibbs 第一次可以只看结论。12.6–12.7 推导较细,建议先读讲解框弄懂"把缺失值当作回归系数"这个技巧,再看公式。最后一定跑一遍或细读量化实战的例一,代码与公式一一对应,是检验理解的最好方式。


12.1 为什么需要 MCMC

12.1.1 马尔可夫过程

先回顾一个概念。随机过程 \(\{X_t\}\) 取值于空间 \(\Omega\),如果给定现在 \(X_t\),未来 \(X_h\)(\(h>t\))与过去 \(X_s\)(\(s<t\))无关:

\[P(X_h|X_s,s\le t)=P(X_h|X_t),\]

就称为马尔可夫过程(Markov process)。离散时间下写作 \(P(X_h|X_t,X_{t-1},\dots)=P(X_h|X_t)\)。转移概率函数 \(P_t(\theta,h,A)=P(X_h\in A|X_t=\theta)\);如果它只依赖 \(h-t\) 而不依赖 \(t\),称链有平稳转移分布。离散状态马尔可夫链的基本性质见第 02 册。

12.1.2 马尔可夫链模拟

贝叶斯推断要的是后验分布 \(P(\theta|X)\)。MCMC 的想法是:在参数空间 \(\Theta\) 上构造一个马尔可夫链,让它的平稳分布恰好是 \(P(\theta|X)\),然后让链跑足够长时间,当前值的分布就足够接近后验。之后链上的每一个值都可以看作(相关的)后验抽样。对同一个目标分布,可以构造出很多满足条件的链,这些方法统称 MCMC。

白话解释:"平稳分布"可以用信用评级迁移矩阵来理解。一年期迁移矩阵反复作用很多年后,一家公司处在各评级的概率会稳定下来,而且与它今天的初始评级无关,这个极限就是平稳分布。MCMC 反过来做:先指定想要的极限(后验),再设计转移规则,使得链跑久了各处被访问的频率正好等于后验概率。 两个代价要记住。第一,链的开头还记得初值,不能用(这就是后面的 burn-in)。第二,相邻样本是相关的,2000 个 MCMC 样本的信息量通常少于 2000 个独立样本,"有效样本量"衡量的就是这个折扣。

12.1.3 从 EM 算法到数据增广

MCMC 在统计中的流行,有一条从 EM 算法(Dempster, Laird & Rubin 1977)过来的脉络。EM 处理缺失数据:

  • M 步:假装缺失值已知,用完整数据的方法做极大似然估计;
  • E 步:给定数据和当前拟合的模型,求缺失值的条件期望并填进去;

从任意初值开始反复迭代直到收敛。Tanner & Wong (1987) 做了两方面推广:

  1. 迭代模拟:把"填条件期望"换成"从条件分布中随机抽一个值";
  2. 数据增广(data augmentation):主动加入一些辅助变量,常常能让条件分布变简单、模拟变快。

后面会反复看到数据增广的威力:异常值模型里每个时点加一个"是不是异常"的 0/1 变量,随机波动率模型里把每天的波动率当作参数,Markov 转换模型里把每天的状态当作参数。加进去之后,每个条件分布都是熟悉的分布。


12.2 Gibbs 抽样

12.2.1 算法

Gibbs 抽样(Gibbs sampling;Geman & Geman 1984;Gelfand & Smith 1990)是最流行的 MCMC 方法。这里"参数"的含义很宽:缺失的数据点可以当作参数;一个交易日内 \(N\) 笔成交背后的 \(N\) 个"真实价格"也可以当作 \(N\) 个参数。

设有三个参数 \(\theta_1,\theta_2,\theta_3\),数据 \(X\),模型 \(M\)。似然可能很难写,但三个完全条件分布(full conditional distributions)

\[f_1(\theta_1|\theta_2,\theta_3,X,M),\quad f_2(\theta_2|\theta_3,\theta_1,X,M),\quad f_3(\theta_3|\theta_1,\theta_2,X,M)\tag{12.1}\]

都能抽样。不必知道它们的确切形式,只需能从中抽随机数。

给定任意初值 \(\theta_{2,0},\theta_{3,0}\):

  1. 从 \(f_1(\theta_1|\theta_{2,0},\theta_{3,0},X,M)\) 抽 \(\theta_{1,1}\);
  2. 从 \(f_2(\theta_2|\theta_{3,0},\theta_{1,1},X,M)\) 抽 \(\theta_{2,1}\);
  3. 从 \(f_3(\theta_3|\theta_{1,1},\theta_{2,1},X,M)\) 抽 \(\theta_{3,1}\)。

这就完成了一次 Gibbs 迭代。注意每一步都用最新的值作条件。重复 \(m\) 次得到 \((\theta_{1,m},\theta_{2,m},\theta_{3,m})\)。在正则条件下(实质是要求从任意初值出发都能到达整个参数空间,理论见 Tierney 1994),\(m\) 足够大时它近似是联合后验 \(f(\theta_1,\theta_2,\theta_3|X,M)\) 的一次抽样。

为什么平稳分布是后验? 设 \((\theta_1,\theta_2,\theta_3)\) 已经服从联合后验 \(f\)。第 1 步只替换 \(\theta_1\),而且是按 \(f(\theta_1|\theta_2,\theta_3)\) 替换,所以替换后 \((\theta_1,\theta_2,\theta_3)\) 的联合分布仍是 \(f(\theta_2,\theta_3)f(\theta_1|\theta_2,\theta_3)=f\)。每一步都保持 \(f\) 不变,整个迭代当然也保持 \(f\) 不变。

推导拆解:把这句话展开成三步。

  1. 假设迭代前 \((\theta_1,\theta_2,\theta_3)\sim f\),那么其中 \((\theta_2,\theta_3)\) 的边际分布是 \(f(\theta_2,\theta_3)\)。
  2. 第 1 步丢掉旧的 \(\theta_1\),按 \(f(\theta_1|\theta_2,\theta_3)\) 重新抽一个。新三元组的密度 \(=\)(\(\theta_2,\theta_3\) 的密度)\(\times\)(给定它们时新 \(\theta_1\) 的密度)\(=f(\theta_2,\theta_3)f(\theta_1|\theta_2,\theta_3)\)。
  3. 由条件密度的定义 \(f(\theta_1|\theta_2,\theta_3)=f(\theta_1,\theta_2,\theta_3)/f(\theta_2,\theta_3)\),乘积正好是 \(f(\theta_1,\theta_2,\theta_3)\)。 这只说明"已经到了后验就不会离开"。"从任意初值出发最终会到后验"需要额外的正则条件,正文括号里提到的就是它。

白话解释:Gibbs 像轮流调整几个相互关联的估计。比如同时估计一只股票的 β 和特质波动率:先假定波动率已知,回归抽一个 β;再用这个 β 算残差,抽一个波动率;如此循环。每一步都只解一个简单的一元或低维问题,合起来却在探索整个联合分布。

12.2.2 实践要点

实践中运行 \(n\) 次迭代,丢弃前 \(m\) 次,得到 Gibbs 样本

\[\{(\theta_{1,j},\theta_{2,j},\theta_{3,j})\}_{j=m+1}^n.\tag{12.2}\]

点估计与后验方差:

\[\hat\theta_i=\frac{1}{n-m}\sum_{j=m+1}^n\theta_{i,j},\qquad \hat\sigma_i^2=\frac{1}{n-m-1}\sum_{j=m+1}^n(\theta_{i,j}-\hat\theta_i)^2.\tag{12.3}\]

要检验 \(H_0:\theta_1=\theta_2\),就对每次抽样算差值 \(\theta_{1,j}-\theta_{2,j}\),再看它的均值与标准差,用 \(t=\hat\theta/\hat\sigma\)。任何参数的函数(比如两个状态的期望持续期之差、某个分位数)都可以这样直接得到后验,这是 MCMC 相对 delta 方法的一大便利。

  • burn-in:被丢弃的前 \(m\) 个样本叫 burn-in,用来让链"忘掉"初值。另一种做法是用不同初值跑很多条短链,各取最后一次抽样组成样本。
  • 分块:Gibbs 把高维问题拆成一串低维条件抽样,极端情况下是 \(N\) 个一元分布。但如果某些参数高度相关,逐个抽样会收敛得很慢(链在狭长的后验山脊上只能走小碎步),应把它们放在一起联合抽样,如用 \(f(\theta_1,\theta_2|\theta_3)\) 和 \(f_3(\theta_3|\theta_1,\theta_2)\)(Liu, Wong & Kong 1994)。第 12b 章的 FFBS 就是"把整条波动率路径一次抽出来"的分块方法。
  • 收敛诊断:理论只保证 \(m\) 足够大时收敛,没有给出具体的 \(m\)。诊断方法很多但没有共识,没有任何方法能 100% 保证收敛(Carlin & Louis 2000;Gelman et al. 2003)。原书的建议是用不同初值重复多次,看结论是否一致。常用的补充工具有:迹图(trace plot)、样本自相关与有效样本量(effective sample size, ESS)、多链的 Gelman–Rubin \(\hat R\) 统计量(接近 1 表示各链混合良好)。

12.3 贝叶斯推断与共轭先验

12.3.1 后验分布

统计推断有两种范式:经典方法(极大似然)和贝叶斯方法(先验 + 数据 → 后验)。本书前面用的都是经典方法,但每个问题都有贝叶斯解法,借助 MCMC 已经可以计算,而且多数情况下两种方法结果相近。有时贝叶斯方法更有优势,例如算 VaR 时可以自然地纳入参数不确定性(第 12b 章例 12.7),代价是计算量大。

设先验 \(P(\theta)\),似然 \(f(X|\theta)\),由贝叶斯定理

\[f(\theta|X)=\frac{f(X|\theta)P(\theta)}{f(X)},\qquad f(X)=\int f(X|\theta)P(\theta)\,d\theta,\tag{12.4}\]
\[f(\theta|X)\propto f(X|\theta)P(\theta).\tag{12.5}\]

分母 \(f(X)\) 只是归一化常数。从 (12.5) 看,基于似然的推断等价于取常数先验的贝叶斯推断。完全条件分布在贝叶斯文献中叫条件后验分布(conditional posterior distribution)。

12.3.2 共轭先验

如果先验和后验属于同一个分布族,就称先验是共轭先验(conjugate prior)。在 MCMC 中,这意味着条件后验有闭式,可以直接调用常规随机数生成器(DeGroot 1970 第 9 章)。下面是金融计量中最常用的几个结果。

Result 12.1(正态均值,方差已知)。\(x_1,\dots,x_n\) iid \(N(\mu,\sigma^2)\),\(\sigma^2\) 已知,先验 \(\mu\sim N(\mu_o,\sigma_o^2)\),则后验 \(\mu|X\sim N(\mu_*,\sigma_*^2)\):

\[\mu_*=\frac{\sigma^2\mu_o+n\sigma_o^2\bar x}{\sigma^2+n\sigma_o^2},\qquad \sigma_*^2=\frac{\sigma^2\sigma_o^2}{\sigma^2+n\sigma_o^2}.\]

用精度(precision,方差的倒数)写更好记。令 \(\eta=1/\sigma^2\),\(\eta_o=1/\sigma_o^2\),\(\eta_*=1/\sigma_*^2\):

\[\eta_*=\eta_o+n\eta,\qquad \mu_*=\frac{\eta_o}{\eta_*}\mu_o+\frac{n\eta}{\eta_*}\bar x.\]

后验精度 = 先验精度 + 数据精度(\(\bar x\) 是充分统计量,精度为 \(n\eta\));后验均值是先验均值与样本均值按精度的加权平均。\(n\) 增大时先验的影响逐渐消失。

证明思路:\(f(\mu|X)\propto\exp[-\frac{n(\bar x-\mu)^2}{2\sigma^2}-\frac{(\mu-\mu_o)^2}{2\sigma_o^2}]\),指数是 \(\mu\) 的二次函数,配方即得。

推导拆解:配方的具体过程。

  1. 似然 \(\prod_i\exp[-(x_i-\mu)^2/(2\sigma^2)]\) 中,\(\sum(x_i-\mu)^2=\sum(x_i-\bar x)^2+n(\bar x-\mu)^2\),第一项与 \(\mu\) 无关,并入常数。这就是"\(\bar x\) 是充分统计量"的含义。
  2. 用精度写指数:\(-\frac12[n\eta(\mu-\bar x)^2+\eta_o(\mu-\mu_o)^2]\)。展开只看含 \(\mu\) 的项:\(-\frac12[(n\eta+\eta_o)\mu^2-2(n\eta\bar x+\eta_o\mu_o)\mu]\)。
  3. 套"\(a\mu^2-2b\mu\) 的中心是 \(b/a\)、精度是 \(a\)":精度 \(\eta_*=n\eta+\eta_o\),均值 \(\mu_*=(n\eta\bar x+\eta_o\mu_o)/\eta_*\)。 数值例:先验认为某基金经理的月 α 均值 0、标准差 0.5%(精度 4);36 个月样本均值 0.6%,月残差标准差 3%,样本均值的标准误 \(3/\sqrt{36}=0.5\%\)(数据精度也是 4)。后验均值 \(=(4\times0+4\times0.6)/8=0.3\%\),后验标准差 \(1/\sqrt8\approx0.35\%\)。先验和数据一样可信,于是各占一半,结果把 α 收缩了一半。

Result 12.1a(多元版本)。\(x_i\) iid \(N(\mu,\Sigma)\),\(\Sigma\) 已知,先验 \(\mu\sim N(\mu_o,\Sigma_o)\),则后验 \(N(\mu_*,\Sigma_*)\):

\[\Sigma_*^{-1}=\Sigma_o^{-1}+n\Sigma^{-1},\qquad \mu_*=\Sigma_*(\Sigma_o^{-1}\mu_o+n\Sigma^{-1}\bar x).\]

把它用在回归上(把 OLS 估计 \(\hat\beta\sim N(\beta,\sigma^2(X'X)^{-1})\) 当作"一个观测"),就得到回归系数的条件后验,这是后面所有回归型 Gibbs 步骤的核心(Box & Tiao 1973)。

Result 12.2(正态精度,均值已知)。Gamma 分布 \(f(\eta|\alpha,\beta)=\frac{\beta^\alpha}{\Gamma(\alpha)}\eta^{\alpha-1}e^{-\beta\eta}\),均值 \(\alpha/\beta\),方差 \(\alpha/\beta^2\)。若 \(x_i\) iid \(N(\mu,1/\eta)\),\(\mu\) 已知,先验 \(\eta\sim\Gamma(\alpha,\beta)\),则后验

\[\eta|X\sim\Gamma\Big(\alpha+\frac n2,\ \beta+\frac12\sum_{i=1}^n(x_i-\mu)^2\Big).\]

Result 12.3(Bernoulli 概率)。Beta 分布 \(f(\theta|\alpha,\beta)=\frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha)\Gamma(\beta)}\theta^{\alpha-1}(1-\theta)^{\beta-1}\),均值 \(\alpha/(\alpha+\beta)\),方差 \(\frac{\alpha\beta}{(\alpha+\beta)^2(\alpha+\beta+1)}\)。若 \(x_i\) iid Bernoulli(\(\theta\)),先验 Beta(\(\alpha,\beta\)),则后验

\[\theta|X\sim\mathrm{Beta}\Big(\alpha+\sum x_i,\ \beta+n-\sum x_i\Big).\]

先验参数可以理解为"事先看到了 \(\alpha\) 次成功、\(\beta\) 次失败"。异常值模型中的异常比例 \(\epsilon\)、Markov 转换模型中的转移概率 \(e_i\) 都用这个结果。

Result 12.4(Poisson 强度)。\(x_i\) iid Poisson(\(\lambda\)),先验 \(\lambda\sim\Gamma(\alpha,\beta)\),则后验 \(\Gamma(\alpha+\sum x_i,\ \beta+n)\)。(比如每分钟成交笔数的强度。)

Result 12.5(指数分布)。\(x_i\) iid 指数分布(率 \(\lambda\)),先验 \(\Gamma(\alpha,\beta)\),则后验 \(\Gamma(\alpha+n,\ \beta+\sum x_i)\)。(比如交易间隔时间,第 05 章的久期。)

Result 12.6(负二项)。负二项分布 \(p(n|m,\lambda)=\binom{m+n-1}{n}\lambda^m(1-\lambda)^n\)。原书的例子:公司有 \(m\) 个职位,每个 MBA 应聘者独立地以概率 \(\lambda\) 合适,面试总人数为 \(Y\),则 \(X=Y-m\) 服从负二项。\(m\) 固定、先验 \(\lambda\sim\) Beta(\(\alpha,\beta\)) 时,后验为 Beta(\(\alpha+mn\), \(\beta+\sum x_i\))。

Result 12.7(正态,均值与精度都未知)。正态–Gamma 先验:\(\mu|\eta\sim N(\mu_o,(\tau_o\eta)^{-1})\),\(\eta\sim\Gamma(\alpha,\beta)\)。则 \(\mu|\eta,X\) 为正态,均值 \(\mu_*=\frac{\tau_o\mu_o+n\bar x}{\tau_o+n}\),精度 \((\tau_o+n)\eta\);\(\eta\) 的边际后验为 \(\Gamma(\alpha+n/2,\beta_*)\),

\[\beta_*=\beta+\frac12\sum_{i=1}^n(x_i-\bar x)^2+\frac{\tau_on(\bar x-\mu_o)^2}{2(\tau_o+n)}.\]

最后一项惩罚样本均值与先验均值的分歧。

Result 12.8(零均值正态的方差,逆卡方先验)。若 \(1/Y\sim\chi^2_v\),称 \(Y\) 服从逆卡方分布,密度 \(f(y|v)=\frac{2^{-v/2}}{\Gamma(v/2)}y^{-(v/2+1)}e^{-1/(2y)}\),\(E(Y)=1/(v-2)\)(\(v>2\)),\(\mathrm{Var}(Y)=\frac{2}{(v-2)^2(v-4)}\)(\(v>4\))。若 \(a_1,\dots,a_n\) iid \(N(0,\sigma^2)\),先验 \(v\lambda/\sigma^2\sim\chi^2_v\),则后验

\[\frac{v\lambda+\sum_{i=1}^na_i^2}{\sigma^2}\sim\chi^2_{v+n}.\]

抽样时就是 \(\sigma^2=(v\lambda+\sum a_i^2)/\chi^2_{v+n}\)。先验可以理解为"事先看过 \(v\) 个观测,其平均平方是 \(\lambda\)"。它和 Result 12.2 是同一件事的两种写法。


12.4 没有闭式时:替代算法

条件后验没有闭式时,需要别的抽样方法。

12.4.1 Metropolis 算法

适用于条件后验只知道到差一个归一化常数的情形(Metropolis & Ulam 1949;Metropolis et al. 1953)。

  1. 取初值 \(\theta_0\),满足 \(f(\theta_0|X)>0\);
  2. 对 \(t=1,2,\dots\): (a) 从跳跃分布或建议分布(jumping / proposal distribution)\(J_t(\theta^*|\theta_{t-1})\) 中抽候选 \(\theta^*\)。\(J_t\) 必须对称:\(J_t(\theta_i|\theta_j)=J_t(\theta_j|\theta_i)\); (b) 计算 \(r=f(\theta^*|X)/f(\theta_{t-1}|X)\); (c) 以概率 \(\min(r,1)\) 令 \(\theta_t=\theta^*\),否则 \(\theta_t=\theta_{t-1}\)。

正则条件下 \(\{\theta_t\}\) 依分布收敛到 \(f(\theta|X)\)。只用到比值,所以不需要归一化常数。需要做的只有三件事:算 \(r\)、从跳跃分布抽样、抽一个均匀随机数决定是否接受。直观上:往后验密度更高的地方跳一定接受;往更低的地方跳以概率 \(r\) 接受,这样链不会只停在众数,而会按密度比例访问各处。最常用的对称跳跃分布是以当前值为中心的正态或 Student-t,叫随机游走 Metropolis(random-walk Metropolis)。

白话解释:一个小数值例。当前值 \(\theta_{t-1}\) 处后验密度(未归一化)为 10,候选 \(\theta^*\) 处为 4,则 \(r=0.4\)。抽一个 \(U(0,1)\) 随机数,小于 0.4 就跳过去,否则原地不动,并把原值再记录一次。长期下来,链停在第一个点附近的时间约是第二个点的 2.5 倍,正好与密度之比一致。 归一化常数为什么能消掉:\(f(\theta|X)=f(X|\theta)P(\theta)/f(X)\),分子分母的 \(f(X)\) 相同,比值里直接约掉。所以只要能算"似然 × 先验"就够了。 实务上建议分布的步长要调:太小几乎每次都接受,但每步只挪一点,样本高度相关;太大几乎总被拒绝,链长时间不动。一维问题接受率在 40% 左右、高维问题在 25% 左右通常比较合适。

12.4.2 Metropolis–Hastings 算法

Hastings (1970) 去掉了对称的要求,接受比改为

\[r=\frac{f(\theta^*|X)/J_t(\theta^*|\theta_{t-1})}{f(\theta_{t-1}|X)/J_t(\theta_{t-1}|\theta^*)}=\frac{f(\theta^*|X)\,J_t(\theta_{t-1}|\theta^*)}{f(\theta_{t-1}|X)\,J_t(\theta^*|\theta_{t-1})}.\]

分子分母各除以"被建议的概率",抵消建议分布本身的偏向。

为什么正确:设转移核为 \(K(\theta\to\theta^*)=J(\theta^*|\theta)\min\{1,r\}\)。可以验证细致平衡(detailed balance)\(f(\theta)K(\theta\to\theta^*)=f(\theta^*)K(\theta^*\to\theta)\):两边都等于 \(\min\{f(\theta)J(\theta^*|\theta),\ f(\theta^*)J(\theta|\theta^*)\}\)。满足细致平衡的链以 \(f\) 为平稳分布。提高 MH 效率的方法见 Tierney (1994)。

推导拆解:为什么两边都等于那个 \(\min\)。

  1. 记 \(a=f(\theta)J(\theta^*|\theta)\),\(b=f(\theta^*)J(\theta|\theta^*)\),则从 \(\theta\) 出发的接受比是 \(r=b/a\)。
  2. 左边 \(f(\theta)K(\theta\to\theta^*)=a\min\{1,b/a\}=\min\{a,b\}\)(把 \(a\) 乘进 \(\min\) 的两项)。
  3. 反方向的接受比是 \(a/b\),右边 \(=b\min\{1,a/b\}=\min\{b,a\}\)。两边相等。
  4. 细致平衡推出平稳:对 \(\theta\) 积分,\(\int f(\theta)K(\theta\to\theta^*)d\theta=f(\theta^*)\int K(\theta^*\to\theta)d\theta=f(\theta^*)\),即"一步之后流入 \(\theta^*\) 的总概率 = 原来在 \(\theta^*\) 的概率"。(这里略去了"拒绝后留在原地"那部分概率,把它加回来结论不变。) 直观上,细致平衡说的是任意两点之间"来往的资金流"两两相抵,整体分布自然不再变化。

12.4.3 Griddy Gibbs

金融模型里常有非线性参数,例如 ARMA 的 MA 系数、GARCH 的系数,它们的条件后验没有闭式。Tanner (1996) 的 Griddy Gibbs 适用于一元条件后验,适用面广,但可能低效。对标量参数 \(\theta_i\)(\(\theta_{-i}\) 为其余参数):

  1. 在一个适当的区间内取格点 \(\theta_{i1}\le\theta_{i2}\le\cdots\le\theta_{im}\),计算 \(w_j=f(\theta_{ij}|X,\theta_{-i})\)(只需到差一个常数);
  2. 用 \(\{w_j\}\) 近似 \(\theta_i\) 的逆累积分布函数;
  3. 抽 \(U\sim U(0,1)\),经近似逆 CDF 变换得到 \(\theta_i\) 的一次抽样。

最简单的近似是把 \(\theta_i\) 当作取值于格点的离散分布 \(p(\theta_{ij})=w_j/\sum_vw_v\)。区间的选择需要检查:如果 Gibbs 样本的直方图在端点处有明显的概率质量,说明区间太窄,要扩大;如果概率集中在区间中间一小块,说明太宽(大多数 \(w_j\approx0\),浪费计算),要缩小。

Griddy Gibbs 或 MH 可以嵌入 Gibbs 抽样里,只用来抽部分参数,其余参数仍用闭式条件后验,这叫 Metropolis-within-Gibbs。第 12b 章的随机波动率和 Markov 转换 GARCH 都是这种混合结构。


12.5 带时间序列误差的线性回归

12.5.1 模型与思路

原书第 2 章用 SCA 估计过这类模型:

\[y_t=x_t'\beta+z_t,\qquad z_t=\phi z_{t-1}+a_t,\qquad a_t\sim\text{iid }N(0,\sigma^2),\qquad t=1,\dots,n,\tag{12.6}\]

\(x_t=(1,x_{1t},\dots,x_{kt})'\),可以包含 \(y_t\) 的滞后。参数 \(\theta=(\beta',\phi,\sigma^2)'\)。

思路很自然:已知时间序列模型,回归就好估;已知回归,残差 \(z_t=y_t-x_t'\beta\) 的 AR 模型也好估。Gibbs 抽样正是在两者之间来回迭代,只是每次都"抽"而不是"估"。需要三个条件后验 \(f(\beta|Y,X,\phi,\sigma^2)\)、\(f(\phi|Y,X,\beta,\sigma^2)\)、\(f(\sigma^2|Y,X,\beta,\phi)\)。

独立的共轭先验:

\[\beta\sim N(\beta_o,\Sigma_o),\qquad \phi\sim N(\phi_o,\sigma_o^2),\qquad \frac{v\lambda}{\sigma^2}\sim\chi^2_v.\tag{12.7}\]

先验中的常数叫超参数(hyperparameters),通常取 \(\beta_o=0\),\(\phi_o=0\),\(\Sigma_o\) 为大对角阵,即弱信息先验。

12.5.2 三个条件后验

\(\beta\) 的条件后验。给定 \(\phi\),做准差分(第 05 册第 16 章的 Cochrane–Orcutt 变换):\(y_{o,t}=y_t-\phi y_{t-1}\),\(x_{o,t}=x_t-\phi x_{t-1}\),得到误差为白噪声的回归

\[y_{o,t}=\beta'x_{o,t}+a_t,\qquad t=2,\dots,n.\tag{12.8}\]

OLS 估计 \(\hat\beta=(\sum x_{o,t}x_{o,t}')^{-1}\sum x_{o,t}y_{o,t}\),分布为 \(N(\beta,\sigma^2(\sum x_{o,t}x_{o,t}')^{-1})\)。由 Result 12.1a:

\[\beta|Y,X,\phi,\sigma^2\sim N(\beta_*,\Sigma_*),\quad \Sigma_*^{-1}=\frac{\sum_{t=2}^nx_{o,t}x_{o,t}'}{\sigma^2}+\Sigma_o^{-1},\quad \beta_*=\Sigma_*\Big(\frac{\sum x_{o,t}x_{o,t}'}{\sigma^2}\hat\beta+\Sigma_o^{-1}\beta_o\Big).\tag{12.9}\]

推导拆解:这一步把三件熟悉的事串了起来。

  1. 准差分:\(y_t=x_t'\beta+z_t\) 减去 \(\phi\) 倍的 \(y_{t-1}=x_{t-1}'\beta+z_{t-1}\),得 \(y_t-\phi y_{t-1}=(x_t-\phi x_{t-1})'\beta+(z_t-\phi z_{t-1})\),最后一项正是白噪声 \(a_t\)。这在 CFA 里讲序列相关的修正时出现过。
  2. OLS 的分布:误差是白噪声后,\(\hat\beta\sim N(\beta,\sigma^2(X_o'X_o)^{-1})\),数据精度就是 \(X_o'X_o/\sigma^2\)(这里 \(X_o'X_o=\sum x_{o,t}x_{o,t}'\))。
  3. 套 Result 12.1a:把 \(\hat\beta\) 当作"一个观测",后验精度 = 先验精度 \(\Sigma_o^{-1}\) + 数据精度;后验均值 = 两个均值按精度矩阵加权。 先验很弱(\(\Sigma_o\) 很大,\(\Sigma_o^{-1}\approx0\))时,\(\beta_*\approx\hat\beta\),\(\Sigma_*\approx\sigma^2(X_o'X_o)^{-1}\),正好回到 GLS 的结果。

\(\phi\) 的条件后验。给定 \(\beta\),\(z_t=y_t-\beta'x_t\) 已知,\(\hat\phi=\sum z_{t-1}z_t/\sum z_{t-1}^2\),方差 \(\sigma^2/\sum z_{t-1}^2\)。由 Result 12.1:

\[\sigma_*^{-2}=\frac{\sum_{t=2}^nz_{t-1}^2}{\sigma^2}+\sigma_o^{-2},\qquad \phi_*=\sigma_*^2\Big(\frac{\sum z_{t-1}^2}{\sigma^2}\hat\phi+\sigma_o^{-2}\phi_o\Big).\tag{12.10}\]

\(\sigma^2\) 的条件后验。\(a_t=z_t-\phi z_{t-1}\) 已知,由 Result 12.8:

\[\frac{v\lambda+\sum_{t=2}^na_t^2}{\sigma^2}\sim\chi^2_{v+(n-1)}.\tag{12.11}\]

Gibbs 步骤:(1) 设定超参数;(2) 给任意初值,比如忽略序列相关的 OLS;(3) 从 (12.9) 抽 \(\beta\);(4) 从 (12.10) 抽 \(\phi\);(5) 从 (12.11) 抽 \(\sigma^2\);重复 (3)–(5) 多次,丢掉 burn-in 后用样本均值作点估计。AR(\(p\)) 误差的推广(原书习题 12.2)只需把准差分改为 \(\phi(B)\),把 (12.10) 换成多元的 Result 12.1a。

12.5.3 例 12.1:3 年期与 1 年期国债利率

数据为美国 1 年期与 3 年期国债恒定期限周利率,1962-01-05 至 2009-04-10(圣路易斯联储),样本量 2466。利率有单位根,所以用周变化 \(c_{3t}=r_{3t}-r_{3,t-1}\)、\(c_{1t}=r_{1t}-r_{1,t-1}\)(%)。原书第 2 章用 MA(1) 误差,这里用 AR(2) 误差。传统方法(R)得到

\[c_{3t}=0.782c_{1t}+z_t,\qquad z_t=0.183z_{t-1}-0.036z_{t-2}+a_t,\qquad \sigma_a=0.068,\tag{12.12}\]

标准误分别为 0.0075、0.0201、0.0201。除滞后 4、6 处残差 ACF 边际显著外,模型充分。

贝叶斯设定 \(c_{3t}=\beta c_{1t}+z_t\),\(z_t=\phi_1z_{t-1}+\phi_2z_{t-2}+a_t\)(12.13),先验 \(\beta\sim N(0,4)\),\(\phi\sim N[0,\mathrm{diag}(0.25,0.16)]\),\((v\lambda)/\sigma^2=(10\times0.05)/\sigma^2\sim\chi^2_{10}\)。初值取两步 OLS 估计,迭代 2100 次,丢弃前 100 次。后验均值(后验标准差)为:

参数 \(\beta\) \(\phi_1\) \(\phi_2\) \(\sigma^2\)
后验均值 0.793 0.184 −0.036 0.00479
后验标准差 0.008 0.019 0.021 0.00013

\(\sigma\approx0.069\)。原书图 12.1 的迹图稳定,图 12.2 是边际后验直方图;换初值结果相似,判断已经收敛。后验均值与 (12.12) 很接近,因为样本大、模型简单,先验几乎不起作用。


12.6 缺失值

12.6.1 缺失值与异常值是同一个问题

加性异常值(additive outlier, AO)的定义是

\[y_t=\begin{cases}x_h+\omega,&t=h,\\x_t,&\text{其他},\end{cases}\tag{12.14}\]

\(\omega\) 是异常幅度,\(x_t\) 是没有异常的序列。录入错误、坏的报价、测量误差都会造成 AO。即使只有几个,AO 也可能严重扭曲参数估计,甚至导致模型误设。

判断 \(y_h\) 是不是 AO 的思路是:先假装 \(x_h\) 缺失,求它在其余数据下的条件分布;如果观测到的 \(y_h\) 在这个分布下很可能出现,就不是异常;如果概率很小,就判为 AO。所以缺失值处理和 AO 检测基于同一个思想。缺失值可以用 Kalman 滤波处理(第 11a 章 11.7 节、第 11b 章 11.15 节;Jones 1980),也可以用 MCMC(McCulloch & Tsay 1994a)。异常值文献有 Chang, Tiao & Chen (1988)、Tsay (1988)、Tsay, Peña & Pankratz (2000);异常值按影响方式分四类,这里只讨论 AO。

12.6.2 AR(\(p\)) 中单个缺失值的条件后验

设 \(x_t=\phi_1x_{t-1}+\cdots+\phi_px_{t-p}+a_t\)(12.15),\(x_h\) 缺失(\(1<h<n\))。把 \(x_h\) 当作未知参数,参数向量 \(\theta=(\phi',x_h,\sigma^2)'\)。先验 \(\phi\sim N(\phi_o,\Sigma_o)\),\(x_h\sim N(\mu_o,\sigma_o^2)\),\(v\lambda/\sigma^2\sim\chi^2_v\)。\(\phi\) 与 \(\sigma^2\) 的条件后验同 12.5 节;关键是 \(x_h\) 的条件后验。

给定模型和数据,\(x_h\) 只与它前后各 \(p\) 个邻居 \(\{x_{h-p},\dots,x_{h-1},x_{h+1},\dots,x_{h+p}\}\) 有关,因为 \(x_h\) 只出现在 \(t=h,\dots,h+p\) 这 \(p+1\) 个方程里。把这些方程改写成"关于 \(x_h\) 的回归":

  1. \(t=h\):令 \(y_h=\phi_1x_{h-1}+\cdots+\phi_px_{h-p}\),\(b_h=-a_h\),则 \(y_h=x_h+b_h=\phi_0x_h+b_h\),\(\phi_0=1\);
  2. \(t=h+j\)(\(j=1,\dots,p\)):把方程中除 \(x_h\) 以外的项移到左边,令 \(y_{h+j}=x_{h+j}-\phi_1x_{h+j-1}-\cdots-\phi_{j-1}x_{h+1}-\phi_{j+1}x_{h-1}-\cdots-\phi_px_{h+j-p}\),\(b_{h+j}=a_{h+j}\),则 \(y_{h+j}=\phi_jx_h+b_{h+j}\)。

于是得到 \(p+1\) 个方程

\[y_{h+j}=\phi_jx_h+b_{h+j},\qquad j=0,1,\dots,p,\tag{12.16}\]

(由正态对称性,\(-a_h\) 与 \(a_h\) 同分布)这是一个只有 \(p+1\) 个数据点、没有截距的简单线性回归。LS 估计与方差为

\[\hat x_h=\frac{\sum_{j=0}^p\phi_jy_{h+j}}{\sum_{j=0}^p\phi_j^2},\qquad \mathrm{Var}(\hat x_h)=\frac{\sigma^2}{\sum_{j=0}^p\phi_j^2}.\]

\(p=1\) 时

\[\hat x_h=\frac{\phi_1}{1+\phi_1^2}(x_{h-1}+x_{h+1}),\]

叫 \(x_h\) 的滤波值(filtered value)。前后两个邻居权重相同,因为高斯 AR(1) 是时间可逆的。

推导拆解:\(p=1\) 的情形逐步写出来。

  1. \(x_h\) 出现在两个方程里:\(x_h=\phi_1x_{h-1}+a_h\) 和 \(x_{h+1}=\phi_1x_h+a_{h+1}\)。
  2. 把它们看成"以 \(x_h\) 为未知系数"的回归:第一式 \(y_h:=\phi_1x_{h-1}=1\cdot x_h-a_h\);第二式 \(y_{h+1}:=x_{h+1}=\phi_1\cdot x_h+a_{h+1}\)。回归元分别是 \(1\) 和 \(\phi_1\)。
  3. 无截距回归的 OLS 是 \(\sum(\text{回归元}\times\text{因变量})/\sum\text{回归元}^2=(\phi_1x_{h-1}+\phi_1x_{h+1})/(1+\phi_1^2)\)。 数值例:\(\phi_1=0.5\),前一天 \(x_{h-1}=2\),后一天 \(x_{h+1}=1\),则 \(\hat x_h=0.4\times3=1.2\)。注意它不是简单的前后平均 1.5,而是向均值 0 收缩:\(\phi_1\) 越小,序列越"健忘",邻居提供的信息越少,估计越靠近无条件均值。 金融上,这就是停牌一天的股票(用去均值的 AR(1) 近似其超额收益或价差)的合理插补值:同时参考停牌前后的数据,而不是简单沿用前一天。

再由 Result 12.1,\(x_h\) 的条件后验为正态 \(N(\mu_*,\sigma_*^2)\):

\[\mu_*=\frac{\sigma^2\mu_o+\sigma_o^2(\sum_{j=0}^p\phi_j^2)\hat x_h}{\sigma^2+\sigma_o^2\sum_{j=0}^p\phi_j^2},\qquad \sigma_*^2=\frac{\sigma^2\sigma_o^2}{\sigma^2+\sigma_o^2\sum_{j=0}^p\phi_j^2}.\tag{12.17}\]

12.6.3 连续缺失

若 \(x_h,x_{h+1}\) 都缺失,它们与 \(\{x_{h-p},\dots,x_{h-1};x_{h+2},\dots,x_{h+p+1}\}\) 相关。有两种做法:

  1. 直接推广:构造一个以 \((x_h,x_{h+1})\) 为系数的多元线性回归,结合先验得二元正态后验,在 Gibbs 中联合抽取(原书习题 12.3);
  2. 在一次 Gibbs 迭代中多次使用单个缺失值的公式,逐个抽取。

因为相邻缺失值高度相关,联合抽取更好,缺失段较长时尤其如此;缺失点少时逐个抽取也可以。以上推导假设 \(h-p\ge1\)、\(h+p\le n\);靠近样本两端时,要相应减少回归中的数据点。


12.7 加性异常值检测

12.7.1 模型与数据增广

在 MCMC 框架下,AO 检测很直接。McCulloch & Tsay (1994a) 的简单 Gibbs 抽样效果良好,除非存在幅度相近的成片 AO(Justel, Peña & Tsay 2001)。模型为

\[y_t=\delta_t\beta_t+x_t,\qquad t=1,\dots,n,\tag{12.18}\]
  • \(\delta_t\) 是独立的 Bernoulli 变量,\(P(\delta_t=1)=\epsilon\),表示第 \(t\) 期是否出现 AO;
  • \(\beta_t\) 是独立的异常幅度;
  • \(x_t=\phi_0+\phi_1x_{t-1}+\cdots+\phi_px_{t-p}+a_t\) 是没有异常的 AR(\(p\))。

每一期都可能出现 AO,概率为 \(\epsilon\)。\(n\) 个数据,却有 \(2n+p+3\) 个参数:\(\phi\)(\(p+1\) 个)、\(\delta\)、\(\beta\)、\(\sigma^2\)、\(\epsilon\)。\(\delta\) 和 \(\beta\) 是数据增广引入的。

共轭先验:\(\phi\sim N(\phi_o,\Sigma_o)\),\(v\lambda/\sigma^2\sim\chi^2_v\),\(\epsilon\sim\mathrm{Beta}(\gamma_1,\gamma_2)\),\(\beta_t\sim N(0,\xi^2)\)。需要的条件后验有五个。

12.7.2 条件后验

\(\phi\) 与 \(\sigma^2\)。给定 \(\delta,\beta\),去掉异常得 \(x_t=y_t-\delta_t\beta_t\),就是普通的 AR(\(p\)) 回归:\(\hat\phi=(\sum_{t=p+1}^n\mathbf x_{t-1}\mathbf x_{t-1}')^{-1}\sum\mathbf x_{t-1}x_t\),\(\mathbf x_{t-1}=(1,x_{t-1},\dots,x_{t-p})'\),后验与 (12.9) 同形。\(\sigma^2\) 的后验为 \((v\lambda+\sum_{t=p+1}^na_t^2)/\sigma^2\sim\chi^2_{v+(n-p)}\),\(a_t=x_t-\phi'\mathbf x_{t-1}\)。

\(\epsilon\)。给定 \(\delta\),由 Result 12.3,\(\epsilon\sim\mathrm{Beta}(\gamma_1+\sum\delta_t,\ \gamma_2+n-\sum\delta_t)\)。(原书没有单列这一步,但它是完整 Gibbs 循环的一部分。)

\(\delta_h\)。它只和 \(j=h-p,\dots,h+p\) 的 \(y_j,\beta_j,\delta_j\)(\(j\ne h\))以及 \(\phi,\sigma^2\) 有关。令 \(x_j^*=x_j\)(\(j\ne h\)),\(x_h^*=y_h\)(第 \(h\) 点暂且取观测值本身),定义

\[w_j=x_j^*-\phi_0-\phi_1x_{j-1}^*-\cdots-\phi_px_{j-p}^*,\qquad j=h,\dots,h+p.\]
  • 情形 I(\(\delta_h=0\),先验概率 \(1-\epsilon\)):\(x_h^*=x_h\),所以 \(w_j=a_j\sim N(0,\sigma^2)\)。
  • 情形 II(\(\delta_h=1\),先验概率 \(\epsilon\)):\(x_h^*=x_h+\beta_h\),于是 \(w_h=a_h+\beta_h\sim N(\beta_h,\sigma^2)\),而 \(j>h\) 时 \(w_j=a_j-\phi_{j-h}\beta_h\sim N(-\phi_{j-h}\beta_h,\sigma^2)\)。令 \(\psi_0=-1\),\(\psi_i=\phi_i\),统一写成 \(w_j\sim N(-\psi_{j-h}\beta_h,\sigma^2)\)。

令 \(m=\min(n,h+p)\),比较两种情形下的似然并按先验概率加权:

\[P(\delta_h=1|\cdot)=\frac{\epsilon\exp\big[-\sum_{j=h}^m(w_j+\psi_{j-h}\beta_h)^2/(2\sigma^2)\big]}{\epsilon\exp\big[-\sum_{j=h}^m(w_j+\psi_{j-h}\beta_h)^2/(2\sigma^2)\big]+(1-\epsilon)\exp\big[-\sum_{j=h}^mw_j^2/(2\sigma^2)\big]}.\tag{12.19}\]

白话解释:(12.19) 是贝叶斯定理在"两个假设"上的直接应用:

\[P(\text{是异常}|\text{数据})=\frac{P(\text{是异常})\times P(\text{数据}|\text{是异常})}{P(\text{是异常})P(\text{数据}|\text{是异常})+P(\text{不是})P(\text{数据}|\text{不是})}.\]
先验概率就是 \(\epsilon\) 与 \(1-\epsilon\);两个 \(\exp[\cdot]\) 是两种情形下局部残差 \(w_j\) 的正态似然(共同的常数因子约掉了)。如果把 \(y_h\) 当真值时,它和前后几天的残差都很大,而扣掉幅度 \(\beta_h\) 后残差变小,"是异常"的似然就压倒性地大。 金融类比:交易对账时看到一笔离谱的成交价,你会同时看它前后几笔是否也跟着动。若后面的价格没有跟随,更像录入错误;若后面也延续了,更像真实的价格变动。\(w_j\)(\(j>h\))正是在做"后面有没有跟随"的检查。 代码里写成 \(1/(1+\frac{1-\epsilon}{\epsilon}e^{l_0-l_1})\) 是同一个式子,分子分母同除以分子,避免指数溢出。

\(\beta_h\)。若 \(\delta_h=0\),数据不含 \(\beta_h\) 的信息,从先验 \(N(0,\xi^2)\) 抽。若 \(\delta_h=1\),由回归 \(w_j=-\psi_{j-h}\beta_h+a_j\) 得 \(\hat\beta_h=\frac{-\sum_{j=h}^m\psi_{j-h}w_j}{\sum_{j=h}^m\psi_{j-h}^2}\),方差 \(\sigma^2/\sum\psi_{j-h}^2\),结合先验得

\[\beta_h^*=\frac{-(\sum_{j=h}^m\psi_{j-h}w_j)\xi^2}{\sigma^2+(\sum_{j=h}^m\psi_{j-h}^2)\xi^2},\qquad \sigma_{h*}^2=\frac{\sigma^2\xi^2}{\sigma^2+(\sum_{j=h}^m\psi_{j-h}^2)\xi^2}.\]

所有 Gibbs 迭代结束后,\(\delta_h\) 的样本均值就是第 \(h\) 期为 AO 的后验概率。

12.7.3 例 12.2:3 年期国债周变化

数据为美国 3 年期国债周变化 \(c_{3t}\),1988-03-18 至 1999-09-10,600 个观测(例 12.1 的子序列)。PACF 建议 AR(3),ML 拟合为

\[c_{3t}=0.227c_{3,t-1}+0.006c_{3,t-2}+0.114c_{3,t-3}+a_t,\qquad \sigma^2=0.0128,\]

标准误 0.041、0.042、0.041,\(Q(12)=11.4\) 不显著。(笔记中第三项的下标误印为 \(t-2\),此处已更正为 \(t-3\)。)

Gibbs 联合估计 + AO 检测的设定:先验 \(\phi\sim N(0,0.25I_3)\),\(v\lambda/\sigma^2=5\times0.00256/\sigma^2\sim\chi^2_5\),\(\gamma_1=5\),\(\gamma_2=95\)(预期约 5% 的点是 AO),\(\xi^2=0.1\)。这里 \(0.00256\approx\sigma^2/5\),\(\xi^2\approx9\sigma^2\),即先验认为异常幅度的标准差约为 3 倍噪声标准差。初值 \(\epsilon=0.05\),\(\sigma^2=0.012\),\(\phi=(0.2,0.02,0.1)\);迭代 1050 次,丢弃前 50 次。

结果:

\[c_{3t}=0.252c_{3,t-1}+0.003c_{3,t-2}+0.110c_{3,t-3}+a_t,\qquad \sigma^2=0.0118,\]

后验标准差 0.046、0.045、0.046、0.0008,与 ML 结果相近。原书图 12.3(b) 画出各点为 AO 的后验概率,(c) 为后验异常幅度。两个最突出的点:

  • \(t=323\)(1994-05-20):AO 后验概率 0.83,幅度 −0.304。\(c_{3t}\) 从 0.24 变为 −0.34,两周内利率约下降 0.6 个百分点。
  • \(t=201\)(1992-01-17):AO 后验概率 0.58,幅度 0.176,\(c_{3t}\) 从 −0.02 变为 0.33。

备注:Gibbs 检测的计算量大,但它联合估计参数和异常值。传统方法把估计与检测分开做,速度快,但存在多个异常值时可能产生虚假检测(一个异常值扭曲了参数,使另一个正常点看起来异常)。用 SCA 软件的传统方法也识别出 \(t=323\) 和 \(t=201\) 为最显著的两个 AO,幅度为 −0.39 与 0.36。


量化实战

应用场景

  1. 贝叶斯回归与收缩:12.5 节的 Gibbs 框架可以直接推广到因子模型的贝叶斯估计。先验 \(\beta\sim N(\beta_o,\Sigma_o)\) 就是一种收缩(shrinkage):小样本或高维因子回归中,把系数向先验均值收缩能显著降低估计误差。Black–Litterman 模型(把市场均衡收益作为先验,把投资者观点作为"数据")用的正是 Result 12.1a 这种精度加权。
  2. 行情数据清洗:12.7 节的 AO 模型可以用来识别坏报价、录入错误和闪崩中的离群成交。与"超过 3 倍标准差就剔除"的规则相比,它利用了序列的动态结构,并且同时估计模型参数,不会因为异常值本身而把阈值撑大。
  3. 缺失值插补:停牌、节假日不对齐时,12.6 节给出 AR 模型下缺失值的条件分布,可用于多重插补(multiple imputation)——不是只填一个值,而是抽多个值,让下游的风险估计反映插补的不确定性。
  4. 参数不确定性:任何 MCMC 输出都是后验样本。把每组参数抽样代入组合优化或风险计算,就得到"参数不确定性下"的风险分布,比单点估计更稳健(第 12b 章的 VaR 例子)。

Python 示例:带 AR(2) 误差回归的 Gibbs 抽样与 AO 检测

例一仿照例 12.1:模拟 2466 周的利率变化,\(c_{3t}=0.782c_{1t}+z_t\),\(z_t\) 为 AR(2)(0.183, −0.036),\(\sigma_a=0.068\),先验与原书相同;与 statsmodels 的 MLE 比较,并用一条从极端初值出发的链检查收敛。例二仿照例 12.2:模拟 600 个 AR(3) 观测,在 \(t=201\) 加 \(+0.45\)、在 \(t=323\) 加 \(-0.50\) 两个 AO,用 McCulloch–Tsay 的 Gibbs 抽样联合估计参数与 AO。

import numpy as np
import statsmodels.api as sm

rng = np.random.default_rng(12)

# ============ 例一:带 AR(2) 误差的回归的 Gibbs 抽样(仿例 12.1)============
n = 2466
c1 = rng.normal(0, 0.10, n)                          # "1 年期利率周变化"
z = np.zeros(n); a = rng.normal(0, 0.068, n)
for t in range(2, n):
    z[t] = 0.183 * z[t - 1] - 0.036 * z[t - 2] + a[t]
c3 = 0.782 * c1 + z                                   # "3 年期利率周变化"

# 先验 (同例 12.1):beta~N(0,4),phi~N(0,diag(.25,.16)),(v*lam)/sigma2 ~ chi2_v,v=10, lam=0.05
b0, B0 = 0.0, 4.0
phi0, Phi0 = np.zeros(2), np.diag([0.25, 0.16])
v, lam = 10, 0.05
p = 2

def gibbs_reg_ar(y, x, n_iter=2100, burn=100, init=None):
    if init is None:                                  # 初值:两步 OLS
        beta = np.sum(x * y) / np.sum(x * x)
        zz = y - beta * x
        Zl = np.column_stack([zz[1:-1], zz[:-2]])
        phi = np.linalg.lstsq(Zl, zz[2:], rcond=None)[0]
        sig2 = np.var(zz[2:] - Zl @ phi)
    else:
        beta, phi, sig2 = init
    draws = []
    for it in range(n_iter):
        # (1) beta | phi, sigma2:准差分后为普通回归 (12.8)(12.9)
        yo = y[p:] - phi[0] * y[p - 1:-1] - phi[1] * y[:-p]
        xo = x[p:] - phi[0] * x[p - 1:-1] - phi[1] * x[:-p]
        prec = np.sum(xo * xo) / sig2 + 1 / B0
        mean = (np.sum(xo * yo) / sig2 + b0 / B0) / prec
        beta = rng.normal(mean, np.sqrt(1 / prec))
        # (2) phi | beta, sigma2:z_t 的 AR(2) 回归 + 正态先验 (12.10)
        zz = y - beta * x
        Zl = np.column_stack([zz[1:-1], zz[:-2]]); zt = zz[2:]
        Sinv = Zl.T @ Zl / sig2 + np.linalg.inv(Phi0)
        S = np.linalg.inv(Sinv)
        m = S @ (Zl.T @ zt / sig2 + np.linalg.inv(Phi0) @ phi0)
        phi = rng.multivariate_normal(m, S)
        # (3) sigma2 | beta, phi:逆卡方 (12.11)
        res = zt - Zl @ phi
        sig2 = (v * lam + np.sum(res ** 2)) / rng.chisquare(v + len(res))
        draws.append([beta, phi[0], phi[1], sig2])
    return np.array(draws)[burn:]

D = gibbs_reg_ar(c3, c1)
names = ["beta", "phi1", "phi2", "sigma2"]
print("Gibbs 后验均值(后验标准差):")
for k, nm in enumerate(names):
    print(f"  {nm:7s} {D[:, k].mean():8.4f} ({D[:, k].std():.4f})")

def ess(x):                                           # 有效样本量:用自相关和截到首个负值
    x = x - x.mean(); n_ = len(x)
    acf = np.correlate(x, x, "full")[n_ - 1:] / (x @ x)
    s = 0
    for k in range(1, n_):
        if acf[k] < 0: break
        s += acf[k]
    return n_ / (1 + 2 * s)
print("  有效样本量:", [int(ess(D[:, k])) for k in range(4)], "/", len(D))

mle = sm.tsa.SARIMAX(c3, exog=c1, order=(2, 0, 0), trend="n").fit(disp=False)
print("MLE (SARIMAX):", np.round(mle.params, 4), "标准误:", np.round(mle.bse, 4))

# 第二条链从很差的初值出发,检查收敛
D2 = gibbs_reg_ar(c3, c1, burn=0, init=(-2.0, np.array([0.9, -0.5]), 1.0))
print("极端初值链前 3 次抽样的 beta:", np.round(D2[:3, 0], 4))
print("两条链后验均值(OLS 初值 / 极端初值):", np.round(D.mean(0), 4), np.round(D2[100:].mean(0), 4))

# ============ 例二:AR(3) 加性异常值的 Gibbs 检测(仿例 12.2,McCulloch & Tsay 1994a)============
rng = np.random.default_rng(3)
n, p = 600, 3
phi_true = np.array([0.227, 0.006, 0.114])
x = np.zeros(n)
for t in range(p, n):
    x[t] = phi_true @ x[t - p:t][::-1] + rng.normal(0, np.sqrt(0.0128))
y = x.copy()
y[200] += 0.45; y[322] -= 0.50                         # 两个加性异常值 (t=201, 323,1 起算)

# 先验:phi~N(0,0.25 I),v*lam/sigma2~chi2_5 (v*lam=5*0.00256),eps~Beta(5,95),beta_t~N(0,0.1)
Sig0inv = np.eye(p + 1) / 0.25
v, vlam, g1, g2, xi2 = 5, 5 * 0.00256, 5, 95, 0.1
def lagmat(xx):
    return np.column_stack([np.ones(n - p)] + [xx[p - i:n - i] for i in range(1, p + 1)])

delta = np.zeros(n, int); bta = np.zeros(n)
phi = np.array([0.0, 0.2, 0.02, 0.1]); sig2, eps = 0.012, 0.05
n_iter, burn = 1050, 50
P_ao = np.zeros(n); B_ao = np.zeros(n); keep = []
for it in range(n_iter):
    xx = y - delta * bta
    # phi | .
    X = lagmat(xx); xt = xx[p:]
    Sinv = X.T @ X / sig2 + Sig0inv; S = np.linalg.inv(Sinv)
    phi = rng.multivariate_normal(S @ (X.T @ xt / sig2), S)
    # sigma2 | .
    res = xt - X @ phi
    sig2 = (vlam + res @ res) / rng.chisquare(v + n - p)
    # eps | delta
    eps = rng.beta(g1 + delta.sum(), g2 + n - delta.sum())
    # delta_h, beta_h 逐点 (12.19)
    psi = np.r_[-1.0, phi[1:]]                          # psi_0=-1, psi_i=phi_i
    for h in range(p, n):
        xs = y - delta * bta; xs[h] = y[h]              # x*_j:第 h 点取观测值本身
        m = min(n - 1, h + p)
        js = np.arange(h, m + 1)
        w = np.array([xs[j] - phi[0] - phi[1:] @ xs[j - p:j][::-1] for j in js])
        ps = psi[js - h]
        l1 = -np.sum((w + ps * bta[h]) ** 2) / (2 * sig2)
        l0 = -np.sum(w ** 2) / (2 * sig2)
        pr1 = 1 / (1 + (1 - eps) / eps * np.exp(l0 - l1))
        delta[h] = rng.random() < pr1
        if delta[h]:
            den = sig2 + np.sum(ps ** 2) * xi2
            bta[h] = rng.normal(-np.sum(ps * w) * xi2 / den, np.sqrt(sig2 * xi2 / den))
        else:
            bta[h] = rng.normal(0, np.sqrt(xi2))
    if it >= burn:
        P_ao += delta; B_ao += delta * bta
        keep.append(np.r_[phi[1:], sig2, eps])
P_ao /= (n_iter - burn)
B_ao = np.where(P_ao > 0, B_ao / np.maximum(P_ao * (n_iter - burn), 1), 0)
keep = np.array(keep)
print("\nAO 模型后验均值 phi1..3, sigma2, eps:", np.round(keep.mean(0), 4))
top = np.argsort(P_ao)[::-1][:4]
print("  真实 AO 位置 t=201, 323 的后验概率:", np.round(P_ao[[200, 322]], 2), " 其余点平均:", round(np.delete(P_ao, [200, 322]).mean(), 3))
for h in top:
    print(f"  t={h + 1:3d}  AO 后验概率={P_ao[h]:.2f}  后验幅度(条件于是 AO)={B_ao[h]:+.3f}")
ols = sm.OLS(y[p:], lagmat(y)).fit()
print("忽略异常值的 OLS phi1..3:", np.round(ols.params[1:], 4), " sigma2:", round(ols.scale, 4))

关键输出:

Gibbs 后验均值(后验标准差):
  beta      0.7881 (0.0141)
  phi1      0.1803 (0.0206)
  phi2     -0.0186 (0.0205)
  sigma2    0.0048 (0.0001)
  有效样本量: [1799, 2000, 2000, 2000] / 2000
MLE (SARIMAX): [ 0.7875  0.1805 -0.0188  0.0046] 标准误: [0.0131 0.0204 0.0199 0.0001]
极端初值链前 3 次抽样的 beta: [0.906  0.7975 0.7711]
两条链后验均值(OLS 初值 / 极端初值): [ 0.7881  0.1803 -0.0186  0.0048] [ 0.7879  0.1799 -0.0176  0.0048]

AO 模型后验均值 phi1..3, sigma2, eps: [0.2109 0.0177 0.1061 0.012  0.0294]
  真实 AO 位置 t=201, 323 的后验概率: [1.   0.98]  其余点平均: 0.023
  t=201  AO 后验概率=1.00  后验幅度(条件于是 AO)=+0.478
  t=323  AO 后验概率=0.97  后验幅度(条件于是 AO)=-0.401
  t=341  AO 后验概率=0.64  后验幅度(条件于是 AO)=-0.337
  t=567  AO 后验概率=0.48  后验幅度(条件于是 AO)=-0.322
忽略异常值的 OLS phi1..3: [2.060e-01 1.000e-04 1.048e-01]  sigma2: 0.0136

读输出:

  • 例一:Gibbs 后验均值和后验标准差与 MLE 的点估计和标准误几乎一样,与原书"样本大、模型简单时贝叶斯与经典结果相近"的结论一致。有效样本量接近名义样本量(2000),说明这条链的自相关很弱、混合很好——这得益于条件后验都是闭式的,且 \(\beta\) 与 \(\phi\) 的相关性不强。从 \(\beta=-2\)、\(\sigma^2=1\) 这样离谱的初值出发,第 2 次迭代就回到了 0.8 附近,两条链的后验均值一致。
  • 例二:两个真实 AO 的后验概率分别为 1.00 和 0.97,幅度估计 +0.48、−0.40 接近真值 +0.45、−0.50。另有 \(t=341\)、\(t=567\) 两点后验概率在 0.5 上下,查看模拟数据可知它们是无异常序列本身的极端值(约 −3.2、−3.6 倍标准差):在正态假设下,这样的点确实"像"异常值。\(\epsilon\) 的后验均值约 3%,低于先验均值 5%。忽略异常值的 OLS 把 \(\sigma^2\) 估成 0.0136,比 AO 模型的 0.0120 大,这就是两个异常值把噪声方差"撑大"的效果。
  • 实务提醒:真实收益率有厚尾,正态 AO 模型会把一部分正常的尾部观测也标为 AO。用在数据清洗时,应把后验概率作为排查优先级而不是自动删除的依据;也可以把 \(a_t\) 换成 Student-t 分布(用正态尺度混合的数据增广实现)。另外,如果某个 AO 恰好把观测推向其条件均值附近,它既检测不出来,也几乎不影响估计——这种情况换个随机种子就能观察到。

本章小结

MCMC 构造一个平稳分布等于后验的马尔可夫链,用链上的样本做推断。Gibbs 抽样依次从各参数的完全条件分布中抽样,每一步都保持后验不变;实践中要丢弃 burn-in,对高相关参数分块联合抽样,并用多初值、迹图、有效样本量检查收敛。共轭先验让条件后验有闭式,核心规律是"后验精度 = 先验精度 + 数据精度";没有闭式时用 Metropolis(对称建议)、Metropolis–Hastings(一般建议,接受比含建议密度修正)或 Griddy Gibbs(一元格点逆 CDF),并可嵌入 Gibbs 之中。数据增广把缺失值、异常指示和异常幅度都当作参数:带 AR 误差的回归在准差分回归与 AR 回归之间交替抽样;AR 模型中的缺失值等价于一个 \(p+1\) 个点的无截距回归;AO 检测按先验概率加权比较"是/不是异常"两种情形下的局部似然。

概念 公式 / 要点
贝叶斯定理 \(f(\theta\mid X)\propto f(X\mid\theta)P(\theta)\)
Gibbs 抽样 依次抽 \(f_i(\theta_i\mid\theta_{-i},X)\);burn-in;分块
正态均值后验 \(\eta_*=\eta_o+n\eta\),\(\mu_*=(\eta_o\mu_o+n\eta\bar x)/\eta_*\)
多元 / 回归 \(\Sigma_*^{-1}=\Sigma_o^{-1}+X'X/\sigma^2\),\(\beta_*=\Sigma_*(\Sigma_o^{-1}\beta_o+X'y/\sigma^2)\)
Beta–Bernoulli Beta\((\alpha+\sum x_i,\beta+n-\sum x_i)\)
Gamma–Poisson / 指数 \(\Gamma(\alpha+\sum x_i,\beta+n)\) / \(\Gamma(\alpha+n,\beta+\sum x_i)\)
逆卡方–方差 \((v\lambda+\sum a_i^2)/\sigma^2\sim\chi^2_{v+n}\)
Metropolis–Hastings \(r=\dfrac{f(\theta^*)J(\theta_{t-1}\mid\theta^*)}{f(\theta_{t-1})J(\theta^*\mid\theta_{t-1})}\),以 \(\min(r,1)\) 接受
Griddy Gibbs 格点上算 \(w_j\),近似逆 CDF 抽样
AR 误差回归 准差分 \(y_t-\phi y_{t-1}\) → 抽 \(\beta\);残差 AR → 抽 \(\phi\);逆卡方 → 抽 \(\sigma^2\)
缺失值滤波值 \(\hat x_h=\sum_{j=0}^p\phi_jy_{h+j}/\sum\phi_j^2\);AR(1):\(\frac{\phi_1}{1+\phi_1^2}(x_{h-1}+x_{h+1})\)
AO 后验概率 (12.19):\(\epsilon\) 与 \(1-\epsilon\) 加权的两种局部似然之比

练习

基础

  1. (原书习题 12.1)\(x\sim N(\mu,4)\),先验 \(\mu\sim N(0,25)\),观测到一个 \(x\),求 \(\mu\) 的后验。 提示:由 Result 12.1,后验均值 \(25x/29\),方差 \(100/29\)。
  2. 某策略过去 40 个交易日有 26 天盈利。取先验 Beta(10,10),求胜率的后验分布、后验均值和 95% 可信区间;与均匀先验 Beta(1,1) 比较。 提示:后验 Beta(36,24),均值 0.6。
  3. 证明 Metropolis–Hastings 的转移核满足细致平衡。
  4. 对 AR(1) 中的单个缺失值,用 (12.16) 推导滤波值 \(\hat x_h=\frac{\phi_1}{1+\phi_1^2}(x_{h-1}+x_{h+1})\),并解释为什么前后权重相同。
  5. 在例 12.2 的先验设定下,解释 \(\gamma_1=5,\gamma_2=95\) 与 \(\xi^2=0.1\) 的含义;如果把 \(\xi^2\) 改成 0.01,你预期检测结果怎样变化? 提示:\(\xi^2\) 太小时,先验认为异常幅度很小,大幅异常会被低估、甚至部分归入噪声。

进阶

  1. (原书习题 12.2)回归误差为 AR(\(p\)) 时,在共轭先验 \(\beta\sim N(\beta_o,\Sigma_o)\),\(\phi\sim N(\phi_o,A_o)\),\(v\lambda/\sigma^2\sim\chi^2_v\) 下推导三个条件后验。
  2. (原书习题 12.3)AR(\(p\)) 中 \(x_h,x_{h+1}\) 两个相邻缺失值,给定二元正态先验,推导其联合条件后验。
  3. 修改例一代码,把 \(\beta\) 与 \(\phi\) 改为用随机游走 Metropolis 抽样(建议分布标准差分别取 0.01、0.02),比较接受率与有效样本量,体会闭式 Gibbs 步骤的效率优势。
  4. 把例二中的 \(a_t\) 改为自由度 4 的 Student-t 噪声(不加任何 AO),运行 AO 检测,统计后验概率 > 0.5 的点有多少个,讨论正态 AO 模型用于厚尾金融数据的局限。
  5. (原书习题 12.8)30 年期抵押贷款利率与 3 月期国库券利率(1971-04 至 2009-09):先用传统方法建立带时间序列误差的回归,再用 MCMC 重新估计并比较。没有数据时,可用例一的模拟框架设定一个 ARMA 误差版本。

原书推荐习题:12.2(AR(\(p\)) 误差回归的条件后验推导,掌握 Gibbs 推导套路)、12.3(连续缺失值的联合后验)、12.1(共轭先验基础计算)、12.8。


原书对照

本章小节 原书章节 PDF 页码
12.1 马尔可夫过程、马尔可夫链模拟、EM 与数据增广 第 12 章引言、12.1 p.633–635
12.2 Gibbs 抽样 12.2 p.635–637
12.3 后验分布、共轭先验(Result 12.1–12.8) 12.3 p.637–641
12.4 Metropolis、MH、Griddy Gibbs 12.4 p.642–644
12.5 带时间序列误差的回归、例 12.1 12.5 p.644–648
12.6 缺失值 12.6、12.6.1 p.648–652
12.7 异常值检测、例 12.2 12.6.2 p.652–656
习题 第 12 章习题 p.690–691

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