From 091ed6c1216430206a7dd5e085b5d22426b46f78 Mon Sep 17 00:00:00 2001 From: nisha617 Date: Sun, 5 Oct 2025 22:37:57 +1100 Subject: [PATCH 1/3] Add files via upload --- lectures/cass_fiscal.md | 784 +++++++++++++++++++--------------------- 1 file changed, 370 insertions(+), 414 deletions(-) diff --git a/lectures/cass_fiscal.md b/lectures/cass_fiscal.md index f01930a..4102735 100644 --- a/lectures/cass_fiscal.md +++ b/lectures/cass_fiscal.md @@ -15,28 +15,28 @@ kernelspec: ## 概述 -本讲座研究在非随机版本的Cass-Koopmans增长模型中,可预见的财政和技术冲击对竞争均衡价格和数量的影响,该模型的特征在QuantEcon讲座{doc}`cass_koopmans_2`中有所描述。 +本讲座研究了在非随机版本的 Cass-Koopmans 增长模型下,预期的财政与技术冲击对竞争均衡价格和数量的影响。该模型的特征在QuantEcon讲座{doc}`cass_koopmans_2`中有所介绍。 -该模型在{cite}`Ljungqvist2012`第11章中有更详细的讨论。 +该模型在{cite}`Ljungqvist2012`的第11章中有更详细的讨论。 -我们将该模型作为实验室,用于试验近似均衡的数值技术,并展示决策者对未来政府决策具有完全预见性的动态模型的结构。 +我们将此模型作为一个实验室,用来尝试近似均衡的数值方法,并展示动态模型的结构,在这些模型中,决策者对未来政府的决策拥有完美预期。 -遵循Robert E. Hall {cite}`hall1971dynamic`的经典论文,我们对Cass-Koopmans最优增长模型的非随机版本进行了扩展,加入了一个政府,该政府购买商品流,并通过一系列扭曲性的固定税率来为其购买融资。 +遵循Robert E. Hall的经典论文{cite}`hall1971dynamic`,我们在Cass-Koopmans最优增长模型的非随机版本基础上,增加了一个政府部门。该政府购买一系列商品,并通过一系列扭曲的比例税来为其支出融资。 扭曲性税收使竞争均衡配置无法解决规划问题。 -因此,为了计算均衡配置和价格系统,我们求解一个由决策者的一阶条件和其他均衡条件组成的非线性差分方程系统。 +因此,为了计算均衡配置和价格体系,我们需要解一个非线性差分方程组。该方程组由决策者的一阶条件和其他均衡条件组成。 -我们提出了两种近似均衡的方法: +我们提出两种近似均衡的方法: -- 第一种是类似于我们在{doc}`cass_koopmans_2`中使用的射击算法。 +- 第一种是射击算法,类似于我们在{doc}`cass_koopmans_2`中使用的。 -- 第二种方法是一种求根算法,它最小化来自消费者和代表性企业的一阶条件的残差。 +- 第二种方法是求根算法,该算法最小化消费者与代表性企业一阶条件残差。 (cs_fs_model)= -## 经济体 +## 经济模型 ### 技术 @@ -49,104 +49,97 @@ $$ (eq:tech_capital) 其中 -- $g_t$ 是时间$t$的政府购买 -- $x_t$ 是总投资,以及 -- $F(k_t, n_t)$ 是线性齐次生产函数,具有正的且递减的资本$k_t$和劳动$n_t$的边际产量。 +- $g_t$ 是t时期的政府购买, +- $x_t$ 是总投资, +- $F(k_t, n_t)$ 是一个线性齐次的生产函数,其中资本$k_t$和劳动$n_t$具有正的且递减的边际产出。 -实物资本按以下方式演化 +物质资本的演化规律为 $$ k_{t+1} = (1 - \delta)k_t + x_t, $$ -其中$\delta \in (0, 1)$是折旧率。 +其中 $\delta \in (0, 1)$ 是折旧率。 -有时从{eq}`eq:tech_capital`中消除$x_t$并将其表示为 +有时,将 $x_t$ 从{eq}`eq:tech_capital`中消除会更方便,可将其表示为 $$ g_t + c_t + k_{t+1} \leq F(k_t, n_t) + (1 - \delta)k_t. -$$ +$$ ### 竞争均衡的组成部分 -所有交易都发生在时间$0$。 +所有交易都发生在0时期。 -代表性家庭拥有资本,做出投资决策,并将资本和劳动租给代表性生产企业。 +代表性家庭拥有资本,做出投资决策,并将资本和劳动出租给代表性生产企业。 -代表性企业使用资本和劳动通过生产函数$F(k_t, n_t)$生产商品。 +代表性企业使用资本和劳动生产商品,生产函数为 $F(k_t, n_t)$。 -**价格系统**是序列三元组$\{q_t, \eta_t, w_t\}_{t=0}^\infty$,其中 +**价格体系**是一个三元序列 $\{q_t, \eta_t, w_t\}_{t=0}^\infty$,其中 -- $q_t$ 是时间$t$的一单位投资或消费($x_t$或$c_t$)在时间$0$的税前价格, -- $\eta_t$ 是家庭在时间$t$从企业租赁资本所获得的税前价格,以及 -- $w_t$ 是家庭在时间$t$向企业租赁劳动所获得的税前价格。 +- $q_t$ 是在 $0$ 时期下一单位$t$ 时期的投资或消费($x_t$ 或 $c_t$)的税前价格, +- $\eta_t$ 是家庭在 $t$ 时期从企业租赁资本所获得的税前价格, +- $w_t$ 是家庭在 $t$ 时期向企业出租劳动力所获得的税前价格。 -价格$w_t$和$\eta_t$以时间$t$的商品表示,而$q_t$以时间$0$的计价物表示,如{doc}`cass_koopmans_2`中所示。 +价格 $w_t$ 和 $\eta_t$ 是以 $t$ 时期的商品为单位表示的,而 $q_t$ 则以 $0$ 时期的计价物计价,这与{doc}`cass_koopmans_2`中一致。 -政府的存在使本讲座与{doc}`cass_koopmans_2`有所区别。 +政府的存在使得本讲座区别于{doc}`cass_koopmans_2`。 -时间$t$的政府购买商品为$g_t \geq 0$。 +$t$ 时期的政府购买为 $g_t \geq 0$。 -政府支出计划是一个序列$g = \{g_t\}_{t=0}^\infty$。 +政府支出计划是一个序列 $g = \{g_t\}_{t=0}^\infty$。 -政府税收计划是序列的四元组$\{\tau_{ct}, \tau_{kt}, \tau_{nt}, \tau_{ht}\}_{t=0}^\infty$, -其中 +政府税收计划是一个四元序列 $\{\tau_{ct}, \tau_{kt}, \tau_{nt}, \tau_{ht}\}_{t=0}^\infty$,其中: -- $\tau_{ct}$ 是时间$t$的消费税率, -- $\tau_{kt}$ 是时间$t$的资本租金税率, -- $\tau_{nt}$ 是时间$t$的工资收入税率,以及 -- $\tau_{ht}$ 是时间$t$对消费者的一次性总额税。 +- $\tau_{ct}$ 是 $t$ 时期的消费税率, +- $\tau_{kt}$ 是 $t$ 时期的资本租赁税率, +- $\tau_{nt}$ 是 $t$ 时期的工资税率, +- $\tau_{ht}$ 是 $t$ 时期对消费者的一次性总额税。 -由于一次性总额税$\tau_{ht}$可用,政府实际上不应该使用任何扭曲性税收。 +由于可以征收一次性总额税 $\tau_{ht}$,政府实际上不应使用任何扭曲性税收。 -然而,我们包括所有这些税收是因为,像{cite}`hall1971dynamic`一样,它们允许我们分析各种税收如何扭曲生产和消费决策。 +尽管如此,我们仍然包含所有这些税收,因为像 {cite}`hall1971dynamic` 一样,它们让我们能够分析各种税收如何扭曲生产和消费决策。 -在[实验部分](cf:experiments)中,我们将看到政府税收计划的变化如何影响过渡路径和均衡。 +在[实验部分](cf:experiments),我们将看到政府税收计划的变化如何影响转型路径和均衡。 ### 代表性家庭 -代表性家庭对单一消费品$c_t$和闲暇$1-n_t$的非负流具有偏好,这些偏好按以下方式排序: +代表性家庭对单一消费品 $c_t$ 和闲暇 $1-n_t$ 的非负序列具有偏好,其偏好由下式给出: $$ \sum_{t=0}^{\infty} \beta^t U(c_t, 1-n_t), \quad \beta \in (0, 1), $$ (eq:utility) 其中 +- $U$ 对 $c_t$ 严格递增,二次连续可微,并在 $c_t \geq 0$ 且 $n_t \in [0, 1]$ 时严格凹。 -- $U$在$c_t$中严格递增,二次连续可微,并且在$c_t \geq 0$和$n_t \in [0, 1]$的条件下严格凹。 - - -代表性家庭在单一预算约束下最大化{eq}`eq:utility`: +代表性家庭在以下单一预算约束下最大化{eq}`eq:utility`: $$ \begin{aligned} \sum_{t=0}^\infty& q_t \left\{ (1 + \tau_{ct})c_t + \underbrace{[k_{t+1} - (1 - \delta)k_t]}_{\text{投资时无税}} \right\} \\ - &\leq \sum_{t=0}^\infty q_t \left\{ \eta_t k_t - \underbrace{\tau_{kt}(\eta_t - \delta)k_t}_{\text{租金回报税}} + (1 - \tau_{nt})w_t n_t - \tau_{ht} \right\}. + &\leq \sum_{t=0}^\infty q_t \left\{ \eta_t k_t - \underbrace{\tau_{kt}(\eta_t - \delta)k_t}_{\text{租金收益税}} + (1 - \tau_{nt})w_t n_t - \tau_{ht} \right\}. \end{aligned} $$ (eq:house_budget) -这里我们假设政府从资本的总租金$\eta_t k_t$中给予折旧补贴$\delta k_t$,因此对来自资本的租金征收税款$\tau_{kt} (\eta_t - \delta) k_t$。 +这里我们假设政府从资本租赁收入 $\eta_t k_t$ 扣除折旧补贴 $\delta k_t$,因此只对 $\tau_{kt} (\eta_t - \delta) k_t$ 征收资本租赁税。 ### 政府 - -政府购买计划$\{ g_t \}_{t=0}^\infty$和税收计划$\{\tau_{ct}, \tau_{kt}, \tau_{nt}, \tau_{ht}\}_{t=0}^\infty$必须遵守预算约束 +政府支出计划 $\{ g_t \}_{t=0}^\infty$ 和税收 $\{\tau_{ct}, \tau_{kt}, \tau_{nt}, \tau_{ht}\}_{t=0}^\infty$ 必须满足以下预算约束 $$ \sum_{t=0}^\infty q_t g_t \leq \sum_{t=0}^\infty q_t \left\{ \tau_{ct}c_t + \tau_{kt}(\eta_t - \delta)k_t + \tau_{nt}w_t n_t + \tau_{ht} \right\}. $$ (eq:gov_budget) +在给定一个预算可行的政府政策 $\{g_t\}_{t=0}^\infty$ 和 $\{\tau_{ct}, \tau_{kt}, \tau_{nt}, \tau_{ht}\}_{t=0}^\infty$ (满足式{eq}`eq:gov_budget`)的条件下: - -给定满足{eq}`eq:gov_budget`的预算可行政府政策$\{g_t\}_{t=0}^\infty$和$\{\tau_{ct}, \tau_{kt}, \tau_{nt}, \tau_{ht}\}_{t=0}^\infty$, - -- *家庭*选择$\{c_t\}_{t=0}^\infty$、$\{n_t\}_{t=0}^\infty$和$\{k_{t+1}\}_{t=0}^\infty$,在预算约束{eq}`eq:house_budget`下最大化效用{eq}`eq:utility`,以及 -- *企业*选择资本序列$\{k_t\}_{t=0}^\infty$和$\{n_t\}_{t=0}^\infty$以最大化利润 +- *家庭*选择 $\{c_t\}_{t=0}^\infty$、$\{n_t\}_{t=0}^\infty$ 和 $\{k_{t+1}\}_{t=0}^\infty$,在预算约束{eq}`eq:house_budget`下最大化效用函数{eq}`eq:utility`, +- *企业*选择 $\{k_t\}_{t=0}^\infty$ 和 $\{n_t\}_{t=0}^\infty$ 以最大化利润 $$ \sum_{t=0}^\infty q_t [F(k_t, n_t) - \eta_t k_t - w_t n_t] $$ (eq:firm_profit) - - **可行配置**是满足可行性条件{eq}`eq:tech_capital`的序列$\{c_t, x_t, n_t, k_t\}_{t=0}^\infty$。 ## 均衡 @@ -154,39 +147,37 @@ $$ (eq:gov_budget) ```{prf:definition} :label: com_eq_tax -**带扭曲性税收的竞争均衡**是一个**预算可行的政府政策**、**可行配置**和**价格系统**,在给定价格系统和政府政策的情况下,该配置解决家庭问题和企业问题。 +**带扭曲性税收的竞争均衡**是一个**预算可行的政府政策**、一个**可行配置**和一个**价格体系**的组合。在给定价格体系和政府政策的情况下,该配置同时解决家庭问题和企业问题。 ``` -## 无套利条件 - -无套利论证意味着对跨时间的价格和税率的限制。 +### 无套利条件 +无套利论证意味着对跨期的价格和税率有一个限制条件。 -通过重新排列{eq}`eq:house_budget`并在相同的$t$处对$k_t$进行分组,我们可以得到 +通过重新排列{eq}`eq:house_budget`,并将同一时期的$k_t$项组合在一起,我们可以得到 $$ \begin{aligned} \sum_{t=0}^\infty q_t \left[(1 + \tau_{ct})c_t \right] &\leq \sum_{t=0}^\infty q_t(1 - \tau_{nt})w_t n_t - \sum_{t=0}^\infty q_t \tau_{ht} \\ &+ \sum_{t=1}^\infty\left\{ \left[(1 - \tau_{kt})(\eta_t - \delta) + 1\right]q_t - q_{t-1}\right\}k_t \\ - &+ \left[(1 - \tau_{k0})(\eta_0 - \delta) + 1\right]q_0k_0 - \lim_{T \to \infty} q_T k_{T+1} +&+ \left[(1 - \tau_{k0})(\eta_0 - \delta) + 1\right]q_0k_0 - \lim_{T \to \infty} q_T k_{T+1} \end{aligned} $$ (eq:constrant_house) -家庭继承给定的$k_0$作为初始条件,并可以自由选择$\{ c_t, n_t, k_{t+1} \}_{t=0}^\infty$。 +家庭继承了一个给定的$k_0$,并将其作为初始条件,同时可以自由选择 $\{ c_t, n_t, k_{t+1} \}_{t=0}^\infty$。 -由于资源有限,家庭的预算约束{eq}`eq:house_budget`在均衡中必须是有界的。 +由于资源有限,家庭的预算约束{eq}`eq:house_budget`在均衡状态下必须是有界的。 这对价格和税收序列施加了限制。 -具体来说,对于$t \geq 1$,乘以$k_t$的项必须等于零。 +具体来说,对于 $t \geq 1$,与 $k_t$ 相乘的项必须等于零。 -如果它们严格为正(负),家庭可以通过选择任意大的正(负)$k_t$来任意增加(减少){eq}`eq:house_budget`的右侧,从而导致无限的利润或套利机会: +如果这些项严格为正(负),家庭就可以通过选择一个任意大的正(负)$k_t$ 来任意增加(减少){eq}`eq:house_budget`的右侧,从而导致无限利润或套利机会: -- 对于严格为正的项,家庭可以购买大量资本存量$k_t$,并从其租赁服务和未折旧价值中获利。 +- 如果这些项严格为正,家庭可以购买大量资本存量 $k_t$,并从资本的租赁服务和未折旧价值中获利。 +- 如果这些项严格为负,家庭可以通过“卖空”合成单位资本来获利。两种情况都会导致{eq}`eq:house_budget`无界。 -- 对于严格为负的项,家庭可以进行资本合成单位的"卖空"。这两种情况都会使{eq}`eq:house_budget`无界。 - -因此,通过将乘以$k_t$的项设为$0$,我们得到无套利条件: +因此,通过令与 $k_t$ 相乘的项设为 $0$,我们得到无套利条件: $$ \frac{q_t}{q_{t+1}} = \left[(1 - \tau_{kt+1})(\eta_{t+1} - \delta) + 1\right]. @@ -198,17 +189,15 @@ $$ -\lim_{T \to \infty} q_T k_{T+1} = 0. $$ (eq:terminal) - - 代表性企业的零利润条件对均衡价格和数量施加了额外的限制。 -企业利润的现值为 +企业利润的现值为: $$ \sum_{t=0}^\infty q_t \left[ F(k_t, n_t) - w_t n_t - \eta_t k_t \right]. $$ -将欧拉定理应用于线性齐次函数$F(k, n)$,企业的现值为: +将线性齐次函数的欧拉定理应用于 $F(k, n)$,企业利润的现值为: $$ \sum_{t=0}^\infty q_t \left[ (F_{kt} - \eta_t)k_t + (F_{nt} - w_t)n_t \right]. @@ -224,13 +213,13 @@ $$(eq:no_arb_firms) 家庭在{eq}`eq:house_budget`约束下最大化{eq}`eq:utility`。 -令$U_1 = \frac{\partial U}{\partial c}, U_2 = \frac{\partial U}{\partial (1-n)} = -\frac{\partial U}{\partial n}.$,我们可以从拉格朗日函数导出一阶条件 +令 $U_1 = \frac{\partial U}{\partial c}, U_2 = \frac{\partial U}{\partial (1-n)} = -\frac{\partial U}{\partial n}$,我们可以从拉格朗日函数 $$ -\mathcal{L} = \sum_{t=0}^\infty \beta^t U(c_t, 1 - n_t) + \mu \left( \sum_{t=0}^\infty q_t \left[(1 + \tau_{ct})c_t - (1 - \tau_{nt})w_t n_t + \ldots \right] \right), +\mathcal{L} = \sum_{t=0}^\infty \beta^t U(c_t, 1 - n_t) + \mu \left( \sum_{t=0}^\infty q_t \left[(1 + \tau_{ct})c_t - (1 - \tau_{nt})w_t n_t + \ldots \right] \right) $$ -代表性家庭问题的一阶必要条件为 +推导出一阶条件 $$ \frac{\partial \mathcal{L}}{\partial c_t} = \beta^t U_{1}(c_t, 1 - n_t) - \mu q_t (1 + \tau_{ct}) = 0 @@ -239,10 +228,10 @@ $$ (eq:foc_c_1) 和 $$ -\frac{\partial \mathcal{L}}{\partial n_t} = \beta^t \left(-U_{2t}(c_t, 1 - n_t)\right) - \mu q_t (1 - \tau_{nt}) w_t = 0 +\frac{\partial \mathcal{L}}{\partial n_t} = \beta^t \left(-U_{2t}(c_t, 1 - n_t)\right) - \mu q_t (1 - \tau_{nt}) w_t = 0. $$ (eq:foc_n_1) -重新排列{eq}`eq:foc_c_1`和{eq}`eq:foc_n_1`,我们有 +对{eq}`eq:foc_c_1`和{eq}`eq:foc_n_1`进行整理,我们得到 $$ \begin{aligned} @@ -257,7 +246,7 @@ $$ $$ (eq:foc_n) -将{eq}`eq:foc_c`代入{eq}`eq:terminal`并替换$q_t$,我们得到终端条件 +将{eq}`eq:foc_c`代入{eq}`eq:terminal`并替换 $q_t$,我们得到终端条件 $$ -\lim_{T \to \infty} \beta^T \frac{U_{1T}}{(1 + \tau_{cT})} k_{T+1} = 0. @@ -265,10 +254,12 @@ $$ (eq:terminal_final) ## 计算均衡 -为了计算均衡,我们寻求一个价格系统$\{q_t, \eta_t, w_t\}$、一个预算可行的政府政策$\{g_t, \tau_t\} \equiv \{g_t, \tau_{ct}, \tau_{nt}, \tau_{kt}, \tau_{ht}\}$,以及一个配置$\{c_t, n_t, k_{t+1}\}$,它们求解由以下组成的非线性差分方程系统: +为了计算均衡,我们需要寻找一个价格体系 $\{q_t, \eta_t, w_t\}$、一个预算可行的政府政策 $\{g_t, \tau_t\} \equiv \{g_t, \tau_{ct}, \tau_{nt}, \tau_{kt}, \tau_{ht}\}$ 以及一个配置 $\{c_t, n_t, k_{t+1}\}$,它们能够解决由以下组成的非线性差分方程系统: + +- 可行性条件{eq}`eq:tech_capital`、家庭无套利条件{eq}`eq:no_arb`、企业无套利条件{eq}`eq:no_arb_firms`、家庭的一阶条件{eq}`eq:foc_c`和{eq}`eq:foc_n`, +- 初始条件 $k_0$ 和终端条件{eq}`eq:terminal_final`。 + -- 可行性条件{eq}`eq:tech_capital`,家庭的无套利条件{eq}`eq:no_arb`和企业的无套利条件{eq}`eq:no_arb_firms`,家庭的一阶条件{eq}`eq:foc_c`和{eq}`eq:foc_n`。 -- 初始条件$k_0$和终端条件{eq}`eq:terminal_final`。 (cass_fiscal_shooting)= ## Python代码 @@ -279,6 +270,11 @@ $$ (eq:terminal_final) import numpy as np from scipy.optimize import root import matplotlib.pyplot as plt +import matplotlib as mpl +FONTPATH = "fonts/SourceHanSerifSC-SemiBold.otf" +mpl.font_manager.fontManager.addfont(FONTPATH) +plt.rcParams['font.family'] = ['Source Han Serif SC'] + from collections import namedtuple from mpmath import mp, mpf from warnings import warn @@ -288,42 +284,42 @@ mp.dps = 40 mp.pretty = True ``` -我们使用`mpmath`库在射击算法中执行高精度算术,以应对由于数值不稳定性导致解发散的情况。 +我们使用`mpmath`库在射击算法中执行高精度运算,以防止由于数值不稳定而导致解发散。 ```{note} -在下面的函数中,我们包含了处理增长组件的例程,这将在{ref}`growth_model`部分进一步讨论。 +在下面的函数中,我们包含了一些处理增长成分的例程(将在{doc}`Exogenous growth` 一节中进一步讨论)。 -我们在这里包含它们以避免代码重复。 +我们在这里提前加入这些代码是为了避免代码重复。 ``` 我们设置以下参数 ```{code-cell} ipython3 -# Create a namedtuple to store the model parameters +# 创建一个命名元组来存储模型参数 Model = namedtuple("Model", ["β", "γ", "δ", "α", "A"]) -def create_model(β=0.95, # discount factor - γ=2.0, # relative risk aversion coefficient - δ=0.2, # depreciation rate - α=0.33, # capital share - A=1.0 # TFP +def create_model(β=0.95, # 贴现因子 + γ=2.0, # 相对风险厌恶系数 + δ=0.2, # 折旧率 + α=0.33, # 资本份额 + A=1.0 # 全要素生产率 ): - """Create a model instance.""" + """创建一个模型实例。""" return Model(β=β, γ=γ, δ=δ, α=α, A=A) model = create_model() -# Total number of periods +# 总期数 S = 100 ``` ### 非弹性劳动供给 -在本讲座中,我们考虑$U(c, 1-n) = u(c)$和$f(k) := F(k, 1)$的特殊情况。 +在本讲中,我们考虑一个特殊情形,即 $U(c, 1-n) = u(c)$,$f(k) := F(k, 1)$。 -我们用$f(k) := F(k, 1)$重写{eq}`eq:tech_capital`, +我们用 $f(k) := F(k, 1)$ 将{eq}`eq:tech_capital`重写为 $$ k_{t+1} = f(k_t) + (1 - \delta) k_t - g_t - c_t. @@ -332,15 +328,15 @@ $$ (eq:feasi_capital) ```{code-cell} ipython3 def next_k(k_t, g_t, c_t, model, μ_t=1): """ - Capital next period: k_{t+1} = f(k_t) + (1 - δ) * k_t - c_t - g_t - with optional growth adjustment: k_{t+1} = (f(k_t) + (1 - δ) * k_t - c_t - g_t) / μ_{t+1} + 下一期资本:k_{t+1} = f(k_t) + (1 - δ) * k_t - c_t - g_t + 带有可选的调整: k_{t+1} = (f(k_t) + (1 - δ) * k_t - c_t - g_t) / μ_{t+1} """ return (f(k_t, model) + (1 - model.δ) * k_t - g_t - c_t) / μ_t ``` -根据线性齐次生产函数的性质,我们有$F_k(k, n) = f'(k)$和$F_n(k, 1) = f(k, 1) - f'(k)k$。 +根据线性齐次生产函数的性质,我们有 $F_k(k, n) = f'(k)$ 和 $F_n(k, 1) = f(k, 1) - f'(k)k$。 -将{eq}`eq:foc_c`、{eq}`eq:no_arb_firms`和{eq}`eq:feasi_capital`代入{eq}`eq:no_arb`,我们得到欧拉方程 +将{eq}`eq:foc_c`、{eq}`eq:no_arb_firms`和{eq}`eq:feasi_capital`代入{eq}`eq:no_arb`,我们得到欧拉方程 $$ \begin{aligned} @@ -350,7 +346,7 @@ $$ \end{aligned} $$(eq:euler_house) -这可以简化为: +这可以简化为: $$ \begin{aligned} @@ -358,15 +354,13 @@ u'(c_t) = \beta u'(c_{t+1}) \frac{(1 + \tau_{ct})}{(1 + \tau_{ct+1})} [(1 - \tau \end{aligned} $$ (eq:diff_second) - -方程{eq}`eq:diff_second`将在我们的均衡计算算法中占据重要地位。 - +方程{eq}`eq:diff_second`将在我们的均衡计算算法中发挥重要作用。 ### 稳态 -税率和政府支出作为差分方程{eq}`eq:feasi_capital`和{eq}`eq:diff_second`的**强制函数**。 +税率和政府支出在差分方程{eq}`eq:feasi_capital`和{eq}`eq:diff_second`中起到**强制函数**的作用。 -定义$z_t = [g_t, \tau_{kt}, \tau_{ct}]'$。 +定义 $z_t = [g_t, \tau_{kt}, \tau_{ct}]'$。 将二阶差分方程表示为: @@ -374,15 +368,15 @@ $$ H(k_t, k_{t+1}, k_{t+2}; z_t, z_{t+1}) = 0. $$ (eq:second_ord_diff) -我们假设政府政策达到稳态,使得$\lim_{t \to \infty} z_t = \bar z$,并且稳态对于$t > T$成立。 +我们假设政府政策达到稳态,使得 $\lim_{t \to \infty} z_t = \bar z$,且该稳态在 $t > T$ 时保持。 -终端稳态资本存量$\bar{k}$满足: +终端稳态资本存量 $\bar{k}$ 满足: $$ H(\bar{k}, \bar{k}, \bar{k}, \bar{z}, \bar{z}) = 0. $$ -从差分方程{eq}`eq:diff_second`,我们可以推断出对稳态的限制: +由差分方程{eq}`eq:diff_second`,我们可以推导出稳态的约束条件: $$ \begin{aligned} @@ -402,18 +396,17 @@ $$ (eq:equil_q) ```{code-cell} ipython3 def compute_q_path(c_path, model, S=100, A_path=None): """ - Compute q path: q_t = (β^t * u'(c_t)) / u'(c_0) - with optional A_path for growth models. + 计算q路径:q_t = (β^t * u'(c_t)) / u'(c_0) + 在增长模型中可以选择性地传入 A_path。 """ A = np.ones_like(c_path) if A_path is None else np.asarray(A_path) q_path = np.zeros_like(c_path) for t in range(S): q_path[t] = (model.β ** t * - u_prime(c_path[t], model, A[t])) / u_prime(c_path[0], model, A[0]) + u_prime(c_path[t], model, A[t])) / u_prime(c_path[0], model, A[0]) return q_path ``` - -*资本租金率* +*资本租赁率* $$ \eta_t = f'(k_t) @@ -422,8 +415,8 @@ $$ ```{code-cell} ipython3 def compute_η_path(k_path, model, S=100, A_path=None): """ - Compute η path: η_t = f'(k_t) - with optional A_path for growth models. + 计算η路径:η_t = f'(k_t) + 在增长模型中可以选择性地传入 A_path。 """ A = np.ones_like(k_path) if A_path is None else np.asarray(A_path) η_path = np.zeros_like(k_path) @@ -431,8 +424,7 @@ def compute_η_path(k_path, model, S=100, A_path=None): η_path[t] = f_prime(k_path[t], model, A[t]) return η_path ``` - -*劳动租金率:* +*劳动力租赁率:* $$ w_t = f(k_t) - k_t f'(k_t) @@ -441,8 +433,8 @@ $$ ```{code-cell} ipython3 def compute_w_path(k_path, η_path, model, S=100, A_path=None): """ - Compute w path: w_t = f(k_t) - k_t * f'(k_t) - with optional A_path for growth models. + 计算w路径:w_t = f(k_t) - k_t * f'(k_t) + 在增长模型中可以选择性地传入 A_path。 """ A = np.ones_like(k_path) if A_path is None else np.asarray(A_path) w_path = np.zeros_like(k_path) @@ -450,8 +442,7 @@ def compute_w_path(k_path, η_path, model, S=100, A_path=None): w_path[t] = f(k_path[t], model, A[t]) - k_path[t] * η_path[t] return w_path ``` - -*资本的单期总回报率:* +*资本的单期回报率:* $$ \bar{R}_{t+1} = \frac{(1 + \tau_{ct})}{(1 + \tau_{ct+1})} \left[(1 - \tau_{kt+1})(f'(k_{t+1}) - \delta) + 1\right] = \frac{(1 + \tau_{ct})}{(1 + \tau_{ct+1})} R_{t, t+1} @@ -460,19 +451,18 @@ $$ (eq:gross_rate) ```{code-cell} ipython3 def compute_R_bar(τ_ct, τ_ctp1, τ_ktp1, k_tp1, model): """ - Gross one-period return on capital: + 资本的单期总回报率: R_bar = [(1 + τ_c_t) / (1 + τ_c_{t+1})] * { [1 - τ_k_{t+1}] * [f'(k_{t+1}) - δ] + 1 } """ return ((1 + τ_ct) / (1 + τ_ctp1)) * ( - (1 - τ_ktp1) * (f_prime(k_tp1, model) - model.δ) + 1) -``` + (1 - τ_ktp1) * (f_prime(k_tp1, model) - model.δ) + 1) -```{code-cell} ipython3 def compute_R_bar_path(shocks, k_path, model, S=100): """ - Compute R_bar path over time. + 计算随时间变化的R̄路径。 """ + A, α, δ = model.A, model.α, model.δ R_bar_path = np.zeros(S + 1) for t in range(S): R_bar_path[t] = compute_R_bar( @@ -482,20 +472,20 @@ def compute_R_bar_path(shocks, k_path, model, S=100): return R_bar_path ``` -*单期贴现因子:* +*一期贴现因子:* $$ R^{-1}_{t, t+1} = \frac{q_{t+1}}{q_{t}} = m_{t, t+1} = \beta \frac{u'(c_{t+1})}{u'(c_t)} \frac{(1 + \tau_{ct})}{(1 + \tau_{ct+1})} $$ (eq:equil_bigR) -*净单期利率:* +*一期净利率:* $$ r_{t, t+1} \equiv R_{t, t+1} - 1 = (1 - \tau_{k, t+1})(f'(k_{t+1}) - \delta) $$ (eq:equil_r) -根据{eq}`eq:equil_bigR`和$r_{t, t+1} = - \ln(\frac{q_{t+1}}{q_t})$,我们有 +根据{eq}`eq:equil_bigR`和 $r_{t, t+1} = - \ln(\frac{q_{t+1}}{q_t})$,我们有 $$ R_{t, t+s} = e^{s \cdot r_{t, t+s}}. @@ -507,7 +497,7 @@ $$ \frac{q_{t+s}}{q_t} = e^{-s \cdot r_{t, t+s}}. $$ -重新排列上述方程,我们有 +重新整理上述方程,我们得到 $$ r_{t, t+s} = -\frac{1}{s} \ln\left(\frac{q_{t+s}}{q_t}\right). @@ -516,7 +506,7 @@ $$ ```{code-cell} ipython3 def compute_rts_path(q_path, S, t): """ - Compute r path: + 计算r路径: r_t,t+s = - (1/s) * ln(q_{t+s} / q_t) """ s = np.arange(1, S + 1) @@ -526,10 +516,9 @@ def compute_rts_path(q_path, S, t): rts_path = - np.log(q_path[t + s] / q_path[t]) / s return rts_path ``` - ## 一些函数形式 -我们假设代表性家庭的期效用具有以下CRRA(常相对风险厌恶)形式 +我们假设代表性家庭的效用函数具有以下CRRA(常数相对风险厌恶)形式 $$ u(c) = \frac{c^{1 - \gamma}}{1 - \gamma} @@ -538,13 +527,13 @@ $$ ```{code-cell} ipython3 def u_prime(c, model, A_t=1): """ - Marginal utility: u'(c) = c^{-γ} - with optional technology adjustment: u'(cA) = (cA)^{-γ} + 边际效用:u'(c) = c^{-γ} + 带可选的技术调整: u'(cA) = (cA)^{-γ} """ return (c * A_t) ** (-model.γ) ``` -通过将{eq}`eq:gross_rate`代入{eq}`eq:diff_second`,我们得到 +将{eq}`eq:gross_rate`代入{eq}`eq:diff_second`,我们得到 $$ c_{t+1} = c_t \left[ \beta \frac{(1 + \tau_{ct})}{(1 + \tau_{ct+1})} \left[(1 - \tau_{k, t+1})(f'(k_{t+1}) - \delta) + 1 \right] \right]^{\frac{1}{\gamma}} = c_t \left[ \beta \overline{R}_{t+1} \right]^{\frac{1}{\gamma}} @@ -553,70 +542,68 @@ $$ (eq:consume_R) ```{code-cell} ipython3 def next_c(c_t, R_bar, model, μ_t=1): """ - Consumption next period: c_{t+1} = c_t * (β * R̄)^{1/γ} - with optional growth adjustment: c_{t+1} = c_t * (β * R_bar)^{1/γ} * μ_{t+1}^{-1} + 下一期消费:c_{t+1} = c_t * (β * R̄)^{1/γ} + 带可选的增长调整:c_{t+1} = c_t * (β * R_bar)^{1/γ} * μ_{t+1}^{-1} """ return c_t * (model.β * R_bar) ** (1 / model.γ) / μ_t ``` -对于生产函数,我们假设Cobb-Douglas形式: +对于生产函数,我们假设其为柯布-道格拉斯形式: $$ F(k, 1) = A k^\alpha $$ ```{code-cell} ipython3 -def f(k, model, A=1): +def f(k, model): """ - Production function: f(k) = A * k^{α} + 生产函数:f(k) = A * k^{α} """ return A * k ** model.α -def f_prime(k, model, A=1): +def f_prime(k, model): """ - Marginal product of capital: f'(k) = α * A * k^{α - 1} + 资本的边际产出:f'(k) = α * A * k^{α - 1} """ return model.α * A * k ** (model.α - 1) ``` - ## 计算 -我们描述了计算均衡的两种方法: +我们介绍两种计算均衡的方法: - * 射击算法 - * 残差最小化方法,专注于施加欧拉方程{eq}`eq:diff_second`和可行性条件{eq}`eq:feasi_capital`。 +* 射击算法 +* 残差最小化方法,主要关注满足欧拉方程{eq}`eq:diff_second`和可行性条件{eq}`eq:feasi_capital`。 ### 射击算法 -该算法执行以下步骤。 - -1. 求解方程{eq}`eq:diff_second_steady`以获得对应于永久政策向量$\bar{z}$的终端稳态资本$\bar{k}$。 +该算法包含以下步骤: -2. 选择一个大的时间索引$S \gg T$,猜测初始消费率$c_0$,并使用方程{eq}`eq:feasi_capital`求解$k_1$。 +1. 求解方程{eq}`eq:diff_second_steady`,得到与永久政策向量 $\bar{z}$ 相对应的终端稳态资本存量 $\bar{k}$。 -3. 使用方程{eq}`eq:consume_R`确定$c_{t+1}$。然后,应用方程{eq}`eq:feasi_capital`计算$k_{t+2}$。 +2. 选择一个远大于 $T$ 的时间指标 $S \gg T$,猜测一个初始消费率 $c_0$,并利用方程{eq}`eq:feasi_capital`求解 $k_1$。 -4. 迭代步骤3以计算候选值$\hat{k}_t$,对于$t = 1, \dots, S$。 +3. 使用方程{eq}`eq:consume_R`确定 $c_{t+1}$。然后,应用方程{eq}`eq:feasi_capital`计算 $k_{t+2}$。 -5. 计算差值$\hat{k}_S - \bar{k}$。如果对于某个小的$\epsilon$,$\left| \hat{k}_S - \bar{k} \right| > \epsilon$,调整$c_0$并重复步骤2-5。 +4. 重复步骤3,计算 $t = 1, \dots, S$ 时的候选值 $\hat{k}_t$。 -6. 使用二分法迭代调整$c_0$,找到确保$\left| \hat{k}_S - \bar{k} \right| < \epsilon$的值。 +5. 计算差值 $\hat{k}_S - \bar{k}$。如果对于某个小 $\epsilon$,$\left| \hat{k}_S - \bar{k} \right| > \epsilon$,则调整 $c_0$ 并重复步骤2-5。 +6. 通过二分法迭代调整 $c_0$,直到找到一个值使得 $\left| \hat{k}_S - \bar{k} \right| < \epsilon$。 以下代码实现了这些步骤。 ```{code-cell} ipython3 -# Steady-state calculation +# 稳态计算 def steady_states(model, g_ss, τ_k_ss=0.0, μ_ss=None): """ - Calculate steady state values for capital and - consumption with optional A_path for growth models. + 计算资本与消费的稳态值, + 在增长模型中可以选择性地传入 A_path。 """ β, δ, α, γ = model.β, model.δ, model.α, model.γ A = model.A or 1.0 - # growth‐adjustment in the numerator: μ^γ or 1 + # 分子中的增长调整:μ^γ 或 1 μ_eff = μ_ss**γ if μ_ss is not None else 1.0 num = δ + (μ_eff/β - 1) / (1 - τ_k_ss) @@ -633,10 +620,10 @@ def steady_states(model, g_ss, τ_k_ss=0.0, μ_ss=None): def shooting_algorithm( c0, k0, shocks, S, model, A_path=None): """ - Shooting algorithm for given initial c0 and k0 - with optional A_path for growth models. + 给定初始 c0 和 k0 的射击算法, + 在增长模型中可以选择性地传入 A_path。 """ - # unpack & mpf‐ify shocks, fill μ with ones if missing + # 解包并将 shocks 转为 mpf 格式,如果缺少 μ 就填充为全 1 g = np.array(list(map(mpf, shocks['g'])), dtype=object) τ_c = np.array(list(map(mpf, shocks['τ_c'])), dtype=object) τ_k = np.array(list(map(mpf, shocks['τ_k'])), dtype=object) @@ -670,9 +657,9 @@ def bisection_c0( c0_guess, k0, shocks, S, model, tol=mpf('1e-6'), max_iter=1000, verbose=False, A_path=None): """ - Bisection method to find initial c0 + 二分法寻找初始消费值 c0 """ - # steady‐state uses last shocks (μ=1 if missing) + # 稳态使用最后一期的 shocks(如果缺少 μ,则设为 1) g_last = mpf(shocks['g'][-1]) τ_k_last = mpf(shocks['τ_k'][-1]) μ_last = mpf(shocks['μ'][-1]) if 'μ' in shocks else mpf('1') @@ -685,21 +672,21 @@ def bisection_c0( k_path, _ = shooting_algorithm(c0, k0, shocks, S, model, A_path) if k_path is None: if verbose: - print(f"[{i}] shoot failed at c0={c0}") + print(f"[{i}] 射击失败,c0={c0}") c0_hi = c0 else: err = k_path[-1] - k_ss_fin if verbose and i % 100 == 0: - print(f"[{i}] c0={c0}, err={err}") + print(f"[{i}] c0={c0}, 误差={err}") if abs(err) < tol: if verbose: - print(f"Converged after {i} iter") + print(f"在 {i} 次迭代后收敛") return c0 - # update bounds in one line + # 单行更新区间 c0_lo, c0_hi = (c0, c0_hi) if err > 0 else (c0_lo, c0) c0 = (c0_lo + c0_hi) / mpf('2') - warn(f"bisection did not converge after {max_iter} iters; returning c0={c0}") + warn(f"二分法在 {max_iter} 次迭代后未收敛;返回 c0={c0}") return c0 @@ -707,82 +694,79 @@ def run_shooting( shocks, S, model, A_path=None, c0_finder=bisection_c0, shooter=shooting_algorithm): """ - Compute initial SS, find c0, and return [k,c] paths - with optional A_path for growth models. + 计算初始稳态,寻找 c0,并返回 [k,c] 路径 + 在增长模型中可以选择性地传入 A_path。 """ - # initial SS at t=0 (μ=1 if missing) + # t=0 时的初始稳态(如果缺少 μ,则设为 1) g0 = mpf(shocks['g'][0]) τ_k0 = mpf(shocks['τ_k'][0]) μ0 = mpf(shocks['μ'][0]) if 'μ' in shocks else mpf('1') k0, c0 = steady_states(model, g0, τ_k0, μ0) optimal_c0 = c0_finder(c0, k0, shocks, S, model, A_path=A_path) - print(f"Model: {model}\nOptimal initial consumption c0 = {mpf(optimal_c0)}") + print(f"模型: {model}\n最优初始消费 c0 = {mpf(optimal_c0)}") k_path, c_path = shooter(optimal_c0, k0, shocks, S, model, A_path) return np.column_stack([k_path, c_path]) ``` - (cf:experiments)= ### 实验 -让我们运行一些实验。 - -1. 在第10期发生的$g$从0.2到0.4的可预见一次性永久性增加, -2. 在第10期发生的$\tau_c$从0.0到0.2的可预见一次性永久性增加, -3. 在第10期发生的$\tau_k$从0.0到0.2的可预见一次性永久性增加,以及 -4. 在第10期发生的$g$从0.2到0.4的可预见一次性增加,之后$g$永久恢复到0.2。 +让我们进行一些实验。 -+++ +1. 可预期的一次性永久冲击:在第 10 期,$g$ 从 0.2 上升到 0.4; +2. 可预期的一次性永久冲击:在第 10 期,$\tau_c$ 从 0.0 上升到 0.2; +3. 可预期的一次性永久冲击:在第 10 期,$\tau_k$ 从 0.0 上升到 0.2; +4. 可预期的一次性暂时冲击:在第 10 期,$g$ 从 0.2 上升到 0.4,之后 $g$ 永久恢复为 0.2。 -首先,我们准备将用于初始化迭代算法的序列。 +首先,我们准备用于初始化迭代算法的序列。 -我们将从初始稳态开始,并在指定的时间应用冲击。 +我们将从一个初始稳态开始,并在指定时间施加冲击。 ```{code-cell} ipython3 def plot_results( solution, k_ss, c_ss, shocks, shock_param, axes, model, A_path=None, label='', linestyle='-', T=40): """ - Plot simulation results (k, c, R, η, and a policy shock) - with optional A_path for growth models. + 绘制模拟结果 (k, c, R, η 以及政策冲击), + 在增长模型中可以选择性地传入 A_path。 """ k_path = solution[:, 0] c_path = solution[:, 1] T = min(T, k_path.size) - # handle growth parameters + # 处理增长参数 μ0 = shocks['μ'][0] if 'μ' in shocks else 1.0 A0 = A_path[0] if A_path is not None else (model.A or 1.0) - # steady‐state lines + # 稳态参考线 R_bar_ss = (1 / model.β) * (μ0**model.γ) η_ss = model.α * A0 * k_ss**(model.α - 1) - # plot k + # 绘制资本路径 k axes[0].plot(k_path[:T], linestyle=linestyle, label=label) axes[0].axhline(k_ss, linestyle='--', color='black') axes[0].set_title('k') - # plot c + # 绘制消费路径 c axes[1].plot(c_path[:T], linestyle=linestyle, label=label) axes[1].axhline(c_ss, linestyle='--', color='black') axes[1].set_title('c') - # plot R bar + # 绘制 R̄ 路径 S_full = k_path.size - 1 R_bar_path = compute_R_bar_path(shocks, k_path, model, S_full) axes[2].plot(R_bar_path[:T], linestyle=linestyle, label=label) axes[2].axhline(R_bar_ss, linestyle='--', color='black') axes[2].set_title(r'$\bar{R}$') - # plot η + # 绘制 η 路径 η_path = compute_η_path(k_path, model, S_full) axes[3].plot(η_path[:T], linestyle=linestyle, label=label) axes[3].axhline(η_ss, linestyle='--', color='black') axes[3].set_title(r'$\eta$') - # plot shock + # 绘制冲击变量 shock_series = np.array(shocks[shock_param], dtype=object) axes[4].plot(shock_series[:T], linestyle=linestyle, label=label) axes[4].axhline(shock_series[0], linestyle='--', color='black') @@ -792,17 +776,14 @@ def plot_results( for ax in axes[:5]: ax.legend() ``` +**实验1:可预期的一次性永久冲击:在第 10 期,$g$ 从 0.2 上升到 0.4** -**实验1:在第10期$g$从0.2到0.4的可预见一次性永久性增加** - -下图显示了在$t = T = 10$时可预见的$g$永久性增加的后果,该增加通过一次性总额税的增加来融资 +下图显示了在 $t = T = 10$ 时,一个可预期的政府支出 $g$ 的永久增加所带来的结果。该增加通过提高一次性总额税来融资。 ```{code-cell} ipython3 -# Define shocks as a dictionary +# 将冲击定义为字典 shocks = { - 'g': np.concatenate( - (np.repeat(0.2, 10), np.repeat(0.4, S - 9)) - ), + 'g': np.concatenate((np.repeat(0.2, 10), np.repeat(0.4, S - 9))), 'τ_c': np.repeat(0.0, S + 1), 'τ_k': np.repeat(0.0, S + 1) } @@ -811,8 +792,8 @@ k_ss_initial, c_ss_initial = steady_states(model, shocks['g'][0], shocks['τ_k'][0]) -print(f"Steady-state capital: {k_ss_initial:.4f}") -print(f"Steady-state consumption: {c_ss_initial:.4f}") +print(f"稳态资本: {k_ss_initial:.4f}") +print(f"稳态消费: {c_ss_initial:.4f}") solution = run_shooting(shocks, S, model) @@ -828,21 +809,18 @@ for ax in axes[5:]: plt.tight_layout() plt.show() ``` - -上述图表明,均衡**消费平滑**机制正在发挥作用,这是由代表性消费者对平滑消费路径的偏好驱动的,这种偏好来自其单期效用函数的曲率。 +上述图形表明,均衡中的**消费平滑**机制正在发挥作用,这一机制源自代表性消费者对平滑消费路径的偏好,而这种偏好来自其单期效用函数的曲率。 - 资本存量的稳态值保持不变: - - 这源于$g$从欧拉方程的稳态版本({eq}`eq:diff_second_steady`)中消失的事实。 - -- 消费在时间$T$之前由于政府消费增加而开始逐渐下降: - - 家庭减少消费以抵消政府支出,政府支出通过增加的一次性总额税融资。 - - 竞争经济通过增加一次性总额税流向家庭发出减少消费的信号。 - - 关心现值而非税收时间的家庭经历消费的不利财富效应,导致立即反应。 - -- 资本在时间$0$和$T$之间由于增加的储蓄而逐渐积累,并在时间$T$之后逐渐减少: - - 资本存量的这种时间变化平滑了随时间的消费,由代表性消费者的消费平滑动机驱动。 + - 这是因为在欧拉方程的稳态版本中({eq}`eq:diff_second_steady`),$g$项消失了。 +- 在时间 $T$ 之前,由于政府消费增加,消费开始逐渐下降: + - 家庭减少消费以抵消政府支出,而这些政府支出通过增加一次性税收来融资。 + - 竞争性经济通过增加一次性税收流向家庭发出减少消费的信号。 + - 家庭关注的是税收的现值而非征收时间,因此消费受到不利的财富效应影响,导致立即做出反应。 +- 资本在时间 $0$ 到 $T$ 之间由于储蓄增加而逐渐积累,在时间 $T$ 之后逐渐减少: + - 这种资本存量的时间变化平滑了消费的时间分布,这是由代表性消费者的消费平滑动机驱动的。 -让我们将上述使用的程序收集到一个函数中,该函数运行求解器并绘制给定实验的图表 +让我们把上述程序整合成一个函数,该函数可以针对给定的实验运行求解器并绘制图表 ```{code-cell} ipython3 :tags: [hide-input] @@ -851,16 +829,16 @@ def experiment_model( shocks, S, model, A_path=None, solver=run_shooting, plot_func=plot_results, policy_shock='g', T=40): """ - Run the shooting algorithm and plot results. + 运行射击算法并绘制结果。 """ - # initial steady state (μ0=None if no growth) + # 初始稳态 (如果没有增长,则 μ0=None) g0 = mpf(shocks['g'][0]) τk0 = mpf(shocks['τ_k'][0]) μ0 = mpf(shocks['μ'][0]) if 'μ' in shocks else None k_ss, c_ss = steady_states(model, g0, τk0, μ0) - print(f"Steady-state capital: {float(k_ss):.4f}") - print(f"Steady-state consumption: {float(c_ss):.4f}") + print(f"稳态资本: {float(k_ss):.4f}") + print(f"稳态消费: {float(c_ss):.4f}") print('-'*64) fig, axes = plt.subplots(2, 3, figsize=(10, 8)) @@ -872,31 +850,30 @@ def experiment_model( A_path=A_path, T=T ) - # remove unused axes + # 删除未使用的子图 for ax in axes[5:]: fig.delaxes(ax) plt.tight_layout() plt.show() ``` +下图比较了两个经济体在 $t = 10$ 时对预期的 $g$ 增长的响应: -下图比较了两个经济体对在$t = 10$时可预见的$g$增加的反应: - - * 我们的原始经济体,$\gamma = 2$,显示为实线,以及 - * 其他方面相同但$\gamma = 0.2$的经济体。 +* 实线表示我们原始的 $\gamma = 2$ 的经济体, +* 虚线表示一个除了 $\gamma = 0.2$ 外其他条件完全相同的经济体。 -这种比较引起我们的兴趣,因为效用曲率参数$\gamma$控制家庭跨时间替代消费的意愿,从而控制其对随时间消费路径平滑度的偏好。 +这个比较之所以有趣,是因为效用曲率参数 $\gamma$ 决定了家庭跨期替代消费的意愿,从而决定了其对消费路径随时间平滑程度的偏好。 ```{code-cell} ipython3 -# Solve the model using shooting +# 使用射击算法求解模型 solution = run_shooting(shocks, S, model) -# Compute the initial steady states +# 计算初始稳态 k_ss_initial, c_ss_initial = steady_states(model, shocks['g'][0], shocks['τ_k'][0]) -# Plot the solution for γ=2 +# 绘制 γ=2 时的解 fig, axes = plt.subplots(2, 3, figsize=(10, 8)) axes = axes.flatten() @@ -905,7 +882,7 @@ plot_results(solution, k_ss_initial, c_ss_initial, shocks, 'g', axes, model, label=label, T=40) -# Solve and plot the result for γ=0.2 +# 求解并绘制 γ=0.2 的结果 model_γ2 = create_model(γ=0.2) solution = run_shooting(shocks, S, model_γ2) @@ -924,18 +901,17 @@ for ax in axes[5:]: plt.tight_layout() plt.show() ``` - -结果表明,降低$\gamma$会影响消费和资本存量路径,因为它增加了代表性消费者跨时间替代消费的意愿: +结果表明降低 $\gamma$ 会同时影响消费和资本存量路径,因为它增加了代表性消费者跨期替代消费的意愿: - 消费路径: - - 当$\gamma = 0.2$时,与$\gamma = 2$相比,消费变得不那么平滑。 - - 对于$\gamma = 0.2$,消费更密切地反映政府支出路径,在$t = 10$之前保持更高水平。 + - 当 $\gamma = 0.2$ 时,与 $\gamma = 2$ 相比,消费变得不那么平滑。 + - 对于 $\gamma = 0.2$,消费更紧密地跟随政府支出路径,在 $t = 10$ 之前保持较高水平。 - 资本存量路径: - - 当$\gamma = 0.2$时,资本存量的积累和减少较小。 - - $\bar{R}$和$\eta$的波动也较小。 + - 当 $\gamma = 0.2$ 时,资本存量的积累和减少幅度较小。 + - $\bar{R}$ 和 $\eta$ 的波动也较小。 -让我们编写另一个函数来运行求解器并绘制这两个实验的图表 +让我们编写另一个函数来运行求解器并为这两个实验绘制图表 ```{code-cell} ipython3 :tags: [hide-input] @@ -944,31 +920,31 @@ def experiment_two_models( shocks, S, model_1, model_2, solver=run_shooting, plot_func=plot_results, policy_shock='g', legend_label_fun=None, T=40, A_path=None): """ - Compare and plot the shooting algorithm paths for two models. + 比较并绘制两个模型的射击算法路径。 """ is_growth = 'μ' in shocks μ0 = mpf(shocks['μ'][0]) if is_growth else None - # initial steady states for both models + # 两个模型的初始稳态 g0 = mpf(shocks['g'][0]) τk0 = mpf(shocks['τ_k'][0]) k_ss1, c_ss1 = steady_states(model_1, g0, τk0, μ0) k_ss2, c_ss2 = steady_states(model_2, g0, τk0, μ0) - # print both - print(f"Model 1 (γ={model_1.γ}): steady state k={float(k_ss1):.4f}, c={float(c_ss1):.4f}") - print(f"Model 2 (γ={model_2.γ}): steady state k={float(k_ss2):.4f}, c={float(c_ss2):.4f}") + # 打印两个模型的结果 + print(f"Model 1 (γ={model_1.γ}): 稳态 k={float(k_ss1):.4f}, c={float(c_ss1):.4f}") + print(f"Model 2 (γ={model_2.γ}): 稳态 k={float(k_ss2):.4f}, c={float(c_ss2):.4f}") print('-'*64) - # default legend labels + # 默认图例标签 if legend_label_fun is None: legend_label_fun = lambda m: fr"$\gamma = {m.γ}$" - # prepare figure + # 创建图形 fig, axes = plt.subplots(2, 3, figsize=(10, 8)) axes = axes.flatten() - # loop over (model, steady‐state, linestyle) + # 遍历 (模型, 稳态, 线型) for model, (k_ss, c_ss), ls in [ (model_1, (k_ss1, c_ss1), '-'), (model_2, (k_ss2, c_ss2), '-.') @@ -979,51 +955,50 @@ def experiment_two_models( label=legend_label_fun(model), linestyle=ls, T=T) - # shared legend in lower‐right + # 在右下角绘制共享图例 handles, labels = axes[0].get_legend_handles_labels() fig.legend( handles, labels, loc='lower right', ncol=2, fontsize=12, bbox_to_anchor=(1, 0.1)) - # drop the unused subplot + # 删除未使用的子图 for ax in axes[5:]: fig.delaxes(ax) plt.tight_layout() plt.show() ``` - -现在我们绘制其他均衡数量: +现在我们绘制其他均衡量: ```{code-cell} ipython3 def plot_prices(solution, c_ss, shock_param, axes, model, label='', linestyle='-', T=40): """ - Compares and plots prices + 比较并绘制价格路径 """ α, β, δ, γ, A = model.α, model.β, model.δ, model.γ, model.A k_path = solution[:, 0] c_path = solution[:, 1] - # Plot for c + # 绘制消费路径 c axes[0].plot(c_path[:T], linestyle=linestyle, label=label) axes[0].axhline(c_ss, linestyle='--', color='black') axes[0].set_title('c') - # Plot for q + # 绘制 q 路径 q_path = compute_q_path(c_path, model, S=S) axes[1].plot(q_path[:T], linestyle=linestyle, label=label) axes[1].plot(β**np.arange(T), linestyle='--', color='black') axes[1].set_title('q') - # Plot for r_{t,t+1} + # 绘制 r_{t,t+1} R_bar_path = compute_R_bar_path(shocks, k_path, model, S) axes[2].plot(R_bar_path[:T] - 1, linestyle=linestyle, label=label) axes[2].axhline(1 / β - 1, linestyle='--', color='black') axes[2].set_title('$r_{t,t+1}$') - # Plot for r_{t,t+s} + # 绘制 r_{t,t+s} for style, s in zip(['-', '-.', '--'], [0, 10, 60]): rts_path = compute_rts_path(q_path, T, s) axes[3].plot(rts_path, linestyle=style, @@ -1032,13 +1007,12 @@ def plot_prices(solution, c_ss, shock_param, axes, axes[3].set_xlabel('s') axes[3].set_title('$r_{t,t+s}$') - # Plot for g + # 绘制 g(冲击变量) axes[4].plot(shocks[shock_param][:T], linestyle=linestyle, label=label) axes[4].axhline(shocks[shock_param][0], linestyle='--', color='black') axes[4].set_title(shock_param) ``` - -对于$\gamma = 2$,下图描述了$q_t$和利率期限结构对在$t = 10$时可预见的$g_t$增加的反应 +对于$\gamma = 2$,下图描述了 $q_t$ 以及利率期限结构对于在 $t = 10$ 时可预见的 $g_t$ 增长的响应 ```{code-cell} ipython3 solution = run_shooting(shocks, S, model) @@ -1052,40 +1026,38 @@ for ax in axes[5:]: fig.delaxes(ax) handles, labels = axes[3].get_legend_handles_labels() -fig.legend(handles, labels, title=r"$r_{t,t+s}$ with ", loc='lower right', - ncol=3, fontsize=10, bbox_to_anchor=(1, 0.1)) +fig.legend(handles, labels, title=r"$r_{t,t+s}$ with ", loc='lower right', ncol=3, fontsize=10, bbox_to_anchor=(1, 0.1)) plt.tight_layout() plt.show() ``` +上方的第二幅图比较了初始稳态下的 $q_t$ 与在 $t = 0$ 时预见到 $g$ 增加后的 $q_t$,而第三幅图比较了隐含的短期利率 $r_t$。 -顶部的第二个面板比较了初始稳态的$q_t$与在$t = 0$预见$g$增加后的$q_t$,而第三个面板比较了隐含的短期利率$r_t$。 - -第四个面板显示了$t=0$、$t=10$和$t=60$时的利率期限结构。 +第四幅图展示了在 $t=0$、$t=10$ 和 $t=60$ 时的利率期限结构。 -注意,到$t = 60$时,系统已经收敛到新的稳态,利率期限结构变得平坦。 +注意,到 $t = 60$ 时,系统已经收敛到新的稳态,利率期限结构变得平坦。 -在$t = 10$时,利率期限结构向上倾斜。 +在 $t = 10$ 时,利率期限结构呈上升趋势。 -这种向上倾斜反映了随时间消费增长率的预期增加,如消费面板所示。 +这种上升趋势反映了消费增长率随时间的预期增长,如消费图所示。 -在$t = 0$时,利率期限结构呈现"U形"模式: +在 $t = 0$ 时,利率期限结构呈现"U形"模式: -- 它下降直到到期日$s = 10$。 -- 在$s = 10$之后,对于更长的到期日,它增加。 +- 在 $s = 10$ 之前呈下降趋势。 +- 在 $s = 10$ 之后,随到期期限的增加而上升。 -这种模式与前两个图中消费增长的模式一致,消费增长在$t = 10$之前以递增的速度下降,然后以递减的速度下降。 +这种模式与前两张图中的消费增长模式相一致:即在 $t = 10$ 之前以递增的速率下降,之后以递减的速率下降。 +++ -**实验2:在第10期$\tau_c$从0.0到0.2的可预见一次性永久性增加** +**实验2:可预期的一次性永久冲击:在第 10 期,$\tau_c$ 从 0.0 上升到 0.2** -在非弹性劳动供给下,欧拉方程{eq}`eq:euler_house`和其他均衡条件表明 -- 恒定的消费税不会扭曲决策,但 -- 对它们的预期变化会。 +在劳动供给缺乏弹性的情况下,欧拉方程{eq}`eq:euler_house`和其他均衡条件表明: +- 固定的消费税不会扭曲决策,但是 +- 可预期的消费税变化会造成扭曲。 -实际上,{eq}`eq:euler_house`或{eq}`eq:diff_second`表明,可预见的$\tau_{ct}$增加(即$(1+\tau_{ct})$$(1+\tau_{ct+1})$的减少)的作用类似于$\tau_{kt}$的增加。 +事实上,{eq}`eq:euler_house`或{eq}`eq:diff_second`表明,可预期的 $\tau_{ct}$ 增加(即 $(1+\tau_{ct})(1+\tau_{ct+1})$ 减少)与 $\tau_{kt}$ 增加的作用相同。 -下图描绘了对可预见的消费税$\tau_c$增加的反应。 +下图展示了对可预期的消费税 $\tau_c$ 增加的响应。 ```{code-cell} ipython3 shocks = { @@ -1099,29 +1071,28 @@ experiment_model(shocks, S, model, plot_func=plot_results, policy_shock='τ_c') ``` - -显然,上述图中的所有变量最终都回到了它们的初始稳态值。 - -对$\tau_{ct}$增加的预期导致消费和资本存量跨时间的变化: - -- 在$t = 0$时: - - 对$\tau_c$增加的预期导致*消费立即跳跃*。 - - 随后出现*消费狂欢*,使资本存量下降直到$t = T = 10$。 -- 在$t = 0$和$t = T = 10$之间: - - 资本存量的下降随时间推高$\bar{R}$。 - - 均衡条件要求消费增长率上升直到$t = T$。 -- 在$t = T = 10$时: - - $\tau_c$的跳跃使$\bar{R}$压低到$1$以下,导致*消费急剧下降*。 -- 在$T = 10$之后: - - 预期扭曲的影响结束,经济逐渐适应较低的资本存量。 - - 资本现在必须上升,需要*紧缩* —消费在$t = T$后暴跌,由较低的消费水平表明。 - - 利率逐渐下降,消费沿着通往终端稳态的路径以递减的速度增长。 +显然,上图中的所有变量最终都会回到其初始稳态值。 + +预期的 $\tau_{ct}$ 增加导致消费和资本存量随时间发生变化: + +- 在 $t = 0$ 时: + - 可预期的 $\tau_c$ 增加导致*消费的立即跳升*。 + - 随后出现*消费狂潮*,使资本存量在 $t = T = 10$ 之前持续下降。 +- 在 $t = 0$ 和 $t = T = 10$ 之间: + - 资本存量的下降导致 $\bar{R}$ 随时间上升。 + - 均衡条件要求消费增长率持续上升,直到 $t = T$。 +- 在 $t = T = 10$ 时: + - $\tau_c$ 的跳升使 $\bar{R}$ 降至 1 以下,导致*消费急剧下降*。 +- 在 $T = 10$ 之后: + - 预期扭曲的影响结束,经济逐渐调整到更低的资本存量水平。 + - 资本现在必须增长,这需要*紧缩* —— 在 $t = T$ 之后消费大幅下降,表现为更低的消费水平。 + - 利率逐渐下降,消费以递减的速率增长,直至达到最终稳态。 +++ -**实验3:在第10期$\tau_k$从0.0到0.2的可预见一次性永久性增加** +**实验3:可预期的一次性永久冲击:在第 10 期,$\tau_k$ 从 0.0 上升到 0.2** -对于两个$\gamma$值2和0.2,下图显示了对在$t = T = 10$时可预见的$\tau_{kt}$永久跳跃的反应。 +对于 $\gamma$ 取值为 2 和 0.2 的两种情况,下图显示了在 $t = T = 10$ 时,可预期的一次性永久性 的$\tau_{kt}$ 跳升所带来的反应。 ```{code-cell} ipython3 shocks = { @@ -1135,24 +1106,23 @@ experiment_two_models(shocks, S, model, model_γ2, plot_func=plot_results, policy_shock='τ_k') ``` +政府支出路径保持不变 +- $\tau_{kt}$ 的增加通过减少一次性税收的现值来抵消,以保持预算平衡。 -政府支出路径保持固定 -- $\tau_{kt}$的增加被一次性总额税现值的减少所抵消,以保持预算平衡。 - -图表明: +图表显示: -- 对$\tau_{kt}$增加的预期导致资本存量由于当前消费增加和消费流增长而立即下降。 -- $\bar{R}$在$t = 0$时开始上升,在$t = 9$时达到峰值,在$t = 10$时,$\bar{R}$由于税收变化而急剧下降。 - - $\bar{R}$的变化与$t = 10$税收增加对跨时间消费的影响一致。 -- 过渡动态将$k_t$(资本存量)推向新的较低稳态水平。在新的稳态中: - - 由于较低资本存量的产出减少,消费较低。 - - 当$\gamma = 2$时,消费路径比$\gamma = 0.2$时更平滑。 +- 对 $\tau_{kt}$ 增加的预期导致资本存量立即下降,这是由于当前和后续消费的增加。 +- $\bar{R}$ 从 $t = 0$ 开始上升,在 $t = 9$ 达到峰值,在 $t = 10$ 时因税收变化而急剧下降。 + - $\bar{R}$ 的变化与 $t = 10$ 时税收增加对跨期消费的影响相一致。 +- 转型动态推动 $k_t$(资本存量)向一个新的、更低的稳态水平移动。在新的稳态下: + - 由于资本存量减少导致产出降低,消费水平更低。 + - $\gamma = 2$ 时的消费路径比 $\gamma = 0.2$ 时的更平滑。 +++ -到目前为止,我们已经探讨了政府政策可预见的一次性永久性变化的后果。接下来我们描述一些实验,其中政策变量有可预见的一次性变化("脉冲")。 +到目前为止,我们已经探讨了可预期的一次性永久性政府政策变动的后果。接下来,我们进行一些实验,其中政策变量仅发生可预期的存在可预期的一次性暂时变化(称为"脉冲")。 -**实验4:在第10期$g$从0.2到0.4的可预见一次性增加,之后$g$永久恢复到0.2** +**实验4: 可预期的一次性暂时冲击:在第 10 期,$g$ 从 0.2 上升到 0.4,之后 $g$ 永久恢复为 0.2** ```{code-cell} ipython3 g_path = np.repeat(0.2, S + 1) @@ -1169,18 +1139,16 @@ experiment_model(shocks, S, model, plot_func=plot_results, policy_shock='g') ``` - -图表明: +该图表明: - 消费: - - 在政策宣布时立即下降,并随时间继续下降,以预期$g$的一次性激增。 - - 在$t = 10$时的冲击后,消费开始恢复,以递减的速度朝其稳态值上升。 - -- 资本和$\bar{R}$: - - 在$t = 10$之前,资本积累,因为利率变化诱使家庭为预期的政府支出增加做准备。 - - 在$t = 10$时,由于政府消费了其中的一部分,资本存量急剧减少。 - - 由于资本减少,$\bar{R}$跳到其稳态值以上,然后逐渐下降到其稳态水平。 + - 在政策宣布后立即下降,并随着时间推移持续下降。 + - 在 $t = 10$ 的冲击之后,消费开始恢复,但以递减的速度上升,逐步趋近其稳态值。 +- 资本和 $\bar{R}$: + - 在 $t = 10$ 之前,由于利率变化导致家庭为预期中的政府支出增加做准备,资本开始积累。 + - 在 $t = 10$ 时,由于政府消耗了部分资本,资本存量急剧下降。 + - 由于资本减少,$\bar{R}$ 跃升至其稳态值以上,然后逐渐下降回稳态水平。 +++ ### 方法2:残差最小化 @@ -1190,21 +1158,21 @@ experiment_model(shocks, S, model, - 欧拉方程{eq}`eq:diff_second`: $$ - 1 = \beta \left(\frac{c_{t+1}}{c_t}\right)^{-\gamma} \frac{(1+\tau_{ct})}{(1+\tau_{ct+1})} \left[(1 - \tau_{kt+1})(\alpha A k_{t+1}^{\alpha-1} - \delta) + 1 \right] +1 = \beta \left(\frac{c_{t+1}}{c_t}\right)^{-\gamma} \frac{(1+\tau_{ct})}{(1+\tau_{ct+1})} \left[(1 - \tau_{kt+1})(\alpha A k_{t+1}^{\alpha-1} - \delta) + 1 \right] $$ -- 可行性条件{eq}`eq:feasi_capital`: +- 可行性条件 {eq}`eq:feasi_capital`: $$ k_{t+1} = A k_{t}^{\alpha} + (1 - \delta) k_t - g_t - c_t. $$ ```{code-cell} ipython3 -# Euler's equation and feasibility condition +# 欧拉方程与可行性条件 def euler_residual(c_t, c_tp1, τ_c_t, τ_c_tp1, τ_k_tp1, k_tp1, model, μ_tp1=1): """ - Computes the residuals for Euler's equation - with optional growth model parameters μ_tp1. + 计算欧拉方程的残差, + 可选增长模型的参数μ_tp1 """ R_bar = compute_R_bar(τ_c_t, τ_c_tp1, τ_k_tp1, k_tp1, model) @@ -1214,59 +1182,57 @@ def euler_residual(c_t, c_tp1, τ_c_t, τ_c_tp1, τ_k_tp1, k_tp1, model, μ_tp1= def feasi_residual(k_t, k_tm1, c_tm1, g_t, model, μ_t=1): """ - Computes the residuals for feasibility condition - with optional growth model parameter μ_t. + 计算可行性条件的残差, + 可选增长模型的参数μ_t。 """ k_t_expected = next_k(k_tm1, g_t, c_tm1, model, μ_t) return k_t_expected - k_t ``` +算法步骤如下: -算法如下进行: +1. 根据 $t=0$ 时的政府计划,找到初始稳态 $k_0$。 -1. 根据$t=0$时的政府计划找到初始稳态$k_0$。 +2. 初始化一个初始猜测 $\{\hat{c}_t, \hat{k}_t\}_{t=0}^{S}$。 -2. 初始化初始猜测序列$\{\hat{c}_t, \hat{k}_t\}_{t=0}^{S}$。 - -3. 计算$t = 0, \dots, S$的残差$l_a$和$l_k$,以及$t = 0$的$l_{k_0}$和$t = S$的$l_{k_S}$: - - 使用{eq}`eq:diff_second`计算$t = 0, \dots, S$的欧拉方程残差: +3. 计算残差 $l_{ta}$ 和 $l_{tk}$ (对于 $t = 0, \dots, S$),以及 $t = 0$ 时的 $l_{k_0}$ 和 $t = S$ 时的 $l_{k_S}$: + - 使用{eq}`eq:diff_second`计算 $t = 0, \dots, S$ 的欧拉方程残差: $$ l_{ta} = \beta u'(c_{t+1}) \frac{(1 + \tau_{ct})}{(1 + \tau_{ct+1})} \left[(1 - \tau_{kt+1})(f'(k_{t+1}) - \delta) + 1 \right] - 1 $$ - - 使用{eq}`eq:feasi_capital`计算$t = 1, \dots, S-1$的可行性条件残差: + - 使用{eq}`eq:feasi_capital`计算 $t = 1, \dots, S-1$ 的可行性条件残差: $$ l_{tk} = k_{t+1} - f(k_t) - (1 - \delta)k_t + g_t + c_t $$ - - 使用{eq}`eq:diff_second_steady`和初始资本$k_0$计算$k_0$的初始条件残差: + - 使用{eq}`eq:diff_second_steady`和初始资本 $k_0$ 计算 $k_0$ 的初始条件残差: $$ l_{k_0} = 1 - \beta \left[ (1 - \tau_{k0}) \left(f'(k_0) - \delta \right) + 1 \right] $$ - - - 在假设$c_t = c_{t+1} = c_S$、$k_t = k_{t+1} = k_S$、$\tau_{ct} = \tau_{ct+1} = \tau_{c_s}$和$\tau_{kt} = \tau_{kt+1} = \tau_{k_s}$的情况下,使用{eq}`eq:diff_second`计算$t = S$的终端条件残差: + - 在假设 $c_t = c_{t+1} = c_S$、$k_t = k_{t+1} = k_S$、$\tau_{ct} = \tau_{ct+1} = \tau_{cS}$ 和 $\tau_{kt} = \tau_{kt+1} = \tau_{kS}$ 的条件下,使用{eq}`eq:diff_second`计算终端条件 $t = S$ 的残差: $$ - l_{k_S} = \beta u'(c_S) \frac{(1 + \tau_{c_s})}{(1 + \tau_{c_s})} \left[(1 - \tau_{k_s})(f'(k_S) - \delta) + 1 \right] - 1 + l_{k_S} = \beta u'(c_S) \frac{(1 + \tau_{cS})}{(1 + \tau_{cS})} \left[(1 - \tau_{kS})(f'(k_S) - \delta) + 1 \right] - 1 $$ -4. 迭代调整$\{\hat{c}_t, \hat{k}_t\}_{t=0}^{S}$的猜测,以最小化$t = 0, \dots, S$的残差$l_{k_0}$、$l_{ta}$、$l_{tk}$和$l_{k_S}$。 +4. 迭代调整 $\{\hat{c}_t, \hat{k}_t\}_{t=0}^{S}$ 的猜测值,以最小化残差 $l_{k_0}$、$l_{ta}$、$l_{tk}$ 和 $l_{k_S}$(对于 $t = 0, \dots, S$)。 ```{code-cell} ipython3 def compute_residuals(vars_flat, k_init, S, shock_paths, model): """ - Compute the residuals for the Euler equation and feasibility condition. + 计算欧拉方程与可行性条件的残差。 """ g, τ_c, τ_k, μ = (shock_paths[key] for key in ('g','τ_c','τ_k','μ')) k, c = vars_flat.reshape((S+1, 2)).T res = np.empty(2*S+2, dtype=float) - # boundary condition on initial capital + # 初始资本的边界条件 res[0] = k[0] - k_init - # interior Euler and feasibility + # 内部的欧拉方程与可行性条件 for t in range(S): res[2*t + 1] = euler_residual( c[t], c[t+1], @@ -1278,7 +1244,7 @@ def compute_residuals(vars_flat, k_init, S, shock_paths, model): g[t], model, μ[t+1]) - # terminal Euler condition at t=S + # 终端时点 t = S 的欧拉条件 res[-1] = euler_residual( c[S], c[S], τ_c[S], τ_c[S], @@ -1291,19 +1257,19 @@ def compute_residuals(vars_flat, k_init, S, shock_paths, model): def run_min(shocks, S, model, A_path=None): """ - Solve for the full (k,c) path by root‐finding the residuals. + 通过对残差求根来求解完整的 (k, c) 路径。 """ shocks['μ'] = shocks['μ'] if 'μ' in shocks else np.ones_like(shocks['g']) - # compute the steady‐state to serve as both initial capital and guess + # 计算稳态:既用作初始资本,也用作初始猜测 k_ss, c_ss = steady_states( model, shocks['g'][0], shocks['τ_k'][0], - shocks['μ'][0] # =1 if no growth + shocks['μ'][0] # 若无增长,则 = 1 ) - # initial guess: flat at the steady‐state + # 初始猜测:在稳态处保持常数 guess = np.column_stack([ np.full(S+1, k_ss), np.full(S+1, c_ss) @@ -1318,28 +1284,27 @@ def run_min(shocks, S, model, A_path=None): return sol.x.reshape((S+1, 2)) ``` +我们发现方法2没有遇到数值稳定性问题,所以无需使用 `mp.mpf`。 -我们发现方法2没有遇到数值稳定性问题,因此不需要使用`mp.mpf`。 - -我们将使用第二种方法复制一些实验作为练习。 +我们把用第二种方法复现我们的实验作为练习。 ```{exercise} :label: cass_fiscal_ex1 -使用残差最小化的第二种方法复制我们四个实验的图表: -1. 在第10期发生的$g$从0.2到0.4的可预见一次性永久性增加, -2. 在第10期发生的$\tau_c$从0.0到0.2的可预见一次性永久性增加, -3. 在第10期发生的$\tau_k$从0.0到0.2的可预见一次性永久性增加,以及 -4. 在第10期发生的$g$从0.2到0.4的可预见一次性增加,之后$g$永久恢复到0.2, +使用第二种残差最小化方法复现我们四个实验的图表: +1. 可预期的一次性永久冲击:在第 10 期,$g$ 从 0.2 上升到 0.4; +2. 可预期的一次性永久冲击:在第 10 期,$\tau_c$ 从 0.0 上升到 0.2; +3. 可预期的一次性永久冲击:在第 10 期,$\tau_k$ 从 0.0 上升到 0.2; +4. 可预期的一次性暂时冲击:在第 10 期,$g$ 从 0.2 上升到 0.4,之后 $g$ 永久恢复为 0.2。 ``` ```{solution-start} cass_fiscal_ex1 :class: dropdown ``` -这是一个解决方案: +参考答案: -**实验1:在第10期$g$从0.2到0.4的可预见一次性永久性增加** +**实验1:可预期的一次性永久冲击:在第 10 期,$g$ 从 0.2 上升到 0.4** ```{code-cell} ipython3 shocks = { @@ -1352,12 +1317,10 @@ experiment_model(shocks, S, model, solver=run_min, plot_func=plot_results, policy_shock='g') ``` - ```{code-cell} ipython3 experiment_two_models(shocks, S, model, model_γ2, run_min, plot_results, 'g') ``` - ```{code-cell} ipython3 solution = run_min(shocks, S, model) @@ -1374,8 +1337,7 @@ fig.legend(handles, labels, title=r"$r_{t,t+s}$ with ", loc='lower right', ncol= plt.tight_layout() plt.show() ``` - -**实验2:在第10期$\tau_c$从0.0到0.2的可预见一次性永久性增加。** +**实验2:可预期的一次性永久冲击:在第 10 期,$\tau_c$ 从 0.0 上升到 0.2** ```{code-cell} ipython3 shocks = { @@ -1388,8 +1350,7 @@ experiment_model(shocks, S, model, solver=run_min, plot_func=plot_results, policy_shock='τ_c') ``` - -**实验3:在第10期$\tau_k$从0.0到0.2的可预见一次性永久性增加。** +**实验3:可预期的一次性永久冲击:在第 10 期,$\tau_k$ 从 0.0 上升到 0.2** ```{code-cell} ipython3 shocks = { @@ -1403,8 +1364,7 @@ experiment_two_models(shocks, S, model, model_γ2, plot_func=plot_results, policy_shock='τ_k') ``` - -**实验4:在第10期$g$从0.2到0.4的可预见一次性增加,之后$g$永久恢复到0.2** +**实验4:可预期的一次性暂时冲击:在第 10 期,$g$ 从 0.2 上升到 0.4,之后 $g$ 永久恢复为 0.2** ```{code-cell} ipython3 g_path = np.repeat(0.2, S + 1) @@ -1424,19 +1384,17 @@ experiment_model(shocks, S, model, solver=run_min, ```{solution-end} ``` - ```{exercise} :label: cass_fiscal_ex2 -设计一个新实验,其中政府支出$g$在第$10$期从$0.2$增加到$0.4$, -然后在第$20$期永久减少到$0.1$。 +设计一个新实验,其中政府支出 $g$ 在第 10 期从 0.2 增加到 0.4,然后在第 20 期永久降至 0.1。 ``` ```{solution-start} cass_fiscal_ex2 :class: dropdown ``` -这是一个解决方案: +参考答案: ```{code-cell} ipython3 g_path = np.repeat(0.2, S + 1) @@ -1460,38 +1418,37 @@ experiment_model(shocks, S, model, solver=run_min, (growth_model)= ## 外生增长 -在前面的部分中,我们考虑了没有外生增长的模型。 +在上一节中,我们考虑了一个没有外生增长的模型。 -我们通过为所有$t$设置$A_t = 1$,将生产函数中的项$A_t$设置为常数。 +我们通过令生产函数中的项 $A_t$ 为常数来消除增长的影响,即设定 $A_t = 1$,$\forall t$. -现在我们准备考虑增长。 +现在,我们准备引入增长因素。 -为了纳入增长,我们修改生产函数为 +为了纳入增长,我们将生产函数修改为: $$ Y_t = F(K_t, A_tn_t) $$ -其中$Y_t$是总产出,$N_t$是总就业,$A_t$是劳动增强型技术变化, -$F(K, AN)$是与之前相同的线性齐次生产函数。 +其中 $Y_t$ 表示总产出,$N_t$ 表示总就业,$A_t$ 表示劳动增强型技术变化,$F(K, AN)$ 仍然是一个线性齐次的生产函数,与之前相同。 -我们假设$A_t$遵循过程 +我们假设 $A_t$ 遵循以下过程 $$ A_{t+1} = \mu_{t+1}A_t $$ (eq:growth) -并且$\mu_{t+1}=\bar{\mu}>1$。 +并且假定 $\mu_{t+1}=\bar{\mu}>1$。 ```{code-cell} ipython3 -# Set the constant A parameter to None +# 将常数 A 参数设为 None model = create_model(A=None) ``` ```{code-cell} ipython3 def compute_A_path(A0, shocks, S=100): """ - Compute A path over time. + 计算 A 的随时间变化的路径 """ A_path = np.full(S + 1, A0) for t in range(1, S + 1): @@ -1501,21 +1458,21 @@ def compute_A_path(A0, shocks, S=100): ### 非弹性劳动供给 -通过线性齐次性,生产函数可以表示为 +由于生产函数具有线性齐次性,可将其表示为: $$ y_t=f(k_t) $$ -其中$f(k)=F(k,1) = k^\alpha$,$k_t=\frac{K_t}{n_tA_t}$,$y_t=\frac{Y_t}{n_tA_t}$。 +其中 $f(k)=F(k,1) = k^\alpha$,$k_t=\frac{K_t}{n_tA_t}$,$y_t=\frac{Y_t}{n_tA_t}$。 -$k_t$和$y_t$按"有效劳动"$A_tn_t$的单位度量。 +$k_t$ 和 $y_t$ 均以“有效劳动单位” $A_tn_t$ 为基准进行度量。 -我们还让$c_t=\frac{C_t}{A_tn_t}$和$g_t=\frac{G_t}{A_tn_t}$,其中$C_t$和$G_t$是总消费和总政府支出。 +同时,定义 $c_t=\frac{C_t}{A_tn_t}$ 和 $g_t=\frac{G_t}{A_tn_t}$,其中 $C_t$表示总消费,$G_t$ 表示政府总支出。 -我们继续考虑非弹性劳动供给的情况。 +我们继续考虑非弹性劳动供给的情形。 -基于此,可行性可以通过方程{eq}`eq:feasi_capital`的以下修改版本来总结: +在此设定下,资源约束(可行性条件)可改写为下式(为方程{eq}`eq:feasi_capital`的修正版本): $$ k_{t+1}=\mu_{t+1}^{-1}[f(k_t)+(1-\delta)k_t-g_t-c_t] @@ -1528,7 +1485,7 @@ $$ \eta_t = F_k(k_t, 1) = f'(k_t), w_t = F_n(k_t, 1) = f(k_t) - f'(k_t)k_t $$ -由于人均消费现在是$c_tA_t$,欧拉方程{eq}`eq:diff_second`的对应项是 +由于人均消费现在是 $c_tA_t$,欧拉方程{eq}`eq:diff_second`的对应形式为: $$ \begin{aligned} @@ -1536,7 +1493,7 @@ u'(c_tA_t) = \beta u'(c_{t+1}A_{t+1}) \frac{(1 + \tau_{ct})}{(1 + \tau_{ct+1})} \end{aligned} $$ (eq:diff_mod) -$\bar{R}_{t+1}$继续由{eq}`eq:gross_rate`定义,除了现在$k_t$是每有效劳动单位的资本。 +$\bar{R}_{t+1}$ 的定义与{eq}`eq:gross_rate`一致,但此处的 $k_t$ 表示每单位有效劳动的资本存量。 因此,代入{eq}`eq:gross_rate`,{eq}`eq:diff_mod`变为 @@ -1550,7 +1507,7 @@ $$ (c_tA_t)^{-\gamma} = \beta (c_{t+1}A_{t+1})^{-\gamma} \bar{R}_{t+1} $$ -因此,{eq}`eq:consume_R`的对应项是 +因此,{eq}`eq:consume_R`的对应形式为: $$ c_{t+1} = c_t \left[ \beta \bar{R}_{t+1} \right]^{\frac{1}{\gamma}}\mu_{t+1}^{-1} @@ -1558,50 +1515,50 @@ $$ (eq:consume_r_mod) ### 稳态 -在稳态中,$c_{t+1} = c_t$。然后{eq}`eq:diff_mod`变为 +在稳态中,$c_{t+1} = c_t$。因此,方程{eq}`eq:diff_mod`可化为: $$ 1=\mu^{-\gamma}\beta[(1-\tau_k)(f'(k)-\delta)+1] $$ (eq:diff_mod_st) -由此我们可以计算每有效劳动单位的稳态资本水平满足 +由此,我们可以求得每单位有效劳动资本的稳态水平满足: $$ f'(k)=\delta + (\frac{\frac{1}{\beta}\mu^{\gamma}-1}{1-\tau_k}) $$ (eq:cap_mod_st) -以及 +并且 $$ \bar{R}=\frac{\mu^{\gamma}}{\beta} $$ (eq:Rbar_mod_st) -每有效劳动单位的稳态消费水平可以使用{eq}`eq:feasi_mod`找到: +利用方程{eq}`eq:feasi_mod`,可求得每单位有效劳动消费的稳态水平: $$ c = f(k)+(1-\delta-\mu)k-g $$ -由于算法和绘图例程与之前相同,我们在{ref}`cass_fiscal_shooting`部分包含稳态计算和射击例程。 +由于算法和作图步骤与先前内容相同,我们将在{ref}`cass_fiscal_shooting`一节中同时包含稳态计算与射击算法的实现。 ### 射击算法 -现在我们可以应用射击算法来计算均衡。我们通过包括$\mu_t$来增加冲击变量向量,然后按之前的方式进行。 +现在,我们可以应用射击算法来计算均衡:将冲击变量向量扩展以包含 $\mu_t$,然后按照之前的方法继续求解。 ### 实验 -让我们运行一些实验: +我们来进行以下实验: -1. 在第10期$\mu$从1.02到1.025的可预见一次性永久性增加 -2. 在第0期$\mu$到1.025的不可预见一次性永久性增加 +1. 可预期的一次性永久性冲击:在第 10 期,$\mu$ 从 1.02 增加到 1.025; +2. 不可预期的一次性永久性冲击:在第 0 期,$\mu$ 从 1.02 增加至 1.025。 +++ -#### 实验1:在t=10时$\mu$从1.02到1.025的可预见增加 +#### 可预期的一次性永久性冲击:在第 10 期,$\mu$ 从 1.02 增加到 1.025 -下图显示了在t=10时生产率增长$\mu$从1.02到1.025的永久增加的影响。 +下图显示了生产率增长 $\mu$ 在 $t=10$ 时从 1.02 永久性提高到 1.025 的影响。 -它们现在以有效劳动单位度量$c$和$k$。 +变量 $c$ 和 $k$ 均以有效劳动单位为度量。 ```{code-cell} ipython3 shocks = { @@ -1619,10 +1576,10 @@ k_ss_initial, c_ss_initial = steady_states(model, shocks['μ'][0] ) -print(f"Steady-state capital: {k_ss_initial:.4f}") -print(f"Steady-state consumption: {c_ss_initial:.4f}") +print(f"稳态资本存量: {k_ss_initial:.4f}") +print(f"稳态消费: {c_ss_initial:.4f}") -# Run the shooting algorithm with the A_path parameter +# 使用 A_path 参数运行射击算法 solution = run_shooting(shocks, S, model, A_path) fig, axes = plt.subplots(2, 3, figsize=(10, 8)) @@ -1639,19 +1596,18 @@ plt.tight_layout() plt.show() ``` -图中的结果主要由{eq}`eq:diff_mod_st`驱动, -并暗示$\mu$的永久增加将导致每有效劳动单位的资本稳态值下降。 +这些图形中的结果主要由方程{eq}`eq:diff_mod_st`驱动,并表明:当 $\mu$ 永久性提高时,每单位有效劳动的稳态资本存量将会下降。 图表明: -- 随着资本变得更有效,即使较少的资本,人均消费也可以提高。 -- 消费平滑驱动*消费立即跳跃*,以预期$\mu$的增加。 -- 资本生产率的提高导致总回报$\bar R$的增加。 -- 完全预见使资本增长增加的影响先于它发生,效果在$t=0$时可见。 +- 随着资本变得更加高效,即使资本存量减少,人均消费水平仍可上升; +- 消费平滑使得经济主体在预期到 $\mu$ 的增加时*立即增加消费*; +- 资本生产率的提高导致总回报 $\bar R$ 的增加; +- 完全预见使资本增长率的提升在冲击发生前就已影响经济行为,使效果在 $t=0$ 时即刻显现。 -#### 实验2:在t=0时$\mu$从1.02到1.025的不可预见增加 +#### 实验2:不可预期的一次性永久性冲击:在第 0 期,$\mu$ 从 1.02 增加至 1.025 -下图显示了在t=0时$\mu$立即跳到1.025的影响。 +下图显示了当 $\mu$ 在 $t=0$ 时从 1.02 意外跃升至 1.025 的影响。 ```{code-cell} ipython3 shocks = { @@ -1669,10 +1625,10 @@ k_ss_initial, c_ss_initial = steady_states(model, shocks['μ'][0] ) -print(f"Steady-state capital: {k_ss_initial:.4f}") -print(f"Steady-state consumption: {c_ss_initial:.4f}") +print(f"稳态资本存量: {k_ss_initial:.4f}") +print(f"稳态消费: {c_ss_initial:.4f}") -# Run the shooting algorithm with the A_path parameter +# 使用 A_path 参数运行射击算法 solution = run_shooting(shocks, S, model, A_path) fig, axes = plt.subplots(2, 3, figsize=(10, 8)) @@ -1688,17 +1644,17 @@ plt.tight_layout() plt.show() ``` -同样,我们可以将上面使用的程序收集到一个函数中,该函数运行求解器并绘制给定实验的图表。 +同样地,我们可以将上文使用的各个步骤整合到一个函数中,使其在给定实验条件下自动运行求解器并绘制结果图。 ```{code-cell} ipython3 def experiment_model(shocks, S, model, A_path, solver, plot_func, policy_shock, T=40): """ - Run the shooting algorithm given a model and plot the results. + 给定模型运行射击算法并绘制结果。 """ k0, c0 = steady_states(model, shocks['g'][0], shocks['τ_k'][0], shocks['μ'][0]) - print(f"Steady-state capital: {k0:.4f}") - print(f"Steady-state consumption: {c0:.4f}") + print(f"稳态资本存量: {k0:.4f}") + print(f"稳态消费: {c0:.4f}") print('-'*64) fig, axes = plt.subplots(2, 3, figsize=(10, 8)) @@ -1731,23 +1687,23 @@ experiment_model(shocks, S, model, A_path, run_shooting, plot_results, 'μ') - 由于缺乏前馈效应,所有变量的路径现在都是平滑的。 - 每有效劳动单位的资本逐渐下降到较低的稳态水平。 - 每有效劳动单位的消费立即跳跃,然后平滑地下降到其较低的稳态值。 -- 税后总回报$\bar{R}$再次与消费增长率共同移动,验证了欧拉方程{eq}`eq:diff_mod_st`。 +- 税后总回报 $\bar{R}$ 再次与消费增长率同步变化,验证了欧拉方程{eq}`eq:diff_mod_st`。 ```{exercise} :label: cass_fiscal_ex3 -使用残差最小化的第二种方法复制我们两个实验的图表: -1. 在t=10时$\mu$从1.02到1.025的可预见增加 -2. 在t=0时$\mu$从1.02到1.025的不可预见增加 +使用第二种残差最小化方法复现前述两个实验的图形结果: +1. 可预期的一次性永久性冲击:在第 10 期,$\mu$ 从 1.02 增加到 1.025; +2. 不可预期的一次性永久性冲击:在第 0 期,$\mu$ 从 1.02 增加至 1.025。 ``` ```{solution-start} cass_fiscal_ex3 :class: dropdown ``` -这是一个解决方案: +参考答案: -**实验1:在$t=10$时$\mu$从1.02到1.025的可预见增加** +**实验1:可预期的一次性永久性冲击:在第 10 期,$\mu$ 从 1.02 增加到 1.025** ```{code-cell} ipython3 shocks = { @@ -1762,7 +1718,7 @@ A_path = compute_A_path(1.0, shocks, S) experiment_model(shocks, S, model, A_path, run_min, plot_results, 'μ') ``` -**实验2:在$t=0$时$\mu$从1.02到1.025的不可预见增加** +**实验2:不可预期的一次性永久性冲击:在第 0 期,$\mu$ 从 1.02 增加至 1.025** ```{code-cell} ipython3 shocks = { @@ -1778,4 +1734,4 @@ experiment_model(shocks, S, model, A_path, run_min, plot_results, 'μ') ```{solution-end} ``` -在这个续集{doc}`cass_fiscal_2`中,我们研究了我们单国模型的双国版本,该版本与{cite:t}`mendoza1998international`密切相关。 +在下一讲{doc}`cass_fiscal_2`中,我们研究了我们单国模型的两国版本,该版本与{cite:t}`mendoza1998international`的研究密切相关。 From b515988c80fddddad2602b088a6d41f9a75d8824 Mon Sep 17 00:00:00 2001 From: nisha617 Date: Sun, 5 Oct 2025 23:22:41 +1100 Subject: [PATCH 2/3] Update cass_fiscal.md --- lectures/cass_fiscal.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lectures/cass_fiscal.md b/lectures/cass_fiscal.md index 4102735..ddb2987 100644 --- a/lectures/cass_fiscal.md +++ b/lectures/cass_fiscal.md @@ -279,7 +279,7 @@ from collections import namedtuple from mpmath import mp, mpf from warnings import warn -# Set the precision +# 设置计算精度 mp.dps = 40 mp.pretty = True ``` @@ -462,7 +462,6 @@ def compute_R_bar_path(shocks, k_path, model, S=100): """ 计算随时间变化的R̄路径。 """ - A, α, δ = model.A, model.α, model.δ R_bar_path = np.zeros(S + 1) for t in range(S): R_bar_path[t] = compute_R_bar( From 0496a5f40f1f9ef3b65f324793b9cc80a410e3ab Mon Sep 17 00:00:00 2001 From: nisha617 Date: Mon, 6 Oct 2025 10:41:11 +1100 Subject: [PATCH 3/3] Update cass_fiscal.md --- lectures/cass_fiscal.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lectures/cass_fiscal.md b/lectures/cass_fiscal.md index ddb2987..c347b6c 100644 --- a/lectures/cass_fiscal.md +++ b/lectures/cass_fiscal.md @@ -554,13 +554,13 @@ F(k, 1) = A k^\alpha $$ ```{code-cell} ipython3 -def f(k, model): +def f(k, model, A=1): """ 生产函数:f(k) = A * k^{α} """ return A * k ** model.α -def f_prime(k, model): +def f_prime(k, model, A=1): """ 资本的边际产出:f'(k) = α * A * k^{α - 1} """