适应性学习与行为预期
Bounded Rationality / Adaptive Learning
放弃"代理人瞬时、全知地求解模型"的理性预期假设,转而假设代理人用递归最小二乘从历史数据中估计预测规则,并随新信息不断更新信念。本页从 PLM–ALM 框架、E-稳定性条件,到手写 RLS 模拟、IRF 对比与结构估计,完整走通一条学习型 DSGE 的建模流水线。
本模型共 28 个方程(NK 结构 3 + 冲击 AR(1) 3 + reduced-form 消元 1 + PLM 2 + 主观预期 2 + RLS 递归 3 + T-map 2 + E-stability ODE 1 + REE 解 2 + 混合预期 1 + CG 回归 1 + NK-T-map 2 + NK-Eig 1 + RE-Learning 对比 2 + 稳态 2 + 其余)。完整清单见页末 Equation Summary。
model(expectation=...) 默认求解理性预期均衡,不会替你做学习。01 概念与直觉:为什么放弃理性预期
理性预期(Rational Expectations, RE)假设代理人在给定模型结构与外生冲击分布下,无偏且瞬时地形成对未来的预测:他们"知道模型",知道均衡方程、知道冲击的 VAR 结构,甚至知道其他所有人也在做同样的预测。Lucas(1976)批判以来,这一假设成为 RBC 与 NK 模型的标准配置。但它有一个极强的隐含前提:经济经历"大制度变化"(Regime Change,如 1970s 大通胀、沃尔克紧缩、零利率下限、疫情冲击)时,代理人应当立刻用新结构重置预测规则——这显然不符合观察。
1.1 理性预期假设为什么太强
第一,认知成本。求解一个中尺度 DSGE 模型需要数学家级别的工作,真实家庭与企业不可能在每个季度都重新求解一个隐函数系统。第二,知识问题。代理人甚至不知道"模型本身"是什么——他们要预测的经济恰好是由他们自己的预测共同构成的,这是一个"自我指涉"的系统(self-referential system)。第三,证据拒绝。对 Michigan 通胀预期、Survey of Professional Forecasters(SPF)的事后检验表明:专业预测者的误差在大波动期存在显著的序列相关与系统性偏差,并非 RE 所要求的 martingale 差序列。Branch(2004)、Coibion 等(2018)的综述都记录了这一点。
1.2 适应性学习的核心思想
适应性学习(Adaptive Learning)把代理人从"全知的计量经济学家"降级为"用 OLS 在线学习的计量经济学家"。他们不直接求解模型,而是假设自己面对的经济服从某个简单的统计关系(例如 AR(1) 或线性回归),用手头数据估计参数,用估计出的预测规则做出经济决策;新数据到来后,再用递归最小二乘(Recursive Least Squares, RLS)或随机梯度下降(SGD)更新参数。时间一长,如果真实经济恰好与他们假设的关系一致,参数就会收敛到理性预期均衡(REE);但在收敛过程中,经济会呈现出缓慢、惯性、可预测的过渡动态——这正是 RE 模型无法产生的内生持续性。
1.3 Evans & Honkapohja 框架与行为预期
Evans 与 Honkapohja 在 2001 年专著 Learning and Expectations in Macroeconomics 中系统化了这一思路。他们的关键贡献是把"学习收敛性"问题转化为一个确定性常微分方程(ODE)的稳定性问题,即 E-稳定性(Expectational Stability):若把 PLM 参数 θ 映射到实际 ALM 参数的 T-map 在 REE 处的导数矩阵 DT(θ*) 的所有特征值实部都小于 1,则代理人的递归学习在大样本下局部收敛到 REE。这把"学习是否会收敛"这一原本需要模拟才能回答的问题,变成了一个可解析判定的条件。
与"适应性学习"平行的另一支文献是 行为预期 / 异质预期(Heterogeneous Expectations),以 Hommes 等的 learning-to-forecast 实验为代表:在实验室里让真人被试对资产价格或通胀做预测,发现他们系统性地使用简单的启发式(heuristics)——自适应规则、趋势外推、朴素预期——并在不同启发式之间切换。Branch & Evans(2006, 2007)把这种"选模型"的微观行为嵌入宏观模型,得到了内生信念选择与多重均衡。Hommes(2011)的综述表明,实验室数据在统计上显著拒绝 RE,而支持"异质启发式 + 选择强度"的混合模型。
理性预期是"闭眼直接跳到终点";适应性学习是"代理人一边走一边用最小二乘修正方向"。模型研究的对象因此从一个均衡点扩展到从任意初始信念出发的一条学习轨迹——这给货币政策评估、通胀脱锚(de-anchoring)、大通胀结束后的过渡,都提供了 RE 框架内不可能有的解释空间。
02 模型假设与公式
2.1 基准 NK 三方程模型(回顾)
我们沿用本工作站 NK 三方程模型 的对数线性化版本。所有变量均为相对于稳态的偏离(gap),时间下标 $t$ 表示季度。
在 RE 下,$E_t$ 是模型一致的数学期望,Dynare 用 Blanchard–Kahn 条件求解。在学习框架下,$E_t$ 改为代理人基于主观信念 $\mathbb{E}_t^*$ 形成的预测,与真实条件期望不再相等。
2.1.1 三个外生冲击的 AR(1) 方程
2.1.2 NK → reduced form 的消元(结构参数 → $\alpha$)
把 (NK-3) Taylor 规则代入 (NK-1) IS,消去 $i_t$,并记复合外生驱动 $w_t=(\kappa r_t^n+\sigma u_t)/(\sigma+\kappa\phi_\pi)$:
2.2 学习机制:PLM 与 ALM
代理人不知道真实结构模型,但他们"认为"经济服从一个简单的线性运动定律。这一被感知到的运动定律称为 PLM(Perceived Law of Motion);把 PLM 代入真实结构方程后得到的、经济实际服从的运动定律称为 ALM(Actual Law of Motion)。
2.3 递归最小二乘(RLS)更新公式
每期新数据到来后,代理人用递归最小二乘更新 PLM 的系数。把 PLM 写成向量回归形式 $y_t = \beta_t' x_{t-1} + \text{error}$,其中 $x_{t-1} = (1, \pi_{t-1}, x_{t-1})'$,$\beta_t = (a_t, b_t, c_t)'$。
2.3.1 RLS 的推导:从 OLS 解析解到递归
普通最小二乘(OLS)的解析解为 $\beta_t = R_t^{-1} b_t$,其中 $R_t=\sum_{\tau=1}^t x_{\tau-1}x_{\tau-1}'$,$b_t=\sum_{\tau=1}^t x_{\tau-1}y_\tau$。把 $t$ 期与 $t-1$ 期相减:
递减增益(decreasing gain / 标准 RLS):$\gamma_t = 1/(t+1)$,随时间趋于 0。其大样本性质等价于 OLS:旧数据权重下降,代理人最终把所有历史一视同仁地回归。它能保证在 E-稳定条件下收敛到 REE。
恒定增益(constant gain learning, CGL):$\gamma_t = \bar\gamma$(典型取值 0.01–0.05),等价于对过去数据做指数加权(discounted least squares)。代理人"忘记"远期历史,对近期冲击更敏感——这使得即使在长期,经济也不会精确停在 REE,而是围绕它持续波动,产生内生 persistence 与肥尾。
2.4 E-稳定性:REE 是否在学习下稳定
为了把"学习是否收敛"变成可解析判定的问题,Evans–Honkapohja 引入 T-map:把任意 PLM 参数 $\theta$ 代入结构模型,得到对应的 ALM 参数 $T(\theta)$。REE 恰好是 T-map 的不动点 $\theta^* = T(\theta^*)$。
2.5 异质预期:理性 + 学习的混合
现实中并非所有代理人都用同一种规则。一个自然扩展是假设经济中存在 $\omega$ 比例的"理性代理人"与 $1-\omega$ 比例的"学习型代理人":
03 逐步求解流程
本节在一个已对数线性化的线性理性预期系统上做适应性学习求解。不熟悉线性系统与扰动法?先学 📚 基础知识库·对数线性化 → 与 📚 基础知识库·扰动法 →,再回来看学习规则如何替换理性预期。
下面用一个最小可解析模型走完整流程,再把同一套逻辑搬到 NK 模型上。考虑简化的 reduced form:
3.1 E-稳定性的数值检验(特征值判据)
步骤 4 的解析判据 $|\alpha|<1,\ |\alpha\rho|<1$ 在复杂 NK 模型中很难手算,下面给出一段数值检验:给定结构参数,把 T-map 在 REE 处的雅可比矩阵 $DT(\theta^*)$ 数值化,并检查所有特征值实部是否严格小于 1。
3.2 NK 模型上的 T-map 与 E-稳定性
把 PLM 写成 $\pi_t=a+b\pi_{t-1}+cx_{t-1}$、$x_t=d+e\pi_{t-1}+fx_{t-1}$,主观预期 $\mathbb E_t^*\pi_{t+1}=a+b\pi_t+cx_t$、$\mathbb E_t^*x_{t+1}=d+e\pi_t+fx_t$。代入 (NK-1)(NK-2),整理出 $\pi_t,x_t$ 关于 $(\pi_{t-1},x_{t-1})$ 的新系数,即 T-map:
"""
E-stability 数值检验: 对简化 reduced form y_t = mu + alpha E*y_{t+1} + delta w_t
PLM: y_t = a + b w_t, T(a)=mu+alpha*a, T(b)=delta+alpha*rho*b
REE: a*=mu/(1-alpha), b*=delta/(1-alpha*rho)
E-stability: DT = diag(alpha, alpha*rho) 的特征值实部 < 1
"""
import numpy as np
def check_estability(alpha, rho, verbose=True):
DT = np.array([[alpha, 0.0],
[0.0, alpha*rho]])
eig = np.linalg.eigvals(DT)
stable = np.all(np.real(eig) < 1.0)
if verbose:
print(f"alpha={alpha:.3f}, rho={rho:.3f}")
print(f" DT 特征值: {eig}")
print(f" 最大实部 {np.max(np.real(eig)):.4f} -> E-stable? {stable}")
return stable, eig
# 教科书 NK 校准: Taylor 原则 phi_pi>1 对应 alpha 较小
for alpha in [0.5, 0.9, 1.1]:
check_estability(alpha, rho=0.8)
# 输出: alpha=0.5 与 0.9 时 E-stable; alpha=1.1 时 E-unstable
# 经济含义: 央行反应越温和(phi_pi 接近 1), 前向系数 alpha 越大,
# 学习动态越可能发散 => 通胀脱锚风险.
用法:在你的完整 NK/中尺度模型里,把 PLM 系数堆成向量 $\theta$,数值扰动 T-map 得到 $DT(\theta^*)$(或用自动微分),跑上面的特征值检查即可。这比"先跑模拟看是否收敛"快几个数量级,是论文 robustness 章节的标准动作。
04 完整可运行 Python 代码
下面的代码实现三件事:(1) 在简化 reduced form 上手写 RLS 学习,画信念从 $\beta_0=0$ 向 REE 收敛的路径;(2) 对比递减增益与恒定增益;(3) 在 NK 三方程上做 IRF,对比 RE 与学习下通胀对成本推动冲击的响应。所有代码均手写时间迭代,不调用 Dynare。
"""
适应性学习(Adaptive Learning)最小可运行模拟
模型: y_t = mu + alpha * E* y_{t+1} + delta * w_t + eps_t, w_t = rho*w_{t-1} + eta_t
PLM : y_t = a + b * w_t, 即 x_t = [1, w_t]', theta = [a, b]
更新: RLS (gamma_t = 1/(t+1)) 或 Constant Gain (gamma = gbar)
"""
import numpy as np
import matplotlib.pyplot as plt
# ---------- 1. 参数 ----------
alpha = 0.90 # 前向系数 (对应 NK 模型中 phi_pi 较强时的值)
rho = 0.80 # 外生冲击持续性
delta = 0.50 # 外生冲击传导
mu = 1.0 # 常数项
sig_e = 0.10 # 内生冲击标准差
sig_w = 0.10 # 外生冲击标准差
T = 2000 # 模拟期数
gbar = 0.02 # 恒定增益
# 解析的 REE(理性预期均衡)
a_star = mu / (1 - alpha)
b_star = delta / (1 - alpha * rho)
print(f"REE: a*={a_star:.4f}, b*={b_star:.4f}")
def run_learning(gain_mode="decreasing", seed=42):
"""跑一次学习模拟, 返回 (theta 路径, y 路径, w 路径)"""
rng = np.random.default_rng(seed)
theta = np.array([0.0, 0.0]) # 初始信念: 全部为 0 (远离 REE)
R = np.eye(2) * 10.0 # 初始信息矩阵 (伪逆保护)
w = 0.0
a_path = np.zeros(T); b_path = np.zeros(T)
y_path = np.zeros(T)
for t in range(1, T):
# --- (a) 外生状态 ---
w = rho * w + sig_w * rng.standard_normal()
# --- (b) 代理人基于 PLM 形成 E* y_{t+1} ---
# PLM: y_t = theta' x_{t-1}, E*[y_{t+1}|I_t] = theta0 + theta1 * E*[w_{t+1}]
# 代理人知道 w 的 AR(1) 系数 rho
Et_y_next = theta[0] + theta[1] * (rho * w)
# --- (c) ALM: 真实 y_t 由结构方程决定 ---
eps = sig_e * rng.standard_normal()
y = mu + alpha * Et_y_next + delta * w + eps
y_path[t] = y
# --- (d) RLS / CG 更新 theta 与 R ---
x_lag = np.array([1.0, w]) # 回归元 [1, w_t]
gamma = 1.0/(t+1) if gain_mode == "decreasing" else gbar
R = R + gamma * (np.outer(x_lag, x_lag) - R)
err = y - theta @ x_lag # 预测误差
theta = theta + gamma * np.linalg.solve(R, x_lag) * err
a_path[t] = theta[0]; b_path[t] = theta[1]
return a_path, b_path, y_path
# ---------- 2. 跑两种增益 ----------
a_dec, b_dec, y_dec = run_learning("decreasing")
a_cg, b_cg, y_cg = run_learning("constant")
# ---------- 3. 画收敛路径 ----------
fig, axes = plt.subplots(2, 2, figsize=(11, 7))
for ax, path, star, name in zip(
axes[0],
[a_dec, b_dec], [a_star, b_star], ["a (intercept)", "b (slope on w)"]):
ax.plot(path, lw=1.2, label="decreasing gain (RLS)")
ax.axhline(star, color="k", ls="--", lw=1, label=f"REE = {star:.3f}")
ax.set_title(f"PLM coefficient: {name}"); ax.legend(fontsize=8)
for ax, path, star, name in zip(
axes[1],
[a_cg, b_cg], [a_star, b_star], ["a (intercept)", "b (slope on w)"]):
ax.plot(path, lw=1.2, label="constant gain (g=0.02)")
ax.axhline(star, color="k", ls="--", lw=1, label=f"REE = {star:.3f}")
ax.set_title(f"PLM coefficient: {name}"); ax.legend(fontsize=8)
plt.tight_layout(); plt.savefig("learning_convergence.png", dpi=130); plt.show()
# 输出渐近样本均值, 看 CG 是否围绕 REE 波动
print(f"RLS 末段均值: a={a_dec[-200:].mean():.3f}, b={b_dec[-200:].mean():.3f}")
print(f"CG 末段均值: a={a_cg[-200:].mean():.3f}, b={b_cg[-200:].mean():.3f}")
print(f"CG 末段标准差: a={a_cg[-200:].std():.3f}, b={b_cg[-200:].std():.3f} <-- 内生波动")
下面一段代码把同一套 RLS 套到 NK 三方程上,比较 RE 与学习下通胀对一期成本推动冲击的 IRF。关键差别是:RE 路径由 Dynare 等价的解析解给出;学习路径则在每一期用代理人当前的 $(a_t,b_t,c_t)$ 替代 $E_t \pi_{t+1}, E_t x_{t+1}$。
"""
NK 三方程下, 一次 1 单位成本推动冲击 u_t 的 IRF 对比
RE: 直接用解析的 RE 决策规则 pi_t = phi_pi^RE * u_t / (1 - beta*rho_u) 简化近似
Learning: 代理人用 RLS 学习 PLM pi_t = a + b*pi_{t-1} + c*x_{t-1}
"""
import numpy as np
import matplotlib.pyplot as plt
# NK 参数
beta, sigma, kappa, phi_pi, rho_u = 0.99, 1.0, 0.10, 1.5, 0.8
H = 40 # IRF 长度
gbar = 0.03 # 恒定增益
# ---- (A) 理性预期 IRF (解析近似: 把 IS 代入 Phillip 后) ----
# 在 Taylor 规则与 rho_u 下, RE 通胀对 u_t 的解析系数
pi_re = np.zeros(H); x_re = np.zeros(H)
coef_pi = kappa / (1 - beta*rho_u - sigma**(-1)*(phi_pi - 1)*kappa)
# 注: 这是教科书线性化解析解的简化形式, 教学用
u = np.zeros(H); u[0] = 1.0
for t in range(1, H):
u[t] = rho_u * u[t-1]
pi_re[t] = coef_pi * u[t]
x_re[t] = (pi_re[t] - beta*pi_re[t-1]) / kappa
# ---- (B) 学习 IRF: 先做一段 burn-in 让信念接近 REE, 再在 t=0 注入冲击 ----
rng = np.random.default_rng(0)
theta = np.array([0.0, 0.9, 0.1]) # 初始信念: 高度外推
R = np.eye(3) * 5.0
pi_lrn = np.zeros(H); x_lrn = np.zeros(H)
pi_prev, x_prev = 0.0, 0.0
for t in range(H):
# 代理人主观预期: E* pi_{t+1} = theta0 + theta1*pi_t + theta2*x_t
Ep_next = theta[0] + theta[1]*pi_prev + theta[2]*x_prev
Ex_next = Ep_next * 0.5 # 简化: 产出预期与通胀预期同向
# 结构方程 (把 IS 与 Phillips 联立)
u_t = u[t]
# 简化求解: x_t 由 IS 给出, pi_t 由 Phillips 给出
i_t = phi_pi * pi_prev
x_t = Ex_next - sigma**(-1)*(i_t - Ep_next)
pi_t = beta*Ep_next + kappa*x_t + u_t
pi_lrn[t] = pi_t; x_lrn[t] = x_t
# RLS 更新 (用 [1, pi_{t-1}, x_{t-1}] 回归 pi_t)
x_lag = np.array([1.0, pi_prev, x_prev])
R = R + gbar*(np.outer(x_lag, x_lag) - R)
theta = theta + gbar*np.linalg.solve(R, x_lag)*(pi_t - theta@x_lag)
pi_prev, x_prev = pi_t, x_t
fig, ax = plt.subplots(1, 2, figsize=(11, 4))
ax[0].plot(pi_re, "-o", label="Rational Expectations", lw=2)
ax[0].plot(pi_lrn, "-s", label="Adaptive Learning (CG=0.03)", lw=2)
ax[0].set_title("Inflation IRF to cost-push shock"); ax[0].legend()
ax[1].plot(x_re, "-o", label="RE", lw=2)
ax[1].plot(x_lrn, "-s", label="Learning", lw=2)
ax[1].set_title("Output gap IRF"); ax[1].legend()
plt.tight_layout(); plt.savefig("irf_re_vs_learning.png", dpi=130)
(1) 递归顺序不能错:先有 $w_t$,再用 $\theta_{t-1}$ 形成预期,再算 $y_t$,最后才能用 $y_t$ 与 $x_{t-1}$ 更新 $\theta_t$。把更新放到形成预期之前,等于"本期用到了本期的预期",会引入前视偏误。
(2) $R_t$ 必须初始化为正定,否则第一步 np.linalg.solve(R, x) 会报错。常用 $R_0 = \lambda I$,$\lambda$ 取 5–50。
(3) 恒定增益的选择:$\bar\gamma=0.02$ 等价于约 25 年(100 季度)的记忆窗口,是 Orphanides & Williams (2005) 与 Milani (2007) 的中位估计。
05 估计方法:如何从数据中估计学习参数
学习型模型引入了两类新参数:增益系数 $\bar\gamma$(或衰减率)与初始信念 $\beta_0$。它们无法从 RE 模型的稳态公式推出来,必须用数据估计。
5.1 三种主流估计路径
- 极大似然 / 贝叶斯估计:把学习方程嵌入状态空间,用卡尔曼滤波或粒子滤波(因为学习使状态转移非线性)构造似然,再用 MCMC 估计 $\bar\gamma, \beta_0$。Milani (2007) 在美战后数据上估计出 $\bar\gamma\approx 0.02$,并发现一旦允许学习,模型所需的"通胀惯性"系数大幅下降——学习本身就是惯性来源。
- 矩估计 / SMM(Simulated Method of Moments):因为学习模型没有解析似然(尤其在异质预期下),常用 SMM:选一组数据矩(通胀自相关、预测误差方差、persistence),模拟不同 $\bar\gamma$ 下的模型矩,最小化二次距离。本工作站 非线性 GMM 与 SMM 一节有详细流程。
- 直接用调查预期数据校准:若有家庭/专业 forecaster 的预测序列,可直接对"预测 = 滞后数据回归"做 RLS 估计,得到每一期的 $\beta_t$ 序列,反推隐含增益。这是 Coibion & Gorodnichenko (2012) 的做法,他们发现调查预测误差对预测误差滞后项显著为正,符合恒定增益学习的预测。
5.2 数据来源
| 数据 | 发布方 | 用途 |
|---|---|---|
| Michigan Survey of Consumers(家庭通胀预期) | University of Michigan | 家庭层面短视/自适应预期的直接证据 |
| Survey of Professional Forecasters(SPF) | 费城联储 / ECB SPF | 专业 forecaster 预期,用于校准 $\omega$(理性份额) |
| FOMC Greenbook 预测 | 美联储理事会 | 央行自身预测行为,用于"央行是否也在学习" |
| 中国人民银行城镇储户问卷(未来物价预期指数) | 中国人民银行统计调查司 | 中国家庭通胀预期的高频代理变量 |
| Wind / Choice 经济学家一致预期 | Wind 资讯 / 东方财富 | 中国市场专业 forecaster 预期,与 SPF 对位 |
| 国家统计局 CPI、GDP 平减指数 | NBS | 与预期数据配对,构造预测误差 |
实证上一个关键做法是:把"调查预测误差对其滞后项回归",系数显著为正即拒绝 RE(RE 下预测误差应为 martingale 差),并支持恒定增益学习——这正是 Coibion–Gorodnichenko 回归。在中国数据上,《经济研究》《金融研究》多篇论文用储户问卷与 SPF 中国版重复了这一检验,普遍发现 2005–2015 年间居民预期更接近自适应规则,而经济学家一致预期更接近 RE。
5.3 增益参数 $\bar\gamma$ 的校准与估计值一览
恒定增益 $\bar\gamma$ 是学习模型唯一的"心理参数",文献给出的中位数估计如下。$\bar\gamma$ 等价记忆窗口约为 $1/(2\bar\gamma)$ 期:$\bar\gamma=0.02$ 对应约 25 年(100 季度)记忆。
| 文献 | 数据 | 估计/校准 $\bar\gamma$ | 含义 |
|---|---|---|---|
| Milani (2007, JME) | 美国战后季度数据,贝叶斯估计 | 0.018–0.025 | 基准中位 0.02;学习一开,内生惯性系数大降 |
| Orphanides-Williams (2005, JET/BPEA) | 美国 SPF 通胀预期 | 0.01–0.03 | 学习下央行应更激进抗通胀 |
| Branch-Evans (2006/2007) | 调查预期,模型选择 | 0.02–0.05 | 异质启发式切换下增益偏大 |
| Malmendier-Nagel (2016, QJE) | Michigan 家庭通胀预期,分出生队列 | 经验权重 ≈ 0.02–0.04 | 年轻家庭权重更集中于近期 => 增益更大 |
| 中文文献(陈彦斌等) | 人行储户问卷 + 一致预期 | 0.03–0.06(居民)/ 0.01–0.02(机构) | 中国居民学习速度显著快于专业预测者 |
校准建议:教学/基准模拟取 $\bar\gamma=0.02$;做美国宏观校准跟 Milani (2007);做中国家庭侧建议上探到 0.04–0.05,因为储户问卷显示中国居民预期对近期新闻反应更强、记忆更短。
5.4 Coibion-Gorodnichenko 回归:用调查数据直接检验学习
CG (2012, AER) 的核心回归:设 $F_t \pi_{t+h}$ 为调查中对 $t+h$ 期通胀的 $t$ 期预测,实际误差为 $\pi_{t+h}-F_t\pi_{t+h}$。RE 下误差应与 $t$ 期已知信息无关;恒定增益学习下,误差对滞后预测误差回归应系数显著为正:
"""
Coibion-Gorodnichenko 回归教学版
输入: 实际通胀序列 actual[t] 与调查预测序列 forecast[t]
输出: 误差对滞后误差的回归系数 beta_CG
"""
import numpy as np
from numpy.linalg import lstsq
def coibion_gorodnichenko_reg(actual, forecast):
"""actual[t]: t 期实际通胀; forecast[t]: t-1 期对 t 期通胀的预测
返回 (alpha, beta_CG), 并打印 RE 是否被拒绝"""
err = actual[1:] - forecast[1] # 实际预测误差
err_lag = err[:-1] # 滞后误差
y = err[1:]
X = np.column_stack([np.ones(len(y)), err_lag[:len(y)]])
coef, *_ = lstsq(X, y, rcond=None)
alpha, beta_CG = coef
# 简单 t 检验 (OLS 标准误, 教学用)
resid = y - X @ coef
sigma2 = (resid @ resid) / (len(y) - 2)
cov = sigma2 * np.linalg.inv(X.T @ X)
se = np.sqrt(np.diag(cov))
t_stat = beta_CG / se[1]
print(f"alpha={alpha:.4f}, beta_CG={beta_CG:.4f} (t={t_stat:.2f})")
print("RE 被拒绝 (beta_CG>0 显著)?" , abs(t_stat) > 1.96 and beta_CG > 0)
return alpha, beta_CG
# 模拟: 恒定增益学习生成的预测 => CG 回归应显著为正
rng = np.random.default_rng(0)
T = 400
pi = np.zeros(T); pi[0] = 2.0
theta = 2.0 # 代理人对稳态通胀的初始信念
gbar = 0.03
for t in range(1, T):
pi[t] = 0.9*pi[t-1] + 0.5*(theta - 0.9*pi[t-1]) + 0.2*rng.standard_normal()
forecast_t = theta
theta = theta + gbar*(pi[t] - theta) # 简化 RLS
coibion_gorodnichenko_reg(pi[10:], np.roll(pi, 1)[10:])
把 actual 换成美国 SPF 通胀预测、把 forecast 换成同一批 forecaster 的历史预测,或把中国人民银行城镇储户问卷的"未来物价预期指数"数字化(扩散指数转预期通胀),即可在中文数据上复现 CG 检验。这是把学习模型"对数据开口"的最便宜做法——不需要完整 DSGE 似然。
06 脉冲响应与经济直觉
6.1 学习下 IRF 与 RE 的三点系统性差异
- 惯性(inertia):RE 下通胀对成本推动冲击的峰值在第 1 期,之后单调衰减;学习下由于代理人只能从数据里"事后"意识到通胀上升,第 1 期反应小,第 2–3 期才达到峰值,整体拖长。这解释了 1970s 美国通胀为何持续数年。
- 延迟(delay):货币政策紧缩后,RE 下企业立刻上调降息预期;学习下企业要看到实际利率上升几个季度才修改信念,导致政策传导滞后。Orphanides & Williams 以此论证:在学习环境下,央行应更早行动,因为政策见效慢于 RE 模型预测。
- 过度反应 / 波动率放大:恒定增益学习下,代理人把"暂时冲击"误读为"结构变化",持续外推,导致通胀与产出缺口的方差显著大于 RE 版本。这一机制可以在不引入"工资合同习惯"的情况下,单独解释观测到的宏观波动率。
6.2 恒定增益如何产生内生波动
递减增益下 $\gamma_t\to 0$,学习最终"熄灭",经济收敛到 REE 附近的小邻域。但恒定增益 $\bar\gamma>0$ 使代理人始终对最近冲击赋予同样权重,即使冲击是 i.i.d. 的,信念 $\beta_t$ 也会持续波动。这种"信念噪声"通过前向结构方程放大到实际经济变量上,产生 RE 模型中不存在的内生 persistence 与肥尾。Branch & Evans (2007) 进一步证明:当代理人在多个 PLM 之间按预测表现切换时,模型可以产生内生的"制度切换"——不需要外生 Markov 切换,经济自己会在"高通胀"与"低通胀"信念之间游走。
6.3 货币政策在学习环境下的设计差异
RE 下,最优政策的核心是"对通胀猛烈反应 + 承诺可信"(Blanchard–Kahn 稳定性条件)。学习下结论有三点变化:
- 更激进的抗通胀反应:因为代理人要从实际利率变化中"学"央行偏好,反应系数 $\phi_\pi$ 越大,学习收敛越快,E-稳定区越大。
- 更多的透明性与沟通:央行公开自身预测与反应函数,等价于让代理人"免费"获得理性预期信息,相当于提高 $\omega$。
- 避免"意外紧缩":在恒定增益环境下,未预期的政策变化会被代理人误读为 regime shift,引发数年的信念调整成本——Orphanides–Williams 因此主张"循序渐进、可预期地"退出宽松。
07 经典论文案例
08 常见错误与调试
正确顺序是:用 $\beta_{t-1}$ 形成 $E_t^*$ → 解出 $y_t$ → 用 $y_t, x_{t-1}$ 更新到 $\beta_t$。若把更新写在形成预期之前,相当于代理人在 $t$ 期已经"看到"了 $y_t$ 再做预测,结果是信念瞬间收敛、学习效应消失,IRF 退化为 RE。这是新手最常见的 bug,调试方法:在循环里 print 一次 $\beta_t$,若它在第 1 期就跳到 REE,就是顺序错了。
若 $R_0 = 0$ 或 $R_0$ 是奇异矩阵,第一步 np.linalg.solve(R, x) 会直接报错。标准做法是 $R_0 = \lambda I$,$\lambda\in[5, 50]$;并在循环开头加一行 if np.linalg.matrix_rank(R) < len(theta): R += 1e-6*np.eye(3) 兜底。
PLM 设定过小(如只放常数项)时,代理人在结构上就无法收敛到 REE——即使 E-稳定条件满足也没用。PLM 过大(如把所有外生状态的滞后 4 阶都放进回归)则会因为参数维度过大、样本太短而方差爆炸。调试方法:先在一个已知 REE 的简化模型上做"自洽性测试"——若 PLM 与 ALM 同阶,且 E-稳定条件成立,递减增益下 $\beta_t$ 必须收敛到解析的 $\beta^*$;若不收敛,就是 PLM 选错了。
递减增益 $\gamma_t=1/(t+1)$ 下,大样本信念方差趋于零——这是 OLS 的标准性质。恒定增益 $\bar\gamma$ 下,信念永不收敛,只围绕 REE 做平稳波动。论文写作时若只说"学习收敛到 REE",必须指明用的是递减增益;若用恒定增益,应说"围绕 REE 的平稳分布"。混用这两个概念是审稿人最常抓的问题。
Dynare 的 model(expectation=...) 与 stoch_simul 都是在 RE 假设下求解 Blanchard–Kahn 系统,没有内置 RLS 学习。若想在 Dynare 里做学习,需要用 @#for 预处理把学习状态 $\beta_t$ 写成额外的状态变量,并在 model; 块里手写递归——这等价于在 Dynare 里再写一遍 Python 循环,通常不如直接 NumPy 直观。
09 进阶资料
- Evans & Honkapohja 专著主页(Princeton 官网):https://press.princeton.edu/books/paperback/9780691091696/learning-and-expectations-in-macroeconomics
- George W. Evans 个人主页(含课程 slides 与代码):https://economic.depaul.edu/gevans/
- RevMac 综述 "Learning in Macroeconomics"(Evans, Honkapohja, Sargent):Annual Review of Economics 2019
- Constant Gain 估计与 NK 应用(Milani 2007 原文 NBER 版本):https://www.nber.org/papers/w13124
- Hommes learning-to-forecast 实验综述:Cars Hommes 学术主页
- Coibion–Gorodnichenko 预测误差回归(AER 2012 原版):https://www.aeaweb.org/articles?id=10.1257/aer.102.4.1446
- 中国人民银行城镇储户问卷调查数据说明:http://www.pbc.gov.cn/diaochatongjisi/116219/116319/index.html
- 费城联储 Survey of Professional Forecasters:https://www.philadelphiafed.org/surveys-and-data/real-time-data-research/survey-of-professional-forecasters
EQ 方程总清单 Equation Summary
下表汇总本页全部方程,按结构模型 / 学习机制 / 推导链 / 估计四组排列。
| 编号 | 方程 | 模块 |
|---|---|---|
| (NK-1) | $x_t=E_t x_{t+1}-\sigma^{-1}(i_t-E_t\pi_{t+1}-r_t^n)$ | IS 曲线 |
| (NK-2) | $\pi_t=\beta E_t\pi_{t+1}+\kappa x_t+u_t$ | NKPC |
| (NK-3) | $i_t=\rho_i i_{t-1}+(1-\rho_i)(\phi_\pi\pi_t+\phi_x x_t)+\varepsilon_t^m$ | Taylor 规则 |
| (NK-SHOCK) | $r_t^n=\rho_{rn}r_{t-1}^n+\varepsilon_t^{rn};\;u_t=\rho_u u_{t-1}+\varepsilon_t^u;\;\varepsilon_t^m=\rho_m\varepsilon_{t-1}^m+\varepsilon_t^m$ | 外生冲击 AR(1) |
| (NK-RF) | $x_t=\alpha E_t^*\pi_{t+1}+\delta r_t^n+\zeta u_t$ | reduced form 消元 |
| (RF) | $y_t=\mu+\alpha E_t^*y_{t+1}+\delta w_t+\varepsilon_t$ | 教学 reduced form |
| (L-1a) | $\pi_t=a_t+b_t\pi_{t-1}+c_t x_{t-1}+\eta_t^\pi$ | PLM (通胀) |
| (L-1b) | $x_t=d_t+e_t\pi_{t-1}+f_t x_{t-1}+\eta_t^x$ | PLM (产出) |
| (L-2a) | $\mathbb E_t^*\pi_{t+1}=a_t+b_t\pi_t+c_t x_t$ | 主观预期 (通胀) |
| (L-2b) | $\mathbb E_t^*x_{t+1}=d_t+e_t\pi_t+f_t x_t$ | 主观预期 (产出) |
| (L-3a) | $\beta_t=\beta_{t-1}+\gamma_t R_t^{-1}x_{t-1}(y_t-\beta_{t-1}'x_{t-1})$ | RLS 系数更新 |
| (L-3b) | $R_t=R_{t-1}+\gamma_t(x_{t-1}x_{t-1}'-R_{t-1})$ | RLS 协方差更新 |
| (L-4) | $d\theta/d\tau=T(\theta)-\theta$ | E-稳定性 ODE |
| (L-5) | $\mathbb E_t^{mix}y_{t+1}=\omega\mathbb E_t^{RE}y_{t+1}+(1-\omega)\mathbb E_t^{AL}y_{t+1}$ | 混合预期 |
| (T-REDUCED) | $T(a)=\mu+\alpha a;\;T(b)=\delta+\alpha\rho b$ | reduced form T-map |
| (REE-R) | $a^*=\mu/(1-\alpha);\;b^*=\delta/(1-\alpha\rho)$ | REE 解析解 |
| (EIG-R) | $DT=\text{diag}(\alpha,\alpha\rho)$;E-stable $\iff$ 所有 $|\cdot|<1$ | reduced form 特征值 |
| (NK-TMAP) | $DT(\theta^*)=\partial T/\partial\theta|_{\theta^*}$ | NK T-map 雅可比 |
| (NK-REE) | $\pi_t^{RE}=A_\pi u_t,\;A_\pi=\kappa/(1-\beta\rho_u-\sigma^{-1}(\phi_\pi-1)\kappa)$ | RE 解析 IRF 系数 |
| (CG-REG) | $\pi_{t+h}-F_t\pi_{t+h}=\alpha+\beta_{CG}(\pi_{t+h-1}-F_{t-1}\pi_{t+h-1})+\varepsilon_t$ | Coibion-Gorodnichenko 回归 |
| (GAIN-D) | $\gamma_t=1/(t+1)$ (递减增益) | 递减增益 |
| (GAIN-C) | $\gamma_t=\bar\gamma\in(0,1)$ (恒定增益) | 恒定增益 |
| (STEADY) | $\theta^*=T(\theta^*)$ | REE 不动点 |
合计:NK 结构 3 + 冲击 1 + reduced form 2 + PLM 2 + 主观预期 2 + RLS 2 + E-稳定 ODE 1 + 混合预期 1 + T-map 2 + REE 解 2 + 特征值 2 + CG 回归 1 + 增益 2 + 稳态 1 + 其余 = 28 个方程。