28. 通过货币资助的政府赤字和价格水平#

28.1. 概览#

通过修改控制货币供应的运动法则,本讲座在这个讲座价格水平的货币主义理论模型的基础上进行了扩展和修改。

本讲座的模型包括两部分:

  • 货币的需求函数

  • 货币供应的运动法则

需求函数描述了公众对“实际余额”的需求,即名义货币余额与价格水平的比率:

  • 它假设当期的实际余额需求与公众预测的当期到下一期间的通货膨胀率成反比

  • 它假定公众对该通货膨胀率的预测是完美的

货币供应的运动法则假定政府通过加印货币来资助政府支出

在我们的模型中每个t0的时间点下货币的需求与供给相等。

需求与供应之间的平衡形成了一个动态模型,在该模型中,货币供应和价格水平序列通过一组同时线性方程来同时决定。

这些方程通常被称为向量线性差分方程

在本讲座中,我们将通过两种不同的方法来求解这些方程。

(解决向量线性差分方程的一种方法将利用在这个讲座特征值和特征向量中研究的矩阵分解 。)

在本讲座中,我们将遇到以下宏观经济学概念:

  • 政府通过发行纸币或电子货币征收通货膨胀税

  • 通货膨胀税率的动态拉弗曲线中存在两个静止均衡点

  • 在理性预期下的反常动力学中,系统趋向于较高的静止通货膨胀税率

  • 在对静态通货膨胀率进行比较静态分析时,我们得到一特殊结果:可以通过维持更高的政府赤字来降低通货膨胀,例如通过加印货币来筹集更多资源。

在这个讲座通货膨胀税拉弗曲线中研究了模型的非线性版本,同样的定性结果也普遍存在。

这些结果为将在这个讲座拉弗曲线与自适应预期中呈现的分析奠定了基础 ,它研究了当前模型的非线性版本;它假定了一种“适应性预期”的版本,而不是理性预期。

那个讲座将探讨:

  • 通货膨胀率的两个静止均衡点保持不变,用适应性预期替代理性预期,但是

  • 此模型违反了反常动力学因为它收敛的静止通货膨胀率比通常的系统较低

  • 出现了一种更可信的比较动态结果,即现在可以通过降低政府赤字来降低通货膨胀 我们将在讲座 一些不愉快的货币主义算术使用这个结论来分析选择一个平稳通胀率的合理性。

我们将使用这些线性代数工具:

  • 矩阵乘法

  • 矩阵求逆

  • 矩阵的特征值和特征向量

28.2. 货币的需求与供给#

我们之所以强调复数形式demands(需求)和supplys,是因为每一个t0 的时点都有一对应需求和供给。

设定:

  • mt+1 为时点 t 结束时的货币供给

  • mt 为从时点 t1 带入到时点 t 的货币供给

  • g 为政府在时点 t1 通过印刷货币融资的赤字

  • mt+1d 为在时点 t 对带入下一期 t+1 的货币需求

  • ptt 时的价格水平

  • bt=mt+1ptt 结束时的实际余额

  • Rt=ptpt+1 是从 tt+1 期持有货币的净回报率

在此我们展示度量单位有助于理解各数据在衡量什么:

  • mtmtd 用美元计量

  • gt 时的商品计量

  • ptt 时的商品的美元价值计量

  • Rt 用时间 t+1 的商品衡量 t 时的商品

  • btt 时的商品计量

现在,我们的任务是确定货币的需求和供给函数。

我们假设货币需求满足类似Cagan的需求函数

(28.1)#mt+1dpt=γ1γ2pt+1pt,t0

其中 γ1,γ2 是正参数。

现在我们转向货币供给。

我们假设 m0>0 是模型外部决定的“初始条件”。

我们将 m0 设定为一个任意的正值,比如说 $100。

对于 t1时,我们假设货币供给由政府的预算约束决定

(28.2)#mt+1mt=ptg,t0

根据这个方程,每个时期,政府印刷货币以支付数量为 g 的商品。

均衡时,货币的需求等于供给:

(28.3)#mt+1d=mt+1,t0

让我们暂停片刻,思考方程(28.3)告诉了我们什么。

t 时的货币需求取决于 tt+1 时的价格水平。

