24. 索洛-斯旺增长模型#

在本讲中,我们将回顾一个由罗伯特·索洛(1925–2023)特雷弗·斯旺(1918–1989)提出的著名模型。

这个模型被用于研究长期的经济增长。

尽管这是一个相对简单的模型,但它提供了许多关于经济增长的深刻见解。

我们将使用以下导入语句。

import matplotlib.pyplot as plt
import numpy as np

24.1. 模型#

在索洛-斯旺经济模型中,经济主体将其当前收入的固定比例用于储蓄。

这些储蓄维持或增加了资本存量。

资本与劳动力相结合生产产出,产出又支付给工人和资本所有者。

为了简化问题,我们忽略人口和生产力增长。

对于每个整数 t0,第 t 期的产出 YtYt=F(Kt,Lt) 给出,其中 Kt 是资本,Lt 是劳动力,F 是总生产函数。

假设函数 F 是非负的,且是一阶齐次的,这意味着

F(λK,λL)=λF(K,L)对于所有 λ0

具有这种特性的生产函数包括:

  • Cobb-Douglas函数 F(K,L)=AKαL1α,其中 0α1

  • CES函数 F(K,L)={aKρ+bLρ}1/ρ,其中 a,b,ρ>0

这里,α 是资本的产出弹性,ρ 是决定资本和劳动力之间替代弹性的参数。

我们假设一个封闭经济,因此总国内投资等于总国内储蓄。

储蓄率是一个常数 s,满足 0s1,所以总投资和储蓄都等于 sYt

资本会贬值:如果不通过投资补充,今天的一单位资本明天会变成 1δ 单位。

因此,

Kt+1=sF(Kt,Lt)+(1δ)Kt

没有人口增长,Lt 等于某个常数 L

kt:=Kt/L,并使用一阶齐次性,现在得到

kt+1=sF(Kt,L)L+(1δ)KtL=sF(Kt,L)L+(1δ)kt=sF(kt,1)+(1δ)kt

f(k):=F(k,1),资本动态的最终表达式为

(24.1)#kt+1=g(kt) where g(k):=sf(k)+(1δ)k

我们的目标是在给定外生初始资本存量 k0 的条件下,研究 kt 随时间演变的规律。

24.2. 图形化视角#

为了理解序列 (kt)t0 的动态,我们使用45度图。

为此,我们首先需要为 f 指定函数形式并为参数赋值。

我们采用Cobb–Douglas生产函数 f(k)=Akα,并设置参数值为 A=2.0α=0.3s=0.3δ=0.4

然后绘制方程 (24.1) 中的函数 g,以及45度线。

我们定义这些常数如下

A, s, alpha, delta = 2, 0.3, 0.3, 0.4
x0 = 0.25
xmin, xmax = 0, 3

现在我们来定义函数g

def g(A, s, alpha, delta, k):
    return A * s * k**alpha + (1 - delta) * k

让我们来绘制函数g的45度图

def plot45(kstar=None):
    xgrid = np.linspace(xmin, xmax, 12000)

    fig, ax = plt.subplots()

    ax.set_xlim(xmin, xmax)

    g_values = g(A, s, alpha, delta, xgrid)

    ymin, ymax = np.min(g_values), np.max(g_values)
    ax.set_ylim(ymin, ymax)

    lb = r'$g(k) = sAk^{\alpha} + (1 - \delta)k$'
    ax.plot(xgrid, g_values,  lw=2, alpha=0.6, label=lb)
    ax.plot(xgrid, xgrid, 'k-', lw=1, alpha=0.7, label=r'$45^{\circ}$')

    if kstar:
        fps = (kstar,)

        ax.plot(fps, fps, 'go', ms=10, alpha=0.6)

        ax.annotate(r'$k^* = (sA / \delta)^{(1/(1-\alpha))}$',
                 xy=(kstar, kstar),
                 xycoords='data',
                 xytext=(-40, -60),
                 textcoords='offset points',
                 fontsize=14,
                 arrowprops=dict(arrowstyle="->"))

    ax.legend(loc='upper left', frameon=False, fontsize=12)

    ax.set_xticks((0, 1, 2, 3))
    ax.set_yticks((0, 1, 2, 3))

    ax.set_xlabel('$k_t$', fontsize=12)
    ax.set_ylabel('$k_{t+1}$', fontsize=12)

    plt.show()
