26. 世代交叠模型#

在这节课中,我们将学习著名的世代交叠(OLG)模型。政策制定者和研究人员使用这个模型来研究:

  • 财政政策

  • 货币政策

  • 长期增长

以及许多其他主题。

世代交叠模型的第一个严谨版本由保罗·萨缪尔森(Paul Samuelson)在1958年提出[Samuelson, 1958],此后成为经济学中研究代际问题的基础框架。

在这一讲中,我们将深入探讨世代交叠模型的一个简单版本,帮助大家理解其核心机制和应用。

26.1. 概述#

OLG模型的动态与索洛-斯旺增长模型非常相似。

与索洛-斯旺模型相比,OLG模型的一个关键区别是储蓄决策是内生的。

这一特征为什么重要呢?考虑我们想要分析一项新税收政策对经济增长的影响。

在索洛-斯旺模型中,我们可以引入税收并观察稳态如何变化。但这种方法忽略了一个重要现实:税收政策会改变家庭的储蓄和消费行为。

当家庭面对新的税率时,他们会调整自己的经济决策,这些调整可能会显著影响模型的预测结果。

因此,为了获得更准确的预测,我们需要明确建模个人的决策过程。在OLG模型中,家庭会根据他们所处的经济环境(包括技术水平、税收政策和市场价格等)来优化他们的储蓄和消费选择。

OLG模型正是为解决这类问题而设计的。

在接下来的内容中,我们将探讨OLG模型的基本版本,详细说明家庭如何做出决策,并分析这些决策如何影响经济的长期增长。

首先,让我们导入需要的库。

import numpy as np
from scipy import optimize
from collections import namedtuple
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']

26.2. 环境#

我们假设时间是离散的,因此 t=0,1,

在时间 t 出生的个体存活两个时期,tt+1

我们称一个个体

  • 在生命的第一个时期为”年轻人”

  • 在生命的第二个时期为”老年人”。

年轻人工作,提供劳动并赚取劳动收入。

他们还决定存多少钱。

老年人不工作,所以所有收入都是金融收入。

他们的金融收入来自工资收入的储蓄利息, 这些储蓄随后与 t+1 时期新的年轻一代的劳动相结合。

在均衡状态下,工资和利率由市场供求关系决定。

为了使代数计算稍微简单一些,我们假设人口规模恒定。

我们将每个时期的恒定人口规模标准化为1。

我们还假设每个个体提供一个”单位”的劳动时间,因此总劳动供给为1。

26.3. 资本供给#

现在让我们从单个家庭的角度开始分析模型。

26.3.1. 消费者问题#

假设在时间 t 出生的个体的效用函数形式为

(26.1)#Ut=u(ct)+βu(ct+1)

其中

  • u:R+R 是”瞬时”效用函数(或”流”效用函数)

  • β(0,1) 是时间偏好的贴现因子

  • ct 表示 t 期出生的个体在年轻时期(即 t 期)的消费

  • ct+1 表示该个体在老年时期(即 t+1 期)的消费

我们假设效用函数 u 是严格递增的。

个体的储蓄决策来自于解决以下效用最大化问题

(26.2)#maxct,ct+1{u(ct)+βu(ct+1)}

受制于

ct+stwtandct+1Rt+1st

这里

  • st 是出生于时间 t 的个人的储蓄

  • wt 是时间 t 的工资率

  • Rt+1 是在时间 t 投资的储蓄在时间 t+1 支付的总利率

由于效用函数 u 是严格递增的,消费者会完全用尽预算约束,使两个约束等式成立。

将第一个约束改写为 st=wtct,并代入第二个约束,我们得到 ct+1=Rt+1(wtct)

为了求解最大化问题,我们将 ct+1=Rt+1(wtct) 代入目标函数,然后对 ct 求导并设为零。

这给出了OLG模型的欧拉方程,它刻画了消费者在不同时期之间如何优化分配消费:

(26.3)#u(ct)=βRt+1u(Rt+1(wtct))

从第一个约束我们得到 ct=wtst,所以欧拉方程 也可以表示为

