28. 通过货币资助的政府赤字和价格水平#
28.1. 概览#
通过修改控制货币供应的运动法则,本讲座在这个讲座价格水平的货币主义理论模型的基础上进行了扩展和修改。
本讲座的模型包括两部分:
货币的需求函数
货币供应的运动法则
需求函数描述了公众对“实际余额”的需求,即名义货币余额与价格水平的比率:
它假设当期的实际余额需求与公众预测的当期到下一期间的通货膨胀率成反比
它假定公众对该通货膨胀率的预测是完美的
货币供应的运动法则假定政府通过加印货币来资助政府支出
在我们的模型中每个
需求与供应之间的平衡形成了一个动态模型,在该模型中,货币供应和价格水平序列通过一组同时线性方程来同时决定。
这些方程通常被称为向量线性差分方程。
在本讲座中,我们将通过两种不同的方法来求解这些方程。
(解决向量线性差分方程的一种方法将利用在这个讲座特征值和特征向量中研究的矩阵分解 。)
在本讲座中,我们将遇到以下宏观经济学概念:
政府通过发行纸币或电子货币征收通货膨胀税
通货膨胀税率的动态拉弗曲线中存在两个静止均衡点
在理性预期下的反常动力学中,系统趋向于较高的静止通货膨胀税率
在对静态通货膨胀率进行比较静态分析时,我们得到一特殊结果:可以通过维持更高的政府赤字来降低通货膨胀,例如通过加印货币来筹集更多资源。
在这个讲座通货膨胀税拉弗曲线中研究了模型的非线性版本,同样的定性结果也普遍存在。
这些结果为将在这个讲座拉弗曲线与自适应预期中呈现的分析奠定了基础 ,它研究了当前模型的非线性版本;它假定了一种“适应性预期”的版本,而不是理性预期。
那个讲座将探讨:
通货膨胀率的两个静止均衡点保持不变,用适应性预期替代理性预期,但是
此模型违反了反常动力学因为它收敛的静止通货膨胀率比通常的系统较低
出现了一种更可信的比较动态结果,即现在可以通过降低政府赤字来降低通货膨胀 我们将在讲座 一些不愉快的货币主义算术使用这个结论来分析选择一个平稳通胀率的合理性。
我们将使用这些线性代数工具:
矩阵乘法
矩阵求逆
矩阵的特征值和特征向量
28.2. 货币的需求与供给#
我们之所以强调复数形式demands(需求)和supplys,是因为每一个
设定:
为时点 结束时的货币供给 为从时点 带入到时点 的货币供给 为政府在时点 通过印刷货币融资的赤字 为在时点 对带入下一期 的货币需求 为 时的价格水平 是 结束时的实际余额 是从 至 期持有货币的净回报率
在此我们展示度量单位有助于理解各数据在衡量什么:
和 用美元计量 用 时的商品计量 用 时的商品的美元价值计量 用时间 的商品衡量 时的商品 用 时的商品计量
现在,我们的任务是确定货币的需求和供给函数。
我们假设货币需求满足类似Cagan的需求函数
其中
现在我们转向货币供给。
我们假设
我们将
对于
根据这个方程,每个时期,政府印刷货币以支付数量为
在均衡时,货币的需求等于供给:
让我们暂停片刻,思考方程(28.3)告诉了我们什么。
因此,从时刻
28.3. 均衡价格和货币供应序列#
前述具体要求表明,对于
或
对实际余额的需求为:
我们将关注参数值和与之相关的实际余额的毛收益率,确保实际余额的需求为正值。
根据(28.5) 这意味着:
这说明了:
我们将描述两种紧密相关但又存在区别的方法来计算价格水平和货币供应的序列
但首先,我们介绍一种特殊的均衡状态,称为稳态。
在稳态均衡下,一些关键变量随时间保持恒定或不变,而其余变量可以表示为这些常量的函数。
找到这样的状态变量在某种程度上是一门艺术。
在许多模型中,寻找这种不变变量的一个好的方法是在比率中寻找。
这个技巧在当前模型中也是成立的。
28.3.1. 稳态#
在我们研究的模型中的稳态均衡,
对于
注意
为了计算稳态,我们寻找满足政府预算约束和实际货币余额需求函数的稳态版本的货币和实际余额的毛收益率
组合这些方程得到
左侧是政府通过支付货币的毛收益率 (
右侧是政府支出。
定义稳态铸币税为
注意
我们将研究满足此条件的均衡序列
通过
据此,政府通过印钞可以收集的最大铸币税收入是
将方程 (28.7) 重新写为
二次方程 (28.9)的解就是稳态毛收益率
所以通常存在两个稳态。
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
让我们设定参数并计算货币的可能稳态回报率
首先,我们创建一个 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)
现在我们计算
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_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)