plot45()
_images/eb2a0ba00ca8d7a87326646dfcc72fd65d591f85b30fd9993efc3e91ac1e034b.png

假设在某个 kt 处,g(kt) 的值严格高于45度线。

那么我们有 kt+1=g(kt)>kt,则人均资本增加。

如果 g(kt)<kt,则人均资本下降。

如果 g(kt)=kt,那么我们就处于稳态kt 保持不变。

(模型的稳态是映射 g不动点。)

从图中可以看出,g 函数与45度线只有一个交点,这意味着在 (0,) 区间内存在唯一的稳态。

在稳态时,k=g(k),即 k=sA(k)α+(1δ)k。解这个方程,我们得到

(24.2)#k:=(sAδ)1/(1α)

当初始资本低于稳态值 k 时,我们可以从图中看到 g(kt)>kt,这意味着资本存量会随时间增加,逐渐接近稳态。

相反,如果初始资本高于 k,则 g(kt)<kt,资本存量会随时间减少,同样趋向于稳态值。

让我们在45度图中标出这个稳态值 k,以便更直观地理解这一动态过程。

kstar = ((s * A) / delta)**(1/(1 - alpha))
plot45(kstar)
_images/fc30c38bacfd4aa9f3343cbf24614d332f18cc531cca19de891e9ba0d220de54.png

根据图示分析,无论初始资本存量 k0 如何,kt 都将收敛于稳态值 k

这是一种全局稳定性的形式。

下图显示了在上述参数设置条件下,从三个不同的初始条件出发的资本时间路径。

在这种参数设置下,k1.78

让我们定义常数和三个不同的初始条件

A, s, alpha, delta = 2, 0.3, 0.3, 0.4
x0 = np.array([.25, 1.25, 3.25])

ts_length = 20
xmin, xmax = 0, ts_length
ymin, ymax = 0, 3.5
def simulate_ts(x0_values, ts_length):

    k_star = (s * A / delta)**(1/(1-alpha))
    fig, ax = plt.subplots(figsize=[11, 5])
    ax.set_xlim(xmin, xmax)
    ax.set_ylim(ymin, ymax)

    ts = np.zeros(ts_length)

    # 模拟和绘制时间序列
    for x_init in x0_values:
        ts[0] = x_init
        for t in range(1, ts_length):
            ts[t] = g(A, s, alpha, delta, ts[t-1])
        ax.plot(np.arange(ts_length), ts, '-o', ms=4, alpha=0.6,
                label=r'$k_0=%g$' %x_init)
    ax.plot(np.arange(ts_length), np.full(ts_length,k_star),
            alpha=0.6, color='red', label=r'$k^*$')
    ax.legend(fontsize=10)

    ax.set_xlabel(r'$t$', fontsize=14)
    ax.set_ylabel(r'$k_t$', fontsize=14)

    plt.show()
simulate_ts(x0, ts_length)
_images/cbc9f4786772249302319ae8e7a37935cad9515e3ec072122ccfb57cb38dadfe.png

如图所示,所有时间路径均如预期收敛至稳态值 k

24.3. 连续时间的增长#

在本节中,我们将研究索洛-斯旺增长模型的连续时间版本。

连续时间框架提供了一种更为流畅的分析方法,使得模型的动态特性更容易理解。

让我们回顾一下离散时间版本的资本动态方程:kt+1=sf(kt)+(1δ)kt

我们可以将其重新整理为单位时间内的变化量:

Δkt=sf(kt)δkt其中Δkt:=kt+1kt

当我们让时间间隔无限趋近于零时,这个离散变化自然过渡到连续时间的导数形式

(24.3)#kt=sf(kt)δktwithkt:=ddtkt

我们的目标是在给定初始资本存量 k0 的条件下,研究 kt 随时间演变的规律。

方程 (24.3)稳态是指资本存量保持不变的 k,即 kt=0 或等价地,sf(k)=δk

我们假设 f(k)=Akα,因此 k 满足 sAkα=δk

解法与离散时间情况相同——参见 (24.2)

动态过程将在下一图表中呈现,并沿用上文所述的参数设定。