(26.4)#u(wtst)=βRt+1u(Rt+1st)

假设对于每个 wtRt+1,恰好有一个 st 可以满足 (26.4)

那么储蓄可以被写成 wtRt+1 的固定函数。

我们将其表示为

(26.5)#st=s(wt,Rt+1)

s 函数的具体形式将取决于效用函数 u 的选择。

wtRt+1 共同代表经济中的价格(劳动力价格和资本租赁率)。

因此,(26.5) 表示给定价格下的储蓄量。

26.3.2. 示例:对数偏好#

在特殊情况 u(c)=logc 下,欧拉方程简化为 st=β(wtst)

求解储蓄,我们得到

(26.6)#st=s(wt,Rt+1)=β1+βwt

在这种特殊情况下,储蓄完全不受利率影响。

26.3.3. 储蓄与投资的关系#

由于我们将人口规模标准化为1,st不仅代表个人储蓄,也代表了t时期整个经济的总储蓄。

在我们考虑的封闭经济模型中,不存在国际资本流动,因此国内净储蓄必然等于总投资,这构成了企业的资本供给。

接下来,我们将转向分析资本需求。

当我们将资本供给与需求相匹配时,就能确定OLG经济中的均衡状态。

26.4. 资本需求分析#

下面我们先详细描述企业的最优化问题,然后推导出一个方程,用于表示在给定价格条件下的资本需求。

26.4.1. 企业问题#

对于每个整数 t0,t期的产出 yt 由**柯布-道格拉斯生产函数**给出

(26.7)#yt=ktαt1α

在这里,kt 表示资本投入,t 表示劳动投入,而 α 是一个介于0和1之间的参数,通常被解释为”资本的产出弹性”。 企业面临的利润最大化问题是

(26.8)#maxkt,t{ktαt1αRtktwtt}

一阶条件是通过对资本和劳动分别求导,并令导数等于零得到的:

(1α)(kt/t)α=wtandα(kt/t)α1=Rt

26.4.2. 需求#

根据我们的假设t=1,我们可以得到

(26.9)#wt=(1α)ktα

并且

(26.10)#Rt=αktα1

重新整理 (26.10) 得出在时间 t+1 的总资本需求

(26.11)#kd(Rt+1):=(αRt+1)1/(1α)

在Python中

def capital_demand(R, α):
    return (α/R)**(1/(1-α)) 
def capital_supply(R, β, w):
    R = np.ones_like(R)
    return R * (β / (1 + β)) * w

下图绘制了资本供给曲线(如(26.6)所示)以及资本需求曲线(如(26.11)所示),这两条曲线都是利率Rt+1的函数。 (对于对数效用这一特殊情况,供给不依赖于利率,因此我们得到一个常数函数。)

26.5. 均衡#

在本节中,我们将推导均衡条件并研究一个例子。

26.5.1. 均衡条件#

在均衡状态下,t时刻的储蓄等于t时刻的投资,也等于t+1时刻的资本供给。

通过将这些数量设为相等来计算均衡,即

(26.12)#s(wt,Rt+1)=kd(Rt+1)=(αRt+1)1/(1α)

原则上,我们现在可以给定wt来求解均衡价格Rt+1。 (实际上,我们首先需要指定函数u,从而得到s。)

当我们求解这个关于t+1时刻结果的方程时,t时刻的量已经确定,所以我们可以将wt视为常数。

从均衡Rt+1(26.11),我们可以得到 均衡数量kt+1

26.5.2. 示例:对数效用#

在对数效用的情况下,我们可以使用(26.12)(26.6)得到

(26.13)#β1+βwt=(αRt+1)1/(1α)

求解均衡利率得到

(26.14)#Rt+1=α(β1+βwt)α1

在Python中,我们可以通过以下方式计算这个

def equilibrium_R_log_utility(α, β, w):
    R = α * ( (β * w) / (1 + β))**(α - 1)
    return R

在对数效用的情况下,由于资本供给不依赖于利率,均衡数量是由供给固定的。

也就是说,

(26.15)#kt+1=s(wt,Rt+1)=β1+βwt

