diff --git a/.translate/state/ar1_turningpts.md.yml b/.translate/state/ar1_turningpts.md.yml index 984fecb..bd9c10f 100644 --- a/.translate/state/ar1_turningpts.md.yml +++ b/.translate/state/ar1_turningpts.md.yml @@ -1,6 +1,6 @@ -source-sha: 59c6877fa298226d160b302900d53ba6ed0f5ea2 -synced-at: "2026-07-18" +source-sha: f3fdcbcc564961a25c77a01f5e12638e70522552 +synced-at: "2026-08-01" model: claude-sonnet-5 -mode: RESYNC +mode: UPDATE section-count: 10 -tool-version: 0.17.0 +tool-version: 0.24.0 diff --git a/.translate/state/kalman_filter_var.md.yml b/.translate/state/kalman_filter_var.md.yml index 539dc3c..3914756 100644 --- a/.translate/state/kalman_filter_var.md.yml +++ b/.translate/state/kalman_filter_var.md.yml @@ -1,6 +1,6 @@ -source-sha: 1abb15f5fc0273ea02b47850f447b3c224255123 -synced-at: "2026-07-22" -model: claude-opus-4-8 -mode: NEW +source-sha: f3fdcbcc564961a25c77a01f5e12638e70522552 +synced-at: "2026-08-01" +model: claude-sonnet-5 +mode: UPDATE section-count: 12 -tool-version: 0.20.0 +tool-version: 0.24.0 diff --git a/.translate/state/lq_bewley_complete_markets.md.yml b/.translate/state/lq_bewley_complete_markets.md.yml index 7771e15..c35922b 100644 --- a/.translate/state/lq_bewley_complete_markets.md.yml +++ b/.translate/state/lq_bewley_complete_markets.md.yml @@ -1,6 +1,6 @@ -source-sha: 94222f281872c1d42aad8eff12f32821041cbdef -synced-at: "2026-07-22" -model: claude-opus-4-8 -mode: NEW +source-sha: f3fdcbcc564961a25c77a01f5e12638e70522552 +synced-at: "2026-08-01" +model: claude-sonnet-5 +mode: UPDATE section-count: 6 -tool-version: 0.20.0 +tool-version: 0.24.0 diff --git a/.translate/state/lq_permanent_income.md.yml b/.translate/state/lq_permanent_income.md.yml index 32c6a30..27a7581 100644 --- a/.translate/state/lq_permanent_income.md.yml +++ b/.translate/state/lq_permanent_income.md.yml @@ -1,6 +1,6 @@ -source-sha: 94222f281872c1d42aad8eff12f32821041cbdef -synced-at: "2026-07-22" -model: claude-opus-4-8 -mode: NEW +source-sha: f3fdcbcc564961a25c77a01f5e12638e70522552 +synced-at: "2026-08-01" +model: claude-sonnet-5 +mode: UPDATE section-count: 3 -tool-version: 0.20.0 +tool-version: 0.24.0 diff --git a/.translate/state/lq_robust_bewley.md.yml b/.translate/state/lq_robust_bewley.md.yml new file mode 100644 index 0000000..ceb0e04 --- /dev/null +++ b/.translate/state/lq_robust_bewley.md.yml @@ -0,0 +1,6 @@ +source-sha: f3fdcbcc564961a25c77a01f5e12638e70522552 +synced-at: "2026-08-01" +model: claude-sonnet-5 +mode: NEW +section-count: 10 +tool-version: 0.24.0 diff --git a/.translate/state/lq_robust_smoothing.md.yml b/.translate/state/lq_robust_smoothing.md.yml index 5d1159f..a518b78 100644 --- a/.translate/state/lq_robust_smoothing.md.yml +++ b/.translate/state/lq_robust_smoothing.md.yml @@ -1,6 +1,6 @@ -source-sha: cb3f056f8e966bd6fd43c8cccefa7a666d6a133c -synced-at: "2026-07-22" -model: claude-opus-4-8 -mode: NEW -section-count: 4 -tool-version: 0.20.0 +source-sha: f3fdcbcc564961a25c77a01f5e12638e70522552 +synced-at: "2026-08-01" +model: claude-sonnet-5 +mode: UPDATE +section-count: 11 +tool-version: 0.24.0 diff --git a/.translate/state/sargent_surico.md.yml b/.translate/state/sargent_surico.md.yml new file mode 100644 index 0000000..4f43412 --- /dev/null +++ b/.translate/state/sargent_surico.md.yml @@ -0,0 +1,6 @@ +source-sha: f3fdcbcc564961a25c77a01f5e12638e70522552 +synced-at: "2026-08-01" +model: claude-sonnet-5 +mode: NEW +section-count: 16 +tool-version: 0.24.0 diff --git a/.translate/state/var_subsets.md.yml b/.translate/state/var_subsets.md.yml new file mode 100644 index 0000000..ceb0e04 --- /dev/null +++ b/.translate/state/var_subsets.md.yml @@ -0,0 +1,6 @@ +source-sha: f3fdcbcc564961a25c77a01f5e12638e70522552 +synced-at: "2026-08-01" +model: claude-sonnet-5 +mode: NEW +section-count: 10 +tool-version: 0.24.0 diff --git a/lectures/_toc.yml b/lectures/_toc.yml index d447729..dcd0a45 100644 --- a/lectures/_toc.yml +++ b/lectures/_toc.yml @@ -65,7 +65,8 @@ parts: - file: wealth_dynamics - file: kalman - file: kalman_2 - - file: kalman_filter_var + - file: kalman_filter_var + - file: var_subsets - file: organization_capital - file: measurement_models - caption: Search @@ -116,12 +117,14 @@ parts: - file: lq_permanent_income - file: lq_bewley_complete_markets - file: lq_robust_smoothing + - file: lq_robust_bewley - file: lq_inventories - caption: Bounded Rationality in Macroeconomics numbered: true chapters: - file: bounded_rationality - file: olg_adaptive_money + - file: learning_approximation - file: exchange_rate_learning - file: genetic_classifier - file: marimon_mcgrattan_sargent @@ -184,6 +187,7 @@ parts: - file: mle - file: unemployment_linear - file: unemployment_shocks + - file: sargent_surico - caption: Auctions numbered: true chapters: diff --git a/lectures/ar1_turningpts.md b/lectures/ar1_turningpts.md index 2505bc5..7bac096 100644 --- a/lectures/ar1_turningpts.md +++ b/lectures/ar1_turningpts.md @@ -460,7 +460,6 @@ $$ - 将集合 $\{W_t(\omega_i)\}^{I}_{i=1}, \ \{W_{t+1}(\omega_i)\}^{I}_{i=1}, \ \dots, \ \{W_{t+N}(\omega_i)\}^{I}_{i=1}$ 视为来自预测分布 $f(W_{t+1} \mid y_t, y_{t-1}, \dots , y_0)$, $f(W_{t+2} \mid y_t, y_{t-1}, \dots , y_0)$, $\dots$, $f(W_{t+N} \mid y_t, y_{t-1}, \dots , y_0)$ 的样本。 - ## 使用模拟来近似后验分布 下面的代码单元使用 `numpyro` 计算时间 $t$ 时 $\rho, \sigma$ 的后验分布。 @@ -517,7 +516,7 @@ def draw_from_posterior(data, size=10000, dis_plot=True, key=key): # 绘制后验分布图和轨迹图 if dis_plot: plot_data = az.from_numpyro(posterior=mcmc) - az.plot_trace_dist(plot_data, var_names=['ρ', 'σ']) + az.plot_trace(plot_data, var_names=['ρ', 'σ']) return post_sample diff --git a/lectures/kalman_filter_var.md b/lectures/kalman_filter_var.md index 596fb9b..eaebfb4 100644 --- a/lectures/kalman_filter_var.md +++ b/lectures/kalman_filter_var.md @@ -4,9 +4,9 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.11.1 + jupytext_version: 1.16.7 kernelspec: - display_name: Python 3 + display_name: Python 3 (ipykernel) language: python name: python3 translation: @@ -38,15 +38,20 @@ translation: Python implementation::Convergence of the Riccati equation: 黎卡提方程的收敛 Python implementation::The VAR representation: VAR 表示 Python implementation::Likelihood evaluation: 似然评估 - An example: 一个例子 - An example::A linear state-space system and its filter: 一个线性状态空间系统及其滤波器 - An example::Impulse responses of $y_t$ to the innovations $a_t$: $y_t$ 对新息 $a_t$ 的脉冲响应 - An example::Bivariate VAR(2) in state-space form: 状态空间形式的二元 VAR(2) - 'An example::Numerical example: impulse responses to innovations': 数值例子:对新息的脉冲响应 + Where this leads: 由此引出的方向 Summary: 总结 Exercises: 练习 --- +(kalman_filter_var)= +```{raw} jupyter +
+ + QuantEcon + +
+``` + # 卡尔曼滤波器与向量自回归 ```{index} single: Kalman Filter @@ -55,6 +60,10 @@ translation: ```{index} single: Vector Autoregression; and Kalman filter ``` +```{contents} Contents +:depth: 2 +``` + 除了 Anaconda 中已有的库之外,本讲座还需要以下库: ```{code-cell} ipython3 @@ -85,6 +94,8 @@ translation: - 时不变卡尔曼滤波器如何生成一个**向量自回归** - 为什么卡尔曼滤波器是*解释*由经济数据估计得到的 *VAR* 的一个基本工具 +后续讲座 {doc}`var_subsets` 将这套工具应用于一个在实践中经常出现的问题:当计量经济学家只能观测到 VAR 中部分变量时,会发生什么。 + ## 状态空间系统 卡尔曼滤波器适用于以下针对 $t \geq 0$ 的**状态空间系统**: @@ -103,7 +114,7 @@ $$ (eq:statespace) - $w_{t+1}$ 是一个 $p \times 1$ 的独立同分布的正态随机变量序列,均值为 $0$,协方差矩阵为单位矩阵 - $v_t$ 是一个独立同分布的正态随机变量序列,均值为零,协方差矩阵为 $R$ -- 对所有 $t+1$ 和 $s \geq 0$,$w_{t+1}$ 与 $v_s$ 正交 +- $w_t$ 与 $v_s$ 在所有日期对上都正交 系数矩阵具有以下维度: $A$ 是 $n \times n$,$C$ 是 $n \times p$,$G$ 是 $m \times n$,$R$ 是 $m \times m$。 @@ -119,6 +130,7 @@ $$ (eq:kalf3) ## 卡尔曼滤波器 + ### 起始分布 从 $t = 0$ 开始沿时间向前推进,在观测到 $y_0$ 之前, @@ -303,7 +315,7 @@ $\mathbb{E} a_t a_{t-1}^\top = 0$,更一般地,$\mathbb{E}[a_t \mid a_{t-1}, 有时 {eq}`eq:kalf10` 被称为**白化滤波器**:它以信号过程 $\{y_t\}$ 为输入,并产生白噪声新息过程 $\{a_t\}$ 作为输出。 -类似地定义 $H(a^t)$,线性空间 $H(a^t)$ 是线性空间 $H(y^t)$ 的一个正交基。 +类似地定义 $H(a^t)$,则 $H(a^t) = H(y^t)$,且 $[a_t, \ldots, a_0]$ 是该共同空间的一个正交基。 卡尔曼滤波器不是通过一个大的回归来计算 $\mathbb{E}[x_t \mid y_{t-1}, \ldots, y_0]$,而是对基 $[a_{t-1}, \ldots, a_0]$ 的一系列相继正交分量执行一系列小回归,这是 **Gram-Schmidt 过程**的一个实例。 @@ -323,6 +335,7 @@ $\mathbb{E} a_t a_{t-1}^\top = 0$,更一般地,$\mathbb{E}[a_t \mid a_{t-1}, ## 估计 + ### 新息表示 从卡尔曼滤波器中产生的**新息表示**为 @@ -379,6 +392,7 @@ $$ ## 向量自回归与卡尔曼滤波器 + ### 收敛到稳态 在 {cite:t}`AHMS1996` 所讨论的条件下,对黎卡提方程 {eq}`eq:riccati` 的迭代从任何正半定初始值 $\Sigma_0$ 出发都收敛到一个**时不变**矩阵 $\Sigma$。 @@ -427,7 +441,7 @@ $$ (eq:varorth) 正交条件 {eq}`eq:varorth` 将 {eq}`eq:var1` 识别为一个向量自回归。 -通过 $L x_{t+1} \equiv x_t$ 定义滞后算子 $L$,由 {eq}`eq:innovti` 推导出的**移动平均表示**为 +设 $L$ 表示滞后算子,使得 $L x_t = x_{t-1}$,由 {eq}`eq:innovti` 推导出的**移动平均表示**为 $$ y_t = \left[I + G(I - AL)^{-1} KL\right] a_t @@ -608,23 +622,33 @@ kf.set_state(np.zeros(1), np.eye(1) * 10.0) # 弥散先验 T = 200 x_path, y_path = lss.simulate(ts_length=T, random_state=42) -# 形状: x_path 是 (n, T+1), y_path 是 (m, T) -x_true = x_path[0, :T] +# 形状: x_path 是 (n, T), y_path 是 (m, T) +x_true = x_path[0, :] y_obs = y_path[0, :] ``` -然后我们手动逐步运行卡尔曼滤波器,以收集滤波后的估计值。 +然后我们手动逐步运行卡尔曼滤波器。 + +`Kalman.update` 方法执行一个*完整*周期,将先验转移到滤波分布,然后再转移到下一期的先验。 + +因此,{eq}`eq:kalf10` 中定义的 $(\hat{x}_t, \Sigma_t)$ 是在调用 `update` *之前* 该对象所持有的值,我们在那时记录它们。 ```{code-cell} ipython3 x_hats = np.zeros(T) Sigmas = np.zeros(T) +innovations = np.zeros(T) for t in range(T): + x_hats[t] = kf.x_hat.item() # x_hat_t = E[x_t | y^{t-1}] + Sigmas[t] = kf.Sigma.item() # Sigma_t + innovations[t] = y_obs[t] - (G @ kf.x_hat).item() kf.update(y_obs[t:t+1]) # 一个完整的滤波周期 - x_hats[t] = kf.x_hat.item() - Sigmas[t] = kf.Sigma.item() ``` +正确排列这个顺序很重要。 + +如果在调用之后再记录 `kf.x_hat`,将会存储一步向前预测 $\hat{x}_{t+1}$,而将其与 $y_t$ 相减得到的序列将不是新息,也不会具有方差 $G\Sigma G^\top + R$。 + ```{code-cell} ipython3 --- mystnb: @@ -651,7 +675,7 @@ axes[1].axhline(kf.Sigma_infinity[0, 0], ls='--', color='k', axes[1].set_title('条件方差') axes[1].legend(fontsize=9) -axes[2].plot(t_range, y_obs - x_hats, color='C2', lw=2, alpha=0.7, +axes[2].plot(t_range, innovations, color='C2', lw=2, alpha=0.7, label=r'新息 $a_t = y_t - G\hat{x}_t$') axes[2].set_title('新息') axes[2].set_xlabel('时间 $t$') @@ -666,6 +690,18 @@ plt.show() 新息序列围绕零波动,正如一步预测误差所应有的那样。 +它的样本标准差应接近于 $\sqrt{G\Sigma_\infty G^\top + R}$。 + +```{code-cell} ipython3 +print(f"sample sd of innovations = {innovations.std():.4f}") +print(f"steady-state sd = " + f"{np.sqrt(kf.Sigma_infinity[0, 0] + R[0, 0]):.4f}") +print(f"first-order autocorrelation = " + f"{np.corrcoef(innovations[1:], innovations[:-1])[0, 1]:.4f}") +``` + +自相关接近于零,证实了滤波器已经将观测序列白化。 + ### 黎卡提方程的收敛 `Kalman` 类通过直接求解离散代数黎卡提方程来计算稳态协方差 $\Sigma_\infty$。 @@ -752,317 +788,15 @@ ll = log_likelihood(A, C, G, R, print(f"Log-likelihood of sample: {ll:.4f}") ``` -## 一个例子 - -我们现在通过一个结构化的例子来说明一个二元 VAR(2) 如何自然地嵌入状态空间框架,以及卡尔曼滤波器如何给出一个 Wold(新息)表示。 - -### 一个线性状态空间系统及其滤波器 - -状态方程和观测方程为 - -$$ -x_{t+1} = A x_t + C w_{t+1} -$$ (eq:ex_state) - -$$ -y_t = G x_t + v_t -$$ (eq:ex_obs) - -具有初始条件和冲击分布 - -$$ -x_0 \sim N(\hat{x}_0, \Sigma_0), \quad -w_{t+1} \sim N(0, I), \quad -v_t \sim N(0, R). -$$ - -稳态误差协方差矩阵 $\Sigma$ 满足黎卡提方程 - -$$ -\Sigma = A \Sigma A^\top + CC^\top - - A \Sigma G^\top \bigl(G \Sigma G^\top + R\bigr)^{-1} G \Sigma A^\top -$$ (eq:ex_riccati) - -且相关的稳态卡尔曼增益为 - -$$ -K = A \Sigma G^\top \bigl(G \Sigma G^\top + R\bigr)^{-1} -$$ (eq:ex_gain) - -从初始估计 $\hat{x}_0$ 出发,卡尔曼滤波器通过下式更新状态估计 - -$$ -\hat{x}_{t+1} = A \hat{x}_t + K a_t -$$ (eq:ex_kf_update) - -其中新息为 - -$$ -a_t = y_t - G \hat{x}_t -$$ (eq:ex_innovation) - -将 {eq}`eq:ex_innovation` 代入 {eq}`eq:ex_kf_update` 并展开: - -$$ -\hat{x}_{t+1} = A \hat{x}_t + K(y_t - G\hat{x}_t) - = (A - KG)\hat{x}_t + K y_t - = (A - KG)\hat{x}_t + K G x_t + K v_t -$$ (eq:ex_kf_expanded) - -### $y_t$ 对新息 $a_t$ 的脉冲响应 - -计算可观测向量 $y_t$ 对其自身新息 $a_t$ 的**普通脉冲响应函数**是有用的,这个移动平均(Wold)表示是 VAR {eq}`eq:var1` 的镜像。 - -从时不变新息表示 {eq}`eq:innovti` - -$$ -\hat{x}_{t+1} = A\hat{x}_t + K a_t, \qquad y_t = G\hat{x}_t + a_t, -$$ - -移动平均表示 {eq}`eq:sf_wold` 为 - -$$ -y_t = \bigl[I + G(I - AL)^{-1} K L\bigr]\, a_t - = a_t + \sum_{h=1}^{\infty} G A^{h-1} K\, a_{t-h}. -$$ - -因此 $y_t$ 对单位新息 $a_t$ 的脉冲响应为 - -$$ -\Psi_0 = I, \qquad \Psi_h = G A^{h-1} K \quad (h \ge 1). -$$ (eq:ex_y_to_a) - -这些系数以由 $A$ 的特征值支配的速率衰减。 - -我们可以直接从一个 `quantecon` `LinearStateSpace` 对象中读取系数 {eq}`eq:ex_y_to_a`。 - -我们构建一个状态空间系统,其状态是滤波估计 $\hat{x}_t$,其单一"冲击"是通过 $C = K$ 加载的新息 $a_t$,其观测矩阵为 $G$。 - -该对象的 `impulse_response` 方法返回序列 $G A^{j} K$,其中 $j = 0, 1, 2, \ldots$,这些正好是 $h \ge 1$ 时的 $\Psi_h$;我们在前面加上 $\Psi_0 = I$ 以捕获当期直达效应 $y_t = G\hat{x}_t + a_t$。 - -下面返回的数组,其元素 `[h, i, j]` 等于可观测量 `i` 在视界 `h` 处对新息分量 `j` 的响应。 - -```{code-cell} ipython3 -def y_to_a_irf(A, K, G, T=40): - """ - 返回 y_t 对其自身新息 a_t 的 Wold 脉冲响应函数。 - """ - n, m = A.shape[0], G.shape[0] - lss = qe.LinearStateSpace(A, K, G, np.zeros((m, m)), mu_0=np.zeros(n)) - _, ycoef = lss.impulse_response(j=T - 2) # [GK, GAK, GA^2K, ...] - Psi = np.empty((T, m, m)) - Psi[0] = np.eye(m) # 当期响应 - for h in range(1, T): - Psi[h] = ycoef[h - 1] - return Psi -``` - -### 状态空间形式的二元 VAR(2) - -考虑两个可观测序列 $r_t$ 和 $z_t$。 - -将它们堆叠成状态向量 $x_t = (r_t,\; r_{t-1},\; z_t,\; z_{t-1})^\top$。 - -我们假设 VAR(2) 状态转移方程: - -$$ -\begin{pmatrix} r_{t+1} \\ r_t \\ z_{t+1} \\ z_t \end{pmatrix} -= -\begin{pmatrix} - d_1 & d_2 & d_3 & d_4 \\ - 1 & 0 & 0 & 0 \\ - \delta_1 & \delta_2 & \delta_3 & \delta_4 \\ - 0 & 0 & 1 & 0 -\end{pmatrix} -\begin{pmatrix} r_t \\ r_{t-1} \\ z_t \\ z_{t-1} \end{pmatrix} -+ -\begin{pmatrix} - c_{11} & c_{12} \\ - 0 & 0 \\ - c_{21} & c_{22} \\ - 0 & 0 -\end{pmatrix} -\begin{pmatrix} w_{1,t+1} \\ w_{2,t+1} \end{pmatrix} -$$ (eq:ex_var2_state) - -我们考虑两种可能的观测方程。 - -第一种是对 $r_t$ 和 $z_t$ 的二元观测: - -$$ -\begin{pmatrix} r_t \\ z_t \end{pmatrix} -= -\begin{pmatrix} - 1 & 0 & 0 & 0 \\ - 0 & 0 & 1 & 0 -\end{pmatrix} -\begin{pmatrix} r_t \\ r_{t-1} \\ z_t \\ z_{t-1} \end{pmatrix} -+ -\begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} -\begin{pmatrix} v_{1t} \\ v_{2t} \end{pmatrix} -$$ (eq:ex_var2_obs) - -第二种是对 $r_t$ 的单变量观测: - -$$ -y_t = \begin{pmatrix} 1 & 0 & 0 & 0 \end{pmatrix} -\begin{pmatrix} r_t \\ r_{t-1} \\ z_t \\ z_{t-1} \end{pmatrix} -+ v_{1t} -$$ (eq:ex_scalar_obs) - -我们现在比较这两个观测系统生成的 Wold 脉冲响应。 - -系统 1 同时观测 $r_t$ 和 $z_t$,因此其新息 $a_t$ 是 $2 \times 1$ 的。 - -系统 2 只观测 $r_t$,因此其新息 $u_t$ 是标量。 - -两个系统的转移矩阵相同,但观测矩阵不同。 - -因此,稳态卡尔曼增益也不同,可观测量对其自身新息的 Wold 响应也不同。 - -### 数值例子:对新息的脉冲响应 - -参数值为: - -$$ -\begin{aligned} -d_1 &= 0.80,\quad d_2 = 0.05,\quad d_3 = 0.75,\quad d_4 = -0.72 \\ -\delta_1 &= 0.00,\quad \delta_2 = 0.00,\quad \delta_3 = 0.75,\quad \delta_4 = 0.20 \\ -c_{11} &= 1.0,\quad c_{12} = 0.0,\quad c_{21} = 0.0,\quad c_{22} = 1.0 \\ -R &= 0.0001 \times I_2 \quad \text{(二元情形)}, \qquad -R = 0.0001 \quad \text{(单变量情形)}. -\end{aligned} -$$ - -这些给出 $4 \times 4$ 转移矩阵和 $4 \times 2$ 冲击加载矩阵 - -$$ -A = \begin{pmatrix} -0.80 & 0.05 & 0.75 & -0.72 \\ -1 & 0 & 0 & 0 \\ -0 & 0 & 0.75 & 0.20 \\ -0 & 0 & 1 & 0 -\end{pmatrix}, \qquad -C = \begin{pmatrix} -1 & 0 \\ -0 & 0 \\ -0 & 1 \\ -0 & 0 -\end{pmatrix}. -$$ - -**系统 1** 使用二元观测方程 {eq}`eq:ex_var2_obs`,因此 -$G$ 从状态中选取 $(r_t, z_t)^\top$,新息 $a_t$ 是 $2 \times 1$ 的。 - -**系统 2** 使用单变量观测方程 {eq}`eq:ex_scalar_obs`,因此该方程中的行向量只选取 $r_t$,新息 $u_t$ 是标量。 - -```{code-cell} ipython3 -# 参数 -d1, d2, d3, d4 = 0.80, 0.05, 0.75, -.72 -δ1, δ2, δ3, δ4 = 0.00, 0.00, 0.75, 0.20 -c11, c12, c21, c22 = 1.0, 0.0, 0.0, 1.0 -σ_v = 0.01 # sqrt(0.0001) - -# 共享矩阵 -A_var = np.array([[d1, d2, d3, d4 ], - [1.0, 0.0, 0.0, 0.0 ], - [δ1, δ2, δ3, δ4], - [0.0, 0.0, 1.0, 0.0 ]]) - -C_var = np.array([[c11, c12], - [0.0, 0.0], - [c21, c22], - [0.0, 0.0]]) - -# 系统 1: 二元观测 -G_biv = np.array([[1.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 1.0, 0.0]]) -H_biv = σ_v * np.eye(2) # H @ H.T = 0.0001 * I_2 - -lss_biv = qe.LinearStateSpace(A_var, C_var, G_biv, H_biv, - mu_0=np.zeros(4), Sigma_0=np.eye(4)) -kf_biv = qe.Kalman(lss_biv) -_, K_biv = kf_biv.stationary_values() - -print("System 1 - steady-state Kalman gain K (4x2):") -print(np.round(K_biv, 5)) - -# 系统 2: 单变量观测 -G_uni = np.array([[1.0, 0.0, 0.0, 0.0]]) -H_uni = np.array([[σ_v]]) # H @ H.T = 0.0001 - -lss_uni = qe.LinearStateSpace(A_var, C_var, G_uni, H_uni, - mu_0=np.zeros(4), Sigma_0=np.eye(4)) -kf_uni = qe.Kalman(lss_uni) -_, K_uni = kf_uni.stationary_values() - -print("\nSystem 2 - steady-state Kalman gain K (4x1):") -print(np.round(K_uni, 5)) -``` - -我们现在应用上面定义的辅助函数 `y_to_a_irf` 来计算可观测量 $y_t$ 对其自身新息 $a_t$ 的普通脉冲响应 {eq}`eq:ex_y_to_a`,分别针对系统 1(二元,因此 $a_t$ 是 $2 \times 1$ 的)和系统 2(单变量,因此 $u_t$ 是标量)。 - -```{code-cell} ipython3 ---- -mystnb: - figure: - caption: 系统 1 对自身新息的响应 - name: fig-kfvar-sys1-ya ---- -T_irf = 40 -horizons = np.arange(T_irf) - -Psi_biv = y_to_a_irf(A_var, K_biv, G_biv, T_irf) # 系统 1: (T, 2, 2) -Psi_uni = y_to_a_irf(A_var, K_uni, G_uni, T_irf) # 系统 2: (T, 1, 1) - -obs_labels = [r'$r_t$', r'$z_t$'] -innov_labels = [r'$a_{1,t}$', r'$a_{2,t}$'] - -# 系统 1 的响应 -fig, axes = plt.subplots(2, 2, figsize=(10, 6), sharex=True) -for i, obs in enumerate(obs_labels): - for j, inn in enumerate(innov_labels): - ax = axes[i, j] - ax.plot(horizons, Psi_biv[:, i, j], lw=2) - ax.axhline(0, color='k', lw=0.6, ls='--') - ax.set_title(fr'{obs} 对 {inn}', fontsize=9) - if i == 1: - ax.set_xlabel('视界 $h$') - if j == 0: - ax.set_ylabel('响应') -fig.tight_layout() -plt.show() -``` - -自身新息在冲击时刻对其自身可观测量产生一对一的影响,然后逐渐消退。 +## 由此引出的方向 -对角面板从 1 开始,非对角面板从 0 开始,因为 $\Psi_0 = I$。 +卡尔曼滤波器将一个状态空间系统映射为总体上对 $y_t$ 关于其自身过去值进行回归所能恢复出的 VAR。 -$r_t$ 对 $a_{2,t}$ 的交叉响应在短视界上是相当大的,而 $z_t$ 对 $a_{1,t}$ 的响应在显示的尺度上非常微小。 +当状态 $x_t$ 包含计量经济学家*看不到*的变量时,这一映射就变得最为有趣。 -```{code-cell} ipython3 ---- -mystnb: - figure: - caption: 系统 2 对自身新息的响应 - name: fig-kfvar-sys2-ya ---- -fig, ax = plt.subplots() -ax.plot(horizons, Psi_uni[:, 0, 0], lw=2) -ax.axhline(0, color='k', lw=0.6, ls='--') -ax.set_xlabel('视界 $h$') -ax.set_ylabel('响应') -fig.tight_layout() -plt.show() -``` - -只观测 $r_t$ 时,单一新息在冲击时刻对 $r_t$ 产生一对一的影响,然后单调地衰减到零。 - -对于 $h \ge 1$,响应通过状态矩阵 $A$ 传播并以几何速率衰减,勾勒出二元(系统 1)和单变量(系统 2)过程的 Wold 移动平均表示。 +后续内容 {doc}`var_subsets` 讨论了这方面的一个典型情形:$Y_t$ 遵循一个有限阶 VAR,而计量经济学家只能观测到其子向量 $y_t = S_y Y_t$。 -这些是来自 Wold 表示的预测误差响应,不是结构性冲击响应。 - -有了这个例子,我们现在可以把本讲座的主要要点汇总起来。 +在那里,我们构建了通用代码,给定 $Y_t$ 的 VAR 以及选择矩阵 $S_y$,返回 $y_t$ 的 VAR 表示和移动平均表示,并将小系统中的新息表达为大系统中新息的分布滞后形式。 ## 总结 @@ -1074,7 +808,9 @@ plt.show() 向后求解新息表示得到一个无限阶 VAR,而向前求解则得到 Wold 移动平均表示。 -数值例子表明,改变观测变量会改变卡尔曼增益,从而改变 Wold 响应,即使底层状态动态相同也是如此。 +计量经济学家观测哪些变量,决定了卡尔曼增益,进而决定了 VAR 表示和 Wold 表示,即使底层状态动态保持不变也是如此。 + +{doc}`var_subsets` 对这一观察进行了系统的探讨。 ## 练习 @@ -1193,12 +929,12 @@ x2_path, y2_path = lss2.simulate(ts_length=T2, random_state=0) x_hats2 = np.zeros((T2, 2)) for t in range(T2): + x_hats2[t] = kf2.x_hat.ravel() # 在更新之前记录 x_hat_t kf2.update(y2_path[:, t]) - x_hats2[t] = kf2.x_hat.ravel() fig, axes = plt.subplots(2, 1, figsize=(10, 6), sharex=True) for i, ax in enumerate(axes): - ax.plot(x2_path[i, :T2], lw=2, label=f'真实 $x_{{{i+1},t}}$') + ax.plot(x2_path[i, :], lw=2, label=f'真实 $x_{{{i+1},t}}$') ax.plot(x_hats2[:, i], lw=2, ls='--', label=rf'$\hat{{x}}_{{{i+1},t}}$') ax.set_title(f'分量 {i+1}') ax.legend(fontsize=9) @@ -1300,4 +1036,4 @@ print(f"True ρ = {ρ_true}, MLE ρ_hat = {ρ_mle:.4f}") 网格最大化器与真实值之间的微小差距来自于有限样本的随机性和离散网格的使用。 ```{solution-end} -``` \ No newline at end of file +``` diff --git a/lectures/lq_bewley_complete_markets.md b/lectures/lq_bewley_complete_markets.md index c0bf596..09af4d9 100644 --- a/lectures/lq_bewley_complete_markets.md +++ b/lectures/lq_bewley_complete_markets.md @@ -48,7 +48,7 @@ translation: 本讲研究当众多消费者各自求解 LQ 永久收入问题时,消费的截面分布如何演化。 -这是关于 LQ 永久收入模型的三讲中的第二讲,直接建立在 {doc}`lq_permanent_income` 的基础之上。 +这是关于 LQ 永久收入模型的四讲中的第二讲,直接建立在 {doc}`lq_permanent_income` 的基础之上。 我们首先说明,个体消费中的单位根会导致消费的截面方差随时间线性增长。 @@ -58,6 +58,8 @@ translation: 第三讲 {doc}`lq_robust_smoothing` 放松了消费者完全信任其收入模型的假设。 +第四讲 {doc}`lq_robust_bewley` 回到本讲的贝利经济体,并在其中引入了对该模型信任程度各不相同的消费者。 + 让我们从一些导入开始。 ```{code-cell} ipython3 @@ -428,6 +430,8 @@ plt.show() 在 {doc}`lq_robust_smoothing` 中,我们放松这一假设,让消费者寻求对合理的模型误设具有稳健性的决策规则。 +{doc}`lq_robust_bewley` 随后回到本讲座所研究的 Bewley 经济,并说明具有不同模型误设担忧程度的消费者截面可以精确再现本讲座的均衡。 + 最优稳健规则采用与上述规则相同的形式,但基于一个扭曲的收入过程模型,该模型看起来比近似模型更具持续性。 ## 练习 @@ -599,4 +603,4 @@ plt.show() 在不完全市场下,秩相关系数随着累积的随机游走重新洗牌谁富谁穷而衰减至零,即使每个消费者都面临相同的收入过程。 ```{solution-end} -``` \ No newline at end of file +``` diff --git a/lectures/lq_permanent_income.md b/lectures/lq_permanent_income.md index da624f9..35e9de5 100644 --- a/lectures/lq_permanent_income.md +++ b/lectures/lq_permanent_income.md @@ -62,12 +62,13 @@ translation: 我们推导消费者的最优消费函数,给出最优决策规则的两种状态空间表示,并用两个经典例子加以说明。 -这是关于 LQ 永久收入模型的三讲中的第一讲。 +这是关于 LQ 永久收入模型的四讲中的第一讲。 -后续两讲直接建立在这里开发的工具之上。 +后续三讲直接建立在这里开发的工具之上。 - {doc}`lq_bewley_complete_markets` 研究消费的横截面行为,并将单个消费者嵌入具有不完全市场和完全市场的封闭经济中。 - {doc}`lq_robust_smoothing` 研究一个不信任自己收入模型并进行预防性储蓄的消费者。 +- {doc}`lq_robust_bewley` 将两者结合起来,构建一个贝尔利经济,其中消费者对自己收入模型的不信任程度各不相同。 让我们从一些导入开始。 @@ -305,8 +306,6 @@ $$ (eq:cointegration) 左侧是协整残差。 - - ### 债务动态 ```{index} single: History Dependence @@ -509,6 +508,8 @@ plt.show() {doc}`lq_robust_smoothing` 研究一个不信任禀赋过程 {eq}`eq:sprob15` 并进行预防性储蓄的消费者。 +{doc}`lq_robust_bewley` 将这类消费者置于一个贝利经济中,并表明他们对模型设定错误的担忧不会在数量数据中留下任何痕迹。 + ## 练习 ```{exercise-start} @@ -720,4 +721,4 @@ plt.show() 对于中间的比率,消费者最优地拆分每个意外,将他归因于永久性分量的比例 $K$ 资本化,并储蓄其余部分。 ```{solution-end} -``` \ No newline at end of file +``` diff --git a/lectures/lq_robust_bewley.md b/lectures/lq_robust_bewley.md new file mode 100644 index 0000000..97bc283 --- /dev/null +++ b/lectures/lq_robust_bewley.md @@ -0,0 +1,635 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.11.1 +kernelspec: + display_name: Python 3 + language: python + name: python3 +translation: + title: 稳健 LQ 贝利模型 + headings: + Overview: 概述 + Mapping the Bewley economy into the HST framework: 将贝利经济映射到 HST 框架 + The robustness scalar for this economy: 该经济体的稳健性标量 + The Bewley observational-equivalence locus: 贝利观测等价轨迹 + Equilibrium with heterogeneous types: 异质类型下的均衡 + Where the agents genuinely differ: 代理人之间真正不同之处 + Computation: 计算 + Concluding remarks: 结语 + Exercises: 练习 + Related lectures: 相关讲座 +--- + +(lq_robust_bewley)= +```{raw} jupyter +
+ + QuantEcon + +
+``` + +# 稳健 LQ 贝利模型 + +```{contents} Contents +:depth: 2 +``` + +```{index} single: Robust Bewley Model +``` + +```{index} single: Observational Equivalence; heterogeneous agents +``` + +## 概述 + +本讲座将 {doc}`lq_bewley_complete_markets` 中的贝利经济嵌入到 {doc}`lq_robust_smoothing` 的稳健永久收入框架中。 + +这是关于 LQ 永久收入模型的四篇讲座中的最后一篇。 + +结果得到了一族经济体,其中的消费者对生成其收入的模型存在分歧,但行为却完全相同。 + +利用 {cite:t}`HST_1999` 的观测等价定理,我们证明了 + +- 连续统消费者 $i$ 如何在其稳健性参数 $\sigma_i \leq 0$ 和贴现因子 $\beta_i$ 上存在差异,只要每对 $(\sigma_i,\beta_i)$ 都位于一条观测等价轨迹上 +- 每个这样的消费者如何选择与完全信任禀赋过程的基准 $(\sigma = 0, \beta)$ 代理人**相同的消费-储蓄规则** +- 均衡利率 $R = \beta^{-1}$ 以及所有总量和横截面动态因此如何与标准贝利模型的对应内容完全一致 +- 尽管如此,不同的 $(\sigma_i,\beta_i)$ 代理人如何对其非金融收入持有真正不同的主观模型 + +该经济体是一个纯禀赋经济,因此没有实物资本,投资也不起任何作用。 + +我们将 {doc}`lq_robust_smoothing` 视为前置知识,并沿用其记号。 + +```{note} +与 {doc}`lq_robust_smoothing` 中一样,$w_{t+1}$ 是基准冲击,$v_{t+1}$ 是对其条件均值的扭曲,$\sigma \le 0$ 是稳健性参数,$\eta_1$ 和 $\eta_2$ 分别是永久性和暂时性禀赋冲击的标准差,$a_t$ 表示净资产。 +``` + +让我们从一些导入开始。 + +```{code-cell} ipython3 +import numpy as np +import matplotlib.pyplot as plt +``` + +## 将贝利经济映射到 HST 框架 + +我们将 {doc}`lq_robust_smoothing` 中的稳健模型特殊化为 $\lambda = \delta_h = 0$,因此没有习惯效应也没有耐用品,并特殊化为不含实物资本的纯禀赋经济,即 $k_t = 0$。 + +在这种情况下,服务等于消费,即 $s_t = c_t$。 + +唯一交易的证券是一期无风险债券,$a_t$ 表示家庭的净资产头寸,因此正的 $a_t$ 表示财富。 + +禀赋过程遵循以下状态空间表示 + +$$ +\begin{aligned} +z_{t+1} &= \check{A}\, z_t + \check{C}\, w_{t+1} \\ +y_t &= \check{G}\, z_t +\end{aligned} +$$ (eq:rbew-endowment) + +采用双因子设定 $y_t = z_{1t}+z_{2t}$,$\check A = \mathrm{diag}(1,0)$ 且 $\check C = \mathrm{diag}(\eta_1,\eta_2)$。 + +家庭的增广状态向量为 $x_t = [a_t,\; z_t^\top]^\top$,{doc}`lq_robust_smoothing` 中的运动规律特殊化为 + +$$ +\begin{pmatrix} a_{t+1} \\ z_{t+1} \end{pmatrix} += +\underbrace{\begin{pmatrix} R & R\check{G} \\ 0 & \check{A} \end{pmatrix}}_{A} +\begin{pmatrix} a_t \\ z_t \end{pmatrix} ++ +\underbrace{\begin{pmatrix} -R \\ 0 \end{pmatrix}}_{B} +c_t ++ +\underbrace{\begin{pmatrix} 0 \\ \check{C} \end{pmatrix}}_{C} +(w_{t+1} + v_{t+1}) +$$ (eq:rbew-law) + +目标函数为 $\mathbb{E}_0 \sum_{t=0}^\infty \beta^t\bigl[-(c_t - b)^2/2\bigr]$,这正是 $\sigma = 0$ 且极乐水平为常数 $b_t \equiv b$ 时的 HST 准则。 + +因此,当 $\sigma = 0$ 时,稳健贝尔曼方程恰好简化为 {doc}`lq_permanent_income` 中的 LQ 问题,从而证实 HST 框架内嵌了贝利模型。 + +## 该经济体的稳健性标量 + +对于稳健性而言,禀赋过程的一切相关信息都可归纳为 {doc}`lq_robust_smoothing` 中导出的标量 $\alpha^2$。 + +对于双因子禀赋,它是 + +$$ +\alpha^2 = \eta_1^2 + (1-\beta)^2\,\eta_2^2 +$$ (eq:rbew-alpha) + +这是消费创新项 $h\,w_{t+1}$ 的方差,其中 $h = (1-\beta)\check G(I-\beta\check A)^{-1}\check C = \begin{pmatrix}\eta_1 & (1-\beta)\eta_2\end{pmatrix}$。 + +在当前的设定中,$\alpha^2$ 还有第二层同样具体的含义,这一点我们在 {doc}`lq_bewley_complete_markets` 中已经遇到过。 + +由于个人消费是创新方差为 $\alpha^2$ 的随机游走,从共同初始条件出发的年龄为 $t$ 的代理人之间的消费横截面方差恰好为 $t\,\alpha^2$。 + +因此,决定消费者稳健性担忧强度的那个标量,同样也决定了贝利横截面扩散的速度。 + +## 贝利观测等价轨迹 + +在均衡利率 $R = \beta^{-1}$ 处应用 {doc}`lq_robust_smoothing` 中的观测等价定理 {prf:ref}`thm-rcs-oe1`,可得**贝利观测等价轨迹** + +$$ +\hat\beta(\sigma) = \beta + \frac{\sigma\,\alpha^2\,\beta}{1-\beta} +$$ (eq:rbew-locus) + +对于 $\sigma < 0$,我们有 $\hat\beta(\sigma) < \beta$。 + +具有 $(\sigma, \hat\beta(\sigma))$ 这一对参数的代理人对模型误设更为担忧,因为 $\sigma$ 更低,但同时也更不耐心,因为 $\hat\beta$ 更低。 + +这两种力量恰好相互抵消,使消费决策规则保持不变。 + +该轨迹只有在 {doc}`lq_robust_smoothing` 的崩溃点之上才是可行的, + +$$ +\underline\sigma = -\frac{(1-\beta)^2}{\alpha^2}, +\qquad\text{此时}\qquad +\hat\beta(\underline\sigma) = \beta^2 +$$ (eq:rbew-breakdown) + +在 $\underline\sigma$ 以下,个体稳健控制问题无解,因此不存在可描述的经济体。 + +## 异质类型下的均衡 + +现在我们可以让连续统的类型来充实经济体,这些类型在其对稳健性的担忧程度上有所不同。 + +````{prf:proposition} 一个稳健贝利均衡 +:label: prop-rbew-types + +设单位区间内的每个代理人 $i$ 由稳健性参数 $\sigma_i \in (\underline\sigma, 0]$ 标示,其分布服从任意分布 $\Phi$,并设代理人 $i$ 具有贴现因子 + +$$ +\beta_i = \hat\beta(\sigma_i) = \beta + \frac{\sigma_i\,\alpha^2\,\beta}{1-\beta} +$$ (eq:rbew-types) + +使得每对 $(\sigma_i,\beta_i)$ 都位于轨迹 {eq}`eq:rbew-locus` 上。 + +那么 + +1. 每个代理人的最优消费计划都与标准 $(\sigma = 0,\, \beta)$ 代理人的相同, +2. 均衡总名义利率为 $R = \beta^{-1}$,与 $\Phi$ 无关,且 +3. 总量和横截面动态与 {doc}`lq_bewley_complete_markets` 中基准贝利经济的对应内容一致。 +```` + +````{prf:proof} +根据 {prf:ref}`thm-rcs-oe1`,面对总回报率 $R = \beta^{-1}$ 的具有参数 $(\sigma_i, \hat\beta(\sigma_i))$ 的代理人,会选择与基准 $(0,\beta)$ 代理人相同的消费-储蓄规则。 + +这一点对每个代理人都成立,并不要求所有 $\sigma_i$ 相等,由此得到第 1 部分。 + +由于所有个体规则都与基准规则一致,商品市场出清条件 $\int c_t^i\, di = Y$ 和债券市场条件 $\int a_t^i\, di = 0$ 就是基准条件,因此它们在 $R = \beta^{-1}$ 处得到满足,原因与 {doc}`lq_bewley_complete_markets` 中给出的完全相同。 + +由于市场出清从不涉及 $\Phi$,均衡利率也不涉及 $\Phi$,由此得到第 2 部分。 + +第 3 部分成立是因为总量和横截面对象是个体路径的积分,而个体路径正是基准路径。 +```` + +因此,稳健性类型的分布 $\Phi$ 完全无法通过数量数据识别出来。 + +一位观察到每个代理人在每个日期的 $\{c_t^i, a_t^i\}$ 的计量经济学家无法判断该经济体是完全由 $\sigma_i = 0$ 的代理人组成,还是完全由 $\sigma_i$ 接近 $\underline\sigma$ 的代理人组成,抑或是任何混合。 + +## 代理人之间真正不同之处 + +轨迹上的代理人在他们*所做*的事情上无法区分,但在他们*所信*的事情上却可以区分。 + +具有 $\sigma_i < 0$ 的代理人会对其条件期望应用最坏情形扭曲 $v_{t+1}^i = K(\sigma_i,\beta_i)\,\mu_{s,t}^i$,而具有 $\sigma_i = 0$ 的代理人则照单全收近似模型。 + +根据 {doc}`lq_robust_smoothing`,代理人 $i$ 的边际效用的最坏情形规律为 + +$$ +\mu_{s,t+1}^i = \zeta_i\, \mu_{st}^i + \alpha\, w_{t+1}, +\qquad +\zeta_i = \frac{\beta}{\beta_i} = \left[1 + \frac{\sigma_i\alpha^2}{1-\beta}\right]^{-1} > 1 +$$ (eq:rbew-zeta) + +在 $\lambda = \delta_h = 0$ 且极乐点为常数的情况下,我们有 $\mu_{st} = b - c_t$,因此代理人 $i$ 的**最坏情形预期消费路径**为 + +$$ +\hat{\mathbb{E}}_t\, c_{t+h}^i = b - \zeta_i^{\,h}\,(b - c_t) +$$ (eq:rbew-beliefs) + +相比之下,在近似模型下,消费是一个鞅,即对于每个 $h$ 都有 $\mathbb{E}_t c_{t+h} = c_t$。 + +方程 {eq}`eq:rbew-beliefs` 表明,一个尚未达到极乐点的稳健代理人,在其最坏情形模型下预期消费将以几何速率 $\zeta_i$ *偏离*极乐点。 + +代理人越稳健,其防范的漂移速度就越快,进行的预防性储蓄也就越多。 + +而更低的 $\beta_i$ 恰好抵消了这一额外储蓄,这就是为什么所有类型实现的路径都相同的原因。 + +## 计算 + +我们使用前几篇讲座的校准。 + +```{code-cell} ipython3 +β = 0.95 # benchmark discount factor, R = 1/β +η1 = 0.15 # std of permanent shock +η2 = 0.30 # std of transitory shock +b = 1.0 # bliss point + +R = 1 / β +h = np.array([η1, (1 - β) * η2]) # consumption innovation loadings +α2 = h @ h +α = np.sqrt(α2) +σ_lo = -(1 - β)**2 / α2 # breakdown point, eq:rbew-breakdown + +print(f"α^2 = {α2:.6f} α = {α:.6f}") +print(f"breakdown σ̲ = {σ_lo:.6f}, where β̂ = {β + σ_lo * α2 * β / (1 - β):.6f}" + f" (β² = {β**2:.6f})") +``` + +接下来我们构建一组分布在可行范围内的类型,并记录它们之间的区别。 + +我们沿用 {doc}`lq_robust_smoothing` 中的检测误差概率,来报告在 $T = 40$ 个季度的样本中,每种类型的最坏情形模型有多难被检测出来。 + +```{code-cell} ipython3 +def worst_case_persistence(σ, β, α2): + "Worst-case persistence ζ(σ) of marginal utility, eq:rbew-zeta." + return 1 / (1 + σ * α2 / (1 - β)) + + +def simulate_paths(ζ, α, T, n_paths, seed): + "Simulate n_paths draws of μ_{t+1} = ζ μ_t + α w_{t+1} from μ_0 = 0." + rng = np.random.default_rng(seed) + paths = np.zeros((n_paths, T + 1)) + shocks = rng.standard_normal((n_paths, T)) + for t in range(T): + paths[:, t + 1] = ζ * paths[:, t] + α * shocks[:, t] + return paths + + +def log_likelihood_ratio(paths, ζ, α): + "Return log p_worst(path) - log p_approx(path)." + lag, lead = paths[:, :-1], paths[:, 1:] + return 0.5 * (np.sum(((lead - lag) / α)**2, axis=1) + - np.sum(((lead - ζ * lag) / α)**2, axis=1)) + + +def detection_error_probability(ζ, α, T=40, n_paths=10_000, seed=1234): + "Finite-sample DEP for the approximating and worst-case scalar laws." + if np.isclose(ζ, 1.0): + return 0.5 + approx = simulate_paths(1.0, α, T, n_paths, seed) + worst = simulate_paths(ζ, α, T, n_paths, seed + 1) + return 0.5 * (np.mean(log_likelihood_ratio(worst, ζ, α) < 0) + + np.mean(log_likelihood_ratio(approx, ζ, α) > 0)) +``` + +```{code-cell} ipython3 +σ_types = np.array([0.0, 0.3, 0.6, 0.9]) * σ_lo +β_types = β + σ_types * α2 * β / (1 - β) +ζ_types = worst_case_persistence(σ_types, β, α2) +dep_types = np.array([detection_error_probability(ζ, α) for ζ in ζ_types]) + +print(f"{'σ_i':>10}{'β_i':>10}{'ζ_i':>10}{'DEP':>8}") +for σ_i, β_i, ζ_i, dep in zip(σ_types, β_types, ζ_types, dep_types): + print(f"{σ_i:10.4f}{β_i:10.4f}{ζ_i:10.4f}{dep:8.3f}") +``` + +这四种类型在耐心程度和其最坏情形模型的悲观程度上存在实质性差异。 + +我们现在确认,尽管如此,它们的行为仍然完全相同。 + +每种类型都面对相同的冲击,并从相同的初始消费出发,每种类型都按照基准规则 $c_{t+1} = c_t + h\,w_{t+1}$ 进行消费。 + +```{code-cell} ipython3 +T = 60 +rng = np.random.default_rng(42) +shocks = rng.standard_normal((T, 2)) # common shocks for all types + +c_paths = np.zeros((len(σ_types), T + 1)) +for i in range(len(σ_types)): + for t in range(T): + c_paths[i, t + 1] = c_paths[i, t] + h @ shocks[t] + +print("max absolute difference across types:" + f" {np.abs(c_paths - c_paths[0]).max():.2e}") +``` + +各路径完全一致,这正是 {prf:ref}`prop-rbew-types` 第 1 部分的体现。 + +下图对比了各类型的行为与其信念之间的差异。 + +```{code-cell} ipython3 +--- +mystnb: + figure: + caption: | + Same actions, different beliefs. Left: realized consumption paths for + four robustness types facing common shocks; the curves lie exactly on + top of one another. Right: each type's worst-case expected consumption + path from a common date, against the flat martingale forecast of the + approximating model. + name: fig-rbew-beliefs +--- +fig, axes = plt.subplots(1, 2, figsize=(11, 4)) + +for i, σ_i in enumerate(σ_types): + axes[0].plot(c_paths[i], lw=3 - 0.6 * i, alpha=0.9, + label=rf'$\sigma_i={σ_i:.3f}$') +axes[0].set_xlabel('$t$') +axes[0].set_ylabel('$c_t$') +axes[0].set_title('realized consumption') +axes[0].legend() + +horizons = np.arange(41) +c_now = c_paths[0, 20] +axes[1].axhline(c_now, color='k', linestyle=':', lw=1.2, + label='approximating model') +for σ_i, ζ_i in zip(σ_types, ζ_types): + if σ_i == 0.0: + continue + axes[1].plot(horizons, b - ζ_i**horizons * (b - c_now), lw=2, + label=rf'worst case, $\sigma_i={σ_i:.3f}$') +axes[1].set_xlabel('horizon $h$') +axes[1].set_ylabel(r'$\hat{\mathbb{E}}_t\,c_{t+h}$') +axes[1].set_title('expected consumption under each belief') +axes[1].legend() + +fig.tight_layout() +plt.show() +``` + +{numref}`fig-rbew-beliefs` 的左图显示了四条完全重叠的曲线。 + +右图则表明,同样这四个代理人对未来的预期却截然不同。 + +$\sigma_i = 0$ 的代理人预期消费将维持在原地不动。 + +每个稳健代理人都在防范消费从极乐点漂移出去的未来,代理人越稳健,漂移速度就越快。 + +最后我们检验 {prf:ref}`prop-rbew-types` 的第 3 部分,即横截面的行为与基准贝利经济一致。 + +我们模拟一个大规模的人群,其中每个代理人自行抽取其类型和冲击,并将消费的横截面方差与基准预测 $t\,\alpha^2$ 进行比较。 + +```{code-cell} ipython3 +n_agents, T = 20_000, 40 +rng = np.random.default_rng(1234) + +# each agent draws a robustness type; types do not affect behaviour +σ_i = rng.uniform(σ_lo, 0.0, size=n_agents) + +shocks = rng.standard_normal((n_agents, T, 2)) +c = np.zeros((n_agents, T + 1)) +c[:, 1:] = np.cumsum(shocks @ h, axis=1) + +print(f"{'t':>5}{'cross-section var':>20}{'t·α²':>12}") +for t in [10, 20, 30, 40]: + print(f"{t:5d}{c[:, t].var():20.5f}{t * α2:12.5f}") +``` + +横截面方差以速率 $\alpha^2$ 线性增长,与 {doc}`lq_bewley_complete_markets` 中的结果完全一致,稳健性类型的分布在数据中不留下任何痕迹。 + +## 结语 + +我们将单代理人的稳健永久收入模型嵌入到一个贝利均衡中,该均衡中包含了在多大程度上不信任其收入过程方面存在差异的连续统代理人。 + +只要每个代理人的一对 $(\sigma_i,\beta_i)$ 位于观测等价轨迹 {eq}`eq:rbew-locus` 上,每个代理人就都会选择基准消费规则。 + +均衡利率 $R = \beta^{-1}$、总量动态以及消费横截面方差的线性增长,都完全不变地继承自 {doc}`lq_bewley_complete_markets` 中标准的贝利模型。 + +这是一个很强的不可识别性结果。 + +数量数据能够确定决策规则,但无法将其分解为不耐心程度和对模型误设的担忧程度。 + +这些代理人*不*共有的是他们对世界的看法:每个稳健类型的行为就好像其消费即将以自己的速率 $\zeta_i$ 偏离极乐点一样。 + +有两条途径可以摆脱这种观测等价性。 + +一是关注资产价格,资产价格确实能够区分 $(\sigma,\hat\beta)$ 对,这一点在 {doc}`robust_permanent_income` 中有所研究。 + +另一条是利用 {doc}`lq_robust_smoothing` 中的检测误差概率,从统计上界定 $\sigma$ 的合理范围。 + +## 练习 + +```{exercise-start} +:label: rbew_ex1 +``` + +本练习要求你完成从基准贝利经济到 HST 记号的转换。 + +将稳健控制设定特殊化为无习惯、无资本的 LQ 贝利环境,即 $\lambda = \delta_h = 0$ 且 $k_t = 0$,并令禀赋遵循双因子模型。 + +1. 将家庭状态写为 $x_t = [a_t, z_t^\top]^\top$,其中 $a_t$ 为净资产,并推导出 {eq}`eq:rbew-law` 中的矩阵 $(A, B, C)$。 + +2. 证明当 $\sigma = 0$ 时,贝尔曼问题与 {doc}`lq_permanent_income` 中的 LQ 永久收入问题一致。 + +3. HST 定义 $\alpha^2 = \nu^\top\nu$,其中 $\nu^\top = M_s C$,$\mu_{st} = M_s x_t$。计算该经济体的 $M_s$,并验证这一途径能得到与 {eq}`eq:rbew-alpha` 相同的 $\alpha^2$。 + +```{exercise-end} +``` + +```{solution-start} rbew_ex1 +:class: dropdown +``` + +以下是一种解法。 + +1. 根据预算法则 $a_{t+1} = R(a_t + y_t - c_t)$,$y_t = \check G z_t$ 以及 $z_{t+1} = \check A z_t + \check C w_{t+1}$,堆叠可得 + +$$ +\begin{pmatrix} a_{t+1} \\ z_{t+1} \end{pmatrix} += +\underbrace{\begin{pmatrix} R & R\check G \\ 0 & \check A \end{pmatrix}}_{A} +\begin{pmatrix} a_t \\ z_t \end{pmatrix} ++ +\underbrace{\begin{pmatrix} -R \\ 0 \end{pmatrix}}_{B} c_t ++ +\underbrace{\begin{pmatrix} 0 \\ \check C \end{pmatrix}}_{C} w_{t+1} . +$$ + + $B$ 的符号为负,因为更高的 $c_t$ 会减少资产积累。 + +2. 在 $\sigma = 0$ 时,最小化代理人不存在,扭曲项从贝尔曼方程中消失,目标函数为 $\mathbb{E}_0\sum \beta^t[-(c_t-b)^2/2]$,受限于线性运动规律。 + + 这正是 LQ 永久收入问题。 + +3. 在 $\lambda = \delta_h = 0$ 且极乐点为常数时,$\mu_{st} = b - c_t$,最优规则为 + +$$ +c_t = (1-\beta)\bigl[a_t + \check G(I-\beta\check A)^{-1} z_t\bigr] + \text{常数}, +$$ + + 因此除常数外,$M_s = -(1-\beta)\begin{pmatrix}1 & \check G(I-\beta\check A)^{-1}\end{pmatrix}$。 + + 由于 $C = [0;\ \check C]$,$M_s$ 的第一列被消去, + +$$ +\nu^\top = M_s C = -(1-\beta)\check G(I-\beta\check A)^{-1}\check C = -h . +$$ + + 因此 $\alpha^2 = \nu^\top\nu = hh^\top = \eta_1^2 + (1-\beta)^2\eta_2^2$,与 {eq}`eq:rbew-alpha` 一致。 + + 负号无关紧要,因为只有 $\alpha^2$ 会出现。 + +```{solution-end} +``` + +```{exercise-start} +:label: rbew_ex2 +``` + +本练习将逐步推导 {prf:ref}`prop-rbew-types` 中的均衡逻辑。 + +固定一个基准对 $(\beta, \sigma = 0)$,令 $R = \beta^{-1}$,并令单位区间内的消费者由 $i$ 标示,类型为 $\sigma_i \in (\underline\sigma, 0]$,贴现因子为来自 {eq}`eq:rbew-locus` 的 $\beta_i = \hat\beta(\sigma_i)$。 + +1. 使用 {doc}`lq_robust_smoothing` 中的 {prf:ref}`thm-rcs-oe1` 证明每种类型与基准 $(\beta, 0)$ 代理人具有相同的消费规则。 + +2. 证明商品市场和债券市场出清意味着与标准贝利模型相同的均衡利率 $R = \beta^{-1}$,无论类型的分布如何。 + +3. 解释为什么代理人在数量上可以观测等价,但持有不同的最坏情形主观模型。 + +4. 假设代理人具有共同的 $\beta$,但在 $\sigma_i$ 上有所不同,即它们*不*位于该轨迹上。解释为什么在这种情况下 $R = \beta^{-1}$ 通常无法使债券市场出清。 + +```{exercise-end} +``` + +```{solution-start} rbew_ex2 +:class: dropdown +``` + +以下是一种解法。 + +1. {prf:ref}`thm-rcs-oe1` 表明,如果 $(\sigma_i,\beta_i)$ 满足 $\beta_i = \beta + \sigma_i\alpha^2\beta/(1-\beta)$,则类型 $i$ 选择的决策规则与基准代理人相同,因此所有类型共享策略函数 $c_t = \mathcal{C}(a_t, z_t)$。 + +2. 由于所有个体规则都与基准规则一致,对 $i$ 进行加总便重现了基准的市场出清条件,而该条件在 $R = \beta^{-1}$ 处成立。 + + 类型分布从未介入其中,因此不会影响均衡利率。 + +3. 观测等价性是关于由最优规则生成的数量的一种表述。 + + 最小化反馈 $K(\sigma_i,\beta_i)$ 在不同类型之间仍然存在差异,因此各代理人在做出相同选择的同时,对相同的冲击过程赋予了不同的最坏情形条件均值。 + +4. 在轨迹之外,不耐心的抵消作用就消失了。 + + 一个具有 $\sigma_i < 0$ 且贴现因子为 $\beta$ 的代理人具有未被抵消的预防性动机,因此在 $R = \beta^{-1}$ 时它想要比基准代理人储蓄更多。 + + 在总体上对债券存在正的净需求的情况下,均衡利率必须降至 $\beta^{-1}$ 以下才能使市场出清,此时均衡就依赖于整个类型分布。 + +```{solution-end} +``` + +```{exercise-start} +:label: rbew_ex3 +``` + +本练习针对两个个体代理人,将数量与信念区分开来。 + +考虑代理人 $a$ 和 $b$,其中 $\sigma^a < \sigma^b \leq 0$,二者都位于轨迹 {eq}`eq:rbew-locus` 上。 + +1. 证明这两个代理人具有相同的消费创新 $h\,w_{t+1}$。 + +2. 证明如果它们从相同的 $(a_t, z_t)$ 出发,并观测到相同的冲击 $w_{t+1}$,则它们下一期的消费和资产是一致的。 + +3. 利用 {eq}`eq:rbew-beliefs`,计算两个代理人关于 $b - c_{t+h}$ 的最坏情形预测之比,并证明其随 $h$ 呈几何增长。 + +4. 总结仅凭数量数据能够识别什么,不能识别什么。 + +```{exercise-end} +``` + +```{solution-start} rbew_ex3 +:class: dropdown +``` + +以下是一种解法。 + +1. 两对参数都位于 {eq}`eq:rbew-locus` 上,因此根据 {prf:ref}`thm-rcs-oe1`,两者都使用基准规则,因而具有相同的创新向量 $h$。 + +2. 在共同的状态和共同的冲击下,两个代理人都采用相同的策略函数和相同的运动规律,因此 $c_{t+1}^a = c_{t+1}^b$ 且 $a_{t+1}^a = a_{t+1}^b$。 + +3. 由 {eq}`eq:rbew-beliefs` 可知,$\hat{\mathbb{E}}_t (b - c_{t+h}^j) = \zeta_j^{\,h}(b-c_t)$,因此比值为 $(\zeta_a/\zeta_b)^h$。 + + 由于 $\sigma^a < \sigma^b$ 意味着 $\zeta_a > \zeta_b$,该比值呈几何增长:随着期限的延长,这两个代理人的信念会无限发散,尽管它们的行为从未有任何不同。 + +4. 数量数据可以确定均衡决策规则,从而确定出现在其中的参数的单一组合。 + + 它们无法沿着该轨迹将这一规则分解为不耐心 $\beta_i$ 和稳健性 $\sigma_i$。 + +```{solution-end} +``` + +```{exercise-start} +:label: rbew_ex4 +``` + +本练习探讨在统计上有多少信念异质性是合理的。 + +将关注范围限制在其最坏情形模型在 $T = 40$ 的样本中检测误差概率至少为 $0.2$ 的类型上。 + +1. 通过二分法找到最稳健的可行类型 $\sigma^{\min}$。 + +2. 对于该类型,报告 $\beta_i$、$\zeta_i$,以及使其对 $b - c_{t+h}$ 的最坏情形预测达到近似模型预测两倍的期限 $h$。 + +3. 将第 1 部分中的 $T$ 改为 $160$ 重复计算,并评述更长样本对信念异质性合理程度的影响。 + +```{exercise-end} +``` + +```{solution-start} rbew_ex4 +:class: dropdown +``` + +以下是一种解法。 + +近似模型对每个 $h$ 都预测 $b - c_{t+h} = b - c_t$,而最坏情形预测为 $\zeta_i^h(b-c_t)$,因此加倍期限满足 $\zeta_i^h = 2$。 + +```{code-cell} ipython3 +def σ_for_target_dep(target, T, β, α2, tol=1e-5): + """ + Find σ ∈ (σ̲, 0) with DEP(σ) = target by bisection. + + Returns None if the DEP never falls to the target on the admissible + range, in which case the breakdown point is the binding constraint. + """ + α_loc = np.sqrt(α2) + lo, hi = 0.999 * (-(1 - β)**2 / α2), 0.0 + + def dep_at(σ): + return detection_error_probability( + worst_case_persistence(σ, β, α2), α_loc, T=T) + + if dep_at(lo) > target: + return None + + while hi - lo > tol: + mid = 0.5 * (lo + hi) + if dep_at(mid) < target: + lo = mid + else: + hi = mid + return 0.5 * (lo + hi) + + +for T in [40, 160]: + σ_min = σ_for_target_dep(0.2, T, β, α2) + if σ_min is None: + σ_min = 0.999 * σ_lo # breakdown binds before detectability + note = ' (breakdown point binds)' + else: + note = '' + ζ_min = worst_case_persistence(σ_min, β, α2) + print(f"T = {T:>3}: σ_min = {σ_min:.5f} β_i = {β / ζ_min:.5f} " + f"ζ_i = {ζ_min:.5f} doubling horizon = " + f"{np.log(2) / np.log(ζ_min):.1f} quarters{note}") +``` + +在 $T = 40$ 时,检测误差概率在可行范围内从未降至 $0.2$,因此最稳健的合理类型就是崩溃点本身对应的类型。 + +在 $T = 160$ 时,统计可检测性首先成为约束,合理类型集合急剧向 $\sigma = 0$ 收缩。 + +加倍期限相应地延长了:随着数据的增多,只有那些悲观情绪累积缓慢的代理人在统计上仍然可信。 + +```{solution-end} +``` + +## 相关讲座 + +- {doc}`lq_permanent_income` 阐述了标准的 LQ 永久收入模型。 +- {doc}`lq_bewley_complete_markets` 构建了基准贝利经济,其均衡在本讲座中得到重现。 +- {doc}`lq_robust_smoothing` 推导了本讲座中使用的观测等价定理、崩溃点和检测误差概率。 +- {doc}`robust_permanent_income` 展示了资产价格如何打破观测等价性。 \ No newline at end of file diff --git a/lectures/lq_robust_smoothing.md b/lectures/lq_robust_smoothing.md index 262bef8..70bd7c5 100644 --- a/lectures/lq_robust_smoothing.md +++ b/lectures/lq_robust_smoothing.md @@ -14,22 +14,28 @@ translation: headings: Overview: 概述 A brief review: 简要回顾 + A brief review::Notation: 符号约定 + A brief review::The model: 模型 + A brief review::The consumption innovation: 消费的新息 A robust permanent income model: 稳健永久收入模型 A robust permanent income model::Robustness and precautionary savings: 稳健性与预防性储蓄 A robust permanent income model::The HST model: HST 模型 A robust permanent income model::Solution when $\sigma = 0$: $\sigma = 0$ 时的解 - A robust permanent income model::Observational equivalence: 观测等价性 - A robust permanent income model::Precautionary savings interpretation: 预防性储蓄解释 - A robust permanent income model::Observational equivalence and distorted expectations: 观测等价性与扭曲预期 - A robust permanent income model::Frequency domain interpretation: 频域解释 - A robust permanent income model::Detection error probabilities: 检测误差概率 - A robust permanent income model::Robustness of decision rules: 决策规则的稳健性 - A robust permanent income model::Another observational equivalence result: 另一个观测等价性结果 - A robust permanent income model::A robust LQ Bewley model: 稳健 LQ Bewley 模型 - A robust permanent income model::A robust LQ Bewley model::Heterogeneous $(\beta_i, \sigma_i)$ preferences: 异质 $(\beta_i, \sigma_i)$ 偏好 - A robust permanent income model::A robust LQ Bewley model::Computation: 计算 - A robust permanent income model::Concluding remarks: 结束语 + Observational equivalence: 观测等价性 + Observational equivalence::Precautionary savings interpretation: 预防性储蓄的解释 + Observational equivalence::Observational equivalence and distorted expectations: 观测等价性与扭曲预期 + Observational equivalence::Another observational equivalence result: 另一个观测等价性结果 + Observational equivalence::Comparing the two loci: 比较两条轨迹 + The scalar worst-case model: 标量最坏情形模型 + The scalar worst-case model::A closed-form solution: 闭式解 + The scalar worst-case model::The breakdown point: 崩溃点 + The scalar worst-case model::Verifying the closed form: 验证闭式解 + Frequency domain interpretation: 频域解释 + Detection error probabilities: 检测误差概率 + Robustness of decision rules: 决策规则的稳健性 + Concluding remarks: 结语 Exercises: 练习 + Related lectures: 相关讲座 --- (lq_robust_smoothing)= @@ -57,38 +63,29 @@ translation: 本讲座研究由 {cite:t}`HST_1999` 和 {cite:t}`HansenSargent2008` 提出的 LQ 永久收入模型的稳健版本。 -这是关于 LQ 永久收入模型三讲中的第三讲。 +一个不信任自己对劳动收入过程设定的消费者会从事某种形式的预防性储蓄。 + +这是关于 LQ 永久收入模型四讲中的第三讲。 它建立在 {doc}`lq_permanent_income` 之上,该讲座发展了标准模型,以及 {doc}`lq_bewley_complete_markets`,该讲座研究了其横截面和市场结构方面的含义。 -一个不信任自己对劳动收入过程设定的消费者会从事某种形式的预防性储蓄。 +后续的 {doc}`lq_robust_bewley` 将利用本讲座得出的结果,构建一个由对其收入模型信任程度各异的消费者组成的 Bewley 经济。 我们对具有稳健性考量的模型的描述包括: -- (对于数量而言)稳健性考量如何在观测上等价于不耐心程度的增加 +- 对于数量而言,稳健性考量如何在观测上等价于不耐心程度的增加 - 消费者用来塑造其决策规则的最坏情况模型如何扭曲基准模型的禀赋过程,使其朝向更强的持续性 +- 一个**崩溃点**,超过该点稳健控制问题将不再有解 - 对禀赋过程设定误差影响的频域表示 - 对模型不确定性大小的检测误差概率刻画 -本讲座最后将 {doc}`lq_bewley_complete_markets` 的 Bewley 经济与稳健性机制相结合。 - -利用 {cite:t}`HansenSargent2008` 的工具,我们展示: - -- 使用相同决策规则的连续统消费者 $i$ 如何仍能在其稳健性参数 $\sigma_i \leq 0$ 和贴现因子 $\beta_i$ 上存在差异,只要 $(\sigma_i, \beta_i)$ 对位于下文推导的观测等价轨迹上 -- 每个这样的消费者如何选择与基准的、对禀赋过程设定误差毫不担忧的普通 $(\sigma = 0, \beta)$ 代理**相同的消费-储蓄规则** -- 均衡利率 $R = \beta^{-1}$ 和所有总量动态因此如何与基准 Bewley 模型的相一致 -- 不同的 $(\sigma_i, \beta_i)$ 代理如何表现得就像他们对其非金融收入过程持有不同的主观模型一样 - -我们首先以其一般形式呈现 HST 模型,其中包括物质资本和投资 $i_t$。 - -当我们回到 {doc}`lq_bewley_complete_markets` 的 Bewley 经济时,我们专门讨论一个没有资本的纯禀赋经济,因此投资在那里不起作用。 +一个反复出现的主题是:单一标量 $\alpha^2$(消费者边际效用创新项的方差)总结了禀赋过程中与稳健性相关的一切信息。 让我们从一些导入开始。 ```{code-cell} ipython3 import numpy as np import matplotlib.pyplot as plt -from scipy.stats import norm import matplotlib as mpl # i18n FONTPATH = "fonts/SourceHanSerifSC-SemiBold.otf" # i18n mpl.font_manager.fontManager.addfont(FONTPATH) # i18n @@ -100,6 +97,20 @@ mpl.rcParams['font.family'] = ['Source Han Serif SC'] # i18n 我们回顾 {doc}`lq_permanent_income` 和 {doc}`lq_bewley_complete_markets` 的要点。 +### 符号约定 + +因为一个稳健的决策者需要防范对冲击均值的扭曲,我们需要为冲击本身与对其的扭曲分别使用不同的符号。 + +因此,我们采用以下约定,这些约定在三处与前两讲不同。 + +```{note} +- $w_{t+1}$ 是基准的独立同分布冲击,与 {doc}`lq_permanent_income` 中一致,而 $v_{t+1}$ 是对其条件均值的**扭曲**,与 {doc}`robust_permanent_income` 中一致。 +- $\sigma \leq 0$ 是**稳健性参数**。前几讲中记作 $\sigma_1$ 和 $\sigma_2$ 的两个禀赋冲击的标准差,在此处重命名为 $\eta_1$ 和 $\eta_2$,以便 $\sigma$ 可以自由使用。 +- $a_t$ 表示消费者的**净资产**,等于 {doc}`lq_permanent_income` 中债务 $b_t$ 的负值。这使得 $b_t$ 可以留给 {cite:t}`HST_1999` 中的偏好转移变量使用。 +``` + +### 模型 + 一个具有二次效用和贴现因子 $\beta$ 的消费者面对禀赋过程 $$ @@ -107,18 +118,18 @@ $$ z_{t+1} &= \check{A}\, z_t + \check{C}\, w_{t+1} \\ y_t &= \check{G}\, z_t \end{aligned} -$$ (eq:rs-endowment) +$$ (eq:rcs-endowment) 最优决策规则具有一个状态空间表示,其中状态是当前消费 $c_t$ 和外生禀赋状态 $z_t$: $$ \begin{aligned} c_{t+1} &= c_t + (1-\beta)\,\check{G}(I-\beta\check{A})^{-1}\check{C}\, w_{t+1} \\ -b_t &= \check{G}(I-\beta\check{A})^{-1} z_t - \frac{1}{1-\beta}\,c_t \\ +a_t &= \frac{1}{1-\beta}\,c_t - \check{G}(I-\beta\check{A})^{-1} z_t \\ y_t &= \check{G}\, z_t \\ z_{t+1} &= \check{A}\, z_t + \check{C}\, w_{t+1} \end{aligned} -$$ (eq:rs-crep) +$$ (eq:rcs-crep) 我们再次使用双因子禀赋 $y_t = z_{1t} + z_{2t}$, @@ -128,28 +139,75 @@ $$ \begin{pmatrix}1 & 0\\0 & 0\end{pmatrix} \begin{pmatrix}z_{1t}\\z_{2t}\end{pmatrix} + -\begin{pmatrix}\sigma_1 & 0\\0 & \sigma_2\end{pmatrix} +\begin{pmatrix}\eta_1 & 0\\0 & \eta_2\end{pmatrix} \begin{pmatrix}w_{1,t+1}\\w_{2,t+1}\end{pmatrix} -$$ (eq:pi-twofactor) +$$ (eq:rcs-twofactor) 其中 $z_{1t}$ 是永久成分,$z_{2t}$ 是纯粹的暂时成分。 +### 消费的新息 + +基于 {eq}`eq:rcs-crep` 构造的一个标量将承担下文的全部工作。 + +{eq}`eq:rcs-crep` 的第一行表明,消费是一个随机游走,其新息为 $h\, w_{t+1}$,其中 + +$$ +h = (1-\beta)\,\check{G}(I-\beta\check{A})^{-1}\check{C} +$$ (eq:rcs-h) + +定义 $\alpha^2$ 为该新息的方差, + +$$ +\alpha^2 = h h^\top += (1-\beta)^2\,\check{G}(I-\beta\check{A})^{-1}\check{C}\check{C}^\top(I-\beta\check{A}^\top)^{-1}\check{G}^\top +$$ (eq:rcs-alpha) + +对于双因子禀赋 {eq}`eq:rcs-twofactor`,我们有 $\check A = \mathrm{diag}(1,0)$、$\check C = \mathrm{diag}(\eta_1,\eta_2)$ 以及 $\check G = \begin{pmatrix}1 & 1\end{pmatrix}$,从而 $(I-\beta\check A)^{-1} = \mathrm{diag}\bigl((1-\beta)^{-1},1\bigr)$,于是 + +$$ +h = \begin{pmatrix}\eta_1 & (1-\beta)\eta_2\end{pmatrix}, +\qquad +\alpha^2 = \eta_1^2 + (1-\beta)^2\,\eta_2^2 +$$ (eq:rcs-alpha2) + +永久冲击的方差 $\eta_1^2$ 以系数 $1$ 出现,因为单位永久冲击会**完全**资本化进消费中。 + +暂时冲击的方差 $\eta_2^2$ 以较小的系数 $(1-\beta)^2$ 出现,因为只有其年金价值会被消费。 + +这个标量在本系列的三讲中承担三重作用。 + +```{note} +$\alpha^2$ 同时是 + +- {doc}`lq_permanent_income` 中消费新息的方差, +- {doc}`lq_bewley_complete_markets` 中消费的截面方差随年龄增长的速率,以及 +- 本讲中乘以 $\sigma$ 后决定每一个稳健性结果的量。 + +{doc}`robust_permanent_income` 将同一个量记作 $\theta^2$。 +``` + 下面的单元格固定了后文使用的校准。 ```{code-cell} ipython3 -# 参数(与前面的讲座相同) -β = 0.95 # 贴现因子 -σ1 = 0.15 # 永久冲击的标准差 -σ2 = 0.30 # 暂时冲击的标准差 +β = 0.95 # 贴现因子,因此 R = 1/β +η1 = 0.15 # 永久冲击的标准差 +η2 = 0.30 # 暂时冲击的标准差 + +R = 1 / β +α2 = η1**2 + (1 - β)**2 * η2**2 +α = np.sqrt(α2) + +print(f"α^2 = {α2:.6f}") +print(f" 永久部分 η1^2 = {η1**2:.6f} " + f"(占 α^2 的 {100 * η1**2 / α2:5.1f}%)") +print(f" 暂时部分 (1-β)^2 η2^2 = {(1 - β)**2 * η2**2:.6f} " + f"(占 α^2 的 {100 * (1 - β)**2 * η2**2 / α2:5.1f}%)") ``` -## 稳健永久收入模型 +在此校准下,永久冲击几乎占据了 $\alpha^2$ 的全部份额。 -```{index} single: Robust Control; permanent income -``` +## 稳健永久收入模型 -```{index} single: Precautionary Savings; robustness -``` ### 稳健性与预防性储蓄 @@ -159,11 +217,11 @@ $$ (eq:pi-twofactor) 关于 HST 模型及其资产定价含义的更完整论述,请参见 {doc}`robust_permanent_income`。 -一个担心模型设定误差的消费者会从事某种形式的**预防性储蓄**,这不同于通常的预防性动机(后者需要凸的边际效用)。 +一个担心模型设定误差的消费者会从事某种形式的**预防性储蓄**,这不同于通常的预防性动机,后者需要凸的边际效用。 在这里,预防性动机之所以产生,是因为消费者想要防范收入冲击**条件均值**的设定误差,并且即使在二次偏好下它也起作用。 -HST 展示了一个重要的**观测等价性**结果:仅就数量 $(c_t, i_t)$ 而言,稳健性考量与不耐心程度的增加($\beta$ 的减小)是无法区分的。 +HST 展示了一个重要的**观测等价性**结果:仅就数量 $(c_t, i_t)$ 而言,稳健性考量与不耐心程度的增加,即 $\beta$ 的减小,是无法区分的。 我们在下文中仔细展开这一结果。 @@ -177,14 +235,14 @@ HST 展示了一个重要的**观测等价性**结果:仅就数量 $(c_t, i_t) HST 的模型的特点是一个计划者,其偏好作用于消费流 $\{c_t\}$,通过**服务流** $\{s_t\}$ 来中介。 -设 $b$ 为一个偏好移位项(效用极乐点)。 +设 $b$ 为一个偏好移位项,或效用极乐点。 **稳健计划者的贝尔曼方程**为 $$ -x^\top P x - p = -\sup_c \inf_w \Bigl\{-(s-b)^2 + \beta\bigl(\theta (w^*)^\top w^* - \mathbb{E}\,(x^*)^\top P x^* - p\bigr)\Bigr\} -$$ (eq:income1) +\sup_c \inf_{v^*} \Bigl\{-(s-b)^2 + \beta\bigl(\theta\, (v^*)^\top v^* - \mathbb{E}\,(x^*)^\top P x^* - p\bigr)\Bigr\} +$$ (eq:rcs-bellman) 受制于家庭技术、资本积累、禀赋动态以及状态法则: @@ -195,59 +253,55 @@ h^* &= \delta_h h + (1-\delta_h) c \\ k^* &= \delta_k k + i \\ c + i &= \gamma k + d \\ \begin{pmatrix}d\\b\end{pmatrix} &= U z \\ -z^* &= A_{22} z + C_2(\epsilon^* + w^*) +z^* &= A_{22} z + C_2(w^* + v^*) \end{aligned} -$$ (eq:income1a) +$$ (eq:rcs-tech) + +这里 $^*$ 表示下一期的值;$c$ 是消费;$s$ 是标量服务度量;$h$ 是习惯存量;$k$ 是资本存量;$i$ 是投资;$d$ 是禀赋冲击;$b$ 是**偏好冲击**;$\gamma$ 是资本边际产量;$w^* \sim N(0,I)$ 是基准冲击;而 $v^*$ 是由一个最小化代理选择的对 $w^*$ 条件均值的**扭曲**。 -这里 $^*$ 表示下一期的值;$c$ 是消费;$s$ 是标量服务度量;$h$ 是习惯存量;$k$ 是资本存量;$i$ 是投资;$d$ 是禀赋/技术冲击;$b$ 是**偏好冲击**(极乐点移位项,不同于上文使用的债券/债务变量 $b_t$);$\epsilon^* \sim N(0,I)$ 是基准冲击;而 $w^*$ 是由一个最小化代理选择的对 $\epsilon^*$ 条件均值的**扭曲**。 +惩罚参数 $\theta$ 支配着消费者对稳健性的考量。 -惩罚参数 $\theta > 0$ 支配着消费者对稳健性的考量。 +较大的 $\theta$ 使扭曲的代价高昂,因此约束了最小化代理。 我们使用变换 $$ -\sigma = -\theta^{-1} \leq 0 -$$ - -因此 $\sigma = 0$ 对应于没有稳健性考量,而 $\sigma < 0$ 对应于日益增强的考量。 +\sigma = -\theta^{-1} \leq 0, +\qquad \theta \in (0,\infty] +$$ (eq:rcs-sigma) -当 $\lambda > 0$ 且 $\delta_h \in (0,1)$ 时,技术 {eq}`eq:income1a` 容纳了**习惯持续性**(正的 $\lambda$)或耐久性。 +因此 $\sigma = 0$(等价地 $\theta = \infty$)对应于没有稳健性考量,而 $\sigma < 0$ 对应于日益增强的考量。 -存量 $h_t$ 是当前和过去消费的几何加权平均。 +当 $\lambda > 0$ 且 $\delta_h \in (0,1)$ 时,技术 {eq}`eq:rcs-tech` 容纳了**习惯持续性**或耐久性,而存量 $h_t$ 是当前和过去消费的几何加权平均。 -方程 $c_t + k_t = Rk_{t-1} + d_t$(其中 $R = \delta_k + \gamma$)将资本积累与线性生产技术结合起来。 - -$R$ 是资本的物质总回报率。 +方程 $c_t + k_t = R k_{t-1} + d_t$(其中 $R = \delta_k + \gamma$)将资本积累与线性生产技术结合起来,因此 $R$ 是资本的物质总回报率。 设 $x_t^\top = [h_{t-1},\, k_{t-1},\, z_t^\top]$。 -状态转移方程为: +状态转移方程为 $$ -x_{t+1} = A\, x_t + B\, u_t + C(\epsilon_{t+1} + w_{t+1}) -$$ (eq:law0) +x_{t+1} = A\, x_t + B\, u_t + C(w_{t+1} + v_{t+1}) +$$ (eq:rcs-law) + +其中 $u_t = c_t$,$v_{t+1}$ 是对 $w_{t+1}$ 条件均值的扭曲。 -其中 $u_t = c_t$,$w_{t+1}$ 是对 $\epsilon_{t+1}$ 条件均值的扭曲。 +HST 用美国季度数据(1970Q1 至 1996Q3)估计了该模型,消费使用非耐久品加服务,投资使用耐久品消费加私人总投资。 -HST 用美国季度数据(1970Q1-1996Q3)估计了该模型,消费使用非耐久品加服务,投资使用耐久品消费加私人总投资。 +他们施加了 $\beta R = 1$ 和 $\delta_k = 0.975$,因此一旦估计出 $\beta$,$\gamma$ 就被确定下来。 -主要估计值总结在下表中(报告于 HST 的附录 A): +他们的两个偏好估计值值得记录。 | 参数 | 习惯 | 无习惯 | |-----------|-------|----------| -| 无风险利率 | 0.025 | 0.025 | | $\beta$ | 0.997 | 0.997 | | $\delta_h$ | 0.682 | — | | $\lambda$ | 2.443 | 0 | -| $\alpha_1$ | 0.813 | 0.900 | -| $\alpha_2$ | 0.189 | 0.241 | -| $\phi_1$ | 0.998 | 0.995 | -| $\phi_2$ | 0.704 | 0.450 | | $2 \times \log L$ | 779.05 | 762.55 | -HST 施加了 $\beta R = 1$ 和 $\delta_k = 0.975$,因此一旦估计出 $\beta$,$\gamma$ 就被确定下来。 +在季度频率下,$\beta = 0.997$ 意味着年实际利率约为 $\beta^{-4} - 1 \approx 1.2\%$。 -2.5% 的年实际利率对应于 $\beta = 0.997$。 +其余的估计参数支配着外生的 $d_t$ 和 $b_t$ 过程,报告于 {cite:t}`HST_1999` 的附录 A 中。 ### $\sigma = 0$ 时的解 @@ -255,9 +309,9 @@ HST 施加了 $\beta R = 1$ 和 $\delta_k = 0.975$,因此一旦估计出 $\bet $$ \mathbb{E}_0\sum_{t=0}^{\infty}\beta^t\bigl\{-(s_t - b_t)^2\bigr\} -$$ (eq:income5) +$$ (eq:rcs-obj) -构造拉格朗日函数并推导一阶条件得到: +构造拉格朗日函数并推导一阶条件得到 $$ \begin{aligned} @@ -266,15 +320,15 @@ $$ \mu_{ht} &= \beta \mathbb{E}_t[\delta_h \mu_{h,t+1} - \lambda \mu_{s,t+1}] \\ \mu_{ct} &= \beta R\, \mathbb{E}_t\mu_{c,t+1} \end{aligned} -$$ (eq:foc) +$$ (eq:rcs-foc) 这里 $\mu_{st}$ 是**消费服务的边际估值**,它总结了内生状态变量 $h_{t-1}$ 和 $k_{t-1}$。 -方程 {eq}`eq:foc`(最后一行)意味着 $\mathbb{E}_t\mu_{c,t+1} = (\beta R)^{-1}\mu_{ct}$,因此当 $\beta R = 1$ 时 $\mu_{st}$ 是一个鞅: +{eq}`eq:rcs-foc` 的最后一行意味着 $\mathbb{E}_t\mu_{c,t+1} = (\beta R)^{-1}\mu_{ct}$,因此当 $\beta R = 1$ 时 $\mu_{st}$ 是一个鞅: $$ -\mu_{st} = \mu_{s,t-1} + \nu^\top \epsilon_t -$$ (eq:martingale) +\mu_{st} = \mu_{s,t-1} + \nu^\top w_t +$$ (eq:rcs-martingale) 对某个向量 $\nu$。 @@ -283,811 +337,925 @@ $$ (eq:martingale) $$ \mu_{st} = \Psi_1 k_{t-1} + \Psi_2 h_{t-1} + \Psi_3\sum_{j=0}^{\infty} R^{-j} \mathbb{E}_t b_{t+j} + \Psi_4\sum_{j=0}^{\infty} R^{-j} \mathbb{E}_t d_{t+j} -$$ (eq:income10) +$$ (eq:rcs-mus) 其中 $$ \Psi_1 = -(1+\lambda)R(1-R^{-2}\beta^{-1})\!\left[\frac{1-R^{-1}\tilde\delta_h}{1-R^{-1}\tilde\delta_h+\lambda(1-\tilde\delta_h)}\right], \quad \Psi_4 = R^{-1}\Psi_1 -$$ (eq:income100a) +$$ (eq:rcs-psi) 且 $\tilde\delta_h = (\delta_h + \lambda)/(1+\lambda)$。 -在被广泛研究的特殊情形 $\lambda = \delta_h = 0$ 下,因此 $s_t = c_t$ 且 $\mu_{st} = b_t - c_t$,从**非人力财富** $Rk_{t-1}$ 中消费的边际倾向等于从**人力财富** $\sum_{j=0}^{\infty}R^{-j}\mathbb{E}_t d_{t+j}$ 中消费的边际倾向,这是 LQ 模型的一个众所周知的特征。 +在被广泛研究的特殊情形 $\lambda = \delta_h = 0$ 下,我们有 $s_t = c_t$ 且 $\mu_{st} = b_t - c_t$,从**非人力财富** $Rk_{t-1}$ 中消费的边际倾向等于从**人力财富** $\sum_{j=0}^{\infty}R^{-j}\mathbb{E}_t d_{t+j}$ 中消费的边际倾向,这是 LQ 模型的一个众所周知的特征。 -$\mu_{st}$ 的公式可以写成 $\mu_{st} = M_s x_t$,其中 $x_t$ 遵循 {eq}`eq:law0`。 +$\mu_{st}$ 的公式可以写成 $\mu_{st} = M_s x_t$,其中 $x_t$ 遵循 {eq}`eq:rcs-law`。 由此可得 $$ \nu^\top = M_s C, \qquad \alpha = \sqrt{\nu^\top \nu} = \sqrt{M_s C C^\top M_s^\top} -$$ (eq:hsoffset2) +$$ (eq:rcs-nu) + +这个 $\alpha$ 与我们在 {eq}`eq:rcs-alpha` 中遇到的标量相同。 + +要理解为何如此,设 $\lambda = \delta_h = 0$ 并固定 $b_t$,那么 $\mu_{st} = b - c_t$,而 $\mu_{st}$ 的创新就是 $c_t$ 创新的相反数。 -标量 $\alpha$ 在下文的观测等价性结果中起核心作用。 +因此 $\nu^\top = -h$ 且 $\alpha^2 = \nu^\top\nu = h h^\top$,恰如 {eq}`eq:rcs-alpha` 中所示。 -### 观测等价性 +符号无关紧要,因为只有 $\alpha^2$ 会出现在后续推导中。 + +## 观测等价性 ```{index} single: Observational Equivalence; Theorem 1 ``` -HST 陈述了一个观测等价性定理。 +HST 提出了一个观测等价性定理。 ````{prf:theorem} 观测等价性,I -:label: thm-lqcs-oe1 +:label: thm-rcs-oe1 固定除 $(\sigma, \beta)$ 之外的所有参数,并假设当 $\sigma = 0$ 时 $\beta R = 1$。 -存在 $\underline\sigma < 0$,使得对于任意 $\sigma \in (\underline\sigma, 0)$,$(0,\beta)$ 的最优消费-投资计划也被一个参数为 $(\sigma, \hat\beta(\sigma))$ 的稳健决策者所选择,其中 +存在 $\underline\sigma < 0$,使得对任意 $\sigma \in (\underline\sigma, 0)$,$(0,\beta)$ 情形下的最优消费-投资计划,也会被参数为 $(\sigma, \hat\beta(\sigma))$ 的稳健决策者所选择,其中 $$ \hat\beta(\sigma) = \frac{1}{R} + \frac{\sigma\alpha^2}{R-1} -$$ (eq:obseq) += \beta + \frac{\sigma\alpha^2\beta}{1-\beta} +$$ (eq:rcs-oe) 且 $\hat\beta(\sigma) < \beta$。 ```` -由于 $R > 1$ 且 $\alpha^2 > 0$,更负的 $\sigma$(更强的稳健性考量)会降低 $\hat\beta$。 +{eq}`eq:rcs-oe` 中的第二个等式使用了 $R = \beta^{-1}$,这将是我们在计算中使用的形式。 + +由于 $R > 1$ 且 $\alpha^2 > 0$,$\sigma$ 越负(意味着更强的稳健性关切)会降低 $\hat\beta$。 -一个稳健的消费者想要储蓄更多,因为他的另一个自我,一个效用最小化的代理,让未来收入看起来比近似模型预测的更糟。 +一个稳健的消费者想要储蓄更多,因为他的另一个自我——一个使效用最小化的行动者——使未来收入看起来比近似模型预测的更糟。 -较低的贴现因子使消费者更不耐心,因此减少储蓄。 +较低的贴现因子会使消费者变得不那么耐心,因此会减少储蓄。 -当这两种力量根据 {eq}`eq:obseq` 达到平衡时,消费计划在 $(\sigma, \hat\beta(\sigma))$ 对之间是相同的。 +当这两种力量根据 {eq}`eq:rcs-oe` 达到平衡时,在不同的 $(\sigma, \hat\beta(\sigma))$ 对之间,消费计划是相同的。 ````{prf:proof} -当 $\beta R = 1$ 且 $\sigma = 0$ 时,边际效用 $\mu_{st}$ 服从鞅 +当 $\beta R = 1$ 且 $\sigma = 0$ 时,边际效用 $\mu_{st}$ 遵循鞅过程 $$ -\mu_{st} = \mu_{s,t-1} + \alpha\,\tilde\epsilon_t -$$ (eq:reversee1) +\mu_{st} = \mu_{s,t-1} + \alpha\,\tilde w_t +$$ (eq:rcs-scalar-approx) -其中 $\tilde\epsilon_t$ 是标量 IID,均值为零,单位方差。 +其中 $\tilde w_t$ 是均值为零、方差为一的标量独立同分布变量。 -激活稳健性考量($\sigma < 0$)意味着效用最小化的另一个自我设置 +激活对稳健性的关切,即 $\sigma < 0$,会使效用最小化的另一自我设定 $$ -\tilde w_t = K(\sigma,\hat\beta)\,\mu_{s,t-1} -$$ +\tilde v_t = K(\sigma,\hat\beta)\,\mu_{s,t-1} +$$ (eq:rcs-K) -使 $\mu_{st}$ 的最坏情况模型为: +从而使 $\mu_{st}$ 的最坏情形模型为 $$ -\mu_{st} = (1 + \alpha\,K(\sigma,\hat\beta))\,\mu_{s,t-1} + \alpha\,\tilde\epsilon_t -$$ (eq:reversee3) +\mu_{st} = \zeta\,\mu_{s,t-1} + \alpha\,\tilde w_t, +\qquad \zeta \equiv 1 + \alpha\,K(\sigma,\hat\beta) +$$ (eq:rcs-scalar-worst) -为使配置保持不变,我们要求稳健欧拉方程 $\hat\beta R\,\hat{\mathbb{E}}_t\mu_{s,t+1} = \mu_{st}$ 在最坏情况模型下成立,这给出 +为使配置保持不变,我们要求稳健欧拉方程 $\hat\beta R\,\hat{\mathbb{E}}_t\mu_{s,t+1} = \mu_{st}$ 在最坏情形模型下成立,这给出 $$ -(\hat\beta R)^{-1} = 1 + \alpha\, K(\sigma,\hat\beta) -$$ (eq:eulerdist) +\zeta = (\hat\beta R)^{-1} +$$ (eq:rcs-eulerdist) -最小化代理的贝尔曼方程,一个纯预测问题,给出 +最小化行动者的贝尔曼方程是一个纯预测问题,由此得出 $$ -\hat\zeta(\hat\beta) \equiv 1 + \alpha K(\sigma,\hat\beta) = \frac{1}{1 - \sigma\alpha^2 P(\hat\beta)} -$$ (eq:distort2) +\zeta = \frac{1}{1 - \sigma\alpha^2 P(\hat\beta)} +$$ (eq:rcs-zetaP) -其中 $P(\hat\beta)$ 求解标量贝尔曼方程: +其中 $P(\hat\beta)$ 求解标量贝尔曼方程 $$ --P(\hat\beta) = \frac{\hat\beta - 1 + \sigma\alpha^2 + \sqrt{(\hat\beta-1+\sigma\alpha^2)^2 + 4\sigma\alpha^2}}{-2\sigma\alpha^2} -$$ (eq:distortcons) +P(\hat\beta) = \frac{\hat\beta - 1 + \sigma\alpha^2 + \sqrt{(\hat\beta-1+\sigma\alpha^2)^2 + 4\sigma\alpha^2}}{-2\sigma\alpha^2} +$$ (eq:rcs-riccati) -对 $\hat\beta$ 求解 {eq}`eq:eulerdist`-{eq}`eq:distortcons` 恰好给出 {eq}`eq:obseq`。 +对 {eq}`eq:rcs-eulerdist`-{eq}`eq:rcs-riccati` 求解 $\hat\beta$,恰好得到 {eq}`eq:rcs-oe`。 ```` -方程 {eq}`eq:obseq` 是有用的数值对象,因为它给出了从稳健性参数到观测等价贴现因子的直线映射。 +方程 {eq}`eq:rcs-oe` 是一个很有用的数值对象,因为它给出了从稳健性参数到观测等价贴现因子之间的一个线性映射。 -### 预防性储蓄解释 +### 预防性储蓄的解释 ```{index} single: Precautionary Savings; robustness vs convex marginal utility ``` -消费者对模型设定误差的考量激活了观测等价性定理背后的预防性储蓄动机。 +消费者对模型设定误差的关切,激活了支撑观测等价性定理的预防性储蓄动机。 -对稳健性的考量使消费者储蓄*更多*。 +对稳健性的关切会使消费者储蓄*更多*。 -减小 $\beta$ 使消费者储蓄*更少*。 +减小 $\beta$ 会使消费者储蓄*更少*。 -观测等价性定理表明这两种力量可以被设置成恰好相互抵消。 +观测等价性定理表明,这两种力量可以被设置成恰好相互抵消。 -在特殊情形 $\lambda = \delta_h = 0$ 下,$s_t = c_t$,消费规则为 +在特殊情形 $\lambda = \delta_h = 0$ 中,$s_t = c_t$,消费规则为 $$ c_t = (1 - R^{-2}\beta^{-1})\!\left[Rk_{t-1} + \mathbb{E}_t\sum_{j=0}^{\infty}R^{-j}d_{t+j}\right] + \left(\frac{(R\beta)^{-1}-1}{R-1}\right)\!b -$$ (eq:consfunction) - -从非人力财富 $Rk_{t-1}$ 中消费的**边际消费倾向** *等于* 从人力财富 $\mathbb{E}_t\sum R^{-j}d_{t+j}$ 中消费的边际消费倾向。 +$$ (eq:rcs-consfunction) -这个等倾向性质是 LQ 模型的标志,并且在存在稳健性考量时*仍然存在*,这与通常具有凸边际效用的预防性储蓄模型形成对比。 +对非人力财富 $Rk_{t-1}$ 的**边际消费倾向**,*等于*对人力财富 $\mathbb{E}_t\sum R^{-j}d_{t+j}$ 的边际消费倾向。 -{prf:ref}`thm-lqcs-oe1` 表明,当 $\sigma < 0$ 时,观测等价的 $\hat\beta$ 满足 $\hat\beta < \beta$。 +这种相等倾向的特性是 LQ 模型的标志,并且在存在稳健性关切时也*得以保持*,这与通常的具有凸边际效用的预防性储蓄模型形成对比。 -如果起点是 $\beta R = 1$,那么 $\hat\beta R < 1$。 +{prf:ref}`thm-rcs-oe1` 表明,当 $\sigma < 0$ 时,观测等价的 $\hat\beta$ 满足 $\hat\beta < \beta$。 -对于在相同利率下具有贴现因子 $\hat\beta$ 的非稳健消费者,欧拉方程意味着 $\mathbb{E}_t c_{t+1} < c_t$:预期消费随时间下降。 +如果起点满足 $\beta R = 1$,那么 $\hat\beta R < 1$。 -这种向下漂移是 {prf:ref}`thm-lqcs-oe1` 中的不耐心抵消。 +对于在相同利率下、贴现因子为 $\hat\beta$ 的非稳健消费者,欧拉方程意味着 $\mathbb{E}_t c_{t+1} < c_t$,因此预期消费随时间下降。 -它抵消了稳健消费者的预防性储蓄动机,使得消费和投资数量保持不变。 +这种向下的漂移正是 {prf:ref}`thm-rcs-oe1` 中的不耐心抵消效应。 -向上漂移的比较出现在 {prf:ref}`thm-lqcs-oe2` 中,该定理提出了相反的观测等价性问题。 +它抵消了稳健消费者的预防性储蓄动机,从而使消费和投资数量保持不变。 -经典预防性动机之所以产生,是因为: +经典的预防性动机产生的原因是 $$ u'''(c) > 0 \;\Rightarrow\; \mathbb{E}_t u'(c_{t+1}) > u'(\mathbb{E}_t c_{t+1}) \;\Rightarrow\; \mathbb{E}_t c_{t+1} > c_t -$$ +$$ (eq:rcs-prudence) -这个渠道需要*边际效用的凸性*,在二次偏好下不存在。 +这一渠道需要*边际效用的凸性*,而在二次型偏好下并不存在。 -相比之下,基于稳健性的预防性动机通过冲击**条件均值**的扭曲运作,移动了对非金融收入创新的一阶矩。 +相比之下,基于稳健性的预防性动机是通过对冲击**条件均值**的扭曲发挥作用的,它改变了非金融收入创新的一阶矩。 ### 观测等价性与扭曲预期 ```{index} single: Distorted Expectations; Stackelberg multiplier game ``` -观测等价性结果可以用**斯塔克尔伯格乘数博弈**来解释。 +观测等价性的结果可以借助**斯塔克尔伯格乘数博弈**来解释。 -在最小化代理承诺了一个扭曲过程 $\{w_{t+1}\}$ 之后,最大化消费者面对以下状态 $X_t$ 的最坏情况运动法则: +在最小化行动者已经承诺了扭曲过程 $\{v_{t+1}\}$ 之后,最大化行动者面临的状态 $X_t$ 的最坏情形运动法则如下: $$ \begin{aligned} -X_{t+1} &= \bigl(A - BF(\sigma,\hat\beta) + CK(\sigma,\hat\beta)\bigr) X_t + C\tilde\epsilon_{t+1} \\ +X_{t+1} &= \bigl(A - BF(\sigma,\hat\beta) + CK(\sigma,\hat\beta)\bigr) X_t + C\,w_{t+1} \\ \begin{pmatrix}b_t\\d_t\end{pmatrix} &= S X_t \end{aligned} -$$ (eq:sys2) +$$ (eq:rcs-worstcase-law) -一个担心近似模型对非金融收入随机过程可能设定误差的稳健消费者,使用**扭曲转移矩阵** $A - BF + CK$ 而不是近似转移矩阵 $A - BF$ 来形成对未来收入的预期。 +一个稳健的消费者使用**扭曲转移矩阵** $A - BF + CK$ 而不是近似转移矩阵 $A - BF$ 来形成对未来收入的预期。 扭曲预期算子 $\hat{\mathbb{E}}_t$ 满足 $$ \hat{\mathbb{E}}_t X_{t+j} = (A - BF(\sigma,\hat\beta) + CK(\sigma,\hat\beta))^j X_t -$$ +$$ (eq:rcs-Ehat) -观测等价性要求修改后的人力财富公式 +观测等价性要求修正后的人力财富公式 $$ \hat\Psi_4 \sum_{j=0}^{\infty} R^{-j}\hat{\mathbb{E}}_t d_{t+j} -$$ +$$ (eq:rcs-humanwealth) -等于其基准对应物 $\Psi_4 \sum_{j=0}^{\infty} R^{-j} \mathbb{E}_t d_{t+j}$。 +等于其基准对应项 $\Psi_4 \sum_{j=0}^{\infty} R^{-j} \mathbb{E}_t d_{t+j}$。 -这是通过系数 $\hat\Psi_j$ 通过 $\hat\beta$ 的相互调整以及扭曲预期算子 $\hat{\mathbb{E}}_t$ 通过 $\sigma$ 的相互调整来实现的。 +这是通过系数 $\hat\Psi_j$ 借助 $\hat\beta$ 的调整、以及扭曲预期算子 $\hat{\mathbb{E}}_t$ 借助 $\sigma$ 的调整,两者相互配合来实现的。 -$A - BF + CK$ 的最坏情况特征值在模上超过 $A - BF$ 的特征值,因此最坏情况扭曲使收入过程比近似模型下*更具持续性*。 +$A - BF + CK$ 的最坏情形特征值在模上超过 $A - BF$ 的特征值,因此最坏情形的扭曲使得收入过程比在近似模型下*更具持续性*。 -这是状态空间形式的预防性动机:最小化代理通过引入低频持续性使未来收入看起来更有风险。 +这就是状态空间形式下的预防性动机:最小化行动者通过引入低频持续性,使未来收入看起来风险更大。 -### 频域解释 +在下一节的标量简化中,这个特征值即为 $\zeta$,我们将验证 $\zeta > 1$,而近似模型具有单位根。 -```{index} single: Frequency Domain; permanent income model +### 另一个观测等价性结果 + +```{index} single: Observational Equivalence; Theorem 2 ``` -LQ 永久收入框架有一个自然的频域解释。 +````{prf:theorem} 观测等价性,II +:label: thm-rcs-oe2 -消费者的凹效用使他厌恶消费中的**高频**波动,他通过调整储蓄来平滑这些波动。 +固定除 $(\sigma,\beta)$ 之外的所有参数,考虑 $(\hat\sigma, \hat\beta)$ 情形下的一个消费-投资配置,其中 $\hat\beta R = 1$ 且 $\hat\sigma < 0$。 -高频波动更容易平滑,因此消费者对收入过程高频特征的设定误差自动稳健。 +那么存在 $\tilde\beta > \hat\beta$,使得 $(\hat\sigma, \hat\beta)$ 配置也求解了 $(0, \tilde\beta)$ 问题。 +```` -**低频**波动更难平滑,因为它们更具持续性。 +{prf:ref}`thm-rcs-oe1` 表明,从满足 $\beta R = 1$ 的基准出发,激活稳健性等价于*减小* $\beta$。 -在 HST 的频域记号中,从冲击 $\epsilon_t$ 到目标 $s_t - b_t$ 的传递函数是 $G(\zeta)$,而 $H_2$ 标准的频率分解为 +{prf:ref}`thm-rcs-oe2` 则走向相反的方向:从满足 $\beta R = 1$ 的起点激活对稳健性的关切所产生的效果,可以通过*增大* $\beta$ 同时设定 $\sigma = 0$ 来复现。 -$$ -H_2 = -\frac{1}{2\pi}\int_{-\pi}^{\pi} \operatorname{trace}\!\bigl[G(\sqrt\beta\, e^{i\omega})^\top\,G(\sqrt\beta\, e^{i\omega})\bigr]\, d\omega -$$ +换言之,当 $\beta R = 1$ 时,对稳健性的关切的作用就像贴现因子的*增大*一样,将 $\beta R$ 推高至大于 1,并使预期消费路径产生*向上的漂移*。 -被积函数 $G^\top G$ 在低频 $\omega \approx 0$ 处*最大*,那里消费者的福利对收入变动性最敏感。 +````{prf:proof} +在 $\hat\beta R = 1$ 且 $\hat\sigma < 0$ 时,稳健欧拉方程意味着 -认识到这一点,最小化代理将最坏情况扭曲集中在低频处。 +$$ +\hat{\mathbb{E}}_t \mu_{c,t+1} = \mu_{ct} +$$ (eq:rcs-euler2) -扭曲过程具有集中在 $\omega = 0$ 附近的谱密度 $W(\zeta)^\top W(\zeta)$。 +我们要寻找 $\tilde\beta > \hat\beta$ 及 $\sigma = 0$,使得相同的配置求解贴现因子为 $\tilde\beta$ 的非稳健问题。 -随着 $|\sigma|$ 增大,最坏情况冲击的方差增长。 +关键的一步是观察到,最坏情形扭曲 $K(\hat\sigma, \hat\beta)$ 在边际效用过程中引入的漂移,等价于将贴现因子提高到 $\hat\beta$ 以上所产生的漂移。 -### 检测误差概率 +令这两种漂移相等,并求解标量贝尔曼方程中的 $K$,得到 -```{index} single: Detection Error Probabilities -``` +$$ +\tilde\beta(\hat\sigma) = \frac{\hat\beta(1+\hat\beta)}{2(1+\hat\sigma\alpha^2)} +\left[1 + \sqrt{1 - 4\hat\beta\,\frac{1+\hat\sigma\alpha^2}{(1+\hat\beta)^2}}\right] +$$ (eq:rcs-oe2) -一种规范 $\sigma$(或 $\theta$)选择的自然方法是问:**从统计上区分近似模型与最坏情况模型有多困难?** +设 $\hat\sigma = 0$,使平方根等于 $(1-\hat\beta)/(1+\hat\beta)$,从而 $\tilde\beta = \hat\beta$。 -对于长度为 $T$ 的样本,可以使用**对数似然比检验**来比较两个假设。 +由于 $1 + \hat\sigma\alpha^2$ 随 $\hat\sigma$ 降至零以下而减小,前置因子和平方根都会增大,因此只要 $\hat\sigma < 0$,就有 $\tilde\beta > \hat\beta$。 +```` -**检测误差概率**(DEP)是在不知道哪个模型生成数据时,使用对数似然比统计量做出错误决定的概率。 +### 比较两条轨迹 -具体来说: +{eq}`eq:rcs-oe` 与 {eq}`eq:rcs-oe2` 都是闭式表达式,因此我们可以直接将它们画出来。 -$$ -\text{DEP}(\sigma) = \frac{1}{2}\bigl[\mathbb{P}\{\text{prefer approx.} \mid \text{worst-case is true}\} - + \mathbb{P}\{\text{prefer worst-case} \mid \text{approx. is true}\}\bigr] -$$ +我们从满足 $\beta R = 1$ 的基准出发。 -当 $\sigma = 0$ 时两个模型相同,DEP $= 0.5$。 +```{code-cell} ipython3 +--- +mystnb: + figure: + caption: | + Two observational-equivalence experiments. Locus I holds the *non-robust* + agent fixed at $\beta R = 1$ and reports the *robust* twin's discount + factor $\hat\beta(\sigma)$; locus II holds the *robust* agent fixed at + $\beta R = 1$ and reports the *non-robust* twin's discount factor + $\tilde\beta(\hat\sigma)$. + name: fig-rcs-oe-loci +--- +σ_grid = np.linspace(0.0, -0.16, 60) -随着 $|\sigma|$ 增大,模型发散,DEP 趋向于零。 +# locus I: non-robust agent fixed at βR=1, report the robust twin's β̂(σ) +β_hat = β + σ_grid * α2 * β / (1 - β) -完整的 DEP 计算需要一个指定的近似模型、其最坏情况对应物以及似然比实验中使用的样本长度。 +# locus II: robust agent fixed at βR=1, report the non-robust twin's β̃(σ̂) +q = 1 + σ_grid * α2 +β_tilde = β * (1 + β) / (2 * q) * (1 + np.sqrt(1 - 4 * β * q / (1 + β)**2)) -我们在下文为稳健 Bewley 模型计算这样一个 DEP。 +fig, ax = plt.subplots() +ax.plot(-σ_grid, β_hat, lw=2, color='C3', + label=r'locus I: robust twin $\hat\beta(\sigma) < \beta$') +ax.plot(-σ_grid, β_tilde, lw=2, color='C0', + label=r'locus II: non-robust twin $\tilde\beta(\hat\sigma) > \beta$') +ax.axhline(β, color='k', linestyle=':', lw=1, + label=r'benchmark $\beta$ ($\beta R = 1$)') +ax.set_xlabel(r'robustness concern $|\sigma|$') +ax.set_ylabel('discount factor of the equivalent agent') +ax.legend() +plt.show() +``` -```{note} -HST 建议 DEP 高于 0.2 是"合理的",意味着模型在统计上仍然足够难以区分,以至于对稳健性的考量是有正当理由的。 +两条轨迹都在 $\sigma = 0$ 处经过基准 $\beta$,并随着稳健性关切的增大而分离。 -对应于 DEP $\geq 0.2$ 的 $\sigma$ 值定义了一组合理的最坏情况模型。 -``` +理解 {numref}`fig-rcs-oe-loci` 的关键在于,这两条轨迹固定的是*不同的*行动者,因此纵轴所绘制的贴现因子在每条曲线上所指的是不同的行动者。 -### 决策规则的稳健性 +来自 {prf:ref}`thm-rcs-oe1` 的轨迹 I,将**非稳健**行动者固定在满足 $\beta R = 1$ 的基准 $(\sigma = 0, \beta)$ 处,并报告能够模仿它的**稳健**行动者的贴现因子 $\hat\beta(\sigma) < \beta$。 -```{index} single: Robustness; payoff evaluation -``` +这正是 HST 所说的、对稳健性的关切在观测上等价于*较低*贴现因子的意义所在:因为稳健性已经使行动者储蓄更多,所以必须降低其贴现因子才能使配置维持在基准水平。 -为了评估当数据由扭曲模型生成时稳健决策规则是否比非稳健规则表现更好,定义当决策规则为稳健性参数 $\sigma_2$ 设计而数据由与 $\sigma_1$ 相关联的扭曲模型生成时的**收益**: +因为非稳健基准满足 $\beta R = 1$,其最优消费是一个鞅过程,即 $\mathbb{E}_t c_{t+1} = c_t$。 -$$ -\pi(\sigma_1;\sigma_2) = -\mathbb{E}_{0,\sigma_1}\sum_{t=0}^{\infty}\beta^t\, x_t^\top H(\sigma_2)^\top H(\sigma_2)\, x_t -$$ (eq:soln3) +稳健的另一自我选择相同的消费过程,因此它也满足 $\mathbb{E}_t c_{t+1} = c_t$。 -其中状态在决策规则 $F(\sigma_2)$ 和最坏情况冲击 $K(\sigma_1)$ 下演化: +较低的 $\hat\beta$(满足 $\hat\beta R < 1$)单独来看会带来向下的漂移,但稳健行动者的预防性储蓄恰好抵消了它,使预期消费保持平稳。 -$$ -x_{t+1} = \bigl(A - BF(\sigma_2) + CK(\sigma_1)\bigr)x_t + C\epsilon_{t+1} -$$ (eq:soln2) +来自 {prf:ref}`thm-rcs-oe2` 的轨迹 II,则将**稳健**行动者固定在满足 $\beta R = 1$ 的 $(\hat\sigma, \beta)$ 处,并报告能够模仿它的**非稳健**行动者的贴现因子 $\tilde\beta(\hat\sigma) > \beta$。 -对于 $\sigma_1 = 0$(近似模型生成数据),非稳健规则($\sigma_2 = 0$)在构造上是最优的。 +在这里不存在不耐心抵消效应,因此共同的配置继承了稳健行动者预防性储蓄产生的*向上*漂移,非稳健的另一自我通过 $\tilde\beta R > 1$ 来复现这一点。 -随着 $\sigma_1$ 减小(数据由日益扭曲的模型生成),$\sigma_2 = 0$ 规则的收益比稳健规则的收益衰减得更快。 +这两个实验所编码的是*相同*的经济学原理:对稳健性的关切增加了预防性储蓄,其作用就如同额外的耐心。 -计算收益比较需要求解 $F(\sigma_2)$ 和 $K(\sigma_1)$ 的完整 HST 矩阵问题。 +它们的区别仅在于哪个行动者被锚定在 $\beta R = 1$,因而在于共同的储蓄动机究竟表现为恰好抵消的不耐心调整(如轨迹 I 中预期消费保持平稳),还是表现为预期消费的向上漂移(如轨迹 II 中所示)。 -### 另一个观测等价性结果 +(rcs-scalar)= +## 标量最坏情形模型 -```{index} single: Observational Equivalence; Theorem 2 +```{index} single: Robust Control; breakdown point ``` -````{prf:theorem} 观测等价性,II -:label: thm-lqcs-oe2 +{prf:ref}`thm-rcs-oe1` 的证明将稳健问题化简为关于边际效用 $\mu_{st}$ 的标量预测问题。 -固定除 $(\sigma,\beta)$ 之外的所有参数,并考虑 $(\hat\sigma, \hat\beta)$ 的一个消费-投资配置,其中 $\hat\beta R = 1$ 且 $\hat\sigma < 0$。 +这个标量问题可以求出闭式解,值得一做,因为它使得最坏情形动态、崩溃点和频域结果都变得透明。 -那么存在 $\tilde\beta > \hat\beta$,使得 $(\hat\sigma, \hat\beta)$ 配置也求解 $(0, \tilde\beta)$ 问题。 -```` +### 闭式解 -{prf:ref}`thm-lqcs-oe1` 表明,从 $\beta R = 1$ 的基准出发,激活稳健性($\sigma < 0$)等价于*减小* $\beta$。 +将 {eq}`eq:rcs-eulerdist` 与 {eq}`eq:rcs-oe` 以及 $R = \beta^{-1}$ 结合,可直接得到最坏情形持续性: -{prf:ref}`thm-lqcs-oe2` 走向相反方向:它表明从 $\beta R = 1$ 的起点激活稳健性考量的效果,可以通过*增大* $\beta$ 同时设置 $\sigma = 0$ 来复制。 +$$ +\zeta(\sigma) = \frac{1}{\hat\beta(\sigma) R} = \frac{\beta}{\hat\beta(\sigma)} += \left[1 + \frac{\sigma\alpha^2}{1-\beta}\right]^{-1} +$$ (eq:rcs-zeta) -换句话说,当 $\beta R = 1$ 时,稳健性考量的运作方式类似于贴现因子的*增大*,将 $\beta R > 1$ 推高并赋予预期消费轮廓一个*向上的漂移*。 +这是本讲座的核心公式。 -````{prf:proof} -当 $\hat\beta R = 1$ 且 $\hat\sigma < 0$ 时,稳健欧拉方程意味着 +**边际效用的最坏情形持续性恰好等于两个贴现因子之比。** -$$ -\hat{\mathbb{E}}_t \mu_{c,t+1} = \mu_{ct} -$$ +由于当 $\sigma<0$ 时 $\hat\beta(\sigma) < \beta$,我们有 $\zeta(\sigma) > 1$:$\mu_{st}$ 的近似模型具有单位根,而最坏情形模型是轻度发散的。 -我们寻求 $\tilde\beta > \hat\beta$ 和 $\sigma = 0$,使得相同的配置求解具有贴现因子 $\tilde\beta$ 的非稳健问题。 +这正是 {eq}`eq:rcs-worstcase-law` 中所述最坏情形转移矩阵的特征值大于近似模型的特征值这一命题的标量对应形式。 -关键步骤是观察到最坏情况扭曲 $K(\hat\sigma, \hat\beta)$ 在边际效用过程中引入了一个漂移,它等价于将贴现因子提高到 $\hat\beta$ 以上所产生的漂移。 +我们还可以显式求解 {eq}`eq:rcs-riccati`。 -令这两个漂移相等并求解 $K$ 的标量贝尔曼方程得到 +记 $u = \sigma\alpha^2$ 且 $\delta = 1-\beta$,于是 {eq}`eq:rcs-oe` 可写成 $\hat\beta - 1 + u = (u - \delta^2)/\delta$。 + +那么 {eq}`eq:rcs-riccati` 中的判别式恰好是一个**完全平方**: $$ -\tilde\beta(\hat\sigma) = \frac{\hat\beta(1+\hat\beta)}{2(1+\hat\sigma\alpha^2)} -\left[1 + \sqrt{1 - 4\hat\beta\,\frac{1+\hat\sigma\alpha^2}{(1+\hat\beta)^2}}\right] -$$ (eq:obsequivn2) +(\hat\beta - 1 + u)^2 + 4u = \frac{(u-\delta^2)^2}{\delta^2} + 4u = \left(\frac{u+\delta^2}{\delta}\right)^2 +$$ (eq:rcs-disc) -当 $\hat\sigma < 0$ 时,解满足 $\tilde\beta > \hat\beta$。 -```` +因此 {eq}`eq:rcs-riccati` 的两个根都可以写成闭式: -映射 {eq}`eq:obsequivn2` 是一个封闭形式,因此我们可以直接绘制它。 +$$ +P = -\frac{1}{1-\beta} +\qquad\text{和}\qquad +P = \frac{1-\beta}{\sigma\alpha^2} +$$ (eq:rcs-roots) -下一个图比较了双因子校准的两个观测等价轨迹,使用 $\alpha^2 = \sigma_1^2 + (1-\beta)^2\sigma_2^2$(在下文 {eq}`eq:bew_alpha2` 中推导)。 +代入 {eq}`eq:rcs-zetaP`,第一个根重现了 {eq}`eq:rcs-zeta`,而第二个根给出常数 $\zeta = R$,这在两个根重合的那个点之外都会违反欧拉方程 {eq}`eq:rcs-eulerdist`。 -我们从 $\hat\beta R = 1$ 的基准出发,因此 $\hat\beta = \beta$。 +因此在经济学意义上相关的根是常数 $P = -(1-\beta)^{-1}$,它与 $\sigma$ 无关。 -```{code-cell} ipython3 ---- -mystnb: - figure: - caption: | - 两个观测等价性实验。轨迹 I(低于 $\beta$)将*非稳健* - 代理固定在 $\beta R=1$,并报告*稳健*孪生代理的 - 贴现因子 $\hat\beta(\sigma)$;轨迹 II(高于 $\beta$)将 - *稳健*代理固定在 $\beta R=1$,并报告*非稳健*孪生代理的 - 贴现因子 $\tilde\beta(\hat\sigma)$。 - name: fig-lqcs-oe-loci ---- -β_bench = β # β R = 1 的基准 -α2 = σ1**2 + (1 - β)**2 * σ2**2 # 双因子 α^2(见 eq:bew_alpha2) +```{note} +通过取两个根中距离目标值 $(\hat\beta R)^{-1}$ 更近者来数值选取根,是很危险的做法。 -σ_hat_vals = np.linspace(0.0, -0.16, 60) +由于 {eq}`eq:rcs-disc` 是完全平方,平方根为 $|u+\delta^2|/\delta$,而当 $u$ 越过 $-\delta^2$ 时,前面用于选取 $P = -(1-\beta)^{-1}$ 的*符号*会发生翻转。 -# 轨迹 I(eq:obseq / eq:bew_locus):非稳健代理固定在 βR=1; -# 报告稳健孪生代理的贴现因子 β̂(σ) < β -β_hat = β_bench + σ_hat_vals * α2 * β_bench / (1 - β_bench) +按距离准则来挑选根的求解器会在此处悄无声息地切换分支。 +``` -# 轨迹 II(eq:obsequivn2):稳健代理固定在 βR=1; -# 报告非稳健孪生代理的贴现因子 β̃(σ̂) > β -disc = 1 - 4 * β_bench * (1 + σ_hat_vals * α2) / (1 + β_bench)**2 -β_tilde = (β_bench * (1 + β_bench)) / (2 * (1 + σ_hat_vals * α2)) \ - * (1 + np.sqrt(disc)) +### 崩溃点 -fig, ax = plt.subplots() -ax.plot(-σ_hat_vals, β_hat, lw=2, color='C3', - label=r'轨迹 I:稳健孪生 $\hat\beta(\sigma)<\beta$' - '\n(非稳健代理固定在 $\\beta R=1$)') -ax.plot(-σ_hat_vals, β_tilde, lw=2, color='C0', - label=r'轨迹 II:非稳健孪生 $\tilde\beta(\hat\sigma)>\beta$' - '\n(稳健代理固定在 $\\beta R=1$)') -ax.axhline(β_bench, color='k', linestyle=':', lw=1, - label=r'基准 $\beta$($\beta R = 1$)') -ax.set_xlabel(r'稳健性考量 $|\sigma|$') -ax.set_ylabel('等价代理的贴现因子') -ax.legend(fontsize=8.5) -plt.show() +{prf:ref}`thm-rcs-oe1` 断言存在下界 $\underline\sigma < 0$,但没有说明它具体是多少。 -print(f"at σ̂ = {σ_hat_vals[-1]:.3f}: β̃ = {β_tilde[-1]:.4f} > β = {β_bench}") -print(f" β̂ = {β_hat[-1]:.4f} < β = {β_bench}") -``` +标量模型告诉了我们答案。 -两条轨迹在 $\sigma = 0$ 处都经过基准 $\beta$,并随着稳健性考量的增长而分离。 +最小化主体的问题只有在贴现后的最坏情形状态是平方可和的情况下才具有有限值,也就是说,只有当 $\hat\beta\,\zeta^2 < 1$ 时才成立。 -阅读该图的关键在于,两条轨迹固定了*不同的*代理,因此纵轴上绘制的贴现因子在每条曲线上指的是不同的代理。 +利用 {eq}`eq:rcs-zeta` 中的 $\hat\beta = \beta/\zeta$,该条件为 $\beta\zeta < 1$,等价于 $\zeta < R$。 -来自 {prf:ref}`thm-lqcs-oe1` 的轨迹 I,将**非稳健**代理固定在基准 $(\sigma = 0, \beta)$($\beta R = 1$),并报告模仿它的**稳健**代理的贴现因子 $\hat\beta(\sigma) < \beta$。 +代入 {eq}`eq:rcs-zeta` 并求解,可得**崩溃点**: -这就是 HST 称稳健性考量在观测上等价于*较低*贴现因子的意义所在:因为稳健性已经使代理储蓄更多,所以必须降低其贴现因子才能将配置保持在基准处。 +$$ +\underline\sigma = -\frac{(1-\beta)^2}{\alpha^2} +$$ (eq:rcs-breakdown) -因为非稳健基准具有 $\beta R = 1$,它的最优消费是一个鞅,$\mathbb{E}_t c_{t+1} = c_t$。 +在 $\sigma = \underline\sigma$ 处,三件事同时发生。 -稳健孪生代理选择相同的消费过程,所以它也满足 $\mathbb{E}_t c_{t+1} = c_t$。 +- 判别式 {eq}`eq:rcs-disc` 出现重根,因此 {eq}`eq:rcs-roots` 中的两个根重合。 +- 最坏情形持续性达到 $\zeta = R$,因此恰好有 $\hat\beta\zeta^2 = 1$。 +- 观测等价贴现因子达到 $\hat\beta = \beta^2$。 -较低的 $\hat\beta$(具有 $\hat\beta R < 1$)本身会赋予一个向下漂移,但稳健代理的预防性储蓄恰好抵消了它,使预期消费保持平稳。 +当 $\sigma < \underline\sigma$ 时,稳健控制问题没有解,在该区域给出的任何数值结果都是没有意义的。 -来自 {prf:ref}`thm-lqcs-oe2` 的轨迹 II,则将**稳健**代理固定在 $(\hat\sigma, \beta)$($\beta R = 1$),并报告模仿它的**非稳健**代理的贴现因子 $\tilde\beta(\hat\sigma) > \beta$。 +因此下面的每张图都将 $\sigma$ 限制在 $(\underline\sigma, 0]$ 范围内。 -这里没有不耐心抵消,所以共同配置继承了稳健代理的预防性*向上*漂移,非稳健孪生代理通过 $\tilde\beta R > 1$ 复制了它。 +### 验证闭式解 -这两个实验编码了*相同的*经济学:稳健性考量增加了预防性储蓄,其作用类似于额外的耐心。 +以下代码单元数值求解二次方程 {eq}`eq:rcs-riccati`,并将其与闭式解 {eq}`eq:rcs-zeta` 和 {eq}`eq:rcs-roots` 进行核对。 -它们唯一的区别在于哪个代理被锚定在 $\beta R = 1$,从而在于共同的储蓄动机是表现为恰好抵消的不耐心调整(轨迹 I,预期消费平稳),还是表现为预期消费的向上漂移(轨迹 II)。 +```{code-cell} ipython3 +def worst_case_persistence(σ, β, α2): + """ + Worst-case persistence ζ(σ) of marginal utility on the + observational-equivalence locus, from eq:rcs-zeta. + """ + return 1 / (1 + σ * α2 / (1 - β)) -### 稳健 LQ Bewley 模型 -```{index} single: Robust Bewley Model +def solve_scalar_riccati(σ, β, α2): + """ + Solve the scalar Bellman equation eq:rcs-riccati by brute force and + return both roots together with the implied persistence ζ = 1/(1-σα²P). + """ + β_hat = β + σ * α2 * β / (1 - β) + u = σ * α2 + disc = (β_hat - 1 + u)**2 + 4 * u + roots = np.array([(β_hat - 1 + u + s * np.sqrt(disc)) / (-2 * u) + for s in (1.0, -1.0)]) + return roots, 1 / (1 - u * roots) + + +σ_lo = -(1 - β)**2 / α2 # breakdown point, eq:rcs-breakdown +print(f"breakdown point σ̲ = {σ_lo:.6f}") +print(f"there β̂ = {β + σ_lo * α2 * β / (1 - β):.6f} " + f"(β² = {β**2:.6f})") +print(f" ζ = {worst_case_persistence(σ_lo, β, α2):.6f} " + f"(R = {R:.6f})") + +print(f"\n{'σ':>10}{'P (numerical roots)':>28}{'-1/(1-β)':>12}" + f"{'ζ (num)':>12}{'ζ (closed)':>12}") +for σ in [-0.02, -0.05, -0.09, -0.105]: + roots, ζs = solve_scalar_riccati(σ, β, α2) + keep = np.argmin(np.abs(roots + 1 / (1 - β))) + print(f"{σ:10.3f}{str(np.round(roots, 4)):>28}{-1 / (1 - β):12.4f}" + f"{ζs[keep]:12.6f}{worst_case_persistence(σ, β, α2):12.6f}") ``` -我们现在通过将 {doc}`lq_bewley_complete_markets` 的 Bewley 经济嵌入 HST 框架并应用观测等价性定理来综合本讲座。 +对每一个 $\sigma$ 而言,都有一个根固定在 $-(1-\beta)^{-1} = -20$,恰如 {eq}`eq:rcs-roots` 所预测,且其所隐含的 $\zeta$ 与闭式解在显示精度上一致。 -我们将构造一族**稳健 Bewley 经济**,以稳健性水平 $\sigma \leq 0$ 为参数,其均衡数量与普通 Bewley 模型的相同。 +还请注意,当 $\sigma$ 降至 $\underline\sigma \approx -0.11$ 附近时,两个根会彼此靠近。 -我们首先将 Bewley 经济映射到 HST 记号中,将稳健模型专门化为 $\lambda = \delta_h = 0$(无习惯,无耐久品)以及一个纯禀赋经济(无物质资本,$k_t = 0$)。 +下图绘制了在容许范围内最坏情形脉冲响应 $\zeta^h$。 -在这种情况下: - -服务等于消费:$s_t = c_t$。 - -唯一交易的证券是单期无风险债券,我们将家庭的净资产头寸写作 $a_t=-b_t$,因此正的 $a_t$ 表示财富而非债务。 +```{code-cell} ipython3 +--- +mystnb: + figure: + caption: | + Worst-case impulse response of marginal utility. The approximating model + has a unit root; the worst-case model is increasingly explosive as + $\sigma$ falls toward the breakdown point $\underline\sigma$. + name: fig-rcs-irf +--- +horizons = np.arange(31) -禀赋过程遵循状态空间表示 {eq}`eq:rs-endowment`。 +fig, ax = plt.subplots() +for frac in [0.0, 0.4, 0.8, 0.98]: + σ = frac * σ_lo + ζ = worst_case_persistence(σ, β, α2) + ax.plot(horizons, ζ**horizons, lw=2, + label=rf'$\sigma={σ:.3f}$, $\zeta={ζ:.3f}$') + +ax.set_xlabel('horizon $h$') +ax.set_ylabel(r'response of $\mu_{s,t+h}$') +ax.legend() +plt.show() +``` -家庭的增广状态向量是 $x_t = [a_t,\; z_t^\top]^\top$,运动法则 {eq}`eq:law0` 专门化为 +{numref}`fig-rcs-irf` 显示,随着 $\sigma$ 下降,最小化主体将近似模型的单位根转化为轻度发散性。 -$$ -\begin{pmatrix} a_{t+1} \\ z_{t+1} \end{pmatrix} -= -\underbrace{\begin{pmatrix} R & R\check{G} \\ 0 & \check{A} \end{pmatrix}}_{A} -\begin{pmatrix} a_t \\ z_t \end{pmatrix} -+ -\underbrace{\begin{pmatrix} -R \\ 0 \end{pmatrix}}_{B} -c_t -+ -\underbrace{\begin{pmatrix} 0 \\ \check{C} \end{pmatrix}}_{C} -\epsilon_{t+1} -$$ (eq:bew_law) +在崩溃点处,响应将以总利率 $R$ 增长,从而使贴现后的最坏情形状态不再是平方可和的。 -目标函数是 $\mathbb{E}_0 \sum_{t=0}^\infty \beta^t [-(c_t - \gamma)^2/2]$,这是 HST 标准 {eq}`eq:income5`,其中 $\sigma = 0$ 且 $b_t \equiv \gamma$(一个固定的极乐水平)。 +## 频域解释 -因此,$\sigma = 0$ 的稳健贝尔曼方程 {eq}`eq:income1` 恰好简化为 {doc}`lq_permanent_income` 的 LQ 问题,证实了 HST 框架嵌套了 Bewley 模型。 +```{index} single: Frequency Domain; permanent income model +``` -我们接下来计算稳健性参数 $\alpha^2$。 +LQ 永久收入框架具有自然的频域解释。 -从 $(c_t,z_t)$ 表示 {eq}`eq:rs-crep`,消费创新为 +消费者的凹效用函数使其厌恶消费中的**高频**波动,因此他通过调整储蓄来平滑消费。 -$$ -c_{t+1} - c_t = h\, w_{t+1}, \qquad -h = (1-\beta)\,\check{G}(I-\beta\check{A})^{-1}\check{C} -$$ (eq:bew_cinno) +高频波动容易被平滑,因此消费者对收入过程高频特征的模型设定误差自动具有稳健性。 -向量 $h$ 在 HST 标量 $\alpha$ 公式 {eq}`eq:hsoffset2` 中扮演 $\nu^\top = M_s C$ 的角色。 +**低频**波动则更难被平滑,因为它们更为持久。 -因此, +在 HST 的频域记号中,从冲击 $w_t$ 到目标 $s_t - b_t$ 的传递函数为 $G(\cdot)$,$H_2$ 准则的频率分解为 $$ -\alpha^2 = h h^\top = (1-\beta)^2\, -\check{G}(I-\beta\check{A})^{-1}\check{C}\check{C}^\top(I-\beta\check{A}^\top)^{-1}\check{G}^\top -$$ (eq:bew_alpha) - -对于双因子模型 {eq}`eq:pi-twofactor`,其中 $\check{A} = \mathrm{diag}(1,0)$ 且 $\check{C} = \mathrm{diag}(\sigma_1,\sigma_2)$,这简化为 +H_2 = -\frac{1}{2\pi}\int_{-\pi}^{\pi} \operatorname{trace}\!\bigl[G(\sqrt\beta\, e^{i\omega})^\top\,G(\sqrt\beta\, e^{i\omega})\bigr]\, d\omega +$$ (eq:rcs-h2) -$$ -\alpha^2 = \sigma_1^2 + (1-\beta)^2\,\sigma_2^2 -$$ (eq:bew_alpha2) +在 $\sqrt{\beta}\,e^{i\omega}$ 处而非在 $e^{i\omega}$ 处求值是至关重要的,而不仅仅是一种惯例。 -永久冲击方差 $\sigma_1^2$ 以系数 1 进入,因为一个单位的永久冲击被*完全*资本化到消费中。 +$\mu_{st}$ 的近似模型和最坏情形模型都是非平稳的,前者具有单位根,后者是爆炸性的,因此二者都没有普通的谱密度。 -暂时冲击方差 $\sigma_2^2$ 以小系数 $(1-\beta)^2$ 进入,因为只有其年金价值被消费。 +用 $\sqrt\beta$ 进行贴现正是使 {eq}`eq:rcs-h2` 中的对象变得有限的原因。 -将 {prf:ref}`thm-lqcs-oe1` {eq}`eq:obseq` 应用于均衡利率 $R = \beta_0^{-1}$ 以及来自 {eq}`eq:bew_alpha2` 的 $\alpha^2$,得到 **Bewley 观测等价轨迹**: +在 {ref}`rcs-scalar` 的标量模型中,目标为 $s_t - b_t = -\mu_{st}$,由 {eq}`eq:rcs-scalar-worst` 我们可以得出传递函数和贴现谱密度 $$ -\hat\beta(\sigma) = \beta_0 + \frac{\sigma\,\alpha^2\,\beta_0}{1-\beta_0} -$$ (eq:bew_locus) +G(z) = \frac{\alpha}{1-\zeta z}, +\qquad +S(\omega;\sigma) = \bigl|G(\sqrt{\hat\beta}\, e^{i\omega})\bigr|^2 += \frac{\alpha^2}{\bigl|1 - \zeta\sqrt{\hat\beta}\, e^{i\omega}\bigr|^2} +$$ (eq:rcs-spectrum) -对于 $\sigma < 0$,我们有 $\hat\beta(\sigma) < \beta_0$。 +当 $\zeta\sqrt{\hat\beta} < 1$ 时该值恰好是有限的,这正是定义崩溃点 {eq}`eq:rcs-breakdown` 的条件 $\hat\beta\zeta^2<1$。 -一个在此轨迹上具有对 $(\sigma, \hat\beta(\sigma))$ 的代理更担心模型设定误差(更低的 $\sigma$),但也更不耐心(更低的 $\hat\beta$);这两种力量恰好抵消,使得消费决策规则保持不变。 +因此频域对象和崩溃点是同一约束的两种视角。 -这些要素结合成一个稳健 Bewley 均衡。 +在 $\sigma = 0$ 时,我们有 $\zeta = 1$ 且 $\hat\beta = \beta$,此时 {eq}`eq:rcs-spectrum` 简化为随机游走的贴现谱密度。 -````{prf:proposition} -:label: prop-lqcs-bewley - -假设 Bewley 经济中的所有代理共享一个位于轨迹 {eq}`eq:bew_locus` 上的公共对 $(\sigma, \hat\beta(\sigma))$,其中 $R = \beta_0^{-1}$。 +```{code-cell} ipython3 +--- +mystnb: + figure: + caption: | + Left: the discounted spectral density of the robust consumer's target. + Right: the same densities relative to the approximating model. The + minimizing agent concentrates its distortion at low frequencies, where + the permanent income consumer is least able to smooth. + name: fig-rcs-spectrum +--- +ω = np.linspace(0, np.pi, 400) -那么每个代理的最优消费计划与普通 $(\sigma = 0,\, \beta_0)$ 经济的相同,且均衡利率保持 $R = \beta_0^{-1}$。 -```` -````{prf:proof} -由 {prf:ref}`thm-lqcs-oe1`,每个代理的消费-储蓄规则与基准相同。 +def spectrum(σ, β, α2): + ζ = worst_case_persistence(σ, β, α2) + β_hat = β / ζ + return α2 / np.abs(1 - ζ * np.sqrt(β_hat) * np.exp(1j * ω))**2 -因此商品市场出清条件 $\int c_t^i\, di = Y$ 在 $R = \beta_0^{-1}$ 处得到满足,原因与基准 Bewley 经济中相同。 -```` -#### 异质 $(\beta_i, \sigma_i)$ 偏好 +S0 = spectrum(0.0, β, α2) -一个更丰富的扩展在经济中填充了**连续统类型**,每个类型由一个稳健性参数 $\sigma_i \in [\underline\sigma, 0]$ 索引,贴现因子为 +fig, axes = plt.subplots(1, 2, figsize=(11, 4)) -$$ -\beta_i = \hat\beta(\sigma_i) = \beta_0 + \frac{\sigma_i\,\alpha^2\,\beta_0}{1-\beta_0} -$$ (eq:bew_heterog) +for frac in [0.0, 0.4, 0.8, 0.95]: + σ = frac * σ_lo + S = spectrum(σ, β, α2) + axes[0].plot(ω, S, lw=2, label=rf'$\sigma={σ:.3f}$') + axes[1].plot(ω, S / S0, lw=2, label=rf'$\sigma={σ:.3f}$') -由于所有对 $(\sigma_i, \beta_i)$ 都位于 {eq}`eq:bew_locus` 上,每个代理采用与基准**相同的消费规则**。 +axes[0].set_yscale('log') +axes[0].set_xlabel(r'frequency $\omega$') +axes[0].set_ylabel(r'$S(\omega;\sigma)$') +axes[0].set_title('discounted spectral density') +axes[0].legend() -总量动态保持不变,因为消费的横截面均值等于 $Y$,横截面方差每期以 $\alpha^2$ 的速率增长。 +axes[1].set_yscale('log') +axes[1].set_xlabel(r'frequency $\omega$') +axes[1].set_ylabel(r'$S(\omega;\sigma)\,/\,S(\omega;0)$') +axes[1].set_title('relative to the approximating model') +axes[1].legend() -均衡利率保持不变:$R = \beta_0^{-1}$。 +fig.tight_layout() +plt.show() +``` -代理对外部计量经济学家而言在观测上无法区分,因为关于 $(c_t^i, a_t^i)$ 的数据无法揭示代理 $i$ 是具有 $\sigma_i = 0$ 还是 $\sigma_i < 0$。 +{numref}`fig-rcs-spectrum` 的左图显示,$S(\omega;\sigma)$ 在 $\omega \approx 0$ 处取得最大值,此时消费者的福利对收入波动性最为敏感。 -代理在其内部模型上有所不同,因为具有 $\sigma_i < 0$ 的代理对其条件预期应用最坏情况扭曲 $w_{t+1}^i = K(\sigma_i, \beta_i)\,\mu_{s,t}^i$,而具有 $\sigma_i = 0$ 的代理则按面值接受近似模型。 +右图揭示了关键之处:比率 $S(\omega;\sigma)/S(\omega;0)$ 随 $\omega$ 急剧下降。 -这为一个具有**异质模糊厌恶**的 Bewley 模型奠定了基础:尽管每个代理在可观测选择方面表现相同,他们却持有不同的收入过程主观模型,并对模型不确定性有不同的态度。 +由于认识到消费者的脆弱之处,最小化主体将最坏情形的扭曲集中在低频处,并且随着 $|\sigma|$ 的增大而更加激进地这样做。 -#### 计算 +$\omega = 0$ 处的峰值等于 $\alpha^2/(1-\sqrt{\beta\zeta})^2$,并且随着 $\sigma \to \underline\sigma$ 而发散,这是观察崩溃点的另一种方式。 -```{code-cell} ipython3 -# Bewley 参数 -β0_bew = β # 0.95 -σ1_bew = σ1 # 0.15 -σ2_bew = σ2 # 0.30 -R_bew = 1.0 / β0_bew - -# 双因子 Bewley α^2 -α2_bew = σ1_bew**2 + (1 - β0_bew)**2 * σ2_bew**2 - -print(f"α^2 (Bewley, two-factor) = {α2_bew:.6f}") -print(f" permanent component σ1^2 = {σ1_bew**2:.6f} " - f"({100*σ1_bew**2/α2_bew:.1f} % of α^2)") -print(f" transitory component (1-β)^2σ2^2= {(1-β0_bew)**2*σ2_bew**2:.6f} " - f"({100*(1-β0_bew)**2*σ2_bew**2/α2_bew:.1f} % of α^2)") -``` +由于根据 {eq}`eq:rcs-K` 扭曲为 $v_t = K\mu_{s,t-1}$,扭曲过程的谱密度是 $\mu_{s,t-1}$ 密度的 $K^2$ 倍,因此它继承了相同的低频集中特性。 -这个计算展示了为什么在此校准中永久冲击主导 $\alpha^2$。 +## 检测误差概率 -我们现在求解附加于此 $\alpha^2$ 的标量稳健预测问题。 +```{index} single: Detection Error Probabilities +``` -该解选择满足观测等价欧拉方程的贝尔曼方程根。 +约束 $\sigma$ 选择的一种自然方式是问:**从统计上区分近似模型和最坏情形模型有多困难?** -```{code-cell} ipython3 -def robust_scalar_solution(σ, β0, α2): - """ - 在观测等价轨迹上求解标量稳健边际效用问题。 - """ - α = np.sqrt(α2) - R = 1.0 / β0 +对于长度为 $T$ 的样本,可以使用**对数似然比检验**来比较两个假设。 - if np.isclose(σ, 0.0): - return β0, np.nan, 1.0, 0.0 +**检测误差概率**(DEP)是指在不知道数据由哪个模型生成的情况下,使用对数似然比统计量做出错误决策的概率: - β_hat = β0 + σ * α2 * β0 / (1 - β0) - disc = (β_hat - 1 + σ * α2)**2 + 4 * σ * α2 - root_disc = np.sqrt(max(disc, 0.0)) - target_ζ = 1 / (β_hat * R) +$$ +\mathrm{DEP}(\sigma) = \frac{1}{2}\bigl[\mathbb{P}\{\text{prefer approximating} \mid \text{worst-case is true}\} + + \mathbb{P}\{\text{prefer worst-case} \mid \text{approximating is true}\}\bigr] +$$ (eq:rcs-dep) - candidates = [] - for sign in (1.0, -1.0): - P = (β_hat - 1 + σ * α2 + sign * root_disc) / (-2 * σ * α2) - ζ = 1 / (1 - σ * α2 * P) - K = (ζ - 1) / α - candidates.append((abs(ζ - target_ζ), P, ζ, K)) +当 $\sigma = 0$ 时,两个模型相同,$\mathrm{DEP} = 0.5$。 - _, P, ζ, K = min(candidates, key=lambda x: x[0]) - return β_hat, P, ζ, K +随着 $|\sigma|$ 增大,模型之间产生分歧,DEP 趋近于零。 +在标量模型中,两个假设是完全显式的: -def log_likelihood_ratio(paths, ζ, α): - """ - 返回 log p_worst(path) - log p_approx(path)。 - """ - lag = paths[:, :-1] - lead = paths[:, 1:] - ll_worst = -0.5 * np.sum(((lead - ζ * lag) / α)**2, axis=1) - ll_approx = -0.5 * np.sum(((lead - lag) / α)**2, axis=1) - return ll_worst - ll_approx +$$ +\text{approximating:}\quad \mu_{t+1} = \mu_t + \alpha w_{t+1}, +\qquad +\text{worst-case:}\quad \mu_{t+1} = \zeta(\sigma)\,\mu_t + \alpha w_{t+1} +$$ (eq:rcs-hypotheses) +两者都具有方差相同(为 $\alpha^2$)的高斯新息,因此对数似然比是平方和之差。 -def simulate_scalar_paths(ζ, α, T, n_paths, seed): +```{code-cell} ipython3 +def simulate_paths(ζ, α, T, n_paths, seed): + "Simulate n_paths draws of μ_{t+1} = ζ μ_t + α w_{t+1} from μ_0 = 0." rng = np.random.default_rng(seed) paths = np.zeros((n_paths, T + 1)) shocks = rng.standard_normal((n_paths, T)) - for t in range(T): paths[:, t + 1] = ζ * paths[:, t] + α * shocks[:, t] - return paths +def log_likelihood_ratio(paths, ζ, α): + "Return log p_worst(path) - log p_approx(path)." + lag, lead = paths[:, :-1], paths[:, 1:] + return 0.5 * (np.sum(((lead - lag) / α)**2, axis=1) + - np.sum(((lead - ζ * lag) / α)**2, axis=1)) + + def detection_error_probability(ζ, α, T=40, n_paths=10_000, seed=1234): - """ - 近似律和最坏情况标量律的有限样本 DEP。 - """ + "Finite-sample DEP for the approximating and worst-case scalar laws." if np.isclose(ζ, 1.0): return 0.5 + approx = simulate_paths(1.0, α, T, n_paths, seed) + worst = simulate_paths(ζ, α, T, n_paths, seed + 1) + return 0.5 * (np.mean(log_likelihood_ratio(worst, ζ, α) < 0) + + np.mean(log_likelihood_ratio(approx, ζ, α) > 0)) +``` + +我们使用 $T = 40$,即十年的季度数据。 + +在绘图之前,值得注意一个使 DEP 成为报告稳健性关注的恰当方式的性质。 + +参数 $\sigma$ *并非*无量纲的:它总是通过乘积 $\sigma\alpha^2$ 起作用,而 $\alpha^2$ 具有消费平方的单位。 - approx_paths = simulate_scalar_paths(1.0, α, T, n_paths, seed) - worst_paths = simulate_scalar_paths(ζ, α, T, n_paths, seed + 1) +因此,将计量消费的单位加倍会改变代表给定稳健性关注程度的 $\sigma$ 的数值。 - llr_approx = log_likelihood_ratio(approx_paths, ζ, α) - llr_worst = log_likelihood_ratio(worst_paths, ζ, α) +DEP 则没有这个问题,因为 $\alpha$ 会在 {eq}`eq:rcs-hypotheses` 中的似然比中被约掉。 - return 0.5 * (np.mean(llr_worst < 0) + np.mean(llr_approx > 0)) +```{code-cell} ipython3 +ζ_test = worst_case_persistence(0.6 * σ_lo, β, α2) +for scale in [0.5, 1.0, 2.0]: + dep = detection_error_probability(ζ_test, scale * α) + print(f"α scaled by {scale:>4}: DEP = {dep:.4f}") ``` -下一个图报告了由这个已求解的标量问题所隐含的最坏情况动态和模型检测概率。 +DEP 只依赖于 $\zeta$ 和样本量 $T$。 ```{code-cell} ipython3 --- mystnb: figure: - caption: 已求解的稳健标量模型 - name: fig-lqcs-robust-scalar + caption: | + Finite-sample detection error probability against the robustness + concern, over the admissible range $(\underline\sigma, 0]$, for two + sample lengths. Values below the dashed line are the ones HST regard as + implausible, because the approximating and worst-case models would then + be too easy to tell apart. + name: fig-rcs-dep --- -α_bew = np.sqrt(α2_bew) -β_min = 0.88 -σ_min = (β_min - β0_bew) * (1 - β0_bew) / (α2_bew * β0_bew) -σ_vals = np.linspace(0.0, σ_min, 31) - -solutions = np.array([robust_scalar_solution(σ, β0_bew, α2_bew) for σ in σ_vals]) -β_hat_vals = solutions[:, 0] -ζ_vals = solutions[:, 2] -K_vals = solutions[:, 3] -dep_vals = np.array([ - detection_error_probability(ζ, α_bew) - for ζ in ζ_vals -]) - -fig, axes = plt.subplots(1, 2, figsize=(11.2, 4.1)) - -horizons = np.arange(31) -for σ in [0.0, σ_vals[10], σ_vals[20]]: - β_hat, P, ζ, K = robust_scalar_solution(σ, β0_bew, α2_bew) - label = rf'$\sigma={σ:.3f}$, $\zeta={ζ:.3f}$' - axes[0].plot(horizons, ζ**horizons, lw=2, label=label) - -axes[0].set_xlabel('视界') -axes[0].set_ylabel(r'$\mu_{s,t+h}$ 的响应') -axes[0].set_title('最坏情况脉冲响应') -axes[0].legend(fontsize=8.5) - -axes[1].plot(-σ_vals, dep_vals, lw=2, color='C0') -axes[1].axhline(0.2, color='C3', linestyle='--', lw=1.2, - label='DEP = 0.2') -axes[1].set_xlabel(r'稳健性考量 $-\sigma$') -axes[1].set_ylabel('检测误差概率') -axes[1].set_ylim(0.0, 0.52) -axes[1].set_title('有限样本可检测性') -axes[1].legend(fontsize=8.5) +σ_vals = np.linspace(0.0, 0.999 * σ_lo, 31) +ζ_vals = worst_case_persistence(σ_vals, β, α2) -fig.tight_layout() +fig, ax = plt.subplots() +for T, color in [(40, 'C0'), (160, 'C2')]: + dep_vals = np.array([detection_error_probability(ζ, α, T=T) + for ζ in ζ_vals]) + ax.plot(-σ_vals, dep_vals, lw=2, color=color, label=f'$T = {T}$') + +ax.axhline(0.2, color='C3', linestyle='--', lw=1.2, label='DEP = 0.2') +ax.axvline(-σ_lo, color='k', linestyle=':', lw=1, + label='breakdown point') +ax.set_xlabel(r'robustness concern $|\sigma|$') +ax.set_ylabel('detection error probability') +ax.set_ylim(0.0, 0.52) +ax.legend() plt.show() ``` -左图显示,随着 $\sigma$ 变得更负,已求解的最坏情况律使边际效用更具持续性。 +```{note} +HST 认为,高于 0.2 的 DEP 是“合理的”,这意味着这些模型在统计上仍然足够难以区分,值得关注稳健性问题。 + +因此,具有 $\mathrm{DEP} \geq 0.2$ 的 $\sigma$ 值定义了一组合理的最坏情形模型。 +``` + +{numref}`fig-rcs-dep` 显示了这两种约束以一种有趣的方式相互作用。 + +当 $T = 40$ 时,DEP 曲线在临界点几乎恰好达到 $0.2$ 的阈值。 -右图从近似标量律 $\mu_{t+1}=\mu_t+\alpha\epsilon_{t+1}$ 与已求解的最坏情况律 $\mu_{t+1}=\zeta(\sigma)\mu_t+\alpha\epsilon_{t+1}$ 之间的精确似然比计算 DEP。 +换句话说,在有十年的季度数据的情况下,该模型能够表示的每一种稳健性关注在统计上也是合理的:数学上的极限先起作用,而统计上的约束则较为宽松。 -### 结束语 +```{code-cell} ipython3 +for frac in [0.6, 0.9, 0.999]: + ζ = worst_case_persistence(frac * σ_lo, β, α2) + print(f"σ = {frac * σ_lo:.5f} (= {frac:.3f} σ̲): " + f"DEP = {detection_error_probability(ζ, α):.4f}") +``` -我们以对全部三讲关键信息的总结来结束。 +这种近乎重合的现象是这一校准和 $T = 40$ 的属性,而非一个定理。 -LQ 永久收入模型,弗里德曼永久收入假说的理性预期版本,有两个互补的状态空间表示: +当 $T = 160$ 时,顺序反转,统计可检测性在达到临界点之前就已发挥约束作用。 -1. **$(b_t, z_t)$ 表示**:强调消费者的最优借贷是历史依赖的,并与消费协整。 +```{code-cell} ipython3 +σ_report = 0.6 * σ_lo +ζ_report = worst_case_persistence(σ_report, β, α2) +print(f"at σ = {σ_report:.4f} (ζ = {ζ_report:.4f}):") +for T in [20, 40, 80, 160]: + print(f" T = {T:>3}: DEP = " + f"{detection_error_probability(ζ_report, α, T=T):.4f}") +``` -2. **$(c_t, z_t)$ 表示**:强调消费是一个鞅(随机游走),并且资产 $b_t$ 编码在消费中,因此消费的脉冲响应函数是"箱形的":水平的永久移动。 +这一结论表明,合理的模型不确定性数量取决于设想计量经济学家所拥有的数据量。 -我们将这个单代理模型嵌入到一个具有连续统事后异质消费者的 Bewley 均衡中。 +## 决策规则的稳健性 -均衡总利率 $R = \beta^{-1}$ 由恒定的平均消费支撑,尽管消费的横截面方差随年龄线性增长。 +```{index} single: Robustness; payoff evaluation +``` -同一模型的完全市场版本实现了完全风险分担和一个时不变的消费分布,代价是更复杂的金融安排(阿罗证券)。 +一个自然而然的后续问题是,当数据实际上是由扭曲模型生成时,稳健决策规则是否比非稳健规则表现更好。 -对模型设定误差的考量,以 $\sigma = -\theta^{-1} \leq 0$ 为参数,改变了永久收入模型。 +定义当决策规则针对稳健性参数 $\sigma^r$ 设计,而数据由与 $\sigma^d$ 相关联的扭曲模型生成时的**收益**: -对稳健性的考量即使在二次偏好下也通过扭曲收入冲击的条件均值产生一个预防性储蓄动机。 +$$ +\pi(\sigma^d;\sigma^r) = -\mathbb{E}_{0,\sigma^d}\sum_{t=0}^{\infty}\beta^t\, x_t^\top H(\sigma^r)^\top H(\sigma^r)\, x_t +$$ (eq:rcs-payoff) -扭曲的最坏情况模型使收入过程**更具持续性**,将功率移向低频,那里永久收入消费者最脆弱。 +其中状态在决策规则 $F(\sigma^r)$ 和最坏情形冲击 $K(\sigma^d)$ 下演化: -观测等价性定理 {prf:ref}`thm-lqcs-oe1` 表明,仅就数量 $(c_t, i_t)$ 而言,稳健性考量与 $\beta$ 的减小无法区分。 +$$ +x_{t+1} = \bigl(A - BF(\sigma^r) + CK(\sigma^d)\bigr)x_t + C\,w_{t+1} +$$ (eq:rcs-payoff-law) -反向定理 {prf:ref}`thm-lqcs-oe2` 表明,从 $\beta R = 1$ 出发,稳健性在观测上等价于 $\beta$ 的*增大*,这赋予预期消费一个向上的漂移。 +关于应该比较*哪一族*规则,存在一个重要的注意事项,这直接源自 {prf:ref}`thm-rcs-oe1`。 -检测误差概率提供了一种校准 $\sigma$ 的原则性方法:选择足够小的 $|\sigma|$,使得近似模型和最坏情况模型在统计上仍然难以区分。 +沿着观测等价轨迹 $(\sigma, \hat\beta(\sigma))$,每个主体都会选择*相同的*决策规则。 -观测等价的 $(\sigma, \hat\beta)$ 对**确实**对资产价格有不同的含义,HST 在资产定价背景下进一步探讨了这一点。 +因此 $F(\sigma^r)$ 沿该轨迹并不变化,$\pi(\sigma^d;\sigma^r)$ 在该轨迹上对 $\sigma^r$ 而言是常数。 -稳健 Bewley 经济展示了代理如何能够拥有相同的消费决策规则并支撑相同的均衡利率 $R = \beta_0^{-1}$,同时在其最坏情况主观收入动态上有所不同。 +因此,对规则进行有意义的比较必须*偏离*该轨迹,例如将 $\beta$ 固定在基准值上,仅改变 $\sigma^r$。 + +该实验需要求解完整的 HST 矩阵问题,而不是 {ref}`rcs-scalar` 中的标量简化形式,因为一旦离开该轨迹,边际效用过程就不再能概括该决策规则。 + +{doc}`robust_permanent_income` 使用 QuantEcon 的 `LQ` 和稳健控制程序进行了该计算。 + +## 结语 + +对模型误设的担忧(用 $\sigma = -\theta^{-1} \leq 0$ 参数化)以微妙而非剧烈的方式改变了永久收入模型。 + +对稳健性的担忧即使在二次型偏好下也会产生预防性储蓄动机,其方式是扭曲收入冲击的条件均值。 + +被扭曲的最坏情形模型使收入过程**更加持续**,将影响力转移到永久收入消费者最脆弱的低频部分。 + +观察等价定理 {prf:ref}`thm-rcs-oe1` 表明,仅就数量 $(c_t, i_t)$ 而言,对稳健性的担忧与 $\beta$ 的减小是无法区分的。 + +反向定理 {prf:ref}`thm-rcs-oe2` 表明,从 $\beta R = 1$ 出发,稳健性在观察上等价于 $\beta$ 的*增大*,这会给预期消费带来向上的漂移。 + +有两条准则限定了稳健性担忧在合理范围内可以有多大。 + +崩溃点 {eq}`eq:rcs-breakdown` 是一个严格的数学极限,超过该极限则不存在解。 + +检测误差概率提供了一种更为柔和且无量纲的统计准则:选择足够小的 $|\sigma|$,使得近似模型与最坏情形模型仍然难以区分。 + +在观察上等价的 $(\sigma, \hat\beta)$ 组合**确实**对资产价格有不同的含义,这一点将在 {doc}`robust_permanent_income` 中进一步探讨。 + +它们对主体所持有的*信念*也有不同的含义,这是 {doc}`lq_robust_bewley` 所讨论的主题。 ## 练习 ```{exercise-start} -:label: lqcs_ex1 +:label: rcs_ex1 ``` -我们从基准 Bewley 经济转换到 HST 记号。 - -将稳健控制设置专门化为无习惯、无资本的 LQ Bewley 环境($\lambda = \delta_h = 0$,$k_t = 0$),并令禀赋过程为 {eq}`eq:pi-twofactor` 中的双因子模型。 - -1. 将家庭状态写作 $x_t = [a_t, z_t^\top]^\top$,其中 $a_t=-b_t$ 是净资产,并推导运动法则 {eq}`eq:law0` 的矩阵 $(A, B, C)$。 +这个练习推导崩溃点 {eq}`eq:rcs-breakdown`。 -2. 证明当 $\sigma = 0$ 时,贝尔曼问题与 LQ 永久收入问题重合。 +1. 使用 {eq}`eq:rcs-zeta`,证明 $\hat\beta(\sigma)\,\zeta(\sigma)^2 = \beta\,\zeta(\sigma)$。 -3. 推导 $\alpha^2$ 并验证 +2. 最小化代理的问题只有在 $\hat\beta\zeta^2 < 1$ 时才有有限的值。利用第 1 部分证明这等价于 $\zeta < R$,因此 $\underline\sigma = -(1-\beta)^2/\alpha^2$。 -$$ -\alpha^2 = \sigma_1^2 + (1-\beta)^2\sigma_2^2. -$$ +3. 验证 $\hat\beta(\underline\sigma) = \beta^2$。 -从经济学上解释为什么永久成分和暂时成分以不同的权重进入。 +4. 解释为什么当禀赋变得更具波动性时,崩溃点会向零移动。 ```{exercise-end} ``` -```{solution-start} lqcs_ex1 +```{solution-start} rcs_ex1 :class: dropdown ``` -这是一个解答: +这是一个解答。 -1. 有 $x_t = [a_t, z_t^\top]^\top$ 以及预算法则 $a_{t+1} = R(a_t + y_t - c_t)$,$y_t = \check G z_t$,$z_{t+1} = \check A z_t + \check C \epsilon_{t+1}$,堆叠的法则是 - -$$ -\begin{pmatrix} a_{t+1} \\ z_{t+1} \end{pmatrix} -= -\underbrace{\begin{pmatrix} R & R\check G \\ 0 & \check A \end{pmatrix}}_{A} -\begin{pmatrix} a_t \\ z_t \end{pmatrix} -+ -\underbrace{\begin{pmatrix} -R \\ 0 \end{pmatrix}}_{B} c_t -+ -\underbrace{\begin{pmatrix} 0 \\ \check C \end{pmatrix}}_{C}\epsilon_{t+1}. -$$ +1. 由 {eq}`eq:rcs-zeta`,$\zeta = \beta/\hat\beta$,因此 $\hat\beta = \beta/\zeta$,从而 $\hat\beta\zeta^2 = (\beta/\zeta)\zeta^2 = \beta\zeta$。 - $B$ 的符号为负,因为更高的 $c_t$ 减少资产积累 $a_{t+1}$。 +2. 由第 1 部分,条件 $\hat\beta\zeta^2 < 1$ 即为 $\beta\zeta < 1$,也就是 $\zeta < \beta^{-1} = R$。 -2. 在 $\sigma=0$ 处,稳健贝尔曼问题坍缩为没有最小化扭曲项的普通 LQ 目标,因此计划者/消费者问题恰好是具有二次效用和线性约束的永久收入问题。 + 代入闭式解 {eq}`eq:rcs-zeta` 得到 -3. 从 $(c_t,z_t)$ 表示, + $$ + \left[1 + \frac{\sigma\alpha^2}{1-\beta}\right]^{-1} < \frac{1}{\beta} + \iff 1 + \frac{\sigma\alpha^2}{1-\beta} > \beta + \iff \sigma\alpha^2 > -(1-\beta)^2 , + $$ -$$ -\Delta c_{t+1} = h\,\epsilon_{t+1}, -\qquad h = (1-\beta)\check G (I-\beta\check A)^{-1}\check C. -$$ + 即 $\sigma > -(1-\beta)^2/\alpha^2 = \underline\sigma$。 - 在 HST 记号中,$\alpha^2 = h h^\top$,且对于双因子校准 $\check A=\mathrm{diag}(1,0)$ 且 $\check C=\mathrm{diag}(\sigma_1,\sigma_2)$,所以 +3. 在 $\sigma = \underline\sigma$ 处,有 $\sigma\alpha^2 = -(1-\beta)^2$,因此 $\zeta = [1-(1-\beta)]^{-1} = \beta^{-1} = R$,且 $\hat\beta = \beta/\zeta = \beta^2$。 -$$ -\alpha^2 = \sigma_1^2 + (1-\beta)^2\sigma_2^2. -$$ +4. 更具波动性的禀赋会提高 $\alpha^2$,因此 $\underline\sigma = -(1-\beta)^2/\alpha^2$ 更接近零。 - 永久冲击获得单位权重,因为它们一对一地移动终身资源,而暂时冲击被年金化,因此在消费增长中按 $(1-\beta)$ 缩放。 + 其经济学含义是,$\sigma$ 仅通过 $\sigma\alpha^2$ 起作用,因此当消费者面临更大的收入风险时,*更小*的 $|\sigma|$ 就已经能带来给定程度的悲观情绪。 ```{solution-end} ``` ```{exercise-start} -:label: lqcs_ex2 +:label: rcs_ex2 ``` -这个练习研究一个由稳健但观测等价的 Bewley 消费者组成的连续统。 - -固定一个基准对 $(\beta_0, \sigma = 0)$,其中 $R = \beta_0^{-1}$,并定义 - -$$ -\beta(\sigma) = \beta_0 + \frac{\sigma\alpha^2\beta_0}{1-\beta_0}, -\qquad \sigma \in [-\bar\sigma, 0]. -$$ +这个练习解释为什么针对 {eq}`eq:rcs-riccati` 的简单数值求解器会出现异常行为。 -假设一个单位区间的消费者由 $i$ 索引,类型为 $\sigma_i \in [-\bar\sigma, 0]$,贴现因子为 $\beta_i = \beta(\sigma_i)$。 +1. 用代数方法验证,在轨迹 {eq}`eq:rcs-oe` 上,{eq}`eq:rcs-riccati` 的判别式等于 $\bigl[(\sigma\alpha^2+(1-\beta)^2)/(1-\beta)\bigr]^2$。 -1. 使用 {prf:ref}`thm-lqcs-oe1` 证明每种类型都具有与基准 $(\beta_0, 0)$ 代理相同的消费规则。 +2. 得出结论:平方根等于 $|\sigma\alpha^2+(1-\beta)^2|/(1-\beta)$,因此两个根即为 {eq}`eq:rcs-roots` 中的根。 -2. 证明总消费和债券市场出清意味着与普通 Bewley 模型相同的均衡利率 $R = \beta_0^{-1}$。 +3. 编写代码,对 $(\underline\sigma,0)$ 区间内的 $\sigma$ 网格,记录 {eq}`eq:rcs-riccati` 中平方根前的哪个*符号*产生具有经济意义的根 $P=-(1-\beta)^{-1}$。 -3. 解释为什么代理可以在数量上观测等价,同时仍然持有不同的最坏情况主观模型。 + 确认答案在 $\sigma = \underline\sigma$ 处发生翻转。 ```{exercise-end} ``` -```{solution-start} lqcs_ex2 +```{solution-start} rcs_ex2 :class: dropdown ``` -这是一个解答: +这是一个解答。 -1. {prf:ref}`thm-lqcs-oe1` 意味着如果 $(\sigma_i, \beta_i)$ 位于 +1. 令 $u = \sigma\alpha^2$,$\delta = 1-\beta$,方程 {eq}`eq:rcs-oe` 给出 $\hat\beta - 1 = -\delta + u/\delta \cdot \beta/\beta$,更直接地有 $\hat\beta-1+u = (u-\delta^2)/\delta$。 -$$ -\beta_i = \beta_0 + \frac{\sigma_i\alpha^2\beta_0}{1-\beta_0}, -$$ + 因此判别式为 - 那么类型 $i$ 选择与基准 $(0,\beta_0)$ 代理相同的决策规则,并且所有类型共享相同的消费政策函数 $c_t = \mathcal C(a_t,z_t)$。 + $$ + \frac{(u-\delta^2)^2}{\delta^2} + 4u + = \frac{(u-\delta^2)^2 + 4u\delta^2}{\delta^2} + = \frac{(u+\delta^2)^2}{\delta^2} . + $$ -2. 由于所有个体政策规则都与基准 Bewley 政策重合,对消费者聚合得到相同的商品和债券市场出清条件,并支撑相同的均衡 $R=\beta_0^{-1}$。 +2. 取平方根得到 $|u+\delta^2|/\delta$,将两个符号代入 {eq}`eq:rcs-riccati` 得到 $P = -1/\delta$ 和 $P = \delta/u$。 -3. 观测等价性涉及由最优规则生成的数量,因此不同的 $(\sigma_i,\beta_i)$ 可以生成相同的 $\{c_t^i,a_t^i\}$,同时隐含不同的内部最坏情况信念。 +3. 符号恰好在 $u + \delta^2$ 变号处翻转,即在 $u = -\delta^2$ 处,也就是 $\sigma = \underline\sigma$。 + +```{code-cell} ipython3 +σ_test = np.linspace(-0.01, 1.4 * σ_lo, 40) +signs = [] +for σ in σ_test: + roots, _ = solve_scalar_riccati(σ, β, α2) + signs.append('+' if np.argmin(np.abs(roots + 1 / (1 - β))) == 0 else '-') + +print(''.join(signs)) +flip = next(i for i in range(1, len(signs)) if signs[i] != signs[i - 1]) +print(f"sign flips between σ = {σ_test[flip - 1]:.5f} " + f"and σ = {σ_test[flip]:.5f}") +print(f"breakdown point σ̲ = {σ_lo:.5f}") +``` ```{solution-end} ``` ```{exercise-start} -:label: lqcs_ex3 +:label: rcs_ex3 ``` -这个练习在不引入额外校准的情况下将数量与信念分开。 - -考虑稳健 Bewley 经济中的两个代理 $a$ 和 $b$,其中 $\sigma^a < \sigma^b \leq 0$ 且对于 $j \in \{a,b\}$,$\beta^j = \beta_0 + \sigma^j\alpha^2\beta_0/(1-\beta_0)$。 +这个练习使用检测误差概率来校准 $\sigma$。 -1. 使用 {eq}`eq:bew_cinno` 和 {eq}`eq:bew_locus` 证明这两个代理具有相同的消费创新 $h\epsilon_{t+1}$。 +编写一个二分法,找出使 $\mathrm{DEP}(\sigma) = 0.2$ 的 $\sigma$,并报告相应的 $\hat\beta$、$\zeta$ 以及比率 $\sigma/\underline\sigma$。 -2. 证明如果这两个代理从相同的 $(a_t,z_t)$ 出发并观测到相同的冲击 $\epsilon_{t+1}$,那么他们的下一期消费和资产选择重合。 +分别在 $T = 40$ 和 $T = 160$ 时运行该程序。 -3. 解释为什么这两个代理仍然可以在 $\epsilon_{t+1}$ 的最坏情况条件均值上意见不一致。 - -总结仅凭数量数据能够识别和不能识别什么。 +请注意:目标值不一定能在可行范围 $(\underline\sigma, 0]$ 内达到,你的代码应当能够说明这一点,而不是悄悄返回一个端点值。 ```{exercise-end} ``` -```{solution-start} lqcs_ex3 +```{solution-start} rcs_ex3 :class: dropdown ``` -这是一个解答: +检测误差概率随 $|\sigma|$ 递减,因此二分法是可行的,但我们必须先检查目标值是否在可达范围内。 -1. 方程 {eq}`eq:bew_locus` 将两个代理都置于观测等价轨迹上,因此 {prf:ref}`thm-lqcs-oe1` 意味着两者都使用基准消费规则,因此在 {eq}`eq:bew_cinno` 中使用相同的创新向量 $h$。 +```{code-cell} ipython3 +def σ_for_target_dep(target, T, β, α2, tol=1e-5): + """ + Find σ ∈ (σ̲, 0) with DEP(σ) = target by bisection. + + Returns None if the DEP never falls to the target on the admissible + range, which happens when the breakdown point binds before statistical + detectability does. + """ + α_loc = np.sqrt(α2) + lo, hi = 0.999 * (-(1 - β)**2 / α2), 0.0 # lo is the more negative end + + def dep_at(σ): + return detection_error_probability( + worst_case_persistence(σ, β, α2), α_loc, T=T) + + if dep_at(lo) > target: + return None + + while hi - lo > tol: + mid = 0.5 * (lo + hi) + if dep_at(mid) < target: + lo = mid # too easy to detect, move toward zero + else: + hi = mid + return 0.5 * (lo + hi) + + +for T in [40, 160]: + σ_star = σ_for_target_dep(0.2, T, β, α2) + if σ_star is None: + print(f"T = {T:>3}: DEP stays above 0.2 on the whole admissible " + f"range; the breakdown point binds first") + else: + ζ_star = worst_case_persistence(σ_star, β, α2) + print(f"T = {T:>3}: σ = {σ_star:.5f} β̂ = {β / ζ_star:.5f} " + f"ζ = {ζ_star:.5f} σ/σ̲ = {σ_star / σ_lo:.3f}") +``` -2. 有一个共同的状态和共同的冲击,两个代理应用相同的政策函数和相同的运动法则,因此 $c_{t+1}^a=c_{t+1}^b$ 且 $a_{t+1}^a=a_{t+1}^b$。 +样本越长,两个模型就越容易区分,因此使 DEP 保持在 $0.2$ 的 $\sigma$ 会更接近零。 -3. 最小化反馈 $K(\sigma^j,\beta^j)$ 可以在不同的 $j$ 之间有所不同,因此即使代理的可观测选择重合,他们也可以对相同的冲击过程赋予不同的最坏情况条件均值。 +在 $T = 40$ 时,没有任何可行的 $\sigma$ 能使 DEP 低至 $0.2$,因此崩溃点是约束条件。 -结论:数量识别均衡决策规则,但不识别沿观测等价轨迹的不耐心($\beta$)与稳健性($\sigma$)之间的分解。 +在 $T = 160$ 时,统计可检测性首先起作用,其位置约为通往崩溃点路程的四分之一处。 ```{solution-end} -``` \ No newline at end of file +``` + +## 相关讲座 + +- {doc}`lq_permanent_income` 阐述了本讲座所使用的标准 LQ 永久收入模型。 +- {doc}`lq_bewley_complete_markets` 研究了消费的横截面分布以及支持该分布的市场结构。 +- {doc}`lq_robust_bewley` 将本讲座的观察等价性结果应用于构建一个具有异质性错误设定担忧的贝叶利经济体。 +- {doc}`robust_permanent_income` 探讨了 HST 模型中的风险敏感偏好、估计以及资产定价问题。 diff --git a/lectures/sargent_surico.md b/lectures/sargent_surico.md new file mode 100644 index 0000000..ddf20ed --- /dev/null +++ b/lectures/sargent_surico.md @@ -0,0 +1,2072 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.16.7 +kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +translation: + title: 货币数量论的两个例证 + headings: + Overview: 概览 + Lucas's moving averages: 卢卡斯的移动平均 + Whiteman's reinterpretation: 怀特曼的重新解释 + Whiteman's reinterpretation::From a state space model to $h(0)$: 从状态空间模型到 $h(0)$ + Data: 数据 + Scatter plots: 散点图 + Regressions on filtered data: 对滤波数据的回归 + Estimates of $h(0)$ from a VAR: 从 VAR 估计 $h(0)$ + A model for monetary policy analysis: 用于货币政策分析的模型 + Three things worth checking: 三件值得核查的事 + Three things worth checking::$\tau$ is not identified: $\tau$ 不可识别 + Three things worth checking::The first unit slope is an identity when money is exogenous: 当货币外生时,第一个单位斜率是一个恒等式 + Three things worth checking::The reported posterior for $\alpha_x$ stops at one half: 报告的 $\alpha_x$ 后验止步于一半 + Solving the model: 求解模型 + The Sargent-Surico model in canonical form: 萨金特-苏里科模型的规范形式 + The Sargent-Surico model in canonical form::Checking the three claims: 检验这三个论断 + Bayesian estimation: 贝叶斯估计 + Bayesian estimation::The likelihood: 似然函数 + Bayesian estimation::Priors: 先验 + Bayesian estimation::The posterior mode: 后验众数 + Bayesian estimation::Random walk Metropolis-Hastings: 随机游走 Metropolis-Hastings + Bayesian estimation::The posterior distribution of $h(0)$: $h(0)$ 的后验分布 + How monetary policy moves the low-frequency slopes: 货币政策如何移动低频斜率 + How monetary policy moves the low-frequency slopes::The same exercise with a Taylor rule: 用泰勒规则重复同样的练习 + Estimating with Hamiltonian Monte Carlo: 用哈密顿蒙特卡洛进行估计 + Estimating with Hamiltonian Monte Carlo::What the random walk delivers: 随机游走给出了什么 + Estimating with Hamiltonian Monte Carlo::Why Hamiltonian methods are awkward for DSGE models: 为什么哈密顿方法对 DSGE 模型来说很棘手 + Estimating with Hamiltonian Monte Carlo::A differentiable solver: 一个可微的求解器 + Estimating with Hamiltonian Monte Carlo::The likelihood in JAX: JAX 中的似然函数 + Estimating with Hamiltonian Monte Carlo::Sampling with NUTS: 用 NUTS 采样 + Estimating with Hamiltonian Monte Carlo::A warning sign in the diagnostics: 诊断中的一个警示信号 + Estimating with Hamiltonian Monte Carlo::Two modes: 两个众数 + Estimating with Hamiltonian Monte Carlo::Does the bimodality change the economics?: 双峰性是否改变了经济学结论? + Estimating with Hamiltonian Monte Carlo::Comparing the samplers: 比较两种采样器 + Estimating with Hamiltonian Monte Carlo::What to take away: 应当汲取的教训 + Concluding remarks: 结束语 + Exercises: 练习 +--- + +(sargent_surico)= +```{raw} jupyter +
+ + QuantEcon + +
+``` + +# 货币数量论的两个例证 + +```{index} single: Quantity Theory of Money +``` + +```{contents} Contents +:depth: 2 +``` + +除了 Anaconda 中已有的内容之外,本讲座使用 `pandas_datareader` 下载宏观经济数据,并使用 `jax`、`numpyro` 和 `arviz` 来完成末尾的哈密顿蒙特卡洛部分: + +```{code-cell} ipython3 +:tags: [hide-output] + +!pip install pandas_datareader numpyro jax arviz +``` + +## 概览 + +{cite:t}`Lucas1980` 绘制了美国通货膨胀的长期移动平均值与美国货币增长的长期移动平均值之间的散点图,随后又绘制了名义利率的长期移动平均值与相同的货币增长移动平均值之间的散点图。 + +两幅散点图都紧贴着 45 度线。 + +卢卡斯将这两个单位斜率解读为体现了"货币数量论的两个核心含义:货币量变化率的给定变化会引起(一)价格通胀率的等量变化;以及(二)名义利率的等量变化"。 + +他也警告说,一种理论会告诉我们"在什么条件下人们可以预期这些结论会失效"。 + +本讲座研究 {cite:t}`SargentSurico2011`,该文认真对待了这一警告。 + +该论文做了三件事。 + +第一,它扩展了卢卡斯的样本,表明他的两个斜率在不同的子时期中并*不*稳定。 + +第二,遵循 {cite:t}`Whiteman1984` 的思路,将卢卡斯的斜率解释为双边分布滞后回归中系数之和,这一对象由时间序列模型给出,是在零频率处的谱密度之比。 + +第三,它在 1984 年之前的样本上估计了一个小型新凯恩斯模型,然后*仅*扰动货币政策规则,表明单凭政策就能使这两个斜率在数据所显示的范围内移动。 + +我们将在 Python 中从零开始完成所有这些工作。 + +我们编写了自己的线性理性预期模型求解器、自己的卡尔曼滤波器,以及自己的 Metropolis-Hastings 采样器,以便让每一步都清晰可见。 + +最后一节则将估计出的模型用作哈密顿蒙特卡洛的测试平台,结果发现这需要将模型求解器替换为一个可微的求解器。 + +在此过程中,我们标出了几处已发表论文对其模型的陈述或实现需要谨慎对待的地方,并对每一处都进行了数值检验。 + +大多数是修正,其中有一处结果反而使论文的结论更加鲜明,而非削弱了它。 + +让我们从导入模块开始。 + +```{code-cell} ipython3 +import datetime +import time +import warnings + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pandas_datareader.data as web +from scipy import optimize, stats +from scipy.linalg import ordqz, solve_discrete_lyapunov, svd +from scipy.stats import invwishart + +warnings.filterwarnings('ignore') +plt.rcParams['figure.figsize'] = (10, 6) +plt.rcParams['axes.grid'] = True +plt.rcParams['grid.alpha'] = 0.3 +``` + +## 卢卡斯的移动平均 + +对于一个标量序列 $x_t$ 及 $\beta \in [0, 1)$,{cite:t}`Lucas1980` 构造了如下的双边移动平均 + +$$ +\bar x_t(\beta) = a \sum_{k=-n}^{n} \beta^{|k|} x_{t+k}, +\qquad +a = \frac{(1-\beta)^2}{1 - \beta^2 - 2\beta^{n+1}(1-\beta)} , +$$ (eq:ss_filter) + +其中 $a$ 使得权重之和为一。 + +$\beta$ 越大意味着序列越平滑、窗口越长。 + +设定 $\beta = 0$ 则还原为原始数据。 + +我们将权重应用于所有可用的观测值,并重新归一化使其始终求和为一。 + +```{code-cell} ipython3 +def lucas_filter(x, beta=0.95): + """Two-sided exponentially weighted moving average of Lucas (1980).""" + x = np.asarray(x, dtype=float) + T = len(x) + out = np.empty(T) + for t in range(T): + w = beta ** np.abs(np.arange(T) - t) + out[t] = w @ x / w.sum() + return out +``` + +## 怀特曼的重新解释 + +{cite:t}`Whiteman1984` 观察到,用一条直线拟合移动平均的散点图,是一种非正式的方法,用来计算长双边分布滞后回归中系数的*总和*。 + +设 $\{y_t, z_t\}$ 联合协方差平稳且均值为零,将 $y_t$ 投影到 $z$ 的全部历史与未来上, + +$$ +y_t = \sum_{j=-\infty}^{\infty} h_j z_{t-j} + \epsilon_t , +\qquad \mathbb{E}\, \epsilon_t z_{t-j} = 0 \ \ \forall j . +$$ (eq:ss_twosided) + +记 $S_y(\omega)$、$S_z(\omega)$ 与 $S_{yz}(\omega)$ 分别为谱密度和交叉谱密度,$h(\omega) = \sum_j h_j e^{-i\omega j}$ 为传递函数。 + +那么 + +$$ +h(\omega) = \frac{S_{yz}(\omega)}{S_z(\omega)} +\qquad \text{so} \qquad +\sum_{j=-\infty}^{\infty} h_j = h(0) = \frac{S_{yz}(0)}{S_z(0)} . +$$ (eq:ss_h0) + +怀特曼证明了当 $\beta \to 1$ 时,$\bar y_t(\beta)$ 对 $\bar z_t(\beta)$ 的回归系数收敛于 $h(0)$。 + +因此卢卡斯的两个例证实际上是主张 + +$$ +h_{\pi, \Delta m}(0) = 1 +\qquad \text{and} \qquad +h_{R, \Delta m}(0) = 1 , +$$ + +其中 $\pi$ 是通货膨胀,$\Delta m$ 是货币增长,$R$ 是名义利率。 + +这是一个有用的重新表述,因为 $h(0)$ 是一个*总体*对象,任何时间序列模型都能给出这一数值。 + +### 从状态空间模型到 $h(0)$ + +假设某个模型蕴含 + +$$ +X_{t+1} = A X_t + B W_{t+1}, +\qquad +Y_{t+1} = C X_t + D W_{t+1}, +$$ (eq:ss_statespace) + +其中 $W_{t+1}$ 是一个标准正态向量,随时间独立同分布,且 $A$ 是稳定的。 + +迭代给出 $X_t = \sum_{j \ge 0} A^j B W_{t-j}$,因此从 $W$ 到 $Y$ 的传递函数为 + +$$ +H(\zeta) = D + \zeta \, C (I - A\zeta)^{-1} B , +\qquad \zeta = e^{-i\omega}, +$$ + +而 $Y$ 的谱密度矩阵为 $S_Y(\omega) = H(\zeta) H(\zeta)^{*} / (2\pi)$,即 + +$$ +2\pi S_Y(\omega) = +C (I - A e^{-i\omega})^{-1} B B' (I - A' e^{i\omega})^{-1} C' ++ D D' ++ e^{-i\omega} C (I - A e^{-i\omega})^{-1} B D' ++ e^{i\omega} D B' (I - A' e^{i\omega})^{-1} C' . +$$ (eq:ss_spectrum) + +```{note} +{cite:t}`SargentSurico2011` 的方程 (7) 只报告了 {eq}`eq:ss_spectrum` 的前两项。 + +当 $B D' = 0$ 时,即推动状态变化的冲击与作用于观测方程的冲击相互正交时,这两个交叉项才会恰好消失。 + +一个一行的例子说明它们在其他情况下是重要的:取标量 $A = 1/2$、$B = C = D = 1$,正确的 $2\pi S_Y(0)$ 为 $(1 + 1/(1-1/2))^2 = 9$,而截断公式给出的却是 $1/(1-1/2)^2 + 1 = 5$。 + +不过后文的内容不受此影响,因为我们把 VAR 和求解得到的模型都写成 $D = 0$ 的形式,这也是书写各自模型的自然方式。 +``` + +在 $\omega = 0$ 且 $D = 0$ 时,一切都化简为一个长期乘数。 + +记 $G = C(I - A)^{-1}B$, + +$$ +2\pi S_Y(0) = G G' , +\qquad +h_{y,z}(0) = \frac{[G G']_{yz}}{[G G']_{zz}} . +$$ (eq:ss_h0state) + +```{code-cell} ipython3 +def h_zero_from_state_space(A, B, C, iy, iz): + """h(0) for observable iy regressed on observable iz.""" + G = np.linalg.solve(np.eye(A.shape[0]) - A, B) + S0 = C @ G @ G.T @ C.T + return S0[iy, iz] / S0[iz, iz] +``` + +## 数据 + +{cite:t}`SargentSurico2011` 将 FRED 数据与 {cite:t}`BalkeGordon1986` 的历史序列拼接,以追溯到 1900 年。 + +那些历史序列在 FRED 上并不存在,因此我们使用 FRED 确实提供的 1959 年之后的季度数据,并将样本延伸到论文 2005 年终点之后的二十年。 + +这一延伸正是有趣之处:它涵盖了 2008 年后和 2020 年后的资产负债表扩张,以及 2021-2023 年的通货膨胀。 + +我们用 M2 代表货币,GDP 平减指数代表价格,实际 GDP 代表产出,三个月期国库券利率代表名义利率。 + +论文的基准是六个月期商业票据利率,FRED 已不再提供该数据;其附录表 A 显示三个月期国库券给出了相似的结果。 + +货币增长、通货膨胀和产出增长为季度对数差分乘以 100,利率除以四,使其也成为以百分比表示的季度利率。 + +```{code-cell} ipython3 +start, end = datetime.datetime(1959, 1, 1), datetime.datetime(2030, 1, 1) +raw = web.DataReader(['M2SL', 'GDPDEF', 'GDPC1', 'TB3MS'], 'fred', start, end) + +q = pd.DataFrame({'M2': raw['M2SL'].resample('QS').mean(), + 'P': raw['GDPDEF'].resample('QS').mean(), + 'Y': raw['GDPC1'].resample('QS').mean(), + 'R': raw['TB3MS'].resample('QS').mean() / 4}).dropna() + +data = pd.DataFrame({'dm': 100 * np.log(q['M2']).diff(), + 'pi': 100 * np.log(q['P']).diff(), + 'dy': 100 * np.log(q['Y']).diff(), + 'R': q['R']}).dropna() + +VARS = ['dm', 'pi', 'R', 'dy'] +LABELS = {'dm': 'M2 growth', 'pi': 'inflation', + 'R': 'T-bill rate', 'dy': 'real GDP growth'} +print(f"sample: {data.index[0].date()} to {data.index[-1].date()}, T = {len(data)}") +data.describe().round(3) +``` + +以下是原始序列及其 $\beta = 0.95$ 移动平均。 + +阴影区域标出了 1959-1975 年,这是我们能够最接近卢卡斯所用窗口的时段。 + +```{code-cell} ipython3 +filtered = pd.DataFrame({c: lucas_filter(data[c].values, 0.95) for c in VARS}, + index=data.index) + +fig, axes = plt.subplots(2, 2, figsize=(12, 7), sharex=True) +for ax, c in zip(axes.flat, VARS): + ax.plot(data.index, data[c], lw=0.8, color='0.65', label='raw') + ax.plot(filtered.index, filtered[c], lw=2.2, color='C0', + label=r'$\beta = 0.95$ filter') + ax.axvspan(pd.Timestamp('1959-01-01'), pd.Timestamp('1975-12-31'), + color='C1', alpha=0.12) + ax.set_title(LABELS[c]) + ax.legend(frameon=False, fontsize=9) +fig.suptitle('U.S. quarterly data and Lucas moving averages, percent per quarter') +plt.tight_layout() +plt.show() +``` + +货币增长、通货膨胀和利率在 20 世纪 80 年代初之前一同上升,随后又一同下降。 + +1984 年以后,这种共同变动就很难看到了,而疫情期间 M2 增长的激增则完全独立于其他一切。 + +## 散点图 + +按照论文的做法,我们绘制每年第二季度的观测值,这样可以减少相邻滤波值之间的重叠。 + +```{code-cell} ipython3 +PERIODS = [('1959-1975', 1959, 1975), ('1960-1983', 1960, 1983), + ('1984-2007', 1984, 2007), ('2008-present', 2008, 2100)] + + +def scatter_panel(yvar, title): + q2 = filtered[filtered.index.quarter == 2] + pad = 0.15 * (q2[['dm', yvar]].values.max() - q2[['dm', yvar]].values.min()) + lim = np.array([q2[['dm', yvar]].values.min() - pad, + q2[['dm', yvar]].values.max() + pad]) + fig, axes = plt.subplots(1, 4, figsize=(14, 3.8), sharex=True, sharey=True) + for ax, (name, lo, hi) in zip(axes, PERIODS): + sub = q2[(q2.index.year >= lo) & (q2.index.year <= hi)] + x, y = sub['dm'].values, sub[yvar].values + ax.scatter(x, y, s=26, color='C0') + b = np.polyfit(x, y, 1) + xx = np.linspace(x.min(), x.max(), 2) + ax.plot(xx, np.polyval(b, xx), color='C3', lw=2, + label=f'slope = {b[0]:.2f}') + ax.plot(lim, lim, color='0.4', ls='--', lw=1, label='45 degrees') + ax.set(xlim=lim, ylim=lim, title=name, xlabel='money growth') + ax.legend(frameon=False, fontsize=8, loc='upper left') + axes[0].set_ylabel(title) + fig.suptitle(f'{title} against money growth, $\\beta = 0.95$ filtered') + plt.tight_layout() + plt.show() + + +scatter_panel('pi', 'inflation') +scatter_panel('R', 'interest rate') +``` + +卢卡斯所用窗口以及沃尔克之前的样本都紧贴 45 度线。 + +而大缓和时期以及 2008 年以来的时期则并非如此。 + +## 对滤波数据的回归 + +论文的表 1 报告了这些斜率在一系列 $\beta$ 值下的结果。 + +```{code-cell} ipython3 +def filtered_slopes(betas=(0.95, 0.8, 0.5, 0.0)): + rows = {} + for beta in betas: + f = pd.DataFrame({c: lucas_filter(data[c].values, beta) for c in VARS}, + index=data.index) + for name, lo, hi in PERIODS + [('full sample', 1900, 2100)]: + m = ((f.index.year >= lo) & (f.index.year <= hi) + & (f.index.quarter == 2)) + x = f.loc[m, 'dm'].values + rows.setdefault(name, {})[('pi on dm', beta)] = np.polyfit(x, f.loc[m, 'pi'], 1)[0] + rows[name][('R on dm', beta)] = np.polyfit(x, f.loc[m, 'R'], 1)[0] + tab = pd.DataFrame(rows).T + order = [(v, b) for v in ['pi on dm', 'R on dm'] for b in betas] + return tab.reindex(columns=order) + + +filtered_slopes().round(2) +``` + +有两个模式很突出。 + +$\beta$ 越接近一,斜率就越大,这与卢卡斯的图形以及论文表 1 中的结果完全一致。 + +并且随着样本的推进,斜率稳步下降,从卢卡斯所用窗口中的大于一,到 2008 年之后变为负值。 + +## 从 VAR 估计 $h(0)$ + +对滤波数据的回归是非正式的。 + +方程 {eq}`eq:ss_h0state` 让我们可以从拟合的 VAR 中正确地计算出 $h(0)$。 + +我们对货币增长、通货膨胀、利率和产出增长拟合一个 VAR(2)模型,将其化为伴随形式,并从长期乘数矩阵中读出 $h(0)$。 + +我们使用弥散先验,以便能够报告后验带,这与论文图 5 的做法一致。 + +如果某次抽取的伴随矩阵是爆炸性的,则将其舍弃,因为 $h(0)$ 对这些情形没有定义。 + +```{code-cell} ipython3 +def bvar_h0(Y, p=2, n_draws=500, seed=0): + """Posterior draws of h(0) from a VAR(p) under a diffuse prior.""" + rng = np.random.default_rng(seed) + T, n = Y.shape + X = np.column_stack([np.ones(T - p)] + [Y[p - l - 1:T - l - 1] for l in range(p)]) + Z, k = Y[p:], 1 + n * p + XXi = np.linalg.inv(X.T @ X) + B_hat = XXi @ X.T @ Z + E = Z - X @ B_hat + S, nu = E.T @ E, T - p - k + L_x = np.linalg.cholesky(XXi) + J = np.vstack([np.eye(n), np.zeros((n * (p - 1), n))]) + + out = np.full((n_draws, 2), np.nan) + for d in range(n_draws): + Sigma = invwishart.rvs(df=nu, scale=S, random_state=rng) + B = B_hat + L_x @ rng.standard_normal((k, n)) @ np.linalg.cholesky(Sigma).T + A = np.zeros((n * p, n * p)) + A[:n] = np.hstack([B[1 + l * n:1 + (l + 1) * n].T for l in range(p)]) + if p > 1: + A[n:, :n * (p - 1)] = np.eye(n * (p - 1)) + if np.max(abs(np.linalg.eigvals(A))) >= 1: + continue + G = np.linalg.solve(np.eye(n * p) - A, J) + S0 = G @ Sigma @ G.T + out[d] = [S0[1, 0] / S0[0, 0], S0[2, 0] / S0[0, 0]] + return out +``` + +```{code-cell} ipython3 +rows = [] +for name, lo, hi in PERIODS + [('full sample', 1900, 2100)]: + m = (data.index.year >= lo) & (data.index.year <= hi) + o = bvar_h0(data.loc[m, VARS].values) + qs = np.nanpercentile(o, [16, 50, 84], axis=0) + rows.append(dict(period=name, T=int(m.sum()), + h_pi=qs[1, 0], h_pi_lo=qs[0, 0], h_pi_hi=qs[2, 0], + h_R=qs[1, 1], h_R_lo=qs[0, 1], h_R_hi=qs[2, 1])) +pd.DataFrame(rows).set_index('period').round(2) +``` + +子时期是手工选定的,这正是 {cite:t}`BoschenOtrok1994` 针对这类证据所提出的反对意见。 + +因此我们也让 VAR 在滚动的二十年窗口上运行。 + +```{code-cell} ipython3 +years = np.arange(data.index.year.min(), data.index.year.max() - 18) +mid, lo68, hi68 = {}, {}, {} +for y in years: + m = (data.index.year >= y) & (data.index.year < y + 20) + if m.sum() < 70: + continue + o = bvar_h0(data.loc[m, VARS].values, n_draws=300, seed=int(y)) + qs = np.nanpercentile(o, [16, 50, 84], axis=0) + mid[y + 10], lo68[y + 10], hi68[y + 10] = qs[1], qs[0], qs[2] + +mid = pd.DataFrame(mid).T +lo68, hi68 = pd.DataFrame(lo68).T, pd.DataFrame(hi68).T + +fig, axes = plt.subplots(1, 2, figsize=(12, 4.2), sharex=True) +for j, (ax, ttl) in enumerate(zip(axes, [r'$h_{\pi,\Delta m}(0)$', + r'$h_{R,\Delta m}(0)$'])): + ax.plot(mid.index, mid[j], color='C3', lw=2, label='median') + ax.fill_between(mid.index, lo68[j], hi68[j], color='C3', alpha=0.18, + label='68% band') + ax.axhline(1, color='0.3', ls='--', lw=1, label='quantity theory') + ax.axhline(0, color='0.7', lw=0.8) + ax.set(title=ttl, xlabel='midpoint of 20 year window') + ax.legend(frameon=False, fontsize=9) +fig.suptitle('Low-frequency slopes from rolling VARs') +plt.tight_layout() +plt.show() +``` + +这两个低频斜率在卢卡斯写作时的样本早期较高,此后逐渐向零漂移。 + +在 20 世纪 80 年代中期以后,其中一个几乎很少落在 68% 带之内。 + +这正是本讲座后文试图解释的不稳定性。 + +## 用于货币政策分析的模型 + +{cite:t}`SargentSurico2011` 第三节采用了 {cite:t}`Ireland2004` 的对数线性化黏性价格模型,其中包含价格指数化、习惯形成以及单位根技术冲击。 + +经济结构为 + +$$ +\pi_t = \theta(1-\alpha_\pi) \mathbb{E}_t \pi_{t+1} + \theta \alpha_\pi \pi_{t-1} + + \kappa x_t - \tfrac{1}{\tau} e_t , +$$ (eq:ss_nkpc) + +$$ +x_t = (1-\alpha_x)\mathbb{E}_t x_{t+1} + \alpha_x x_{t-1} + - \sigma(R_t - \mathbb{E}_t \pi_{t+1}) + \sigma(1-\xi)(1-\rho_a) a_t , +$$ (eq:ss_is) + +$$ +\Delta m_t = \pi_t + z_t + \tfrac{1}{\sigma\gamma}\Delta x_t + - \tfrac{1}{\gamma}\Delta R_t + + \tfrac{1}{\gamma}(\Delta\chi_t - \Delta a_t) , +$$ (eq:ss_md) + +$$ +\tilde y_t = x_t + \xi a_t , +\qquad +\Delta y_t = \tilde y_t - \tilde y_{t-1} + z_t . +$$ (eq:ss_output) + +这里 $\pi_t$ 是通货膨胀,$x_t$ 是产出缺口,$\Delta m_t$ 是名义货币增长,$R_t$ 是短期利率,$\tilde y_t$ 是去趋势产出,$z_t$ 是技术增长率。 + +方程 {eq}`eq:ss_nkpc` 是新凯恩斯菲利普斯曲线,{eq}`eq:ss_is` 是新凯恩斯 IS 曲线。 + +方程 {eq}`eq:ss_md` 是 {cite:t}`McCallumNelson1999` 和 {cite:t}`Ireland2003` 所提出的货币需求关系。 + +贴现因子为 $\theta$,$\alpha_\pi$ 是对过去通胀的指数化程度,$\alpha_x$ 是习惯形成程度,$\kappa$ 是菲利普斯曲线的斜率,$\sigma$ 是跨期替代弹性,$\tau$ 是 {cite:t}`Rotemberg1982` 的价格调整成本,$\xi$ 是弗里希弹性的倒数,$1/\gamma$ 是货币需求的利率半弹性。 + +有四个非政策扰动驱动经济:加成冲击 $e_t$、需求冲击 $a_t$、货币需求冲击 $\chi_t$,以及技术冲击 $z_t$, + +$$ +e_t = \rho_e e_{t-1} + \varepsilon_{et}, +\quad +a_t = \rho_a a_{t-1} + \varepsilon_{at}, +\quad +\chi_t = \rho_\chi \chi_{t-1} + \varepsilon_{\chi t}, +\quad +z_t = \varepsilon_{zt} . +$$ (eq:ss_shocks) + +货币政策要么是一个货币增长规则 + +$$ +\Delta m_t = \rho_m \Delta m_{t-1} + (1-\rho_m)(\phi_\pi \pi_t + \phi_x x_t) + + \varepsilon_{mt} +$$ (eq:ss_mrule) + +要么是一个泰勒规则 + +$$ +R_t = \rho_r R_{t-1} + (1-\rho_r)(\psi_\pi \pi_t + \psi_x x_t) + \varepsilon_{Rt} . +$$ (eq:ss_trule) + +可观测变量为 $[\Delta m_t, \pi_t, R_t, \Delta y_t]$。 + +## 三件值得核查的事 + +在估计任何东西之前,先看看这一参数化设定能够提供什么、又无法提供什么,是值得的。 + +### $\tau$ 不可识别 + +价格调整成本 $\tau$ 只在一个地方进入模型,即 {eq}`eq:ss_nkpc` 中的 $e_t/\tau$ 项。 + +由于 $e_t$ 是一个 AR(1) 过程,其创新标准差 $\sigma_e$ 是自由估计的,因此过程 $e_t/\tau$ 是一个创新标准差为 $\sigma_e/\tau$ 的 AR(1) 过程。 + +因此似然函数只通过比值 $\sigma_e/\tau$ 依赖于 $(\tau, \sigma_e)$。 + +我们在下文用数值方法验证了这一点。 + +尽管如此,论文表 2 仍报告了 $\tau$ 的后验,均值为 3.51,5-95 区间为 $[1.99, 4.99]$,而先验的均值为 4,区间为 $[2.51, 5.77]$。 + +那个后验并不能作为关于罗滕伯格调整成本的证据。 + +它向左偏移,是 $\sigma_e$ 先验一旦被数据锁定比值后所隐含的结果:数据希望 $\sigma_e/\tau \approx 0.31$,而 $\sigma_e$ 的逆伽马先验均值为 $0.3$,将 $\sigma_e$ 向下拉,从而把 $\tau$ 也一并拉低。 + +由于 $\tau$ 没有任何实际贡献,我们将其固定在先验均值处,并少估计一个参数。 + +拟合结果,以及 $h(0)$,都不会因此发生任何变化。 + +### 当货币外生时,第一个单位斜率是一个恒等式 + +将货币需求方程 {eq}`eq:ss_md` 的各项归组为 + +$$ +\Delta m_t = \pi_t + z_t + \Delta v_t , +\qquad +v_t = \tfrac{1}{\sigma\gamma} x_t - \tfrac{1}{\gamma} R_t + + \tfrac{1}{\gamma}(\chi_t - a_t) . +$$ (eq:ss_qtm) + +除了 $\pi_t + z_t$ 之外,其余一切都是*一阶差分*。 + +滤波器 $1 - e^{-i\omega}$ 在 $\omega = 0$ 处消失,因此 $\Delta v_t$ 在零频率处对任何谱密度或交叉谱都没有贡献。 + +因此 + +$$ +h_{\pi, \Delta m}(0) += \frac{S_{\pi,\pi+z}(0)}{S_{\pi+z}(0)} += 1 - \frac{S_{z,\pi+z}(0)}{S_{\pi+z}(0)} . +$$ (eq:ss_decomp) + +由此可得一个命题。 + +```{prf:proposition} +:label: ss_prop + +在货币增长规则 {eq}`eq:ss_mrule` 且 $\phi_\pi = \phi_x = 0$ 的情形下, + +$$ +h_{\pi, \Delta m}(0) = 1 +$$ + +无论其他参数取何值,此式都精确成立。 +``` + +```{prf:proof} +当 $\phi_\pi = \phi_x = 0$ 时,规则变为 $\Delta m_t = \rho_m \Delta m_{t-1} + \varepsilon_{mt}$,因此货币增长仅由 $\varepsilon_m$ 驱动。 + +由 {eq}`eq:ss_qtm`,$\pi_t + z_t = \Delta m_t - \Delta v_t$,而 $\Delta v$ 在零频率处没有贡献,因此 $S_{z,\pi+z}(0) = S_{z,\Delta m}(0)$。 + +技术是外生的,且与 $\varepsilon_m$ 正交,因此 $S_{z, \Delta m}(\omega) \equiv 0$。 + +现在应用 {eq}`eq:ss_decomp` 即可。 +``` + +这一点值得深思。 + +卢卡斯的*第一个*例证只要货币增长在计量上是外生的就会成立,而这正是 {cite:t}`Whiteman1984` 所假设的情形。 + +这是货币需求设定的一个性质,而非某种深层的货币中性。 + +对一的偏离仅通过 $S_{z,\pi+z}(0)$ 产生,而该项只有在政策规则使得货币增长对内生变量作出反应、从而使技术在零频率处与货币增长相关时才不为零。 + +*第二个*例证则没有这样的支撑。 + +同样的论证给出 $h_{R,\Delta m}(0) = S_{R,\pi+z}(0)/S_{\pi+z}(0)$,只有当事前实际利率的低频行为恰好合作时,该值才等于一。 + +因此在这一结构模型内,卢卡斯的两个例证并非处于同等地位。 + +### 报告的 $\alpha_x$ 后验止步于一半 + +表 2 报告了习惯参数 $\alpha_x$ 的后验,均值为 0.4775,第 95 百分位恰好为 0.5000,先验为 $[0,1]$ 上的贝塔分布。 + +一个恰好止于整数的区间,通常反映的是约束而非发现。 + +这并非可决性约束:我们在下文核查得知,模型在 $\alpha_x = 0.5$ 两侧都存在唯一的稳定解。 + +因此我们让 $\alpha_x$ 遍历整个单位区间。 + +## 求解模型 + +该模型是一个线性理性预期系统,我们采用 {cite:t}`Sims2002gensys` 的方法求解。 + +将其写成规范形式 + +$$ +\Gamma_0 y_t = \Gamma_1 y_{t-1} + \Psi \varepsilon_t + \Pi \eta_t , +$$ (eq:ss_gensys) + +其中 $\varepsilon_t$ 汇集了结构冲击,$\eta_t$ 汇集了预期误差,对应系统中每个出现预期的变量各有一个预期误差。 + +技巧在于将 $\mathbb{E}_t \pi_{t+1}$ 和 $\mathbb{E}_t x_{t+1}$ 加入变量向量,连同恒等式 + +$$ +\pi_t = \mathbb{E}_{t-1}\pi_t + \eta^\pi_t , +\qquad +x_t = \mathbb{E}_{t-1}x_t + \eta^x_t . +$$ + +求解算法对矩阵束 $(\Gamma_0, \Gamma_1)$ 进行广义舒尔分解,将稳定的广义特征值排在前面,然后判断是否可以选择预期误差以消除爆炸性的那一块。 + +如果可以,则存在一个稳定解;如果只能以唯一的方式选择,则该解是唯一的。 + +```{code-cell} ipython3 +SMALL = 1e-6 + + +def gensys(g0, g1, psi, pi, div=1.01): + """ + Solve g0 @ y[t] = g1 @ y[t-1] + psi @ eps[t] + pi @ eta[t]. + + Returns (G1, impact, eu) so that, when eu == (1, 1), + + y[t] = G1 @ y[t-1] + impact @ eps[t] + + is the unique stable solution. eu[0] flags existence, eu[1] uniqueness. + """ + n = g0.shape[0] + S, T, alpha, beta, Q, Z = ordqz(g0, g1, output='complex', + sort=lambda a, b: abs(b) < div * abs(a)) + nunstab = int(np.sum(abs(beta) >= div * abs(alpha))) + ns = n - nunstab + if np.any((abs(alpha) < SMALL) & (abs(beta) < SMALL)): + return None, None, (-2, -2) + + q = Q.conj().T + q1, q2 = q[:ns], q[ns:] + + def trimmed_svd(M): + u, d, vh = svd(M) + keep = d > SMALL + r = len(d) + return u[:, :r][:, keep], d[keep], vh.conj().T[:, :r][:, keep] + + u2, d2, v2 = trimmed_svd(q2 @ pi) # can eta kill the explosive block? + u1, d1, v1 = trimmed_svd(q1 @ pi) # is the choice unique? + + exist = len(d2) >= nunstab + if v1.shape[1] == 0: + unique = True + else: + loose = v1 - v2 @ v2.conj().T @ v1 + unique = np.sum(svd(loose, compute_uv=False) > SMALL * n) == 0 + eu = (int(exist), int(unique)) + if not exist: + return None, None, eu + + W = u2 @ np.diag(1 / d2) @ v2.conj().T @ v1 @ np.diag(d1) @ u1.conj().T + tmat = np.hstack([np.eye(ns), -W.conj().T]) + G0 = np.vstack([tmat @ S, + np.hstack([np.zeros((nunstab, ns)), np.eye(nunstab)])]) + G0i = np.linalg.inv(G0) + G1 = np.real(Z @ (G0i @ np.vstack([tmat @ T, np.zeros((nunstab, n))])) + @ Z.conj().T) + impact = np.real(Z @ (G0i @ np.vstack([tmat @ q @ psi, + np.zeros((nunstab, psi.shape[1]))]))) + return G1, impact, eu +``` + +在信任它之前,我们先用一个我们可以写出解析解的模型来检验它。 + +在教科书式的三方程新凯恩斯模型中 + +$$ +\pi_t = \theta \mathbb{E}_t \pi_{t+1} + \kappa x_t, +\quad +x_t = \mathbb{E}_t x_{t+1} - \sigma(R_t - \mathbb{E}_t \pi_{t+1}) + g_t, +\quad +R_t = \phi_\pi \pi_t , +$$ + +其中 $g_t$ 是一个 AR(1) 过程,均衡为 $\pi_t = \pi_g g_t$ 及 $x_t = x_g g_t$,其中 $(\pi_g, x_g)$ 满足一个二乘二的线性方程组,且当且仅当 $\phi_\pi > 1$ 时均衡才唯一。 + +```{code-cell} ipython3 +def toy_nk(phi_pi, theta=0.99, kappa=0.1, sigma=1.0, rho=0.8): + """y = [pi, x, R, g, E pi(+1), E x(+1)].""" + g0, g1 = np.zeros((6, 6)), np.zeros((6, 6)) + psi, pie = np.zeros((6, 1)), np.zeros((6, 2)) + g0[0, 0], g0[0, 4], g0[0, 1] = 1, -theta, -kappa + g0[1, 1], g0[1, 5], g0[1, 2], g0[1, 4], g0[1, 3] = 1, -1, sigma, -sigma, -1 + g0[2, 2], g0[2, 0] = 1, -phi_pi + g0[3, 3], g1[3, 3], psi[3, 0] = 1, rho, 1 + g0[4, 0], g1[4, 4], pie[4, 0] = 1, 1, 1 + g0[5, 1], g1[5, 5], pie[5, 1] = 1, 1, 1 + return g0, g1, psi, pie + + +for phi in [0.5, 1.5, 3.0]: + G1, impact, eu = gensys(*toy_nk(phi)) + msg = 'unique stable solution' if eu == (1, 1) else 'indeterminate' + print(f'phi_pi = {phi}: eu = {eu} ({msg})') + +theta, kappa, sigma, rho, phi = 0.99, 0.1, 1.0, 0.8, 1.5 +M = np.array([[1 - theta * rho, -kappa], [sigma * (phi - rho), 1 - rho]]) +exact = np.linalg.solve(M, np.array([0.0, 1.0])) +G1, impact, _ = gensys(*toy_nk(phi)) +print(f'\nanalytic (pi_g, x_g) = {np.round(exact, 8)}') +print(f'gensys (pi_g, x_g) = {np.round(impact[:2, 0], 8)}') +``` + +该求解器再现了解析解,精度达到机器精度,并且在 $\phi_\pi < 1$ 时正确地拒绝给出解。 + +## 萨金特-苏里科模型的规范形式 + +现在我们把方程 {eq}`eq:ss_nkpc` 到 {eq}`eq:ss_trule` 写成 {eq}`eq:ss_gensys` 的形式。 + +变量向量为 + +$$ +y_t = [\pi_t,\ x_t,\ \Delta m_t,\ R_t,\ e_t,\ a_t,\ \chi_t,\ z_t,\ + \mathbb{E}_t \pi_{t+1},\ \mathbb{E}_t x_{t+1}]' , +$$ + +冲击为 $\varepsilon_t = [\varepsilon_{et}, \varepsilon_{at}, \varepsilon_{\chi t}, \varepsilon_{zt}, \varepsilon_{mt}]'$。 + +```{code-cell} ipython3 +PI, X, DM, R, E, A_, CH, Z, EPI, EX = range(10) +NY = 10 + + +def canonical(p, rule='money'): + """Matrices g0, g1, psi, pi of equations (SS-NKPC) through (SS-Taylor).""" + th, api, kap, tau = p['theta'], p['alpha_pi'], p['kappa'], p['tau'] + ax, sig, xi, gam = p['alpha_x'], p['sigma'], p['xi'], p['gamma'] + g0, g1 = np.zeros((NY, NY)), np.zeros((NY, NY)) + psi, pie = np.zeros((NY, 5)), np.zeros((NY, 2)) + + # Phillips curve + g0[0, PI], g0[0, EPI], g0[0, X], g0[0, E] = 1, -th * (1 - api), -kap, 1 / tau + g1[0, PI] = th * api + # IS curve + g0[1, X], g0[1, EX], g0[1, R], g0[1, EPI] = 1, -(1 - ax), sig, -sig + g0[1, A_] = -sig * (1 - xi) * (1 - p['rho_a']) + g1[1, X] = ax + # money demand + g0[2, DM], g0[2, PI], g0[2, Z] = 1, -1, -1 + for col, coef in [(X, -1 / (sig * gam)), (R, 1 / gam), + (CH, -1 / gam), (A_, 1 / gam)]: + g0[2, col], g1[2, col] = coef, coef + # policy rule + if rule == 'money': + rm = p['rho_m'] + g0[3, DM] = 1 + g0[3, PI], g0[3, X] = -(1 - rm) * p['phi_pi'], -(1 - rm) * p['phi_x'] + g1[3, DM] = rm + else: + rr = p['rho_r'] + g0[3, R] = 1 + g0[3, PI], g0[3, X] = -(1 - rr) * p['psi_pi'], -(1 - rr) * p['psi_x'] + g1[3, R] = rr + psi[3, 4] = 1 + # exogenous shocks + for row, (v, rho, k) in enumerate([(E, p['rho_e'], 0), (A_, p['rho_a'], 1), + (CH, p['rho_chi'], 2), (Z, 0.0, 3)], 4): + g0[row, v], g1[row, v], psi[row, k] = 1, rho, 1 + # expectational identities + g0[8, PI], g1[8, EPI], pie[8, 0] = 1, 1, 1 + g0[9, X], g1[9, EX], pie[9, 1] = 1, 1, 1 + return g0, g1, psi, pie +``` + +方程 {eq}`eq:ss_output` 中的产出增长需要 $x_{t-1}$ 和 $a_{t-1}$,因此状态还要携带这两个滞后项, + +$$ +S_t = [y_t',\ x_{t-1},\ a_{t-1}]' , +\qquad +S_t = A S_{t-1} + B \varepsilon_t , +\qquad +Y_t = C S_t . +$$ + +这里没有测量误差,因此 $D = 0$,可以直接应用 {eq}`eq:ss_h0state`。 + +这里出现了一个问题。 + +`gensys` 的 `div` 参数用来将稳定的广义特征值与爆炸性的区分开,为了使这一区分在数值上可靠,它必须略高于一。 + +因此,一个被 `gensys` 报告为唯一且稳定的解,其转移矩阵仍可能存在一个恰好等于一或略高于一的根。 + +$h(0)$ 和卡尔曼滤波都需要协方差平稳性,因此我们显式地检验这一点,而不是仅仅信任那些标志位。 + +```{code-cell} ipython3 +def state_space(p, rule='money'): + """ + Return A, B, C for S[t] = A S[t-1] + B eps[t] and Y[t] = C S[t], + together with a status string that is 'ok' when the equilibrium is + unique and covariance stationary. + """ + G1, impact, eu = gensys(*canonical(p, rule)) + if eu[0] != 1: + return None, None, None, 'no stable solution' + if eu[1] != 1: + return None, None, None, 'indeterminate' + sd = np.diag([p['sig_e'], p['sig_a'], p['sig_chi'], p['sig_z'], p['sig_m']]) + n = NY + 2 + A, B = np.zeros((n, n)), np.zeros((n, 5)) + A[:NY, :NY] = G1 + A[NY, X], A[NY + 1, A_] = 1, 1 + B[:NY] = impact @ sd + C = np.zeros((4, n)) # [dm, pi, R, dy] + C[0, DM], C[1, PI], C[2, R] = 1, 1, 1 + C[3, X], C[3, NY] = 1, -1 + C[3, A_], C[3, NY + 1] = p['xi'], -p['xi'] + C[3, Z] = 1 + if np.max(np.abs(np.linalg.eigvals(A))) > 1 - 1e-9: + return None, None, None, 'unit or explosive root' + return A, B, C, 'ok' + + +def h_zero(p, rule='money'): + """(h_pi,dm(0), h_R,dm(0)) implied by the model at parameters p.""" + A, B, C, status = state_space(p, rule) + if status != 'ok': + return np.nan, np.nan + return (h_zero_from_state_space(A, B, C, 1, 0), + h_zero_from_state_space(A, B, C, 2, 0)) +``` + +这一检验很重要。 + +如果没有它,像 $\phi_\pi = 1$、$\phi_x = 0$ 这样的一点会返回 $h_{\pi,\Delta m}(0) = h_{R,\Delta m}(0) = 1.000$,看起来像是对卢卡斯两个例证的完美确认。 + +那一点处转移矩阵恰好有一个等于一的根,零频率处的谱密度并不存在,而那两个数字来自对一个条件数约为 $10^{16}$ 的矩阵求逆。 + +那一点正好处于论文图 6 所绘范围的右上角。 + +我们在下文表明,在论文自身表 2 的后验均值处,整整一条带状区域并不存在协方差平稳均衡。 + +现在我们可以对照论文来检验我们的实现。 + +在表 2 的后验均值处,{cite:t}`SargentSurico2011` 报告的蕴含值为 $h_{\pi,\Delta m}(0) = 1.0068$ 和 $h_{R,\Delta m}(0) = 0.8163$。 + +```{code-cell} ipython3 +PAPER = dict(theta=0.9901, alpha_pi=0.8815, kappa=0.0324, tau=3.5126, + alpha_x=0.4775, sigma=0.0997, xi=3.0319, gamma=3.8128, + phi_pi=0.2312, phi_x=-0.1971, rho_m=0.7428, rho_e=0.5645, + rho_a=0.9241, rho_chi=0.5024, sig_e=1.0922, sig_a=0.7226, + sig_chi=0.2388, sig_z=1.5845, sig_m=1.1457) + +print('h at the posterior means of Table 2: %.4f, %.4f' % h_zero(PAPER)) +print('reported in Table 2: 1.0068, 0.8163') +``` + +我们独立实现的结果与论文一致。 + +这让我们对我们理解方程 {eq}`eq:ss_nkpc` 到 {eq}`eq:ss_mrule` 的方式与作者原意相符有了信心。 + +### 检验这三个论断 + +现在我们验证前一节的三个观察。 + +```{code-cell} ipython3 +print('scaling tau and sigma_e together leaves h(0) untouched:') +for f in [0.5, 1.0, 2.0, 8.0]: + q = dict(PAPER, tau=PAPER['tau'] * f, sig_e=PAPER['sig_e'] * f) + print(f' tau, sigma_e scaled by {f:4.1f}: h_pi = {h_zero(q)[0]:.10f}') + +print('\nwith phi_pi = phi_x = 0, h_pi is exactly one for any other parameters:') +rng = np.random.default_rng(0) +for i in range(5): + q = dict(PAPER, phi_pi=0.0, phi_x=0.0, + kappa=rng.uniform(0.01, 0.3), alpha_pi=rng.uniform(0.1, 0.9), + alpha_x=rng.uniform(0.1, 0.9), sigma=rng.uniform(0.05, 0.5), + gamma=rng.uniform(1, 8), rho_m=rng.uniform(0, 0.95), + sig_z=rng.uniform(0.2, 3.0), xi=rng.uniform(0.5, 5.0)) + print(f' draw {i}: h_pi = {h_zero(q)[0]:.12f} h_R = {h_zero(q)[1]:.4f}') + +print('\ndeterminacy on both sides of alpha_x = 0.5:') +for ax in [0.30, 0.45, 0.499, 0.501, 0.60, 0.80]: + print(f' alpha_x = {ax:5.3f}: {state_space(dict(PAPER, alpha_x=ax))[3]}') +``` + +三个论断都成立。 + +似然函数在 $(\tau, \sigma_e)$ 的缩放变换下保持不变,第一个单位斜率在货币增长外生时是一个恒等式,且模型在 $\alpha_x = 1/2$ 两侧都是可决的。 + +还要注意,$h_{R,\Delta m}(0)$ 在这些相同的抽样中变化很大,这正是 {prf:ref}`ss_prop` 所预测的两个例证之间的不对称性。 + +最后,这里是图 6 所示政策网格中的一条带状区域,在论文自身的后验均值处,该区域不存在协方差平稳均衡。 + +```{code-cell} ipython3 +for phi_x in [0.0, -0.25, -0.5]: + bad = [round(g, 2) for g in np.linspace(-3, 1, 41) + if state_space(dict(PAPER, phi_pi=g, phi_x=phi_x))[3] != 'ok'] + print(f'phi_x = {phi_x:5.2f}: no stationary equilibrium at phi_pi in ' + f'{bad if bad else "none of the grid"}') +``` + +该带状区域远离估计出的政策规则,因此论文的结论并不受此影响。 + +但如果在该区域上报告 $h(0)$,那将是从一个并不存在的谱密度中计算出来的数字。 + +## 贝叶斯估计 + +我们在论文所用样本 1960:I-1983:IV 上估计货币增长规则版本。 + +四个可观测变量已去均值化,因为模型是以偏离稳态的形式写出的。 + +```{code-cell} ipython3 +mask = (data.index.year >= 1960) & (data.index.year <= 1983) +Y_est = data.loc[mask, VARS].values +Y_est = Y_est - Y_est.mean(0) +print(f'estimation sample: {mask.sum()} quarters, ' + f'{data.index[mask][0].date()} to {data.index[mask][-1].date()}') +``` + +### 似然函数 + +给定 $(A, B, C)$,似然函数可由卡尔曼滤波得出。 + +我们将状态初始化在其无条件均值和协方差处,后者通过求解离散李雅普诺夫方程 $P = A P A' + BB'$ 得到。 + +```{code-cell} ipython3 +def loglik(p, Y, rule='money'): + """Kalman filter log likelihood of Y (T x 4) at parameters p.""" + A, B, C, status = state_space(p, rule) + if status != 'ok': + return -np.inf + Q = B @ B.T + try: + P = solve_discrete_lyapunov(A, Q) + except Exception: + return -np.inf + s = np.zeros(A.shape[0]) + ll, const = 0.0, Y.shape[1] * np.log(2 * np.pi) + for t in range(Y.shape[0]): + s = A @ s + P = A @ P @ A.T + Q + v = Y[t] - C @ s # forecast error + PCt = P @ C.T + F = C @ PCt # its covariance + try: + L = np.linalg.cholesky(F) + except np.linalg.LinAlgError: + return -np.inf + u = np.linalg.solve(L, v) + ll -= 0.5 * (const + 2 * np.sum(np.log(np.diag(L))) + u @ u) + K = np.linalg.solve(F, PCt.T).T # Kalman gain + s, P = s + K @ v, P - K @ PCt.T + return ll if np.isfinite(ll) else -np.inf +``` + +### 先验 + +我们使用表 2 的先验均值和标准差,通过矩匹配来选定每个分布族的参数。 + +```{code-cell} ipython3 +def beta_prior(m, s): + nu = m * (1 - m) / s ** 2 - 1 + return stats.beta(m * nu, (1 - m) * nu) + + +def gamma_prior(m, s): + return stats.gamma(m ** 2 / s ** 2, scale=s ** 2 / m) + + +def invgamma_prior(m, s): + a = m ** 2 / s ** 2 + 2 + return stats.invgamma(a, scale=m * (a - 1)) + + +PRIOR, SUPPORT = {}, {} +for n, (m, s) in [('theta', (0.99, 0.005)), ('alpha_pi', (0.5, 0.2)), + ('alpha_x', (0.5, 0.2)), ('rho_m', (0.5, 0.05)), + ('rho_e', (0.5, 0.1)), ('rho_a', (0.5, 0.1)), + ('rho_chi', (0.5, 0.1))]: + PRIOR[n], SUPPORT[n] = beta_prior(m, s), (1e-6, 1 - 1e-6) +for n, (m, s) in [('kappa', (0.3, 0.1)), ('sigma', (0.1, 0.05)), + ('xi', (2.0, 1.0)), ('gamma', (4.0, 1.0))]: + PRIOR[n], SUPPORT[n] = gamma_prior(m, s), (1e-8, np.inf) +for n in ['phi_pi', 'phi_x']: + PRIOR[n], SUPPORT[n] = stats.norm(0, 0.5), (-np.inf, np.inf) +for n in ['sig_e', 'sig_a', 'sig_chi', 'sig_z', 'sig_m']: + PRIOR[n], SUPPORT[n] = invgamma_prior(0.3, 1.0), (1e-8, np.inf) + +FREE = ['theta', 'alpha_pi', 'kappa', 'alpha_x', 'sigma', 'xi', 'gamma', + 'phi_pi', 'phi_x', 'rho_m', 'rho_e', 'rho_a', 'rho_chi', + 'sig_e', 'sig_a', 'sig_chi', 'sig_z', 'sig_m'] +TAU = 4.0 # not identified; fixed at its prior mean + + +def unpack(v): + return dict({n: float(x) for n, x in zip(FREE, v)}, tau=TAU) + + +def log_post(v, Y): + lp = 0.0 + for n, x in zip(FREE, v): + lo, hi = SUPPORT[n] + if not lo < x < hi: + return -np.inf + lp += PRIOR[n].logpdf(x) + return lp + loglik(unpack(v), Y) +``` + +### 后验众数 + +我们从论文的后验均值开始搜索,使用鲍威尔的无导数方法,并用梯度方法进行精修。 + +```{code-cell} ipython3 +v_start = np.array([PAPER[n] for n in FREE]) +neg_log_post = lambda v: -log_post(v, Y_est) + +res = optimize.minimize(neg_log_post, v_start, method='Powell', + options=dict(maxiter=20000, maxfev=20000)) +res = optimize.minimize(neg_log_post, res.x, method='L-BFGS-B', + bounds=[SUPPORT[n] for n in FREE]) +v_mode = res.x +print(f'log posterior at the paper\'s means: {log_post(v_start, Y_est):10.3f}') +print(f'log posterior at the mode: {-res.fun:10.3f}') +print('h(0) at the mode: %.4f, %.4f' % h_zero(unpack(v_mode))) +``` + +```{note} +从论文的估计值开始搜索,会找到离它们最近的那个众数。 + +本讲座末尾的哈密顿蒙特卡洛部分会发现,这只是一个*局部*众数,而后验存在另一个密度更高的众数。 +``` + +### 随机游走 Metropolis-Hastings + +标准的提议协方差是在众数处对负对数后验求逆黑塞矩阵,我们用有限差分法计算它。 + +```{code-cell} ipython3 +def numerical_hessian(f, v, rel=1e-4): + n = len(v) + h = rel * np.maximum(np.abs(v), 1e-2) + H = np.zeros((n, n)) + for i in range(n): + for j in range(i, n): + ei, ej = np.zeros(n), np.zeros(n) + ei[i], ej[j] = h[i], h[j] + H[i, j] = H[j, i] = (f(v + ei + ej) - f(v + ei - ej) + - f(v - ei + ej) + f(v - ei - ej)) / (4 * h[i] * h[j]) + return H + + +H = numerical_hessian(neg_log_post, v_mode) +Sigma_prop = np.linalg.inv(H) +print('proposal covariance is positive definite:', + np.all(np.linalg.eigvalsh(H) > 0)) +``` + +```{code-cell} ipython3 +def rwmh(Y, v0, Sigma, n_draws, c=0.45, seed=42): + """Random walk Metropolis-Hastings in the natural parameter space.""" + rng = np.random.default_rng(seed) + L = np.linalg.cholesky(Sigma) + v, lp = v0.copy(), log_post(v0, Y) + draws, n_acc = np.empty((n_draws, len(v))), 0 + for i in range(n_draws): + cand = v + c * (L @ rng.standard_normal(len(v))) + lp_cand = log_post(cand, Y) + if np.log(rng.random()) < lp_cand - lp: + v, lp, n_acc = cand, lp_cand, n_acc + 1 + draws[i] = v + return draws, n_acc / n_draws +``` + +落在先验支撑之外的抽样会被赋予 $-\infty$ 并被拒绝,因此我们可以直接在自然参数空间中工作,而无需进行变换。 + +下面的链足够短,可以让你一边阅读一边运行;真正认真的应用需要更多的抽样。 + +```{code-cell} ipython3 +N_DRAWS, BURN = 30_000, 10_000 + +t0 = time.time() +draws, acc_rate = rwmh(Y_est, v_mode, Sigma_prop, N_DRAWS) +rwmh_seconds = time.time() - t0 + +kept = draws[BURN::5] +print(f'acceptance rate {acc_rate:.3f}, {len(kept)} retained draws, ' + f'{rwmh_seconds:.0f} seconds') +``` + +```{code-cell} ipython3 +fig, axes = plt.subplots(2, 3, figsize=(12, 5)) +for ax, n in zip(axes.flat, ['phi_pi', 'phi_x', 'rho_m', + 'alpha_pi', 'kappa', 'sigma']): + j = FREE.index(n) + ax.plot(draws[:, j], lw=0.4, color='C0') + ax.axvline(BURN, color='C3', ls='--', lw=1) + ax.set_title(n) +fig.suptitle('Metropolis-Hastings traces, dashed line ends the burn-in') +plt.tight_layout() +plt.show() +``` + +```{code-cell} ipython3 +summary = pd.DataFrame({ + 'prior mean': [PRIOR[n].mean() for n in FREE], + 'post. mean': kept.mean(0), + '5th': np.percentile(kept, 5, axis=0), + '95th': np.percentile(kept, 95, axis=0), + 'paper': [PAPER[n] for n in FREE]}, index=FREE) +summary.round(4) +``` + +我们的估计值明显与表 2 的相符,其差异也是不同利率序列和不同数据版本所应产生的差异。 + +菲利普斯曲线具有强烈的向后看性质且斜率平缓,IS 曲线则远没有那么强的向后看性质。 + +对下文而言最重要的是,货币增长规则对通货膨胀的反应很弱,$\phi_\pi$ 的后验横跨零点,并且带有相当程度的平滑。 + +这正是论文对 1984 年前政体的核心解读:美联储将持续的、近乎外生的波动注入到货币增长之中。 + +由 {prf:ref}`ss_prop` 可知,这正是卢卡斯第一个例证成立的那种配置,这也正是为什么论文自己在表 2 中对 $h_{\pi,\Delta m}(0)$ 的后验会如此紧密地围绕一。 + +### $h(0)$ 的后验分布 + +结构参数的每一次抽样都蕴含一对低频斜率。 + +```{code-cell} ipython3 +h_draws = np.array([h_zero(unpack(v)) for v in kept]) + +fig, axes = plt.subplots(1, 2, figsize=(11, 3.8)) +for ax, j, ttl in zip(axes, [0, 1], + [r'$h_{\pi,\Delta m}(0)$', r'$h_{R,\Delta m}(0)$']): + ax.hist(h_draws[:, j], bins=60, color='C0', alpha=0.8, density=True) + ax.axvline(1, color='0.3', ls='--', lw=1.5) + ax.set_title(f'{ttl} mean {h_draws[:, j].mean():.3f}, ' + f'90% [{np.percentile(h_draws[:, j], 5):.3f}, ' + f'{np.percentile(h_draws[:, j], 95):.3f}]') +fig.suptitle('Posterior of the low-frequency slopes implied by the model') +plt.tight_layout() +plt.show() +``` + +估计出的模型在一个非常接近卢卡斯所用样本的样本上,重现了他的两个例证。 + +将这些结果与我们前面计算得到的 1960-1983 年 VAR 估计值,以及论文报告的后验均值 1.0068 和 0.8163 相比较。 + +## 货币政策如何移动低频斜率 + +现在来看论文的主要实验。 + +我们将每个结构参数锁定在其后验均值处,只改变两个政策系数,并在每一点上重新计算 $h(0)$。 + +```{code-cell} ipython3 +p_bar = unpack(kept.mean(0)) + + +def h_grid(p, rule, k1, k2, g1_vals, g2_vals): + H1 = np.full((len(g2_vals), len(g1_vals)), np.nan) + H2 = np.full_like(H1, np.nan) + for i, b in enumerate(g2_vals): + for j, a in enumerate(g1_vals): + H1[i, j], H2[i, j] = h_zero(dict(p, **{k1: a, k2: b}), rule) + return H1, H2 + + +phi_pi_grid = np.linspace(-3, 1, 49) +phi_x_grid = np.linspace(-1, 0, 25) +Hpi, HR = h_grid(p_bar, 'money', 'phi_pi', 'phi_x', phi_pi_grid, phi_x_grid) +``` + +```{code-cell} ipython3 +def contour_panel(g1_vals, g2_vals, H1, H2, xlab, ylab, suptitle, scatter=None): + fig, axes = plt.subplots(1, 2, figsize=(12, 4.4), sharey=True) + for ax, Hm, ttl in zip(axes, [H1, H2], + [r'$h_{\pi,\Delta m}(0)$', r'$h_{R,\Delta m}(0)$']): + cs = ax.contourf(g1_vals, g2_vals, Hm, levels=14, cmap='viridis') + ax.contour(g1_vals, g2_vals, Hm, levels=[0.2, 1.0], + colors=['white', 'red'], linewidths=1.8) + ax.contourf(g1_vals, g2_vals, np.isnan(Hm).astype(float), + levels=[0.5, 1.5], colors=['0.85']) + if scatter is not None: + ax.scatter(*scatter, s=1.5, color='k', alpha=0.25) + fig.colorbar(cs, ax=ax) + ax.set(title=ttl, xlabel=xlab) + axes[0].set_ylabel(ylab) + fig.suptitle(suptitle) + plt.tight_layout() + plt.show() + + +contour_panel(phi_pi_grid, phi_x_grid, Hpi, HR, r'$\phi_\pi$', r'$\phi_x$', + 'Low-frequency slopes under the money growth rule\n' + '(white contour: 0.2, red contour: 1.0, dots: posterior draws)', + scatter=(kept[:, FREE.index('phi_pi')], + kept[:, FREE.index('phi_x')])) +``` + +有三点浮现出来,它们正是论文的三个发现。 + +低频斜率*并非*政策不变的:仅仅移动 $(\phi_\pi, \phi_x)$ 就能使 $h_{\pi,\Delta m}(0)$ 扫过滚动 VAR 所显示范围的大部分。 + +后验抽样的点云聚集在两个斜率都接近一的区域,这正是 1960-1983 年数据所处的位置。 + +而更加激进的抗通胀立场,即较大的*负*的 $\phi_\pi$(意味着当通胀上升时货币增长被大力削减),会使两个斜率都远远低于一,最小值出现在 $\phi_x$ 也接近零的那个角落。 + +红色等高线标出了 $h(0) = 1$ 的位置,正如 {prf:ref}`ss_prop` 所要求的那样,它恰好穿过 $\phi_\pi = \phi_x = 0$ 这一点。 + +任何灰色区域都对应着不存在唯一协方差平稳均衡、$h(0)$ 不存在的情形。 + +以下是斜率触底的位置、在政策系数 $\phi_x$ 后验均值处的一个网格切片,以及平稳性检验剔除掉的网格比例。 + +```{code-cell} ipython3 +print(f'no stationary equilibrium at {np.isnan(Hpi).mean():.0%} of grid points') +for name, Hm in [('h_pi', Hpi), ('h_R', HR)]: + i, j = np.unravel_index(np.nanargmin(Hm), Hm.shape) + print(f' smallest {name:5s} = {Hm[i, j]:6.3f} at ' + f'phi_pi = {phi_pi_grid[j]:5.2f}, phi_x = {phi_x_grid[i]:5.2f}') + +row = np.argmin(np.abs(phi_x_grid - p_bar['phi_x'])) +print(f'\nslice at phi_x = {phi_x_grid[row]:.3f}') +for j in range(0, len(phi_pi_grid), 6): + print(f' phi_pi = {phi_pi_grid[j]:6.2f}: ' + f'h_pi = {Hpi[row, j]:7.3f}, h_R = {HR[row, j]:7.3f}') +``` + +### 用泰勒规则重复同样的练习 + +论文用利率规则 {eq}`eq:ss_trule` 重复了这一实验。 + +我们将平滑系数和政策冲击标准差固定在货币规则的估计值处,改变 $(\psi_\pi, \psi_x)$。 + +在泰勒规则使均衡不可决的地方,我们只是将其记录下来,并将这些区域涂成灰色;论文则选用了 {cite:t}`LubikSchorfheide2004` 的正交解。 + +```{code-cell} ipython3 +p_taylor = dict(p_bar, rho_r=p_bar['rho_m'], psi_pi=1.5, psi_x=0.5) +psi_pi_grid = np.linspace(0, 3, 37) +psi_x_grid = np.linspace(0, 1, 21) +Tpi, TR = h_grid(p_taylor, 'taylor', 'psi_pi', 'psi_x', + psi_pi_grid, psi_x_grid) + +print(f'indeterminate or nonexistent at {np.isnan(Tpi).mean():.0%} of grid points') +print(f'h_pi ranges over [{np.nanmin(Tpi):.2f}, {np.nanmax(Tpi):.2f}]') +print(f'h_R ranges over [{np.nanmin(TR):.2f}, {np.nanmax(TR):.2f}]') + +contour_panel(psi_pi_grid, psi_x_grid, Tpi, TR, r'$\psi_\pi$', r'$\psi_x$', + 'Low-frequency slopes under a Taylor rule\n' + '(gray: no unique stable equilibrium)') +``` + +对政策的依赖依然存在,但要弱得多。 + +在可决区域内,泰勒规则无法将任一斜率驱动到接近零的水平。 + +这正是论文发现的利率规则"较难复现估计结果"的地方。 + +分解式 {eq}`eq:ss_decomp` 提供了一个原因。 + +要将 $h_{\pi,\Delta m}(0)$ 推向零,需要使比值 $S_{z,\pi+z}(0)/S_{\pi+z}(0)$ 接近一,实际上这意味着挤压通货膨胀的零频率功率,直到 $\pi_t + z_t$ 被技术所主导。 + +一个带有很大负 $\phi_\pi$ 的货币增长规则恰恰能做到这一点,因为中央银行是在直接选择 {eq}`eq:ss_qtm` 的左边。 + +而泰勒规则则是设定利率,让货币增长由货币需求决定,因此它对通货膨胀相对于货币增长的低频行为几乎没有掌控力,$h_{\pi,\Delta m}(0)$ 就一直停留在接近一的水平。 + +## 用哈密顿蒙特卡洛进行估计 + +产生我们后验的随机游走采样器,是 DSGE 估计的传统主力方法。 + +它也是低效的,而我们可以衡量这种低效程度。 + +本节将萨金特-苏里科模型用作现代替代方法的实验样本。 + +### 随机游走给出了什么 + +一条长度为 $N$ 的相关链所蕴含的信息量,少于 $N$ 个独立抽样,**有效样本量**给出了具体是多少。 + +```{code-cell} ipython3 +import arviz as az + +rwmh_idata = az.from_dict( + {'posterior': {n: kept[:, j][None, :] for j, n in enumerate(FREE)}}) +rwmh_summary = az.summary(rwmh_idata, var_names=FREE) +print(rwmh_summary[['mean', 'sd', 'ess_bulk']].to_string()) +print(f'\n{len(kept)} retained draws out of {N_DRAWS}, in {rwmh_seconds:.0f} seconds') +print(f'smallest effective sample size = {rwmh_summary["ess_bulk"].min():.0f}') +``` + +数万次迭代大约只能为混合最差的参数换来一百个左右的独立抽样。 + +原因体现在提议分布上。 + +随机游走在全部十八个参数的方向上进行扰动,而这个方向对后验的局部形状一无所知,因此步长必须迁就最受约束的方向,而最松弛的方向也只能以同样缓慢的速度被探索。 + +我们的后验尺度很差。 + +```{code-cell} ipython3 +w = np.linalg.eigvalsh(H) +print(f'condition number of the posterior Hessian {w.max() / w.min():10.3g}') +print(f'ratio of longest to shortest posterior scale {np.sqrt(w.max() / w.min()):10.0f}') +``` + +### 为什么哈密顿方法对 DSGE 模型来说很棘手 + +**哈密顿蒙特卡洛** {cite}`DuaneEtAl1987,Neal2011` 将参数向量视为一个粒子的位置,赋予它一个随机的动量,并模拟哈密顿动力学,其中负对数后验扮演势能的角色。 + +轨迹沿着分布的等高线移动,而不是横冲直撞地穿过它们,因此一个提议可以移动很长的距离,同时仍被接受。 + +**无掉头采样器** {cite}`HoffmanGelman2014` 消除了对轨迹长度进行调优的需要,它将每条轨迹延伸,直到它开始向回折返为止。 + +{cite:t}`Betancourt2017` 给出了一个概念性的介绍。 + +代价是需要梯度 $\nabla_\theta \log p(\theta \mid Y)$。 + +这正是 DSGE 模型变得棘手的地方。 + +我们的似然函数要经过 `gensys`,其第一个动作是一次*排序*的广义舒尔分解:它计算广义特征值,按模**排序**,并重新排列分解以与之匹配。 + +排序是一个离散操作,而没有哪个自动微分库能够通过它传播导数。 + +正是这一点,而不是任何统计上的反对意见,才是哈密顿方法在 DSGE 估计中仍不常见的原因。 + +### 一个可微的求解器 + +障碍在于*算法*,而不在于模型本身,因此我们更换算法。 + +将均衡条件写为 + +$$ +F_A\, \mathbb{E}_t y_{t+1} + F_B\, y_t + F_C\, y_{t-1} + F_E\, \varepsilon_t = 0 , +$$ (eq:ss_structural) + +其中 + +$$ +y_t = [\pi_t,\ x_t,\ \Delta m_t,\ R_t,\ e_t,\ a_t,\ \chi_t,\ z_t,\ u_t]' +$$ + +且 $u_t = \varepsilon_{mt}$ 携带货币规则冲击。 + +`gensys` 所需要的辅助预期变量在这里并不需要。 + +假设一个解的形式为 + +$$ +y_t = G\, y_{t-1} + \Theta\, \varepsilon_t . +$$ (eq:ss_conjecture) + +那么 $\mathbb{E}_t y_{t+1} = G y_t$,方程 {eq}`eq:ss_structural` 变为 + +$$ +(F_A G + F_B)\, y_t + F_C\, y_{t-1} + F_E\, \varepsilon_t = 0 . +$$ + +求解出 $y_t$ 并与 {eq}`eq:ss_conjecture` 匹配系数,得到一个只含 $G$ 的不动点, + +$$ +G = -(F_A G + F_B)^{-1} F_C , +\qquad +\Theta = -(F_A G + F_B)^{-1} F_E . +$$ (eq:ss_fixedpoint) + +从 $G = 0$ 开始迭代 {eq}`eq:ss_fixedpoint`,其中只涉及矩阵乘积和线性求解,每一步都是可微的。 + +```{code-cell} ipython3 +import jax +import jax.numpy as jnp +import numpyro +import numpyro.distributions as dist +from jax import lax +from numpyro.infer import MCMC, NUTS + +jax.config.update('jax_enable_x64', True) +jax.config.update('jax_platform_name', 'cpu') + +U, NJ = 8, 9 # y = [pi, x, dm, R, e, a, chi, z, u] + + +def structural(p): + """Return F_A, F_B, F_C, F_E of equation (SS-structural).""" + th, api, kap = p['theta'], p['alpha_pi'], p['kappa'] + ax, sig, xi, gam = p['alpha_x'], p['sigma'], p['xi'], p['gamma'] + rm, ra = p['rho_m'], p['rho_a'] + FA = jnp.zeros((NJ, NJ)); FB = jnp.zeros((NJ, NJ)) + FC = jnp.zeros((NJ, NJ)); FE = jnp.zeros((NJ, 5)) + + FA = FA.at[0, PI].set(-th * (1 - api)) # Phillips curve + FB = FB.at[0, PI].set(1).at[0, X].set(-kap).at[0, E].set(1 / TAU) + FC = FC.at[0, PI].set(-th * api) + + FA = FA.at[1, X].set(-(1 - ax)).at[1, PI].set(-sig) # IS curve + FB = (FB.at[1, X].set(1).at[1, R].set(sig) + .at[1, A_].set(-sig * (1 - xi) * (1 - ra))) + FC = FC.at[1, X].set(-ax) + + FB = FB.at[2, DM].set(1).at[2, PI].set(-1).at[2, Z].set(-1) # money demand + FB = (FB.at[2, X].set(-1 / (sig * gam)).at[2, R].set(1 / gam) + .at[2, CH].set(-1 / gam).at[2, A_].set(1 / gam)) + FC = (FC.at[2, X].set(1 / (sig * gam)).at[2, R].set(-1 / gam) + .at[2, CH].set(1 / gam).at[2, A_].set(-1 / gam)) + + FB = (FB.at[3, DM].set(1).at[3, U].set(-1) # policy rule + .at[3, PI].set(-(1 - rm) * p['phi_pi']) + .at[3, X].set(-(1 - rm) * p['phi_x'])) + FC = FC.at[3, DM].set(-rm) + + for row, (v, rho, k) in enumerate([(E, p['rho_e'], 0), (A_, ra, 1), + (CH, p['rho_chi'], 2), (Z, 0.0, 3)], 4): + FB = FB.at[row, v].set(1) + FC = FC.at[row, v].set(-rho) + FE = FE.at[row, k].set(-1) + FB = FB.at[8, U].set(1) + FE = FE.at[8, 4].set(-1) + return FA, FB, FC, FE + + +def solve_fixed_point(p, n_iter=60): + """Iterate (SS-fixedpoint) to convergence; differentiable throughout.""" + FA, FB, FC, FE = structural(p) + + def step(G, _): + return -jnp.linalg.solve(FA @ G + FB, FC), None + + G, _ = lax.scan(step, jnp.zeros((NJ, NJ)), None, length=n_iter) + return G, -jnp.linalg.solve(FA @ G + FB, FE) +``` + +在信任它之前,我们在论文的后验均值处将其与 `gensys` 进行核对。 + +这两个算法没有共享任何代码,因此在机器精度上的一致性是一个真正的检验。 + +```{code-cell} ipython3 +p_check = {n: float(PAPER[n]) for n in FREE} +G_fp, Theta_fp = solve_fixed_point(p_check) + +A_gen, B_gen, C_gen, _ = state_space(dict(p_check, tau=TAU)) +idx = [PI, X, DM, R, E, A_, CH, Z] +sd_check = np.array([p_check[n] for n in + ['sig_e', 'sig_a', 'sig_chi', 'sig_z', 'sig_m']]) + +print('fixed point versus gensys') +print(f' transition matrix max abs difference ' + f'{np.abs(np.asarray(G_fp)[np.ix_(idx, idx)] - A_gen[:10, :10][np.ix_(idx, idx)]).max():.2e}') +print(f' shock loadings max abs difference ' + f'{np.abs(np.asarray(Theta_fp * sd_check)[idx] - B_gen[:10][idx]).max():.2e}') +``` + +```{note} +当存在稳定解时,不动点会收敛到该稳定解,但与 `gensys` 不同,它不会返回存在性和唯一性的标志。 + +因此,我们在上一节的可决性图中保留使用 `gensys`,只在需要求导的地方使用不动点方法。 +``` + +### JAX 中的似然函数 + +卡尔曼滤波保持不变地照搬过来,用 `lax.scan` 来编写,以便它也能够被求导。 + +唯一实质性的变化是初始协方差:我们不再调用一个李雅普诺夫求解器,而是使用 $\operatorname{vec}(P) = (I - A \otimes A)^{-1}\operatorname{vec}(Q)$,这只是一次线性求解。 + +```{code-cell} ipython3 +def state_space_jax(p): + G, Theta = solve_fixed_point(p) + sd = jnp.array([p['sig_e'], p['sig_a'], p['sig_chi'], p['sig_z'], p['sig_m']]) + n = NJ + 2 # append x(-1) and a(-1) + A = jnp.zeros((n, n)).at[:NJ, :NJ].set(G) + A = A.at[NJ, X].set(1).at[NJ + 1, A_].set(1) + B = jnp.zeros((n, 5)).at[:NJ].set(Theta * sd) + C = jnp.zeros((4, n)) + C = C.at[0, DM].set(1).at[1, PI].set(1).at[2, R].set(1) + C = C.at[3, X].set(1).at[3, NJ].set(-1) + C = C.at[3, A_].set(p['xi']).at[3, NJ + 1].set(-p['xi']) + C = C.at[3, Z].set(1) + return A, B, C + + +def loglik_jax(p, Y): + A, B, C = state_space_jax(p) + n = A.shape[0] + Q = B @ B.T + P0 = jnp.linalg.solve(jnp.eye(n * n) - jnp.kron(A, A), + Q.reshape(-1)).reshape(n, n) + const = Y.shape[1] * jnp.log(2 * jnp.pi) + + def step(carry, y): + s, P = carry + s, P = A @ s, A @ P @ A.T + Q + v = y - C @ s + PCt = P @ C.T + F = C @ PCt + L = jnp.linalg.cholesky(F) + u = jax.scipy.linalg.solve_triangular(L, v, lower=True) + ll = -0.5 * (const + 2 * jnp.sum(jnp.log(jnp.diag(L))) + u @ u) + K = jnp.linalg.solve(F, PCt.T).T + return (s + K @ v, P - K @ PCt.T), ll + + _, lls = lax.scan(step, (jnp.zeros(n), P0), Y) + return jnp.sum(lls) +``` + +两项检查:新的似然函数必须与我们用于随机游走的那个一致,其梯度必须与有限差分一致。 + +```{code-cell} ipython3 +Y_jax = jnp.asarray(Y_est) +print(f'log likelihood, JAX {float(loglik_jax(p_check, Y_jax)):.8f}') +print(f'log likelihood, NumPy {loglik(dict(p_check, tau=TAU), Y_est):.8f}') + +grad_ll = jax.jit(jax.grad(lambda q: loglik_jax(q, Y_jax))) +g = grad_ll(p_check) + +print('\n autodiff finite difference') +for n in ['phi_pi', 'kappa', 'rho_m', 'sig_z']: + step_n = 1e-5 + up = dict(p_check); up[n] = p_check[n] + step_n + dn = dict(p_check); dn[n] = p_check[n] - step_n + fd = (loglik_jax(up, Y_jax) - loglik_jax(dn, Y_jax)) / (2 * step_n) + print(f' {n:8s} {float(g[n]):12.5f} {float(fd):17.5f}') +``` + +```{code-cell} ipython3 +t0 = time.time() +for _ in range(20): + gg = grad_ll(p_check) +jax.block_until_ready(gg) +grad_ms = 1000 * (time.time() - t0) / 20 + +t0 = time.time() +for _ in range(20): + loglik(dict(p_check, tau=TAU), Y_est) +loglik_ms = 1000 * (time.time() - t0) / 20 + +print(f'one NumPy log likelihood {loglik_ms:6.2f} ms') +print(f'one JAX gradient (18 partials) {grad_ms:6.2f} ms') +``` + +一个完整的梯度所花的代价,大约相当于评估一次似然函数,这正是反向模式微分的全部意义所在。 + +而一个有限差分梯度至少需要十九次似然函数的评估。 + +### 用 NUTS 采样 + +我们将同样的先验交给 NumPyro {cite}`PhanEtAl2019`,它提供了 NUTS,并处理了哈密顿动力学所需的、到无约束空间的变换。 + +```{code-cell} ipython3 +def beta_np(m, s): + nu = m * (1 - m) / s ** 2 - 1 + return dist.Beta(m * nu, (1 - m) * nu) + + +def gamma_np(m, s): + return dist.Gamma(m ** 2 / s ** 2, m / s ** 2) + + +def invgamma_np(m, s): + a = m ** 2 / s ** 2 + 2 + return dist.InverseGamma(a, m * (a - 1)) + + +PRIORS_NP = { + 'theta': beta_np(0.99, 0.005), 'alpha_pi': beta_np(0.5, 0.2), + 'alpha_x': beta_np(0.5, 0.2), 'rho_m': beta_np(0.5, 0.05), + 'rho_e': beta_np(0.5, 0.1), 'rho_a': beta_np(0.5, 0.1), + 'rho_chi': beta_np(0.5, 0.1), + 'kappa': gamma_np(0.3, 0.1), 'sigma': gamma_np(0.1, 0.05), + 'xi': gamma_np(2.0, 1.0), 'gamma': gamma_np(4.0, 1.0), + 'phi_pi': dist.Normal(0, 0.5), 'phi_x': dist.Normal(0, 0.5), + 'sig_e': invgamma_np(0.3, 1.0), 'sig_a': invgamma_np(0.3, 1.0), + 'sig_chi': invgamma_np(0.3, 1.0), 'sig_z': invgamma_np(0.3, 1.0), + 'sig_m': invgamma_np(0.3, 1.0)} + + +def ss_model(Y): + p = {n: numpyro.sample(n, PRIORS_NP[n]) for n in FREE} + numpyro.factor('loglik', loglik_jax(p, Y)) +``` + +有三项设置很重要。 + +我们要求一个**稠密质量矩阵**,因为前面报告的条件数说明后验存在着对角预条件子无法吸收的相关性。 + +我们对轨迹长度设定上限,因为没有上限的话,NUTS 会把大部分时间花在最平坦方向上的很长轨迹上。 + +并且我们运行**四条链**而不是一条,都从后验众数处出发。 + +最后这一选择正是收获最大的地方。 + +```{code-cell} ipython3 +kernel = NUTS(ss_model, target_accept_prob=0.8, dense_mass=True, + max_tree_depth=8, + init_strategy=numpyro.infer.init_to_value( + values={n: float(v) for n, v in zip(FREE, v_mode)})) +mcmc = MCMC(kernel, num_warmup=400, num_samples=400, num_chains=4, + chain_method='sequential', progress_bar=False) + +t0 = time.time() +mcmc.run(jax.random.PRNGKey(1), Y_jax, extra_fields=('num_steps', 'diverging')) +jax.block_until_ready(mcmc.get_samples()) +nuts_seconds = time.time() - t0 + +extra = mcmc.get_extra_fields() +print(f'{nuts_seconds:.0f} seconds for 4 chains of 400 draws') +print(f'mean leapfrog steps per iteration ' + f'{np.asarray(extra["num_steps"]).mean():.0f}') +print(f'divergences ' + f'{int(np.asarray(extra["diverging"]).sum())}') +``` + +```{code-cell} ipython3 +nuts_idata = az.from_numpyro(mcmc) +nuts_summary = az.summary(nuts_idata, var_names=FREE, + ci_kind='hdi', ci_prob=0.94) +nuts_kept = np.column_stack([np.asarray(mcmc.get_samples()[n]) for n in FREE]) +nuts_summary[['mean', 'sd', 'hdi94_lb', 'hdi94_ub', 'ess_bulk', 'r_hat']] +``` + +### 诊断中的一个警示信号 + +大多数参数看起来非常好,$\hat R$ 都为一,有效样本量也有几百到几千。 + +有几个则不是这样,值得追问是哪几个。 + +```{code-cell} ipython3 +worst = nuts_summary['ess_bulk'].nsmallest(3).index.tolist() +print('weakest mixing:') +print(nuts_summary.loc[worst, ['mean', 'sd', 'ess_bulk', 'r_hat']]) + +by_chain = mcmc.get_samples(group_by_chain=True) +print('\nper-chain posterior means') +print(f'{"":10s}' + ''.join(f'{"chain " + str(c):>10s}' for c in range(4))) +for n in worst: + v = np.asarray(by_chain[n]) + print(f'{n:10s}' + ''.join(f'{v[c].mean():10.4f}' for c in range(4))) +``` + +各条链都从同一个点出发,因此如果它们之间存在分歧,就意味着其中一些链已经游荡到了其他链未曾到达的地方。 + +这些表现不佳的参数的身份是一条线索。 + +数据中的通货膨胀具有持续性,而方程 {eq}`eq:ss_nkpc` 提供了两种传递这种持续性的方式。 + +**内生持续性**来自对过去通胀的指数化,即一个较大的 $\alpha_\pi$,而加成冲击则保持是暂时性的。 + +**继承的持续性**来自一个持续性的加成冲击,即一个较大的 $\rho_e$,而指数化程度较小。 + +混合得最差的参数,恰恰是区分这两种叙事的参数。 + +这有理由让人怀疑后验存在不止一个众数,并告诉我们应该到哪里去寻找第二个众数。 + +### 两个众数 + +采样器诊断是一种带噪声的手段,因此我们改用优化器来解决这个问题。 + +我们在估计一节中的众数搜索,从论文的后验均值出发,攀升到了一个高指数化众数。 + +我们现在从相反的角落出发运行同一个优化器。 + +```{code-cell} ipython3 +v_start_a = v_mode.copy() +for n, val in [('alpha_pi', 0.12), ('rho_e', 0.84), ('sig_e', 0.35)]: + v_start_a[FREE.index(n)] = val + +res_a = optimize.minimize(neg_log_post, v_start_a, method='Powell', + options=dict(maxiter=20000, maxfev=20000)) +res_a = optimize.minimize(neg_log_post, res_a.x, method='L-BFGS-B', + bounds=[SUPPORT[n] for n in FREE]) +v_mode_a = res_a.x + +print(f'log posterior, low-indexation mode {-res_a.fun:10.3f}') +print(f'log posterior, high-indexation mode {log_post(v_mode, Y_est):10.3f}') +print('\n low-index high-index paper') +for n in ['alpha_pi', 'rho_e', 'sig_e', 'kappa', 'phi_pi', 'phi_x']: + i = FREE.index(n) + print(f' {n:9s}{v_mode_a[i]:10.4f}{v_mode[i]:13.4f}{PAPER[n]:11.4f}') +``` + +存在两个不同的众数,且低指数化众数的后验密度**更高**。 + +我们先前找到的众数,即最接近论文已发表估计值、也是我们随机游走用三万次抽样探索过的那个众数,实际上是一个*局部*众数。 + +汇总的 NUTS 抽样从采样的角度也表明了同样的情况。 + +```{code-cell} ipython3 +--- +mystnb: + figure: + caption: Marginal posteriors for the parameters that separate the two modes + name: fig-ss-bimodal +--- +fig, axes = plt.subplots(1, 3, figsize=(13, 3.8)) +for ax, n, ttl in zip(axes, ['alpha_pi', 'rho_e', 'sig_e'], + [r'$\alpha_\pi$: indexation', + r'$\rho_e$: markup persistence', + r'$\sigma_e$: markup volatility']): + i = FREE.index(n) + ax.hist(nuts_kept[:, i], bins=60, density=True, color='C0', alpha=0.8) + ax.axvline(v_mode_a[i], color='C2', lw=2, label='low-index mode') + ax.axvline(v_mode[i], color='C3', lw=2, label='high-index mode') + ax.axvline(PAPER[n], color='k', ls='--', lw=1.2, label='paper') + ax.set(title=ttl, xlabel=n) +axes[0].legend(fontsize=8) +fig.suptitle('The marginals spread across both modes rather than concentrating on one') +fig.tight_layout() +plt.show() +``` + +这些边缘分布很宽且呈现出块状,而不是其他每个参数所呈现的那种整齐的钟形曲线。 + +各条链确实在两个区域之间移动,但移动得很缓慢,而这种缓慢的移动正是那些较差的有效样本量所反映出来的情况。 + +三万次随机游走抽样根本从未完成过这次移动。 + +这两个众数背后的经济学解释是一个熟悉的识别问题。 + +1960-1983 年的数据无法告诉我们,通货膨胀之所以具有持续性,究竟是因为价格被指数化到过去的通货膨胀,还是因为推动通货膨胀波动的冲击本身就具有持续性。 + +两种叙事都能拟合数据,而已发表的估计值所描述的正是数据略微不太偏好的那一个。 + +### 双峰性是否改变了经济学结论? + +这是对本讲座其余部分而言最重要的问题。 + +```{code-cell} ipython3 +h_mode_a = h_zero(unpack(v_mode_a)) +h_mode_b = h_zero(unpack(v_mode)) +print(f'h(0) at the low-indexation mode {h_mode_a[0]:.4f}, {h_mode_a[1]:.4f}') +print(f'h(0) at the high-indexation mode {h_mode_b[0]:.4f}, {h_mode_b[1]:.4f}') + +h_nuts = np.array([h_zero(unpack(v)) for v in nuts_kept]) +low = nuts_kept[:, FREE.index('alpha_pi')] < 0.5 +print(f'\n{low.sum()} of {len(low)} NUTS draws sit on the low-indexation side') +for tag, m in [('low-indexation draws ', low), ('high-indexation draws', ~low)]: + if m.sum() < 20: + continue + print(f'{tag} h_pi {h_nuts[m, 0].mean():.4f} ' + f'[{np.percentile(h_nuts[m, 0], 5):.4f}, {np.percentile(h_nuts[m, 0], 95):.4f}]' + f' h_R {h_nuts[m, 1].mean():.4f} ' + f'[{np.percentile(h_nuts[m, 1], 5):.4f}, {np.percentile(h_nuts[m, 1], 95):.4f}]') +``` + +```{code-cell} ipython3 +fig, axes = plt.subplots(1, 2, figsize=(11, 3.8)) +for ax, j, ttl in zip(axes, [0, 1], + [r'$h_{\pi,\Delta m}(0)$', r'$h_{R,\Delta m}(0)$']): + ax.hist(h_draws[:, j], bins=50, density=True, alpha=0.55, + color='C0', label='RWMH') + ax.hist(h_nuts[:, j], bins=50, density=True, alpha=0.55, + color='C3', label='NUTS') + ax.axvline(1, color='0.3', ls='--', lw=1.5) + ax.set_title(ttl) + ax.legend(fontsize=9) +fig.suptitle('The low-frequency slopes are robust across samplers and modes') +plt.tight_layout() +plt.show() +``` + +令人放心的答案是:并没有改变。 + +这两个众数在通货膨胀*为何*具有持续性这一问题上分歧很大,但在本讲座所关注的低频斜率上分歧却小得多。 + +无论通货膨胀持续性是内生的还是继承而来的,$h_{\pi,\Delta m}(0)$ 都保持在大约五分之四到一之间,而 $h_{R,\Delta m}(0)$ 在两种情形下都接近五分之四。 + +论文的实质性结论在其参数估计描述的只是一个局部众数这一发现面前依然站得住脚。 + +### 比较两种采样器 + +解决了这个问题之后,我们可以回到效率问题上来。 + +区分两个众数的那三个参数的有效样本量在两种采样器之间不能直接比较,因为对 NUTS 而言,这些量部分反映的是众数*之间*的移动,而对随机游走而言,反映的是单一众数*内部*的移动。 + +因此我们比较中位数而不是最小值。 + +```{code-cell} ipython3 +compare = pd.DataFrame({ + 'RWMH mean': rwmh_summary['mean'], 'NUTS mean': nuts_summary['mean'], + 'RWMH ESS': rwmh_summary['ess_bulk'], 'NUTS ESS': nuts_summary['ess_bulk'], + 'NUTS r_hat': nuts_summary['r_hat']}) +compare['ESS ratio'] = compare['NUTS ESS'] / compare['RWMH ESS'] +compare.round(3) +``` + +```{code-cell} ipython3 +unimodal = ~nuts_summary.index.isin(worst) +r_med = rwmh_summary['ess_bulk'][unimodal].median() +n_med = nuts_summary['ess_bulk'][unimodal].median() + +print(f'{"":26s}{"RWMH":>12s}{"NUTS":>12s}') +print(f'{"draws kept":26s}{len(kept):12d}{len(nuts_kept):12d}') +print(f'{"seconds":26s}{rwmh_seconds:12.0f}{nuts_seconds:12.0f}') +print(f'{"median ESS":26s}{r_med:12.0f}{n_med:12.0f}') +print(f'{"median ESS per 1000 draws":26s}{1000 * r_med / len(kept):12.1f}' + f'{1000 * n_med / len(nuts_kept):12.1f}') +print(f'{"median ESS per second":26s}{r_med / rwmh_seconds:12.2f}' + f'{n_med / nuts_seconds:12.2f}') +print(f'\n{"speed-up in ESS per second":30s}' + f'{(n_med / nuts_seconds) / (r_med / rwmh_seconds):6.1f}x') +``` + +按每次抽样计算,差距非常大,因为每一次 NUTS 抽样都是一条穿越后验分布的轨迹的终点,而不是迈出的一小步随机步伐。 + +计算代价则挽回了一部分差距,因为一次 NUTS 迭代需要多次梯度评估,而一次随机游走迭代只需要一次似然评估。 + +真正重要的比值是每秒的有效抽样数,而它仍然大幅度地偏向 NUTS。 + +```{code-cell} ipython3 +:tags: [hide-input] + +fig, axes = plt.subplots(1, 2, figsize=(12, 4.5)) +order = np.argsort(rwmh_summary['ess_bulk'].values) +pos = np.arange(len(FREE)) +axes[0].barh(pos - 0.2, rwmh_summary['ess_bulk'].values[order], 0.4, + label='RWMH', color='C0') +axes[0].barh(pos + 0.2, nuts_summary['ess_bulk'].values[order], 0.4, + label='NUTS', color='C3') +axes[0].set(yticks=pos, yticklabels=[FREE[i] for i in order], + xlabel='effective sample size', title='ESS by parameter') +axes[0].legend() + +j = FREE.index('rho_a') +axes[1].plot(np.linspace(0, 1, len(kept)), kept[:, j], lw=0.5, color='C0', + alpha=0.8, label=f'RWMH ({len(kept)} draws)') +axes[1].plot(np.linspace(0, 1, len(nuts_kept)), nuts_kept[:, j], lw=0.5, + color='C3', alpha=0.8, label=f'NUTS ({len(nuts_kept)} draws)') +axes[1].set(xlabel='fraction of the run', ylabel=r'$\rho_a$', + title=r'traces for $\rho_a$, a parameter both samplers agree on') +axes[1].legend() +fig.tight_layout() +plt.show() +``` + +### 应当汲取的教训 + +在 DSGE 估计中阻碍哈密顿方法应用的是模型求解器,而不是统计学本身。 + +用一个只涉及线性代数的不动点求解器,替代一个对特征值进行排序的求解器,能以大约多花一次似然评估的代价换来精确的梯度,而这足以让 NUTS 变得触手可及。 + +收获不仅仅在于速度。 + +低成本的链使得同时运行多条链并检查其诊断指标变得便宜,而混合最差的那些参数恰恰指向了一个更好的第二众数,而三万次随机游走抽样从未到访过那里。 + +有两点值得说明。 + +第一,在不存在稳定解的地方,不动点方法会返回没有意义的结果,因此一个游荡到可决区域之外的采样器会产生胡言乱语,而不是被拒绝;这里的后验分布很好地落在该区域内部,但一个更平坦的后验分布可能不会。 + +第二,上面报告的效率提升是针对这一特定后验分布而言的,一个维度更少、尺度更好的后验分布会大大缩小这一差距。 + +## 结束语 + +{cite:t}`Lucas1980` 曾谨慎地说明,他的两个单位斜率应当预期在某些货币政策下成立,而在另一些货币政策下失效。 + +将他的样本延伸半个世纪,证实了这些失效情形。 + +在一个类似他所用的样本上估计一个小型结构模型,然后只改变货币政策规则,就能产生跨越数据所显示的大部分范围的斜率。 + +这正是卢卡斯、{cite:t}`Sargent1971` 以及 {cite:t}`Whiteman1984` 都得出的教训,即低频回归系数并非结构性的。 + +从零开始梳理这一模型,为论文的论述增添了一些内容。 + +卢卡斯的第一个例证,即通货膨胀对货币增长的单位斜率,在这一模型中,只要货币增长在计量上是外生的,就是一个*恒等式*,因为货币需求是一个数量方程,其余各项都是一阶差分。 + +他的第二个例证,即利率对货币增长的单位斜率,则没有这样的支撑,可以自由地变动。 + +因此,这两个在散点图上看起来对称的例证,从结构模型的视角来看,其实是相当不同的对象。 + +正如 {ref}`ss_ex2` 所揭示的那样,这种不对称性也标出了这一练习的局限所在。 + +由于 $h_{\pi,\Delta m}(0)$ 被货币需求锚定在一,要将其驱动到 1984 年后数据所显示的接近零的值,需要一个远比这些数据实际选定的规则更具反通胀性的货币增长规则。 + +在计算方面,这一模型证明是哈密顿蒙特卡洛的一个有用测试平台。 + +将其用于 DSGE 模型的障碍并非统计上的,而是算法上的:标准求解器要对特征值排序,而排序没有导数。 + +换入一个只用线性代数的不动点求解器,就能恢复精确的梯度,而由此获得的采样器在像这里这样尺度很差的后验分布上,单位计算时间内的效率要高得多。 + +更大的收获是诊断上的。 + +低成本的链及其收敛诊断,把我们引向了第二个众数,而后验分布结果是双峰的:数据无法在内生的和继承而来的通货膨胀持续性之间做出选择,而最接近已发表估计值的众数恰恰是两者中较*低*的那一个。 + +尽管如此,这两个众数在 $h_{\pi,\Delta m}(0)$ 和 $h_{R,\Delta m}(0)$ 上却达成一致,这对论文来说是一则好消息,而这只有借助更彻底的采样器才能揭示出来。 + +## 练习 + +```{exercise} +:label: ss_ex1 + +论文假设技术增长是序列不相关的。 + +将 $z_t = \varepsilon_{zt}$ 替换为 $z_t = \rho_z z_{t-1} + \varepsilon_{zt}$,并回答两个问题。 + +{prf:ref}`ss_prop` 是否依然成立?持续性的技术增长是否提供了一条与货币政策无关、打破单位斜率的途径? +``` + +```{solution-start} ss_ex1 +:class: dropdown +``` + +技术冲击块是规范形式的第 7 行,其中 `g1[7, Z]` 目前为零。 + +```{code-cell} ipython3 +def canonical_rho_z(p, rule='money'): + g0, g1, psi, pie = canonical(p, rule) + g1[7, Z] = p['rho_z'] + return g0, g1, psi, pie + + +def h_zero_rho_z(p): + G1, impact, eu = gensys(*canonical_rho_z(p)) + if eu != (1, 1): + return np.nan, np.nan + sd = np.diag([p['sig_e'], p['sig_a'], p['sig_chi'], p['sig_z'], p['sig_m']]) + n = NY + 2 + A, B = np.zeros((n, n)), np.zeros((n, 5)) + A[:NY, :NY], A[NY, X], A[NY + 1, A_] = G1, 1, 1 + B[:NY] = impact @ sd + C = np.zeros((4, n)) + C[0, DM], C[1, PI], C[2, R], C[3, Z] = 1, 1, 1, 1 + C[3, X], C[3, NY] = 1, -1 + C[3, A_], C[3, NY + 1] = p['xi'], -p['xi'] + if np.max(np.abs(np.linalg.eigvals(A))) > 1 - 1e-9: + return np.nan, np.nan + return (h_zero_from_state_space(A, B, C, 1, 0), + h_zero_from_state_space(A, B, C, 2, 0)) + + +print('exogenous money growth, phi_pi = phi_x = 0') +for rho_z in [0.0, 0.3, 0.6, 0.9]: + q = dict(p_bar, phi_pi=0.0, phi_x=0.0, rho_z=rho_z) + print(f' rho_z = {rho_z:.1f}: h_pi = {h_zero_rho_z(q)[0]:.10f}, ' + f'h_R = {h_zero_rho_z(q)[1]:.4f}') + +print('\nwith policy feedback, phi_pi = -2, phi_x = -0.5') +for rho_z in [0.0, 0.3, 0.6, 0.9]: + q = dict(p_bar, phi_pi=-2.0, phi_x=-0.5, rho_z=rho_z) + print(f' rho_z = {rho_z:.1f}: h_pi = {h_zero_rho_z(q)[0]:.4f}, ' + f'h_R = {h_zero_rho_z(q)[1]:.4f}') +``` + +{prf:ref}`ss_prop` 依然完好无损地成立,因为它的证明只用到了技术与政策冲击是正交的这一事实,而从未用到技术具有多大的持续性。 + +在货币增长外生的情形下,*两个*斜率都对 $\rho_z$ 保持不变,这一点值得留意其原因:$z_t$ 只在同期通过货币需求进入模型,因此 $\rho_z$ 改变了技术的动态,却不改变任何人对货币冲击的反应。 + +一旦政策存在反馈,情况就不同了,持续性的技术增长会把 $h_{\pi,\Delta m}(0)$ 大幅拉离一。 + +因此第二个问题的答案是肯定的,而这也指出了论文实验的一个局限:技术过程在政策变化时被固定不变,而这两者实际上是相互作用的。 + +```{solution-end} +``` + +```{exercise} +:label: ss_ex2 + +本讲座在 1960:I-1983:IV 上估计模型。 + +在 1984:I-2007:IV 上找出后验众数,并将政策系数以及蕴含的 $h(0)$ 与我们在较早样本上得到的结果进行比较。 + +VAR 显示 1984-2007 年间 $h_{\pi,\Delta m}(0)$ 接近零,重新估计后的结构模型是否与之一致? +``` + +```{solution-start} ss_ex2 +:class: dropdown +``` + +```{code-cell} ipython3 +mask2 = (data.index.year >= 1984) & (data.index.year <= 2007) +Y2 = data.loc[mask2, VARS].values +Y2 = Y2 - Y2.mean(0) + +res2 = optimize.minimize(lambda v: -log_post(v, Y2), v_mode, method='Powell', + options=dict(maxiter=20000, maxfev=20000)) +res2 = optimize.minimize(lambda v: -log_post(v, Y2), res2.x, method='L-BFGS-B', + bounds=[SUPPORT[n] for n in FREE]) +v2 = res2.x +print(' 1960-1983 1984-2007') +for n in ['phi_pi', 'phi_x', 'rho_m']: + j = FREE.index(n) + print(f' {n:9s} {v_mode[j]:11.4f} {v2[j]:12.4f}') +print(' %-9s %5.3f, %.3f %5.3f, %.3f' + % (('model h(0)',) + h_zero(unpack(v_mode)) + h_zero(unpack(v2)))) +for name, lo, hi in [('1960-1983', 1960, 1983), ('1984-2007', 1984, 2007)]: + m = (data.index.year >= lo) & (data.index.year <= hi) + med = np.nanmedian(bvar_h0(data.loc[m, VARS].values), axis=0) + print(f' VAR h(0) on {name}: {med[0]:.3f}, {med[1]:.3f}') +``` + +重新估计的模型*并不*与 VAR 一致。 + +政策系数发生了变化,但蕴含的 $h_{\pi,\Delta m}(0)$ 在两个样本上都保持接近一,而 VAR 在 1984 年后将其估计为接近零。 + +{prf:ref}`ss_prop` 解释了为什么这必定是困难的。 + +在这一模型中,$h_{\pi,\Delta m}(0)$ 被锚定在一,只有政策反馈才能将其拉离,因此要达到接近零的值需要一个很大的负 $\phi_\pi$,而 1984 年后的数据并没有将货币增长规则推向那个方向的任何地方。 + +这是论文第二节与第三节之间一个真实存在的张力:等高线图显示存在一种*可能*产生低斜率的政策规则,但后期数据实际选定的规则并非那种规则。 + +一个完整的比较应当在两个样本上都运行采样器,而不是仅仅比较众数。 + +```{solution-end} +``` + +```{exercise} +:label: ss_ex3 + +论文的图 8 探讨了供给冲击方差的下降,而非政策的改变,是否能够解释 $h(0)$ 的下降。 + +将 $\sigma_e$ 削减为其后验均值的四分之一,重新绘制货币规则等高线图,并报告该图变化了多少。 +``` + +```{solution-start} ss_ex3 +:class: dropdown +``` + +```{code-cell} ipython3 +p_small_e = dict(p_bar, sig_e=p_bar['sig_e'] / 4) +Hpi2, HR2 = h_grid(p_small_e, 'money', 'phi_pi', 'phi_x', + phi_pi_grid, phi_x_grid) + +print('baseline h_pi in [%.2f, %.2f], h_R in [%.2f, %.2f]' + % (np.nanmin(Hpi), np.nanmax(Hpi), np.nanmin(HR), np.nanmax(HR))) +print('small sig_e h_pi in [%.2f, %.2f], h_R in [%.2f, %.2f]' + % (np.nanmin(Hpi2), np.nanmax(Hpi2), np.nanmin(HR2), np.nanmax(HR2))) +print('largest change in h_pi across the grid: %.3f' + % np.nanmax(np.abs(Hpi2 - Hpi))) + +contour_panel(phi_pi_grid, phi_x_grid, Hpi2, HR2, r'$\phi_\pi$', r'$\phi_x$', + r'Low-frequency slopes with $\sigma_e$ cut to one quarter') +``` + +$h_{\pi,\Delta m}(0)$ 所能达到的范围没有变化,从政策到 $h(0)$ 的映射也保持相同的形状。 + +等高线确实在该范围内发生了移动,在某些网格点上移动幅度达到了十分之几,因此并不能说冲击方差是无关紧要的。 + +论文所主张的是一个更弱的说法,即这种量级的冲击方差变化,不足以替代政策的变化。 + +```{solution-end} +``` \ No newline at end of file diff --git a/lectures/var_subsets.md b/lectures/var_subsets.md new file mode 100644 index 0000000..294529b --- /dev/null +++ b/lectures/var_subsets.md @@ -0,0 +1,1214 @@ +--- +jupytext: + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.16.7 +kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +translation: + title: 变量子集的向量自回归 + headings: + Overview: 概述 + The large system: 大系统 + The small system: 小系统 + Four representations: 四种表示 + Four representations::The Wold representation: 沃尔德表示 + Four representations::The vector autoregression: 向量自回归 + Four representations::Innovations of the small system in terms of the large one: 用大系统的新息表示小系统的新息 + Four representations::The structural moving average: 结构性移动平均 + Four representations::A forecast error that contains past shocks: 包含过去冲击的预测误差 + Four representations::What the coefficients $\Gamma_j$ are: 系数 $\Gamma_j$ 到底是什么 + Four representations::A factorization identity: 一个因式分解恒等式 + Two cases where nothing is lost: 两种没有信息损失的情形 + Code: 代码 + 'Example 1: a bivariate VAR(2)': 例1:一个二元向量自回归 VAR(2) + 'Example 1: a bivariate VAR(2)::The VAR for the subsystem': 子系统的向量自回归 + 'Example 1: a bivariate VAR(2)::Wold impulse responses': 沃尔德脉冲响应 + 'Example 1: a bivariate VAR(2)::Checking the innovation map by simulation': 通过模拟检验新息映射 + 'Example 1: a bivariate VAR(2)::The two orthogonality facts': 两个正交性事实 + 'Example 2: an omitted interest rate': 例2:被剔除的利率变量 + Summary: 总结 + Exercises: 练习 +--- + +(var_subsets)= +```{raw} jupyter +
+ + QuantEcon + +
+``` + +# 变量子集的向量自回归 + +```{index} single: Vector Autoregression; subsystems +``` + +```{index} single: Kalman Filter; and vector autoregressions +``` + +```{contents} Contents +:depth: 2 +``` + +除了 Anaconda 中已有的库之外,本讲座还需要以下库: + +```{code-cell} ipython3 +:tags: [hide-output] + +!pip install quantecon +``` + +## 概述 + +一个经济模型为一组变量 $Y_t$ 给出一个向量自回归。 + +计量经济学家通常只能观察到其中的*一部分*。 + +本讲座针对这种情形回答三个问题。 + +给定一个 $n \times 1$ 向量 $Y_t$ 的 $m$ 阶向量自回归,以及一个选择矩阵 +$S_y$,它提取出一个 $n_y \times 1$ 的子向量 $y_t = S_y Y_t$: + +1. $y_t$ 服从怎样的向量自回归? +2. 它的移动平均表示是什么? +3. 小系统中的新息与大系统中的新息之间有什么关系? + +所有答案都来自 {doc}`卡尔曼滤波 `。 + +状态是有限阶向量自回归所需要的 $Y_t$ 的历史,观测则是子向量 $y_t$。 + +由于 $y_t$ 是状态的一个子向量,而不是关于状态的带噪信号,所以这是一个*没有*测量误差的状态空间系统。 + +主要结果是: + +- $y_t$ 服从一个**无限阶**向量自回归,我们精确计算其系数, +- 小系统的新息 $a_t$ 是大系统新息 $\varepsilon_t$ 的**单侧分布滞后**, +- 该分布滞后在每一个滞后阶都有一个宽的系数矩阵,因此 + 无法从 $y_t$ 的历史中恢复出 $\varepsilon_t$, +- 小系统的预测误差方差超过大系统的预测误差方差,超出的量我们也将计算出来。 + +我们还识别并验证了两种小向量自回归仍保持有限阶的特殊情形。 + +本讲座推广了以前在 {doc}`kalman_filter_var` 结尾处使用的实例。 + +让我们从导入开始。 + +```{code-cell} ipython3 +import matplotlib.pyplot as plt +import numpy as np +import quantecon as qe + +plt.rcParams['figure.figsize'] = (10, 5) +np.set_printoptions(precision=4, suppress=True) +``` + +## 大系统 + +设 $Y_t$ 为 $n \times 1$ 的向量,并假设其服从 $m$ 阶向量自回归 + +$$ +Y_{t+1} = A_1 Y_t + A_2 Y_{t-1} + \cdots + A_m Y_{t-m+1} + \varepsilon_{t+1}, +\qquad +\mathbb{E}\, \varepsilon_t \varepsilon_t^\top = V , +$$ (eq:vs_bigvar) + +其中 $\{\varepsilon_t\}$ 是一个序列不相关的序列,满足 +$\mathbb{E}[\varepsilon_{t+1} \mid Y_t, Y_{t-1}, \ldots] = 0$。 + +将 $m$ 期滞后堆叠为 $nm \times 1$ 的状态向量 + +$$ +X_t = \begin{pmatrix} Y_t \\ Y_{t-1} \\ \vdots \\ Y_{t-m+1}\end{pmatrix} . +$$ + +于是 {eq}`eq:vs_bigvar` 变成一阶**伴随形式** + +$$ +X_{t+1} = A X_t + C \varepsilon_{t+1}, +\qquad +A = \begin{pmatrix} +A_1 & A_2 & \cdots & A_{m-1} & A_m \\ +I & 0 & \cdots & 0 & 0 \\ +0 & I & \cdots & 0 & 0 \\ +\vdots & & \ddots & & \vdots \\ +0 & 0 & \cdots & I & 0 +\end{pmatrix}, +\qquad +C = \begin{pmatrix} I_n \\ 0 \\ \vdots \\ 0 \end{pmatrix} . +$$ (eq:vs_companion) + +我们用不带下标的 $A$ 表示伴随矩阵,用带下标的 $A_1, \ldots, A_m$ +表示向量自回归系数矩阵。 + +设 $J = \begin{pmatrix} I_n & 0 & \cdots & 0\end{pmatrix}$ 为从状态中读取 $Y_t$ 的 +$n \times nm$ 矩阵,使得 $Y_t = J X_t$ 且 $C = J^\top$。 + +我们假设 $A$ 的所有特征值都严格位于单位圆内,因此 +$\{Y_t\}$ 是协方差平稳的。 + +## 小系统 + +计量经济学家观察到 + +$$ +y_t = S_y Y_t = G X_t, +\qquad +G = S_y J , +$$ (eq:vs_obs) + +其中 $S_y$ 是 $n_y \times n$ 的矩阵,且 $n_y < n$。 + +通常 $S_y$ 是从 $Y_t$ 中挑选出 $n_y$ 个坐标,但下文并不要求如此, +因此也允许线性组合。 + +方程 {eq}`eq:vs_companion` 和 {eq}`eq:vs_obs` 构成了一个在 {doc}`kalman_filter_var` 中研究过的 +状态空间系统,其中冲击加载为 $C$,观测矩阵为 $G$,测量误差协方差为 + +$$ +R = 0 . +$$ + +该观测是*精确*的,但它是状态的严格子向量,因此 +计量经济学家仍然面临一个滤波问题。 + +令 $\Sigma$ 求解稳态里卡蒂方程 + +$$ +\Sigma = A \Sigma A^\top + C V C^\top + - A \Sigma G^\top \bigl(G \Sigma G^\top\bigr)^{-1} G \Sigma A^\top +$$ (eq:vs_riccati) + +对应的卡尔曼增益为 + +$$ +K = A \Sigma G^\top \bigl(G \Sigma G^\top\bigr)^{-1} . +$$ (eq:vs_gain) + +此处 $\Sigma$ 是 $X_t - \mathbb{E}[X_t \mid y^{t-1}]$ 的协方差矩阵。 + +```{note} +由于 $X_t$ 包含 $Y_t$ 的滞后项,而计量经济学家已经精确地观察到其中的 $S_y$ 分量, +所以 $\Sigma$ 是奇异的。 + +这是无害的。 + +卡尔曼增益 {eq}`eq:vs_gain` 所需要的是*新息* +协方差 $G \Sigma G^\top$ 非奇异,只要 $y_t$ 的任何线性组合 +都不能被 $y^{t-1}$ 完全预测,这一点就成立。 +``` + +小系统中的新息为 + +$$ +a_t = y_t - \mathbb{E}[y_t \mid y^{t-1}] = G\bigl(X_t - \hat X_t\bigr), +\qquad +\Omega \equiv \mathbb{E}\, a_t a_t^\top = G \Sigma G^\top . +$$ (eq:vs_innov) + +## 四种表示 + +### 沃尔德表示 + +{doc}`kalman_filter_var` 中导出的稳态新息表示是 + +$$ +\hat X_{t+1} = A \hat X_t + K a_t, +\qquad +y_t = G \hat X_t + a_t . +$$ (eq:vs_innovrep) + +向前求解 {eq}`eq:vs_innovrep`,得到用 $y_t$ 自身新息表示的移动平均表示, + +$$ +y_t = \sum_{h=0}^{\infty} \Psi_h\, a_{t-h}, +\qquad +\Psi_0 = I_{n_y}, +\qquad +\Psi_h = G A^{h-1} K \quad (h \geq 1) . +$$ (eq:vs_wold) + +### 向量自回归 + +反过来向后求解 {eq}`eq:vs_innovrep`,得到 + +$$ +y_t = \sum_{j=1}^{\infty} B_j\, y_{t-j} + a_t, +\qquad +B_j = G (A - KG)^{j-1} K . +$$ (eq:vs_var) + +这是一个无限阶向量自回归,由于 $A - KG$ 的特征值 +位于单位圆内,因此该级数收敛。 + +### 用大系统的新息表示小系统的新息 + +这正是激发本讲座的问题。 + +设 $e_t = X_t - \hat X_t$ 为滤波误差。 + +从状态方程 {eq}`eq:vs_companion` 中减去卡尔曼递推 +$\hat X_{t+1} = A \hat X_t + K a_t$,并利用 $a_t = G e_t$,得到 + +$$ +e_{t+1} = (A - KG) e_t + C \varepsilon_{t+1} . +$$ (eq:vs_error) + +向后求解 {eq}`eq:vs_error` 并左乘 $G$,即可得到答案。 + +```{prf:proposition} +:label: vs_prop_innov + +小系统的新息是大系统新息的单侧分布滞后 + +$$ +a_t = \sum_{j=0}^{\infty} \Gamma_j\, \varepsilon_{t-j}, +\qquad +\Gamma_j = G (A - KG)^j C , +$$ (eq:vs_gamma) + +其首项系数为 + +$$ +\Gamma_0 = G C = S_y J J^\top = S_y . +$$ +``` + +由于每一个 $\Gamma_j$ 都是 $n_y \times n$ 的矩阵,且 $n_y < n$, +从 $\{\varepsilon_t\}$ 到 $\{a_t\}$ 的映射没有逆映射。 + +知道 $y_t$ 的整个历史不足以恢复出 $\varepsilon_t$。 + +### 结构性移动平均 + +作为比较,迭代 {eq}`eq:vs_companion` 可以直接用大系统的新息表示 $y_t$, + +$$ +y_t = \sum_{j=0}^{\infty} \Phi_j\, \varepsilon_{t-j}, +\qquad +\Phi_j = G A^j C . +$$ (eq:vs_phi) + +### 包含过去冲击的预测误差 + +在 {eq}`eq:vs_gamma` 中把 $j = 0$ 这一项分离出来,并利用 $\Gamma_0 = S_y$,得到 + +$$ +a_t = \underbrace{S_y \varepsilon_t}_{\text{完全信息预测误差}} + \; + \; + \underbrace{\sum_{j=1}^{\infty} \Gamma_j\, \varepsilon_{t-j}}_{t \text{ 之前实现的冲击}} . +$$ (eq:vs_split) + +第一项正如它表面所示。 + +由于 $\mathbb{E}[\varepsilon_t \mid Y^{t-1}] = 0$,我们有 +$y_t - \mathbb{E}[y_t \mid Y^{t-1}] = S_y \varepsilon_t$,所以 $S_y \varepsilon_t$ +就是能观测到 $Y$ *整个*历史的人在预测 $y_t$ 时所犯的误差。 + +第二项值得停下来思考,因为乍一看它似乎是不可能的。 + +按照构造,$a_t$ 是一个预测误差,与 $t-1$ 期已知的一切正交。 + +然而 {eq}`eq:vs_split` 说 $a_t$ 加载在 $\varepsilon_{t-1}, +\varepsilon_{t-2}, \ldots$ 上,而这些冲击在那时早已实现。 + +这两个事实是相容的,而且都是成立的: + +$$ +\mathbb{E}\, a_t\, \varepsilon_{t-j}^\top = \Gamma_j V \neq 0 +\quad (j \geq 1), +\qquad \text{而} \qquad +\mathbb{E}\, a_t\, y_{t-k}^\top = 0 +\quad (k \geq 1) . +$$ (eq:vs_orth) + +其原因在于,过去的冲击是*大*系统的计量经济学家所知道的,而小系统的计量经济学家并不知道。 + +小系统计量经济学家的信息集是 $H(y^{t-1})$,即 $y_{t-1}, y_{t-2}, \ldots$ 的闭线性张成空间, +而 $\varepsilon_{t-j}$ 并不属于这个空间。 + +令 $P_{t-1}$ 表示投影到 $H(y^{t-1})$ 上的算子。 + +对 {eq}`eq:vs_split` 应用 $P_{t-1}$,利用 $P_{t-1} a_t = 0$ 和 +$P_{t-1}\varepsilon_t = 0$,得到恒等式 + +$$ +\sum_{j=1}^{\infty} \Gamma_j\, P_{t-1}\varepsilon_{t-j} = 0 . +$$ (eq:vs_pred) + +因此 {eq}`eq:vs_split` 中的分布滞后只加载在小系统计量经济学家*尚未*了解到的过去冲击部分, + +$$ +a_t = S_y \varepsilon_t + + \sum_{j=1}^{\infty} \Gamma_j + \bigl(\varepsilon_{t-j} - P_{t-1}\varepsilon_{t-j}\bigr) . +$$ (eq:vs_unlearned) + +如果你只关注的那个序列尚未把某个三个季度前发生的冲击完全揭示出来,那么这个冲击在今天仍然可以是新消息。 + +这正是滤波问题的全部内容所在,也是为什么 $\Omega$ +会超过 $S_y V S_y^\top$ 的原因。 + +### 系数 $\Gamma_j$ 到底是什么 + +将移动平均表示 {eq}`eq:vs_phi` 代入自回归表示 +{eq}`eq:vs_var`,并匹配 $\varepsilon_{t-k}$ 的系数,得到关于同一对象的第二个公式, + +$$ +\Gamma_k = \Phi_k - \sum_{j=1}^{k} B_j\, \Phi_{k-j} . +$$ (eq:vs_gamma_alt) + +因此 $\Gamma_k$ 衡量的是小系统自身的自回归无法重现大系统 $k$ 阶滞后响应的程度。 + +值得写出 $k = 1$ 的情形。 + +由于 $\Phi_0 = S_y$,$\Phi_1 = G A C = S_y A_1$, + +$$ +\Gamma_1 = S_y A_1 - B_1 S_y . +$$ (eq:vs_gamma1) + +假设 $S_y$ 是选择坐标的矩阵,并像之前一样将 +$Y_t = (y_t^\top, \tilde y_t^\top)^\top$ 进行分块。 + +那么 $B_1 S_y$ 在属于被剔除变量的那些列上为零,所以 +{eq}`eq:vs_gamma1` 变为 + +$$ +\Gamma_1 = \begin{pmatrix} A_1^{yy} - B_1 & A_1^{y \tilde y}\end{pmatrix} . +$$ (eq:vs_gamma1_block) + +$a_t$ 在上一期*被剔除*冲击上的加载恰好等于 +$A_1^{y\tilde y}$,即被剔除变量进入被保留方程所经由的那个分块。 + +方程 {eq}`eq:vs_gamma1_block` 也预示了 +{prf:ref}`vs_prop_blockexog`:分块外生性使得 $A_1^{y\tilde y} = 0$, +这将迫使 $B_1 = A_1^{yy}$,从而 $\Gamma_1 = 0$。 + +### 一个因式分解恒等式 + +表示 {eq}`eq:vs_wold`、{eq}`eq:vs_gamma` 和 {eq}`eq:vs_phi` 描述的是 +同一个过程,因此如果记 $\Psi(z) = \sum_h \Psi_h z^h$,且对 $\Gamma$ 和 $\Phi$ +也做类似定义,那么 + +$$ +\Phi(z) = \Psi(z)\, \Gamma(z) . +$$ (eq:vs_factor) + +方程 {eq}`eq:vs_factor` 说明,结构性移动平均算子可以分解为 +小系统的沃尔德算子乘以新息映射。 + +这是对上述一切内容的一个严格的数值检验,我们也把它作为一种检验方式来使用。 + +在各阶滞后处匹配方差,也可以得到 + +$$ +\Omega = \sum_{j=0}^{\infty} \Gamma_j V \Gamma_j^\top + = S_y V S_y^\top + \sum_{j=1}^{\infty} \Gamma_j V \Gamma_j^\top . +$$ (eq:vs_varloss) + +第二个求和中的每一项都是半正定的,因此 + +$$ +\Omega \succeq S_y V S_y^\top . +$$ + +小系统的一步预测误差方差绝不会小于大系统中对应分块的预测误差方差,而 +{eq}`eq:vs_varloss` 精确地说明了到底损失了多少。 + +## 两种没有信息损失的情形 + +```{prf:proposition} +:label: vs_prop_full + +如果 $S_y = I_n$,那么 $\Gamma_0 = I_n$ 且对 $j \geq 1$ 有 $\Gamma_j = 0$,因此 +$a_t = \varepsilon_t$,且 {eq}`eq:vs_var` 就退化为原始的 $m$ 阶 +向量自回归 {eq}`eq:vs_bigvar`。 +``` + +此时没有任何信息被隐藏,因此沃尔德新息*就是*结构新息。 + +第二种情形更有趣。 + +将 $Y_t = (y_t^\top, \tilde y_t^\top)^\top$ 分块,相应地 + +$$ +A_k = \begin{pmatrix} A_k^{yy} & A_k^{y\tilde y} \\ + A_k^{\tilde y y} & A_k^{\tilde y \tilde y}\end{pmatrix}, +\qquad k = 1, \ldots, m . +$$ + +```{prf:proposition} +:label: vs_prop_blockexog + +假设 $y_t$ 是**分块外生的**,即对所有 $k$ 都有 $A_k^{y\tilde y} = 0$, +这意味着在 $y$ 的方程中不出现被剔除变量的任何滞后项。 + +那么对 $j \geq 1$ 有 $\Gamma_j = 0$,$a_t = S_y \varepsilon_t$, +$\Omega = S_y V S_y^\top$,且 $y_t$ 服从有限的 $m$ 阶向量自回归 + +$$ +y_t = \sum_{k=1}^{m} A_k^{yy}\, y_{t-k} + a_t . +$$ +``` + +```{prf:proof} +分块外生性使得 {eq}`eq:vs_bigvar` 中 $y$ 那些行可以写成 +$y_{t+1} = \sum_k A_k^{yy} y_{t+1-k} + S_y \varepsilon_{t+1}$。 + +方程右边只涉及 $y$ 的滞后项,而 $S_y \varepsilon_{t+1}$ +与整个历史 $Y^t$ 正交,因而也与 $y^t$ 正交。 + +所以这*就是* $y_{t+1}$ 在 $y^t$ 上的投影,从而将其识别为 +沃尔德表示。 +``` + +请注意 {prf:ref}`vs_prop_blockexog` *并不*要求什么:$V$ 不必是分块对角的。 + +$\varepsilon^y$ 与 $\varepsilon^{\tilde y}$ 之间存在同期相关是可以的。 + +对于一个被剔除的变量是否会损害向量自回归而言,重要的是格兰杰因果性, +而不是同期相关性。 + +## 代码 + +下面的类将上述内容全部打包在一起。 + +```{code-cell} ipython3 +class VARSubsystem: + """ + A VAR for Y and the implied representations for a subvector y = S_y Y. + + Y[t+1] = A_1 Y[t] + ... + A_m Y[t-m+1] + eps[t+1], E eps eps' = V + y[t] = S_y Y[t] + + Parameters + ---------- + A_list : list of (n, n) arrays, the VAR coefficient matrices A_1, ..., A_m + V : (n, n) array, covariance matrix of eps + S_y : (n_y, n) selector matrix + """ + + def __init__(self, A_list, V, S_y): + self.A_list = [np.atleast_2d(np.asarray(a, dtype=float)) for a in A_list] + self.V = np.atleast_2d(np.asarray(V, dtype=float)) + self.S_y = np.atleast_2d(np.asarray(S_y, dtype=float)) + n, m = self.A_list[0].shape[0], len(self.A_list) + self.n, self.m, self.n_y = n, m, self.S_y.shape[0] + + # companion form + self.A = np.zeros((n * m, n * m)) + self.A[:n] = np.hstack(self.A_list) + if m > 1: + self.A[n:, :n * (m - 1)] = np.eye(n * (m - 1)) + self.J = np.zeros((n, n * m)) + self.J[:, :n] = np.eye(n) + self.C = self.J.T + self.G = self.S_y @ self.J + self.Q = self.C @ self.V @ self.C.T + self._Sigma = self._K = None + + def companion_eigenvalues(self): + return np.linalg.eigvals(self.A) + + def stationary_filter(self): + """Steady-state (Sigma, K) from the Riccati equation with R = 0.""" + if self._Sigma is None: + A, G = self.A, self.G + R = np.zeros((self.n_y, self.n_y)) + Sigma = qe.solve_discrete_riccati(A.T, G.T, self.Q, R) + Omega = G @ Sigma @ G.T + self._Sigma = Sigma + self._K = A @ Sigma @ G.T @ np.linalg.inv(Omega) + return self._Sigma, self._K + + def innovation_cov(self): + """Omega = E a a', the one-step forecast error covariance of y.""" + Sigma, _ = self.stationary_filter() + return self.G @ Sigma @ self.G.T + + def wold(self, h_max=20): + """Psi[h] in y[t] = sum_h Psi[h] a[t-h]; Psi[0] = I.""" + _, K = self.stationary_filter() + Psi = np.empty((h_max + 1, self.n_y, self.n_y)) + Psi[0], P = np.eye(self.n_y), np.eye(self.A.shape[0]) + for h in range(1, h_max + 1): + Psi[h] = self.G @ P @ K + P = P @ self.A + return Psi + + def var_coefficients(self, h_max=20): + """B[j-1] in y[t] = sum_j B[j] y[t-j] + a[t], for j = 1, ..., h_max.""" + _, K = self.stationary_filter() + M = self.A - K @ self.G + B, P = np.empty((h_max, self.n_y, self.n_y)), np.eye(self.A.shape[0]) + for j in range(h_max): + B[j] = self.G @ P @ K + P = P @ M + return B + + def innovation_map(self, h_max=20): + """Gamma[j] in a[t] = sum_j Gamma[j] eps[t-j].""" + _, K = self.stationary_filter() + M = self.A - K @ self.G + Gamma, P = np.empty((h_max + 1, self.n_y, self.n)), np.eye(self.A.shape[0]) + for j in range(h_max + 1): + Gamma[j] = self.G @ P @ self.C + P = P @ M + return Gamma + + def structural_ma(self, h_max=20): + """Phi[j] in y[t] = sum_j Phi[j] eps[t-j].""" + Phi, P = np.empty((h_max + 1, self.n_y, self.n)), np.eye(self.A.shape[0]) + for j in range(h_max + 1): + Phi[j] = self.G @ P @ self.C + P = P @ self.A + return Phi + + def simulate(self, T, seed=0, burn=200): + """Simulate Y and the innovations eps that generated it.""" + rng = np.random.default_rng(seed) + L = np.linalg.cholesky(self.V) + eps = rng.standard_normal((T + burn, self.n)) @ L.T + X, Y = np.zeros(self.n * self.m), np.zeros((T + burn, self.n)) + for t in range(T + burn): + X = self.A @ X + self.C @ eps[t] + Y[t] = self.J @ X + return Y[burn:], eps[burn:] + + def filter_innovations(self, y_path): + """Recover a[t] from observed y by running the steady-state filter.""" + _, K = self.stationary_filter() + x_hat = np.zeros(self.A.shape[0]) + a = np.empty((len(y_path), self.n_y)) + for t in range(len(y_path)): + a[t] = y_path[t] - self.G @ x_hat + x_hat = self.A @ x_hat + K @ a[t] + return a + + +def convolve(Psi, Gamma, h_max): + """(Psi * Gamma)[h] = sum_{k=0}^{h} Psi[k] Gamma[h-k].""" + out = np.zeros((h_max + 1, Psi.shape[1], Gamma.shape[2])) + for h in range(h_max + 1): + for k in range(h + 1): + out[h] += Psi[k] @ Gamma[h - k] + return out +``` + +下面这个单一的例程收集了我们希望针对每个例子查看的各种诊断信息。 + +```{code-cell} ipython3 +def report(model, h_max=30, label=''): + """Print the identities that every subsystem must satisfy.""" + Sigma, K = model.stationary_filter() + A, G, V = model.A, model.G, model.V + resid = Sigma - (A @ Sigma @ A.T + model.Q + - A @ Sigma @ G.T @ np.linalg.inv(G @ Sigma @ G.T) + @ G @ Sigma @ A.T) + Psi = model.wold(h_max) + Gamma = model.innovation_map(h_max) + Phi = model.structural_ma(h_max) + Omega, Vy = model.innovation_cov(), model.S_y @ V @ model.S_y.T + + print(f'--- {label} (n = {model.n}, m = {model.m}, n_y = {model.n_y})') + print(f' max |eig| of companion A {np.max(abs(model.companion_eigenvalues())):.6f}') + print(f' max |eig| of A - KG {np.max(abs(np.linalg.eigvals(A - K @ G))):.6f}') + print(f' Riccati residual {np.abs(resid).max():.2e}') + print(f' |Gamma[0] - S_y| {np.abs(Gamma[0] - model.S_y).max():.2e}') + print(f' |Phi - Psi * Gamma| ' + f'{np.abs(convolve(Psi, Gamma, h_max) - Phi).max():.2e}') + Gamma_long = model.innovation_map(300) # the sum in (SS) is infinite + print(f' |Omega - sum Gamma V Gamma\'| ' + f'{np.abs(Omega - sum(Gamma_long[j] @ V @ Gamma_long[j].T for j in range(301))).max():.2e}') + print(f' max |Gamma[j]|, j >= 1 {np.abs(Gamma[1:]).max():.3e}') + print(f' det Omega / det S_y V S_y\' ' + f'{np.linalg.det(Omega) / np.linalg.det(Vy):.4f}') + return Psi, Gamma, Phi +``` + +## 例1:一个二元向量自回归 VAR(2) + +两个可观测序列 $r_t$ 和 $z_t$ 服从向量自回归 VAR(2) + +$$ +\begin{pmatrix} r_{t+1} \\ z_{t+1}\end{pmatrix} += A_1 \begin{pmatrix} r_t \\ z_t \end{pmatrix} ++ A_2 \begin{pmatrix} r_{t-1} \\ z_{t-1}\end{pmatrix} ++ \varepsilon_{t+1}, +$$ + +其中 + +$$ +A_1 = \begin{pmatrix} 0.80 & 0.75 \\ 0 & 0.75 \end{pmatrix}, +\qquad +A_2 = \begin{pmatrix} 0.05 & -0.72 \\ 0 & 0.20 \end{pmatrix}, +\qquad +V = I_2 . +$$ + +请注意 $z$ 是分块外生的:其方程中不包含 $r$ 的滞后项。 + +但 $r$ 却*不是*,因为 $z$ 以两个滞后项都进入了 $r$ 的方程。 + +因此剔除 $z$ 应当是重要的,而剔除 $r$ 则不应有影响。 + +```{code-cell} ipython3 +A1 = np.array([[0.80, 0.75], + [0.00, 0.75]]) +A2 = np.array([[0.05, -0.72], + [0.00, 0.20]]) +V2 = np.eye(2) + +S_both = np.eye(2) # observe (r, z) +S_r = np.array([[1.0, 0.0]]) # observe r only +S_z = np.array([[0.0, 1.0]]) # observe z only + +mod_both = VARSubsystem([A1, A2], V2, S_both) +mod_r = VARSubsystem([A1, A2], V2, S_r) +mod_z = VARSubsystem([A1, A2], V2, S_z) + +Psi_both, Gam_both, _ = report(mod_both, label='observe r and z') +print() +Psi_r, Gam_r, _ = report(mod_r, label='observe r only') +print() +Psi_z, Gam_z, _ = report(mod_z, label='observe z only') +``` + +每个恒等式都在机器精度下成立。 + +这三种情形的差异恰好与命题的预测一致。 + +同时观测两个变量时,对 $j \geq 1$ 有 $\Gamma_j = 0$,因此 +$a_t = \varepsilon_t$,这正是 {prf:ref}`vs_prop_full` 所要求的。 + +只观测 $z$(它是分块外生的)时,对 $j \geq 1$ 也有 $\Gamma_j = 0$, +因此 $a_t = \varepsilon_{z,t}$,这正是 {prf:ref}`vs_prop_blockexog` +所要求的。 + +只观测 $r$ 的情形则不同。 + +此时对 $j \geq 1$ 有 $\Gamma_j \neq 0$,预测误差方差之比揭示了只观测 $r$ +的计量经济学家所损失的信息量。 + +```{code-cell} ipython3 +print('observe r only:') +print(f' Omega = {mod_r.innovation_cov()[0, 0]:.4f}') +print(f' S_y V S_y\' = {(S_r @ V2 @ S_r.T)[0, 0]:.4f}') +print('\n Gamma[j] for j = 0, ..., 5 (rows: response of a to eps_r, eps_z)') +print(Gam_r[:6, 0, :]) +``` + +预测误差方差比 $V_{11}$ 大出超过百分之五十。 + +多出来的那部分方差,完全可以归因于计量经济学家只能通过其对 $r$ 的影响间接观测到的过去 $\varepsilon_z$ 冲击。 + +### 子系统的向量自回归 + +```{code-cell} ipython3 +--- +mystnb: + figure: + caption: VAR coefficients for the subsystem + name: fig-vs-varcoef +--- +B_r = mod_r.var_coefficients(12) + +fig, ax = plt.subplots() +ax.stem(np.arange(1, 13), B_r[:, 0, 0], basefmt=' ') +ax.axhline(0, color='k', lw=0.6) +ax.set_xlabel('lag $j$') +ax.set_ylabel('$B_j$') +ax.set_title(r'Population VAR coefficients for $r_t$ when only $r$ is observed') +fig.tight_layout() +plt.show() + +print('B_1, ..., B_6:', np.round(B_r[:6, 0, 0], 5)) +print('\nfor comparison, A_1[0,0] and A_2[0,0]:', A1[0, 0], A2[0, 0]) +``` + +只用 $r$ 建立的无限阶向量自回归主要由两个滞后项主导,但这两个系数 +都不等于二元系统中对应的系数。 + +剔除 $z$ 并不只是简单地删去向量自回归中 $z$ 的那些列,而是改变了剩下的东西。 + +### 沃尔德脉冲响应 + +```{code-cell} ipython3 +--- +mystnb: + figure: + caption: Wold responses when both variables are observed + name: fig-vs-wold-both +--- +H = 25 +h = np.arange(H + 1) +Psi_both = mod_both.wold(H) + +fig, axes = plt.subplots(2, 2, figsize=(10, 6), sharex=True) +names, shocks = [r'$r_t$', r'$z_t$'], [r'$a_{r,t}$', r'$a_{z,t}$'] +for i in range(2): + for j in range(2): + axes[i, j].plot(h, Psi_both[:, i, j], lw=2) + axes[i, j].axhline(0, color='k', lw=0.6, ls='--') + axes[i, j].set_title(f'{names[i]} to {shocks[j]}', fontsize=10) + if i == 1: + axes[i, j].set_xlabel('horizon $h$') +fig.suptitle('Wold responses, both variables observed') +fig.tight_layout() +plt.show() +``` + +由于此时 $a_t = \varepsilon_t$,这些沃尔德响应与二元向量自回归的结构响应一致。 + +```{code-cell} ipython3 +--- +mystnb: + figure: + caption: Wold response when only r is observed + name: fig-vs-wold-r +--- +Psi_r = mod_r.wold(H) +Phi_r = mod_r.structural_ma(H) + +fig, ax = plt.subplots() +ax.plot(h, Psi_r[:, 0, 0], lw=2, label=r'$\Psi_h$: $r_t$ to its own innovation $a_t$') +ax.plot(h, Phi_r[:, 0, 0], lw=2, ls='--', + label=r'$\Phi_h$: $r_t$ to $\varepsilon_{r,t}$') +ax.plot(h, Phi_r[:, 0, 1], lw=2, ls=':', + label=r'$\Phi_h$: $r_t$ to $\varepsilon_{z,t}$') +ax.axhline(0, color='k', lw=0.6) +ax.set_xlabel('horizon $h$') +ax.set_ylabel('response') +ax.set_title(r'Wold versus structural responses of $r_t$') +ax.legend() +fig.tight_layout() +plt.show() +``` + +沃尔德响应针对的是 $a_t$,它既不是对某一个结构冲击的响应,也不是对另一个的响应。 + +它是两者的混合,而 {eq}`eq:vs_factor` 恰好说明了这种混合是如何发生的。 + +### 通过模拟检验新息映射 + +命题 {prf:ref}`vs_prop_innov` 是关于总体对象的一个陈述。 + +我们通过比较从观测到的 $r$ 序列中由卡尔曼滤波提取的新息与由产生该序列的冲击 +构建的分布滞后 $\sum_j \Gamma_j \varepsilon_{t-j}$,在一段较长的模拟样本上检验这一命题。 + +```{code-cell} ipython3 +T = 100_000 +Y_sim, eps_sim = mod_r.simulate(T, seed=1) +y_sim = Y_sim @ S_r.T + +a_filtered = mod_r.filter_innovations(y_sim) + +J_lag = 400 # the distributed lag is infinite, so truncate generously +Gam_long = mod_r.innovation_map(J_lag) +a_theory = np.zeros_like(a_filtered) +for j in range(J_lag + 1): + a_theory[j:] += eps_sim[:T - j] @ Gam_long[j].T + +burn = J_lag + 1 +print(f'correlation of the two series ' + f'{np.corrcoef(a_filtered[burn:, 0], a_theory[burn:, 0])[0, 1]:.8f}') +print(f'max absolute difference ' + f'{np.abs(a_filtered[burn:] - a_theory[burn:]).max():.2e}') +print(f'sample variance of a {a_filtered[burn:, 0].var():.4f}') +print(f'population Omega {mod_r.innovation_cov()[0, 0]:.4f}') +print(f'sample corr(a_t, a_(t-1)) ' + f'{np.corrcoef(a_filtered[burn + 1:, 0], a_filtered[burn:-1, 0])[0, 1]:.4f}') +``` + +两种构造出来的 $a_t$ 在截断分布滞后所允许的精度范围内是一致的,$a_t$ +的样本方差与 $\Omega$ 相符,且 $a_t$ 是序列不相关的。 + +### 两个正交性事实 + +现在我们通过对模拟数据进行两次回归,直接检验 {eq}`eq:vs_orth`。 + +第一次将 $a_t$ 回归到当期和滞后的*结构*冲击上,而这些冲击是小系统的计量经济学家所看不到的。 + +第二次将 $a_t$ 回归到滞后的*观测值*上,而这才是小系统的计量经济学家能够看到的全部信息。 + +```{code-cell} ipython3 +P_lags = 4 +Z_eps = np.column_stack([eps_sim[P_lags - l:T - l] for l in range(P_lags + 1)]) +target = a_filtered[P_lags:, 0] +b_eps = np.linalg.lstsq(Z_eps, target, rcond=None)[0].reshape(P_lags + 1, 2) +fit = Z_eps @ b_eps.ravel() +r2_eps = 1 - ((target - fit) ** 2).sum() / target.var() / len(target) + +print('OLS of a_t on eps_t, ..., eps_{t-4}:') +print(b_eps) +print('population Gamma_0, ..., Gamma_4:') +print(Gam_long[:P_lags + 1, 0, :]) +print(f'max discrepancy {np.abs(b_eps - Gam_long[:P_lags + 1, 0, :]).max():.2e}') +print(f'R^2 = {r2_eps:.6f}') +``` + +```{code-cell} ipython3 +Q_lags = 8 +Z_y = np.column_stack([y_sim[Q_lags - l - 1:T - l - 1, 0] for l in range(Q_lags)]) +tgt = a_filtered[Q_lags:, 0] +b_y = np.linalg.lstsq(Z_y, tgt, rcond=None)[0] +resid = tgt - Z_y @ b_y +r2_y = 1 - (resid ** 2).sum() / tgt.var() / len(tgt) + +print('OLS of a_t on y_{t-1}, ..., y_{t-8}:') +print(np.round(b_y, 5)) +print(f'R^2 = {r2_y:.6f}') +``` + +第一个回归恢复了 $\Gamma_j$,几乎完美拟合,唯一微小的偏差仅来自 +将分布滞后截断为四阶所带来的误差。 + +所以 $a_t$ 确实是由回溯到 $t$ 之前的冲击构造出来的。 + +第二个回归则几乎解释不了任何东西,这证实了 $a_t$ 仍然与小系统计量经济学家的信息集正交。 + +我们可以通过询问小系统计量经济学家究竟已经从每一个过去冲击中了解到多少信息,来理解这一点为什么成立。 + +```{code-cell} ipython3 +print('R^2 from projecting a structural shock on y_{t-1}, ..., y_{t-8}') +for lag in [0, 1, 2, 3]: + r2s = [] + for k in range(2): + shock = eps_sim[Q_lags - lag:T - lag, k] + c = np.linalg.lstsq(Z_y, shock, rcond=None)[0] + e = shock - Z_y @ c + r2s.append(1 - (e ** 2).sum() / shock.var() / len(shock)) + print(f' eps_(t-{lag}): eps_r {r2s[0]:6.4f} eps_z {r2s[1]:6.4f}') +``` + +当期冲击 $\varepsilon_t$ 完全无法从 $y^{t-1}$ 中被预测出来,这是必然的。 + +而两期或更多期以前的冲击则在很大程度上已经被了解到了。 + +其中最有意思的一行是 $\varepsilon_{t-1}$:它的 $r$ 分量在很大程度上是已知的, +而它的 $z$ 分量则*完全*未知,这是因为 $z_{t-1}$ 要经过一期滞后才能影响到 $r$, +所以在 $y^{t-1}$ 中还没有以任何方式体现出来。 + +这正是为什么 {eq}`eq:vs_gamma1_block` 给出 $a_t$ 在 +$\varepsilon_{z,t-1}$ 上的加载恰好等于完整的结构系数 +$A_1^{y\tilde y} = 0.75$,而它在 $\varepsilon_{r,t-1}$ 上的加载则只是 +小得多的残差 $A_1^{yy} - B_1$。 + +```{code-cell} ipython3 +B1 = mod_r.var_coefficients(1)[0] +print(f'Gamma_1 = {Gam_long[1, 0, :]}') +print(f'[A1[0,0] - B_1, A1[0,1]] = ' + f'[{A1[0, 0] - B1[0, 0]:.4f}, {A1[0, 1]:.4f}]') + +Phi_r = mod_r.structural_ma(6) +B_r6 = mod_r.var_coefficients(6) +recursion = np.array([Phi_r[k] - sum(B_r6[j - 1] @ Phi_r[k - j] + for j in range(1, k + 1)) + for k in range(7)]) +print(f'\nmax |Gamma_k - (Phi_k - sum_j B_j Phi_(k-j))| = ' + f'{np.abs(recursion - Gam_long[:7]).max():.2e}') +``` + +## 例2:被剔除的利率变量 + +现在考虑一个关于产出增长率 $g_t$、通货膨胀 $\pi_t$ 和利率 +$i_t$ 的三元向量自回归 VAR(1),计量经济学家从中剔除了 $i_t$。 + +我们对比两个系数矩阵,二者的*唯一*区别在于利率是否反馈到 $g$ 和 $\pi$ 上。 + +$$ +A_1^{\text{exog}} = +\begin{pmatrix} +0.60 & 0.10 & 0.00 \\ +0.15 & 0.55 & 0.00 \\ +0.30 & 0.40 & 0.70 +\end{pmatrix}, +\qquad +A_1^{\text{fb}} = +\begin{pmatrix} +0.60 & 0.10 & -0.35 \\ +0.15 & 0.55 & 0.25 \\ +0.30 & 0.40 & 0.70 +\end{pmatrix} . +$$ + +两种情形下的冲击协方差矩阵 $V$ 相同,而且它*不是*对角矩阵,因此利率新息 +与其他两个新息之间存在同期相关关系。 + +```{code-cell} ipython3 +V3 = np.array([[0.36, 0.05, 0.02], + [0.05, 0.25, 0.06], + [0.02, 0.06, 0.16]]) +S_gpi = np.array([[1.0, 0.0, 0.0], + [0.0, 1.0, 0.0]]) + +A_exog = np.array([[0.60, 0.10, 0.00], + [0.15, 0.55, 0.00], + [0.30, 0.40, 0.70]]) +A_fb = np.array([[0.60, 0.10, -0.35], + [0.15, 0.55, 0.25], + [0.30, 0.40, 0.70]]) + +mod_exog = VARSubsystem([A_exog], V3, S_gpi) +mod_fb = VARSubsystem([A_fb], V3, S_gpi) + +_, Gam_exog, _ = report(mod_exog, label='i is block exogenous') +print() +_, Gam_fb, _ = report(mod_fb, label='i feeds back') +``` + +即使冲击相关,分块外生情形也完全符合 {prf:ref}`vs_prop_blockexog` +所要求的行为。 + +而反馈情形则不然。 + +```{code-cell} ipython3 +print('block exogenous: B_1 versus the (g, pi) block of A_1') +print(mod_exog.var_coefficients(3)[0]) +print(A_exog[:2, :2]) +print(f' max |B_j| for j >= 2: {np.abs(mod_exog.var_coefficients(12)[1:]).max():.2e}') + +print('\nfeedback: B_1 versus the (g, pi) block of A_1') +print(mod_fb.var_coefficients(3)[0]) +print(A_fb[:2, :2]) +print(f' max |B_j| for j >= 2: {np.abs(mod_fb.var_coefficients(12)[1:]).max():.4f}') +``` + +在分块外生的情形下,子系统向量自回归*恰好*就是大向量自回归中对应的那一分块, +且只有一阶滞后。 + +在反馈情形下,一阶滞后系数被扭曲,同时还出现了更高阶的项。 + +值得注意的是,滞后通货膨胀在产出增长方程中的系数所受到的影响:大系统中的一个正数, +在子系统中变成了负数。 + +```{code-cell} ipython3 +--- +mystnb: + figure: + caption: Innovation map coefficients with and without feedback + name: fig-vs-gamma +--- +J_max = 10 +labels = [r'$\varepsilon_g$', r'$\varepsilon_\pi$', r'$\varepsilon_i$'] +fig, axes = plt.subplots(2, 2, figsize=(11, 6), sharex=True) +for col, (Gam, ttl) in enumerate([(Gam_exog, 'block exogenous'), + (Gam_fb, 'feedback')]): + for row, obs in enumerate([r'$a_g$', r'$a_\pi$']): + ax = axes[row, col] + for k in range(3): + ax.plot(np.arange(J_max + 1), Gam[:J_max + 1, row, k], + marker='o', ms=3, lw=1.5, label=labels[k]) + ax.axhline(0, color='k', lw=0.6) + ax.set_title(f'{obs}, {ttl}', fontsize=10) + if row == 1: + ax.set_xlabel('lag $j$') + if row == 0 and col == 0: + ax.legend(fontsize=8) +axes[0, 0].set_ylabel(r'$\Gamma_j$') +axes[1, 0].set_ylabel(r'$\Gamma_j$') +fig.suptitle(r'Coefficients $\Gamma_j$ in $a_t = \sum_j \Gamma_j \varepsilon_{t-j}$') +fig.tight_layout() +plt.show() +``` + +在左侧一列中,只有 $j = 0$ 处的系数非零,且它们恰好等于 $S_y$ 的各行。 + +而在右侧一列中,被剔除的利率冲击 $\varepsilon_i$ 在每一个滞后阶都渗漏进了 +观测到的新息之中。 + +## 总结 + +对 $Y_t$ 的一个有限阶向量自回归,对任何子向量 $y_t = S_y Y_t$ 都蕴含着一个 +无限阶向量自回归,其系数 $B_j = G(A - KG)^{j-1}K$ 来自 +针对伴随系统的稳态卡尔曼滤波。 + +小系统的新息是大系统新息的单侧分布滞后 +$a_t = \sum_j \Gamma_j \varepsilon_{t-j}$,其中 +$\Gamma_j = G(A - KG)^j C$ 且 $\Gamma_0 = S_y$。 + +由于 $\Gamma_j$ 是一个宽矩阵,该映射无法求逆,这正是子系统向量自回归 +信息缺失的精确表述。 + +这一代价的大小由 $\Omega - S_y V S_y^\top = \sum_{j \geq 1} \Gamma_j V \Gamma_j^\top$ 来度量。 + +当一切都被观测到时,这一代价为零;而当被保留的分块是分块外生的时候, +代价也同样为零,此时子系统向量自回归恰好等于原系统中对应的那一分块。 + +## 练习 + +```{exercise-start} +:label: vs_ex1 +``` + +以例2中的三元系统为基础,通过写出 + +$$ +A_1(\theta) = A_1^{\text{exog}} + \theta \begin{pmatrix} 0 & 0 & -0.35 \\ +0 & 0 & 0.25 \\ 0 & 0 & 0 \end{pmatrix} . +$$ + +将利率对 $(g, \pi)$ 的反馈强度置于你的控制之下。 + +对 $\theta$ 在从 $0$ 到 $1.5$ 的网格上取值,画出 + +1. $\det \Omega / \det(S_y V S_y^\top)$,即剔除 $i_t$ 所损失的信息量, +2. $\max_{j \geq 1} |\Gamma_j|$,即过去冲击渗漏进观测新息中的大小。 + +解释你在 $\theta = 0$ 处所发现的图形形状。 + +```{exercise-end} +``` + +```{solution-start} vs_ex1 +:class: dropdown +``` + +下面给出一种解法: + +```{code-cell} ipython3 +E = np.zeros((3, 3)) +E[0, 2], E[1, 2] = -0.35, 0.25 + +thetas = np.linspace(0, 1.5, 31) +det_ratio, leak = [], [] +for th in thetas: + mod = VARSubsystem([A_exog + th * E], V3, S_gpi) + Om = mod.innovation_cov() + det_ratio.append(np.linalg.det(Om) + / np.linalg.det(S_gpi @ V3 @ S_gpi.T)) + leak.append(np.abs(mod.innovation_map(40)[1:]).max()) + +fig, axes = plt.subplots(1, 2, figsize=(11, 4)) +axes[0].plot(thetas, det_ratio, lw=2) +axes[0].set(xlabel=r'$\theta$', ylabel='determinant ratio', + title='information lost by dropping $i_t$') +axes[1].plot(thetas, leak, lw=2, color='C1') +axes[1].set(xlabel=r'$\theta$', ylabel=r'$\max_{j \geq 1} |\Gamma_j|$', + title='leakage of past shocks into $a_t$') +for ax in axes: + ax.axhline(ax.get_ylim()[0], color='k', lw=0.6) +fig.tight_layout() +plt.show() + +print(f'at theta = 0: ratio = {det_ratio[0]:.6f}, leakage = {leak[0]:.2e}') +print(f'at theta = 1: ratio = {det_ratio[20]:.4f}, leakage = {leak[20]:.4f}') +``` + +两条曲线都从各自的最小值开始,泄漏量恰好为零,行列式之比恰好为一。 + +这正是 {prf:ref}`vs_prop_blockexog`:在 $\theta = 0$ 处,利率并不格兰杰因果地 +影响 $(g, \pi)$,因此即使其新息与其他新息同期相关,剔除它也不会带来任何代价。 + +随着反馈强度的增强,两种度量都会上升。 + +```{solution-end} +``` + +```{exercise-start} +:label: vs_ex2 +``` + +回到二元系统,但将 $A_1$ 和 $A_2$ 替换为单个矩阵 + +$$ +A_1 = \begin{pmatrix} 0.5 & 0.6 \\ 0 & \rho_z \end{pmatrix}, +\qquad V = I_2 , +$$ + +从而由 $\rho_z$ 控制被剔除变量 $z$ 的持续性。 + +只观测 $r$,针对 $\rho_z \in \{0.2, 0.5, 0.75, 0.9, 0.95, 0.99\}$ 报告 + +1. 预测误差方差 $\Omega$, +2. 需要多少个滞后阶才能使 $\sum_{j > p} |B_j| < 10^{-3}$。 + +一个持续性很强的被剔除变量会对计量经济学家应当拟合的向量自回归产生什么影响? + +```{exercise-end} +``` + +```{solution-start} vs_ex2 +:class: dropdown +``` + +下面给出一种解法: + +```{code-cell} ipython3 +print(' rho_z Omega lags needed') +for rho_z in [0.2, 0.5, 0.75, 0.9, 0.95, 0.99]: + mod = VARSubsystem([np.array([[0.5, 0.6], [0.0, rho_z]])], + np.eye(2), np.array([[1.0, 0.0]])) + B = mod.var_coefficients(400) + tails = [np.abs(B[p:]).sum() for p in range(400)] + p_need = next(p for p in range(400) if tails[p] < 1e-3) + print(f' {rho_z:5.2f} {mod.innovation_cov()[0, 0]:6.4f} {p_need:3d}') +``` + +两列数值都随着 $\rho_z$ 的增大而增大。 + +一个持续性很强的被剔除变量既会推高预测误差方差,也会延长自回归所需要的滞后阶数, +因为计量经济学家必须回溯得更久,才能从 $r$ 的历史中提取出关于 $z$ 的同等信息量。 + +因此,一个滞后阶数过少的经验向量自回归,在被遗漏变量持续性最强的地方, +表现将会最差。 + +```{solution-end} +``` + +```{exercise-start} +:label: vs_ex3 +``` + +系数 $B_j$ 是总体对象。 + +对例1中的二元系统模拟 $T = 200{,}000$ 个观测值,只保留 $r_t$, +并用普通最小二乘法拟合阶数为 $p = 1, 2, 4, 8$ 的有限阶自回归。 + +将估计结果与 $B_1, \ldots, B_p$ 进行比较,并将残差方差与 $\Omega$ 进行比较。 + +哪个阶数太短?拟合过短的滞后阶数会对第一个系数产生什么影响? + +```{exercise-end} +``` + +```{solution-start} vs_ex3 +:class: dropdown +``` + +下面给出一种解法: + +```{code-cell} ipython3 +Y_big, _ = mod_r.simulate(200_000, seed=3) +r_series = Y_big[:, 0] +B_pop = mod_r.var_coefficients(8)[:, 0, 0] + +for p in [1, 2, 4, 8]: + X = np.column_stack([r_series[p - 1 - l:len(r_series) - 1 - l] + for l in range(p)]) + zz = r_series[p:] + b_hat = np.linalg.lstsq(X, zz, rcond=None)[0] + resid = zz - X @ b_hat + print(f'p = {p}') + print(f' OLS {np.round(b_hat, 4)}') + print(f' population {np.round(B_pop[:p], 4)}') + print(f' residual variance {resid.var():.4f} Omega {mod_r.innovation_cov()[0, 0]:.4f}') +``` + +AR(1) 阶数太短。 + +它的单个系数被大幅抬高,远超 $B_1$,因为它必须替代被遗漏的第二个滞后项发挥作用, +而其残差方差也超过了 $\Omega$。 + +从 $p = 2$ 开始,估计值就能跟上总体系数,残差方差也稳定在 $\Omega$ 附近, +这与上文的发现一致:在本例中,$B_j$ 在超过第二个滞后阶之后就变得可以忽略不计。 + +```{solution-end} +``` \ No newline at end of file