t+1 时的货币供给取决于 t 时的货币供应和价格水平。

因此,从时刻 t0 开始的无限序列方程 (28.3) 暗示了价格序列 {pt}t=0货币供给序列 {mt}t=0 是紧密联系并最终同时决定的。)

28.3. 均衡价格和货币供应序列#

前述具体要求表明,对于 t1实际余额依据以下公式演变:

mt+1ptmtpt1pt1pt=g

(28.4)#btbt1Rt1=g

对实际余额的需求为:

(28.5)#bt=γ1γ2Rt1.

我们将关注参数值和与之相关的实际余额的毛收益率,确保实际余额的需求为正值。

根据(28.5) 这意味着:

bt=γ1γ2Rt1>0

这说明了:

(28.6)#Rt(γ2γ1)R

R 是支撑非负实际余额需求的货币回报的最小毛实际收益率。

我们将描述两种紧密相关但又存在区别的方法来计算价格水平和货币供应的序列 {pt,mt}t=0

但首先,我们介绍一种特殊的均衡状态,称为稳态

在稳态均衡下,一些关键变量随时间保持恒定或不变,而其余变量可以表示为这些常量的函数。

找到这样的状态变量在某种程度上是一门艺术。

在许多模型中,寻找这种不变变量的一个好的方法是在比率中寻找。

这个技巧在当前模型中也是成立的。

28.3.1. 稳态#

在我们研究的模型中的稳态均衡,

Rt=R¯bt=b¯

对于 t0

注意 Rt=ptpt+1bt=mt+1pt 都是比率

为了计算稳态,我们寻找满足政府预算约束和实际货币余额需求函数的稳态版本的货币和实际余额的毛收益率 R¯,b¯

g=b¯(1R¯)b¯=γ1γ2R¯1

组合这些方程得到

(28.7)#(γ1+γ2)γ2R¯γ1R¯=g

左侧是政府通过支付货币的毛收益率 (R¯1) 收集的稳态时的铸币税或政府收入。

右侧是政府支出。

定义稳态铸币税为

(28.8)#S(R¯)=(γ1+γ2)γ2R¯γ1R¯

注意 S(R¯)0 仅当 R¯[γ2γ1,1][R,R],同时当 R¯=RR¯=R 时,S(R¯)=0

我们将研究满足此条件的均衡序列

Rt[R,R],t0.

通过 R¯最大化稳态铸币税 (28.8) ,我们发现货币的最大化回报率是

R¯max=γ2γ1

据此,政府通过印钞可以收集的最大铸币税收入是

(γ1+γ2)γ2R¯maxγ1R¯max

将方程 (28.7) 重新写为

(28.9)#γ2+(γ1+γ2g)R¯γ1R¯2=0

二次方程 (28.9)的解就是稳态毛收益率 R¯

所以通常存在两个稳态。

28.4. 一些代码#

让我们从一些导入代码开始:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
plt.rcParams['figure.dpi'] = 300
from collections import namedtuple

让我们设定参数并计算货币的可能稳态回报率 R¯ 和铸币税最大货币收益率,以及我们稍后讨论的与货币最大稳态回报率相关联的初始价格水平 p0

首先,我们创建一个 namedtuple 来存储参数,以便我们可以在整个讲座中的函数中重复使用这个 namedtuple

# 创建一个包含参数的 namedtuple
MoneySupplyModel = namedtuple("MoneySupplyModel", 
                        ["γ1", "γ2", "g", 
                         "M0", "R_u", "R_l"])

def create_model(γ1=100, γ2=50, g=3.0, M0=100):
    
    # 计算 R 的稳态
    R_steady = np.roots((-γ1, γ1 + γ2 - g, -γ2))
    R_u, R_l = R_steady
    print("[R_u, R_l] =", R_steady)
    
    return MoneySupplyModel(γ1=γ1, γ2=γ2, g=g, M0=M0, R_u=R_u, R_l=R_l)

现在我们计算 R¯max 和对应的收益

def seign(R, model):
    γ1, γ2, g = model.γ1, model.γ2, model.g
    return -γ2/R + (γ1 + γ2)  - γ1 * R

msm = create_model()