我们重新绘制上面的图,但这次加入均衡数量和价格。

R_vals = np.linspace(0.3, 1)
α, β = 0.5, 0.9
w = 2.0

fig, ax = plt.subplots()

ax.plot(R_vals, capital_demand(R_vals, α), 
        label="总需求")
ax.plot(R_vals, capital_supply(R_vals, β, w), 
        label="总供给")

R_e = equilibrium_R_log_utility(α, β, w)
k_e = (β / (1 + β)) * w

ax.plot(R_e, k_e, 'o',label='均衡')

ax.set_xlabel("$R_{t+1}$")
ax.set_ylabel("$k_{t+1}$")
ax.legend()
plt.show()
_images/fcd63ab509c745d630b77224a5b881f88d419979e35bab9000f768b7c3062875.png

26.6. 动态分析#

在本节中,我们将研究模型的动态行为。

我们主要关注对数效用的情况,此时均衡由方程(26.15)确定。

26.6.1. 资本积累过程#

前面我们已经分析了如何根据当期工资wt确定下一期的均衡资本kt+1

现在,我们可以利用(26.9)中的工资决定方程,将资本积累表示为一个关于当期资本kt的函数。

具体来说,由于工资由wt=(1α)ktα给出,我们可以得到资本的演化方程

(26.16)#kt+1=β1+β(1α)(kt)α

如果我们对这个方程进行迭代,我们将得到一个资本存量序列。

让我们绘制这些动态的45度图,我们将其表示为

kt+1=g(kt)其中 g(k):=β1+β(1α)(k)α
def k_update(k, α, β):
    return β * (1 - α) * k**α /  (1 + β)
α, β = 0.5, 0.9
kmin, kmax = 0, 0.1
n = 1000
k_grid = np.linspace(kmin, kmax, n)
k_grid_next = k_update(k_grid,α,β)

fig, ax = plt.subplots(figsize=(6, 6))

ymin, ymax = np.min(k_grid_next), np.max(k_grid_next)

ax.plot(k_grid, k_grid_next,  lw=2, alpha=0.6, label='$g$')
ax.plot(k_grid, k_grid, 'k-', lw=1, alpha=0.7, label=r'$45^{\circ}$')


ax.legend(loc='upper left', frameon=False, fontsize=12)
ax.set_xlabel('$k_t$', fontsize=12)
ax.set_ylabel('$k_{t+1}$', fontsize=12)

plt.show()
_images/f6c2c502e59e8e1f0dd4b45281428d767754070cb73b14ddedd179f8bb9842aa.png

26.6.2. 稳态(对数情况)#

图表显示,该模型具有唯一的正稳态,我们将其表示为k

我们可以通过设置k=g(k)来求解k,即

(26.17)#k=β(1α)(k)α(1+β)

求解方程得到

(26.18)#k=(β(1α)1+β)1/(1α)

我们可以从(26.10)得到稳态利率,即

R=α(k)α1=α1α1+ββ

在Python中,我们有

k_star = ((β * (1 - α))/(1 + β))**(1/(1-α))
R_star = (α/(1 - α)) * ((1 + β) / β)

26.6.3. 时间序列#

上面的45度图显示,具有正初始条件的资本时间序列会收敛到这个稳态。

让我们绘制一些时间序列来可视化这一点。

ts_length = 25
k_series = np.empty(ts_length)
k_series[0] = 0.02
for t in range(ts_length - 1):
    k_series[t+1] = k_update(k_series[t], α, β)

fig, ax = plt.subplots()
ax.plot(k_series, label="资本序列")
ax.plot(range(ts_length), np.full(ts_length, k_star), 'k--', label="$k^*$")
ax.set_ylim(0, 0.1)
ax.set_ylabel("资本")
ax.set_xlabel("$t$")
ax.legend()
plt.show()
_images/9316b4d69e3050dbd566c4ff67af16c174e931ed6e838f922e9c6b3fd718b1c8.png

如果你尝试不同的正初始值,你会发现这个序列总是收敛于k

下面我们还绘制了随时间变化的总利率。

R_series = α * k_series**(α - 1)