kt=g(kt) 定义为 g(k)=sAkαδk,当 g(k)>0 时,kt>0,此时资本存量处于增长状态。

g(k)<0 时,资本存量将减少。这种动态机制源于两种力量的共同作用:低资本存量水平下的储蓄高边际回报与高资本存量水平下的低回报率相结合,最终形成系统的全局稳定性。

为了在图中看到这一点,让我们定义以下常数

A, s, alpha, delta = 2, 0.3, 0.3, 0.4

接下来,我们定义函数 g 表示连续时间的增长

def g_con(A, s, alpha, delta, k):
    return A * s * k**alpha - delta * k
def plot_gcon(kstar=None):

    k_grid = np.linspace(0, 2.8, 10000)

    fig, ax = plt.subplots(figsize=[11, 5])
    ax.plot(k_grid, g_con(A, s, alpha, delta, k_grid), label='$g(k)$')
    ax.plot(k_grid, 0 * k_grid, label="$k'=0$")

    if kstar:
        fps = (kstar,)

        ax.plot(fps, 0, 'go', ms=10, alpha=0.6)


        ax.annotate(r'$k^* = (sA / \delta)^{(1/(1-\alpha))}$',
                 xy=(kstar, 0),
                 xycoords='data',
                 xytext=(0, 60),
                 textcoords='offset points',
                 fontsize=12,
                 arrowprops=dict(arrowstyle="->"))

    ax.legend(loc='lower left', fontsize=12)

    ax.set_xlabel("$k$",fontsize=10)
    ax.set_ylabel("$k'$", fontsize=10)

    ax.set_xticks((0, 1, 2, 3))
    ax.set_yticks((-0.3, 0, 0.3))

    plt.show()
kstar = ((s * A) / delta)**(1/(1 - alpha))
plot_gcon(kstar)
_images/53d167007c17b9383b6f28b82560e13a18f37b38c767901492506b6912171ba3.png

上图直观地展示了特定参数下的全局稳定性,但我们如何严格证明这一性质对于所有合理参数都成立呢?

在离散时间模型中,要得到 kt 的解析表达式相当困难。

然而,转向连续时间框架可以大大简化分析。在连续时间下,我们能够推导出 kt 的简洁表达式,从而清晰地描述资本存量随时间的演化路径。

为此,我们引入变量替换 xt:=kt1α,这样 xt=(1α)ktαkt

将连续时间的动态方程 kt=sAktαδkt 代入上式,我们得到一个线性微分方程

(24.4)#xt=(1α)(sAδxt)

这个方程是一个线性常微分方程,其解为 $xt=(k01αsAδ)eδ(1α)t+sAδ$

(你可以通过对 t 求导来确认这个函数 xt 满足方程(24.4)。)

代换回 kt 得到

(24.5)#kt=[(k01αsAδ)eδ(1α)t+sAδ]1/(1α)

由于 δ>0α(0,1),我们立即可以得出结论,当 t 时,ktk,且与 k0 无关。

因此,全局稳定性成立。

24.4. 练习#

Exercise 24.1

绘制稳态下人均消费 c 作为储蓄率 s 的函数图,其中 0s1

使用Cobb-Douglas生产函数 f(k)=Akα

A=2.0,α=0.3,δ=0.5

此外,找出能使 c(s) 最大化的 s 的近似值,并在图中表示。

Exercise 24.2

随机生产率

为了使索洛-斯旺模型更贴近实际数据,我们需要考虑如何处理总量中的随机波动。

这样做会带来多方面的影响,其中之一是消除了人均产出 yt=Aktα 收敛到常数 y:=A(k)α 这一不切实际的预测。

接下来,我们将转向对离散时间模型的讨论。

一种方法是用某个随机序列 (At)t1 替代常数生产率。

现在的动态方程变为

(24.6)#kt+1=sAt+1f(kt)+(1δ)kt

我们假设 f 是Cobb–Douglas生产函数,且 (At) 是独立同分布的对数正态分布。

现在,在确定性情况下获得的长期收敛性不再成立,因为系统在每个时间点都会受到新的冲击。

考虑 A=2.0,s=0.6,α=0.3,δ=0.5

生成并绘制时间序列 kt 的图表。