Fig. 28.1 以稳态回报率货币为x画出稳态时通胀税收益的函数(实线蓝色曲线)和实际政府支出(虚线红色线)来对比#
让我们显示出两个稳态回报率
(构造上,两个稳态回报率应该产生相同金额的实际收入。)
我们希望接下来的代码能确认这一点。
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#
据此构建对应均衡
按顺序求解以下方程后计算得出
Remark 28.1
方法 1 使用一个间接方法来计算均衡,首先计算一个均衡
Remark 28.2
注意,方法 1 首先从集合
Remark 28.3
每个
28.5.2. 方法2#
此方法采用直接方式。
它定义了一个“状态向量”
这里我们暂时将
解出的结果是
现在让我们思考初始条件
人们会自然而然地将初始货币存量
但
这不是我们希望由我们的模型来决定的吗?
是的,但有时我们要求得太多,因为实际上存在一系列与平衡存在相容的初始
正如我们很快会看到的,方法2中选择初始
28.6. 计算方法1#
记住存在两个稳定状态均衡值
我们按以下步骤进行:
从
选择一个
计算
然后对于
当我们实施方法1的这部分时,我们将发现以下显著的结果:
从区间
中的一个 开始,我们将发现 总是收敛到一个取决于初始条件 的有限“稳态”值 。只有两个可能的极限点
。对于几乎所有初始条件
, 。当且仅当
时, 。
量
我们不久将看到,存在两个稳定状态的货币回报率
表明有一个 拉弗曲线 存在于通货膨胀税率中,这用于资助政府的
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
让我们写一些代码来绘制初始值
Show 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()
让我们绘制与不同
下方的每一条线代表与不同
# 创建 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)

Fig. 28.2 从不同初始条件
请关注,序列如何从半开区间
28.7. 计算方法 2#
对所有
定义
则平衡条件为 (28.1)、(28.2) 和 (28.3) 如下
或
其中
H1 = np.array([[1, msm.γ2],
[1, 0]])
H2 = np.array([[0, msm.γ1],
[1, msm.g]])
定义
H = np.linalg.solve(H1, H2)
print('H = \n', H)
H =
[[ 1. 3. ]
[-0.02 1.94]]
将系统 (28.13) 表示为
这样,
其中
很自然地,可以将
数学似乎告诉我们
(像往常一样,当数学向我们发声时,我们应该倾听。)
现在,让我们就基于信念机械式地继续前进。
计算特征向量分解
其中
结果表明,
这里的
Λ, 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
划分
下面我们将逐步验证以下声明:
**声明:**如果我们设
事实证明
然而,如果我们设
那么
让我们逐步验证这些声明。
注意到
从而
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
对于几乎所有初始向量
避免这种结果的唯一方法是让
为了理解这种情况,我们使用下面的转换
这个方程所表达的系统的动力可以帮助我们分离出导致通货膨胀趋向较低稳态通货膨胀率
仔细观察(28.17) 我们可以得出,除非
方程 (28.18) 还让我们得出结论:对于初始向量
为了使这种情况发生,
但请注意,因为
有时,这种情况非正式地被描述为,尽管
因此,简而言之,向量
初始向量
这里
其中
解这个方程得到
28.7.1. 更便捷的公式#
我们可以得到一个等效但可能更便捷的
为了得到这个公式,首先注意到因为
这意味着
因此,
所以我们可以写成
这就是我们的公式 (28.16)。
p0_bar = (Q[1, 0]/Q[0, 0]) * msm.M0
print(f'p0_bar = {p0_bar:.4f}')
p0_bar = 2.2959
可以验证这个公式会随时间自我复制,意味着
现在让我们从不同的
我们创建一个函数 draw_iterations
来生成图表。
Show 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()

Fig. 28.3 从不同的初始值
请注意对于
使用对数刻度可以让我们更容易地通过视觉识别两个不同的常数极限增长率
28.8. 特殊的静态结果#
正如本讲座开始时所承诺的,我们遇到了这些宏观经济学的概念:
政府通过印制纸币或电子货币征收的通货膨胀税
通货膨胀税率的动态劳弗曲线,该曲线有两个静态均衡点
观察图 Fig. 28.2 中关于物价水平的回报率路径和图 Fig. 28.3 中的物价水平路径显示,几乎所有路径都趋向于在图 Fig. 28.1 展示的劳弗曲线静态状态中显示的较高的通货膨胀税率。
因此,我们确实发现了我们早先称之为“反常”的动态,即在理性预期下,系统收敛于两个可能的静态通货膨胀税率中的较高者。
这些动态之所以“反常”,不仅仅是因为它们意味着货币和财政当局选择通过印刷货币来筹集财政收入,最终征收的通货膨胀税超过了筹集财政支出所需的税收,还因为我们可以通过观察图 Fig. 28.1 中显示的静态状态劳弗曲线得出以下“违反直觉”的情况:
该图表显示,通过运行更高的政府赤字,即通过印制更多的货币来筹集更多资源,可以降低通货膨胀。
Note
在本讲座 通货膨胀税拉弗曲线 中研究的模型的非线性版本中,同样的定性结果仍然适用。
28.9. 均衡选择#
我们发现作为价格水平路径的模型或模型是不完整的,因为存在一系列与实际货币余额总是等于供给的“均衡”路径
通过应用我们的计算方法1和2,我们已经了解到这个连续体可以通过选择以下两个标量之一来索引:
对于计算方法1,
对于计算方法2,
为了应用我们的模型,我们必须以某种方式完成它,通过在可能的路径连续体中选择一个均衡路径。
我们发现:
除一个外的所有均衡路径都会收敛到其中较高的两个可能的平稳通胀税率的限制
存在一个独特的均衡路径,它与关于政府赤字减少如何影响恒定通胀率的“合理”声明相关联
出于合理性的考虑,我们建议按照许多宏观经济学家的看法,选择收敛到较低平稳通胀税率的独特均衡。
正如我们将在讲座 一些不愉快的货币主义算术 中看到的,我们将接受这一建议。
在讲座 拉弗曲线与自适应预期 中,我们将探讨 [Bruno and Fischer, 1990] 和其他人是如何以其他方式证明这一点的。