# 计算 p0 的初始猜测
p0_guess = msm.M0 / (msm.γ1 - msm.g - msm.γ2 / msm.R_u)
print(f'p0 猜测 = {p0_guess:.4f}')

# 计算最大化铸币税的回报率
R_max = np.sqrt(msm.γ2/msm.γ1)
g_max = seign(R_max, msm)
print(f'R_max, g_max = {R_max:.4f}, {g_max:.4f}')
[R_u, R_l] = [0.93556171 0.53443829]
p0 猜测 = 2.2959
R_max, g_max = 0.7071, 8.5786

现在我们来把铸币税作为 R 的潜在稳定值的函数并绘制函数图像。

我们将看到有两个 R 的稳态值达到了 g 的铸币税水平, 其中一个记为 R,另一个记为 Ru

它们满足 R<Ru 并且与更高的通货膨胀税率 (1R) 和较低的 通货膨胀税率 1Ru 关联。

# 生成 R 的值
R_values = np.linspace(msm.γ2/msm.γ1, 1, 250)

# 计算函数值
seign_values = seign(R_values, msm)

# 将 seign_values 与 R 值进行可视化
fig, ax = plt.subplots(figsize=(11, 5))
plt.plot(R_values, seign_values, label='通货膨胀税收益')
plt.axhline(y=msm.g, color='red', linestyle='--', label='政府赤字')
plt.xlabel('$R$')
plt.ylabel('铸币税')