fig, ax = plt.subplots()
ax.plot(R_series, label="毛利率")
ax.plot(range(ts_length), np.full(ts_length, R_star), 'k--', label="$R^*$")
ax.set_ylim(0, 4)
ax.set_ylabel("毛利率")
ax.set_xlabel("$t$")
ax.legend()
plt.show()
_images/495fdd1bd3d133cef2e373e4184298a8aba0a6d9e5628626ba08e6a0a974548e.png

利率反映了资本的边际产出,当资本存量较低时,利率较高。

26.7. CRRA偏好#

到目前为止,我们一直使用对数效用函数来分析模型。现在让我们扩展到更一般的情况。

对数效用实际上是常相对风险厌恶(CRRA)效用函数的一个特例,当风险厌恶参数γ趋近于1时得到。

在本节中,我们假设u(c)=c1γ11γ,其中γ>0,γ1

这个函数被称为CRRA效用函数。

在这一节中,我们将采用这种更一般的效用函数,同时保持模型的其他方面不变。

首先,让我们在Python中实现CRRA效用函数,并创建一个包含所有模型参数的数据结构。

def crra(c, γ):
    return c**(1 - γ) / (1 - γ)

Model = namedtuple('Model', ['α',        # 柯布-道格拉斯参数
                             'β',        # 折现因子
                             'γ']        # CRRA效用函数中的参数
                   )

def create_olg_model(α=0.4, β=0.9, γ=0.5):
    return Model(α=α, β=β, γ=γ)

让我们也重新定义资本需求函数,使其能够与这个namedtuple一起工作。

def capital_demand(R, model):
    return (α/R)**(1/(1-model.α)) 

26.7.1. 供给#

对于家庭来说,欧拉方程变为

(26.19)#(wtst)γ=βRt+11γ(st)γ

求解储蓄,我们得到

(26.20)#st=s(wt,Rt+1)=wt[1+β1/γRt+1(γ1)/γ]1

请注意,与对数情况不同,储蓄现在取决于利率。

def savings_crra(w, R, model):
    α, β, γ = model
    return w / (1 + β**(-1/γ) * R**((γ-1)/γ)) 
model = create_olg_model()
w = 2.0

fig, ax = plt.subplots()

ax.plot(R_vals, capital_demand(R_vals, model), 
        label="总需求")
ax.plot(R_vals, savings_crra(w, R_vals, model), 
        label="总供给")

ax.set_xlabel("$R_{t+1}$")
ax.set_ylabel("$k_{t+1}$")
ax.legend()
plt.show()
_images/00dab6cdec86120c56f87aeee2d5a884af2a03231bb179ea2d2919abc1bfba0f.png

26.7.2. 均衡#

将资本的总需求(参见(26.11))与我们新的总供给函数相等,即可得出均衡资本。

因此,我们设定

(26.21)#wt[1+β1/γRt+1(γ1)/γ]1=(Rt+1α)1/(α1)

这个表达式相当复杂,我们无法解析地求解 Rt+1

(26.10)(26.21)结合起来,得到

(26.22)#kt+1=[1+β1/γ(αkt+1α1)(γ1)/γ]1(1α)(kt)α

同样,有了这个等式和给定的 kt,我们无法用纸笔求解 kt+1

在下面的练习中,你将被要求用数值方法解这些方程。

26.8. 练习#

Exercise 26.1

使用(26.22)在 CRRA 情况下数值求解均衡资本存量的动态。

使用 45 度图来可视化这个动态过程。

Exercise 26.2

上一个练习中的45度图表明存在唯一的正稳态。

通过在(26.22)中设置 kt+1=kt=k,可以得到正稳态,即:

k=(1α)(k)α1+β1/γ(α(k)α1)(γ1)/γ

与对数效用情况不同,CRRA效用的稳态 k 无法通过解析方法获得。

相反,我们使用牛顿法求解 k

Exercise 26.3

根据上面列出的参数化,生成三个资本的时间路径,来自三个不同的初始条件。

使用 k0 的初始条件为 0.001,1.2,2.6,并且时间序列长度为 10。