plt.legend()
plt.show()
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 38136 (\N{CJK UNIFIED IDEOGRAPH-94F8}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 24065 (\N{CJK UNIFIED IDEOGRAPH-5E01}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 31246 (\N{CJK UNIFIED IDEOGRAPH-7A0E}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 36890 (\N{CJK UNIFIED IDEOGRAPH-901A}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 36135 (\N{CJK UNIFIED IDEOGRAPH-8D27}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 33192 (\N{CJK UNIFIED IDEOGRAPH-81A8}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 32960 (\N{CJK UNIFIED IDEOGRAPH-80C0}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25910 (\N{CJK UNIFIED IDEOGRAPH-6536}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 30410 (\N{CJK UNIFIED IDEOGRAPH-76CA}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25919 (\N{CJK UNIFIED IDEOGRAPH-653F}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 24220 (\N{CJK UNIFIED IDEOGRAPH-5E9C}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 36196 (\N{CJK UNIFIED IDEOGRAPH-8D64}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 23383 (\N{CJK UNIFIED IDEOGRAPH-5B57}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
_images/99816037a3aefb4aee10d82471248de18b6b4fec610db14d60b2457df81387f0.png

Fig. 28.1 以稳态回报率货币为x画出稳态时通胀税收益的函数(实线蓝色曲线)和实际政府支出(虚线红色线)来对比#

让我们显示出两个稳态回报率 R¯ 和政府收集的相关铸币税收入。

(构造上,两个稳态回报率应该产生相同金额的实际收入。)

我们希望接下来的代码能确认这一点。

g1 = seign(msm.R_u, msm)
print(f'R_u, g_u = {msm.R_u:.4f}, {g1:.4f}')

g2 = seign(msm.R_l, msm)
print(f'R_l, g_l = {msm.R_l:.4f}, {g2:.4f}')
R_u, g_u = 0.9356, 3.0000
R_l, g_l = 0.5344, 3.0000

现在让我们计算通过印钞票能收集到的最大稳态铸币税以及使他实现的稳态货币回报率。

28.5. 两种计算策略#

我们现在继续计算均衡,不一定是稳态。

我们将尝试两种不同的计算策略。

28.5.1. 方法 1#

  • 设置 R0[γ2γ1,Ru] 并计算 b0=γ1γ2/R0

  • 计算序列 {Rt,bt}t=1,这些序列是与均衡相关的回报率和实际余额,通过按顺序求解方程 (28.4)(28.5) 解出 t1:

(28.10)#bt=bt1Rt1+gRt1=γ1γ2γ21bt
  • 据此构建对应均衡 p0

(28.11)#p0=m0γ1gγ2/R0
  • 按顺序求解以下方程后计算得出 {pt,mt}t=1

(28.12)#pt=Rtpt1mt=bt1pt

Remark 28.1

方法 1 使用一个间接方法来计算均衡,首先计算一个均衡 {Rt,bt}t=0 序列,然后使用它来推导出一个均衡 {pt,mt}t=0 序列。

Remark 28.2

注意,方法 1 首先从集合 [γ2γ1,Ru] 中选择一个初始条件 R0。均衡 {pt,mt}t=0 序列不是唯一的。实际上,有一个由 R0 的选择索引的均衡连续体。

Remark 28.3

每个 R0 的选择都有唯一的 p0,由方程 (28.11) 描述。)

28.5.2. 方法2#

此方法采用直接方式。 它定义了一个“状态向量” yt=[mtpt] 并根据第一阶向量差分方程来表述平衡条件(28.1)(28.2),和(28.3)

yt+1=Myt,t0,

这里我们暂时将 y0=[m0p0] 作为初始条件

解出的结果是

yt=Mty0.

现在让我们思考初始条件 y0

人们会自然而然地将初始货币存量 m0>0 作为初始条件。

p0怎么办?

这不是我们希望由我们的模型来决定的吗?

是的,但有时我们要求得太多,因为实际上存在一系列与平衡存在相容的初始p0水平。

正如我们很快会看到的,方法2中选择初始p0与方法1中选择初始货币回报率R0密切相关。

28.6. 计算方法1#

记住存在两个稳定状态均衡值 R<Ru 对应货币回报率 Rt

我们按以下步骤进行:

t=0 开始

  • 选择一个 R0[γ2γ1,Ru]

  • 计算 b0=γ1γ0R01

然后对于 t1,通过迭代方程 (28.10) 构造 bt,Rt

当我们实施方法1的这部分时,我们将发现以下显著的结果:

  • 从区间 [γ2γ1,Ru] 中的一个 R0 开始,我们将发现 {Rt} 总是收敛到一个取决于初始条件 R0 的有限“稳态”值 R¯

  • 只有两个可能的极限点 {R,Ru}

  • 对于几乎所有初始条件 R0limt+Rt=R

  • 当且仅当 R0=Ru 时,limt+Rt=Ru

1Rt 可以被解释为政府对持有其货币者征收的 通货膨胀税率

我们不久将看到,存在两个稳定状态的货币回报率 表明有一个 拉弗曲线 存在于通货膨胀税率中,这用于资助政府的 g 带来的赤字。

Note

拉弗曲线绘制了税收与税率之间呈驼峰形状的曲线。其驼峰形态表明通常有两个税率产生相同的税收额。这是由两个相对作用力造成的,一是提高税率通常会减少税基,因为人们会作出决定以减少他们要面对的税收。

def simulate_system(R0, model, num_steps):
    γ1, γ2, g = model.γ1, model.γ2, model.g

    # 初始化数组以存储结果
    b_values = np.empty(num_steps)
    R_values = np.empty(num_steps)

    # 初始值
    b_values[0] = γ1 - γ2/R0
    R_values[0] = 1 / (γ1/γ2 - (1 / γ2) * b_values[0])

    # 按时间迭代
    for t in range(1, num_steps):
        b_t = b_values[t - 1] * R_values[t - 1] + g
        R_values[t] = 1 / (γ1/γ2 - (1/γ2) * b_t)
        b_values[t] = b_t

    return b_values, R_values

让我们写一些代码来绘制初始值 R0 的多个可能结果。

Hide code cell content
line_params = {'lw': 1.5, 
              'marker': 'o',
              'markersize': 3}

def annotate_graph(ax, model, num_steps):
    for y, label in [(model.R_u, '$R_u$'), (model.R_l, '$R_l$'), 
                     (model.γ2 / model.γ1, r'$\frac{\gamma_2}{\gamma_1}$')]:
        ax.axhline(y=y, color='grey', linestyle='--', lw=1.5, alpha=0.6)
        ax.text(num_steps * 1.02, y, label, verticalalignment='center', 
                color='grey', size=12)

def draw_paths(R0_values, model, line_params, num_steps):

    fig, axes = plt.subplots(2, 1, figsize=(8, 8), sharex=True)
    
    # 预先按时间计算
    time_steps = np.arange(num_steps) 
    
    # 遍历 R_0s 并模拟系统 
    for R0 in R0_values:
        b_values, R_values = simulate_system(R0, model, num_steps)
        
        # 绘制 R_t 和时间的关系
        axes[0].plot(time_steps, R_values, **line_params)
        
        # 绘制 b_t 和时间的关系
        axes[1].plot(time_steps, b_values, **line_params)
        
    # 向子图添加线和文本注释
    annotate_graph(axes[0], model, num_steps)
    
    # 添加标签
    axes[0].set_ylabel('$R_t$')
    axes[1].set_xlabel('时间步')
    axes[1].set_ylabel('$b_t$')
    axes[1].xaxis.set_major_locator(MaxNLocator(integer=True))
    
    plt.tight_layout()
    plt.show()

让我们绘制与不同 R0[γ2γ1,Ru] 相关的不同结果。

下方的每一条线代表与不同 R0 对应的路径。

# 创建 R_0 的网格
R0s = np.linspace(msm.γ2/msm.γ1, msm.R_u, 9)
R0s = np.append(msm.R_l, R0s)
draw_paths(R0s, msm, line_params, num_steps=20)
/tmp/ipykernel_8255/3989673625.py:38: UserWarning: Glyph 26102 (\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/tmp/ipykernel_8255/3989673625.py:38: UserWarning: Glyph 38388 (\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/tmp/ipykernel_8255/3989673625.py:38: UserWarning: Glyph 27493 (\N{CJK UNIFIED IDEOGRAPH-6B65}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26102 (\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 38388 (\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
/home/runner/miniconda3/envs/quantecon/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 27493 (\N{CJK UNIFIED IDEOGRAPH-6B65}) missing from font(s) DejaVu Sans.
  fig.canvas.print_figure(bytes_io, **kw)
_images/8ebb4e0a8c1cfca73fe85aeb19d3d9093f992d38635f185faa3ac75874965975.png

Fig. 28.2 从不同初始条件 R0 出发的 Rt(上层图面)和 bt(下层图面)的路径#

请关注,序列如何从半开区间 [R,Ru) 收敛到与 R 相关的稳态。

28.7. 计算方法 2#

对所有 t1mt=mtd .

定义

yt=[mtpt].

则平衡条件为 (28.1)(28.2)(28.3) 如下

(28.13)#[1γ210][mt+1pt+1]=[0γ11g][mtpt]

H1yt=H2yt1

其中

H1=[1γ210]H2=[0γ11g]
H1 = np.array([[1, msm.γ2], 
               [1, 0]])
H2 = np.array([[0, msm.γ1], 
               [1, msm.g]]) 

定义

H=H11H2
H = np.linalg.solve(H1, H2)
print('H = \n', H)
H = 
 [[ 1.    3.  ]
 [-0.02  1.94]]

将系统 (28.13) 表示为

(28.14)#yt+1=Hyt,t0

这样,{yt}t=0 可以从以下公式计算

(28.15)#yt=Hty0,t0

其中

y0=[m0p0].

很自然地,可以将 m0 作为模型外部确定的初始条件。

数学似乎告诉我们 p0 也必须在模型外部确定,尽管这是我们希望通过模型确定的东西。

(像往常一样,当数学向我们发声时,我们应该倾听。)

现在,让我们就基于信念机械式地继续前进。

计算特征向量分解

H=QΛQ1

其中 Λ 是特征值的对角矩阵,Q 的列是对应于这些特征值的特征向量。

结果表明,

Λ=[R100Ru1]

这里的 RRu 是我们上面计算出的货币的较低和较高的恒定利率回报。

Λ, Q = np.linalg.eig(H)
print('Λ = ', Λ)
print('Q = ', Q)
Λ =  [1.06887658 1.87112342]
Q =  [[-0.99973655 -0.96033288]
 [-0.02295281 -0.27885616]]
R_l = 1 / Λ[0]
R_u = 1 / Λ[1]

print(f'R_l = {R_l:.4f}')
print(f'R_u = {R_u:.4f}')
R_l = 0.9356
R_u = 0.5344

划分 Q

Q=[Q11Q12Q21Q22]

下面我们将逐步验证以下声明:

**声明:**如果我们设

(28.16)#p0=p0Q21Q111m0,

事实证明

pt+1pt=Ru1,t0

然而,如果我们设

p0>p0

那么

limt+pt+1pt=Rl1.

让我们逐步验证这些声明。

注意到

Ht=QΛtQ1

从而

yt=QΛtQ1y0
def iterate_H(y_0, H, num_steps):
    Λ, Q = np.linalg.eig(H)
    Q_inv = np.linalg.inv(Q)
    y = np.stack(
        [Q @ np.diag(Λ**t) @ Q_inv @ y_0 for t in range(num_steps)], 1)
    
    return y

对于几乎所有初始向量 y0, 通货膨胀的总率 pt+1pt 最终会收敛到较大的特征值 Rl1

避免这种结果的唯一方法是让 p0(28.16) 中描述的特定值。

为了理解这种情况,我们使用下面的转换

yt=Q1yt.

yt的动力显然受制于

(28.17)#yt+1=Λtyt.

这个方程所表达的系统的动力可以帮助我们分离出导致通货膨胀趋向较低稳态通货膨胀率 Rl 的逆值的力量。

仔细观察(28.17) 我们可以得出,除非

(28.18)#y0=[y1,00]

yt 的路径,因此 yt=Qyt 给出的 mtpt 的路径将最终以 Rl1 的总率增长,随着 t+

方程 (28.18) 还让我们得出结论:对于初始向量 y0 有一个唯一的设置,使得两个组件永远以较低的速率 Ru1 增长。

为了使这种情况发生,y0 的所需设置显然必须具有以下属性:

Q1y0=y0=[y1,00].

但请注意,因为 y0=[m0p0]m0 作为初始条件给定,p0 必须调整以满足这个方程。

有时,这种情况非正式地被描述为,尽管 m0 是一个真正的状态变量,p0 是一个必须在 t=0 时调整以满足方程的跳跃变量。

因此,简而言之,向量 y0 的唯一值使得 yt 的路径最终以 R1 的速率增长,需要将 y0 的第二组分设为零。

初始向量 y0=[m0p0]p0 显然必须满足

Q{2}y0=0

这里 Q{2} 表示 Q1 的第二行,相当于

(28.19)#Q21m0+Q22p0=0

其中 Qij 表示 Q1(i,j) 元素。

解这个方程得到 p0,我们发现

(28.20)#p0=(Q22)1Q21m0.

28.7.1. 更便捷的公式#

我们可以得到一个等效但可能更便捷的 p0 公式 (28.16),该公式是用 Q 的组成部分表示的,而不是 Q1 的组成部分。

为了得到这个公式,首先注意到因为 (Q21 Q22)Q 的逆矩阵的第二行,并且因为 Q1Q=I,所以我们有

[Q21Q22][Q11Q21]=0

这意味着

Q21Q11+Q22Q21=0.

因此,

(Q22)1Q21=Q21Q111.

所以我们可以写成

p0=Q21Q111m0.

这就是我们的公式 (28.16)

p0_bar = (Q[1, 0]/Q[0, 0]) * msm.M0

print(f'p0_bar = {p0_bar:.4f}')
p0_bar = 2.2959

可以验证这个公式会随时间自我复制,意味着

(28.21)#pt=Q21Q111mt.

现在让我们从不同的 p0 值开始,来可视化 mtptRt 的动态,以验证我们上述的论断。

我们创建一个函数 draw_iterations 来生成图表。

Hide code cell content
def draw_iterations(p0s, model, line_params, num_steps):

    fig, axes = plt.subplots(3, 1, figsize=(8, 10), sharex=True)
    
    # 预计算时间步
    time_steps = np.arange(num_steps) 
    
    # 前两个y轴使用对数刻度
    for ax in axes[:2]:
        ax.set_yscale('log')

    # 遍历p_0s并计算一系列y_t
    for p0 in p0s:
        y0 = np.array([msm.M0, p0])
        y_series = iterate_H(y0, H, num_steps)
        M, P = y_series[0, :], y_series[1, :]

        # 针对时间绘制R_t
        axes[0].plot(time_steps, M, **line_params)

        # 针对时间绘制b_t
        axes[1].plot(time_steps, P, **line_params)
        
        # 计算R_t
        R = np.insert(P[:-1] / P[1:], 0, np.NAN)
        axes[2].plot(time_steps, R, **line_params)
        
    # 给子图添加线和文本标注
    annotate_graph(axes[2], model, num_steps)
    
    # 绘制标签
    axes[0].set_ylabel('$m_t$')
    axes[1].set_ylabel('$p_t$')
    axes[2].set_ylabel('$R_t$')
    axes[2].set_xlabel('时间步')
    
    # 强制整数轴标签
    axes[2].xaxis.set_major_locator(MaxNLocator(integer=True))

    plt.tight_layout()
    plt.show()
p0s = [p0_bar, 2.34, 2.5, 3, 4, 7, 30, 100_000]

draw_iterations(p0s, msm, line_params, num_steps=20)
/tmp/ipykernel_8255/3764470695.py:40: UserWarning: Glyph 26102 (\N{CJK UNIFIED IDEOGRAPH-65F6}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/tmp/ipykernel_8255/3764470695.py:40: UserWarning: Glyph 38388 (\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/tmp/ipykernel_8255/3764470695.py:40: UserWarning: Glyph 27493 (\N{CJK UNIFIED IDEOGRAPH-6B65}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
_images/b49d1d29a40fc4126f90621d6605e4f34c391c709c89eef70a16cc374a0fc0be.png

Fig. 28.3 从不同的初始值 p0 出发, mt 的路径(顶部面板,m 使用对数刻度), pt(中间面板,m 使用对数刻度), Rt(底部面板)#

请注意对于 mtpt,我们使用了对数刻度。

使用对数刻度可以让我们更容易地通过视觉识别两个不同的常数极限增长率 Ru1R1.

28.8. 特殊的静态结果#

正如本讲座开始时所承诺的,我们遇到了这些宏观经济学的概念:

  • 政府通过印制纸币或电子货币征收的通货膨胀税

  • 通货膨胀税率的动态劳弗曲线,该曲线有两个静态均衡点

观察图 Fig. 28.2 中关于物价水平的回报率路径和图 Fig. 28.3 中的物价水平路径显示,几乎所有路径都趋向于在图 Fig. 28.1 展示的劳弗曲线静态状态中显示的较高的通货膨胀税率。

因此,我们确实发现了我们早先称之为“反常”的动态,即在理性预期下,系统收敛于两个可能的静态通货膨胀税率中的较高者。

这些动态之所以“反常”,不仅仅是因为它们意味着货币和财政当局选择通过印刷货币来筹集财政收入,最终征收的通货膨胀税超过了筹集财政支出所需的税收,还因为我们可以通过观察图 Fig. 28.1 中显示的静态状态劳弗曲线得出以下“违反直觉”的情况:

  • 该图表显示,通过运行更高的政府赤字,即通过印制更多的货币来筹集更多资源,可以降低通货膨胀。

Note

在本讲座 通货膨胀税拉弗曲线 中研究的模型的非线性版本中,同样的定性结果仍然适用。

28.9. 均衡选择#

我们发现作为价格水平路径的模型或模型是不完整的,因为存在一系列与实际货币余额总是等于供给的“均衡”路径 {mt+1,pt}t=0

通过应用我们的计算方法1和2,我们已经了解到这个连续体可以通过选择以下两个标量之一来索引:

  • 对于计算方法1,R0

  • 对于计算方法2,p0

为了应用我们的模型,我们必须以某种方式完成它,通过在可能的路径连续体中选择一个均衡路径。

我们发现:

  • 除一个外的所有均衡路径都会收敛到其中较高的两个可能的平稳通胀税率的限制

  • 存在一个独特的均衡路径,它与关于政府赤字减少如何影响恒定通胀率的“合理”声明相关联

出于合理性的考虑,我们建议按照许多宏观经济学家的看法,选择收敛到较低平稳通胀税率的独特均衡。

正如我们将在讲座 一些不愉快的货币主义算术 中看到的,我们将接受这一建议。

在讲座 拉弗曲线与自适应预期 中,我们将探讨 [Bruno and Fischer, 1990] 和其他人是如何以其他方式证明这一点的。