28. 通过货币资助的政府赤字和价格水平#
28.1. 概览#
本讲座在货币主义价格水平理论模型的基础上进行了扩展,主要通过修改控制货币供应的运动法则。
我们的模型由两个核心部分组成:
货币需求函数
货币供应的运动法则
货币需求函数描述了公众对”实际余额”的需求,也就是名义货币余额与价格水平的比率:
当期的实际余额需求与公众预期的通货膨胀率呈反比关系
我们假设公众能够完美预测通货膨胀率
货币供应的运动法则则表明政府通过印发新货币来为其支出提供资金
在我们的模型中,对于每个时间点
需求与供应之间的平衡形成了一个动态模型,在该模型中,货币供应和价格水平序列通过一组同时线性方程来同时决定。
这些方程通常被称为向量线性差分方程。
在本讲座中,我们将通过两种不同的方法来求解这些方程。
(解决向量线性差分方程的一种方法将利用在这个讲座特征值和特征向量中研究的矩阵分解 。)
在本讲座中,我们将遇到以下宏观经济学概念:
政府通过发行纸币或电子货币征收通货膨胀税
通货膨胀税率的动态拉弗曲线中存在两个静止均衡点
在理性预期下的反常动力学中,系统趋向于较高的静止通货膨胀税率
在对静态通货膨胀率进行比较静态分析时,我们得到一特殊结果:可以通过维持更高的政府赤字来降低通货膨胀,例如通过加印货币来筹集更多资源。
在这个讲座通货膨胀税的拉弗曲线中研究了模型的非线性版本,同样的定性结果也普遍存在。
这些结果为将在这个讲座拉弗曲线与自适应预期中呈现的分析奠定了基础,它研究了当前模型的非线性版本;它假定了一种“适应性预期”的版本,而不是理性预期。
那个讲座将探讨:
通货膨胀率的两个静止均衡点保持不变,用适应性预期替代理性预期,但是
此模型违反了反常动力学因为它收敛的静止通货膨胀率比通常的系统较低
出现了一种更可信的比较动态结果,即现在可以通过降低政府赤字来降低通货膨胀 我们将在讲座 一些不愉快的货币主义算术使用这个结论来分析选择一个平稳通胀率的合理性。
我们将使用这些线性代数工具:
矩阵乘法
矩阵求逆
矩阵的特征值和特征向量
28.2. 货币的需求与供给#
我们使用复数形式”demands”(需求)和”supplies”(供给),是因为在每个时间点
让我们定义以下变量:
表示时间点 结束时的货币供给 表示从上一时期 带入到当前时期 的货币供给 表示政府在 时通过印钞方式融资的赤字 表示在时间 对下一期 的货币需求 表示时间 的价格水平 表示时间 结束时的实际货币余额 表示从时间 到 持有货币的实际回报率
为了更好地理解各变量的含义,我们来看看它们的度量单位:
和 以美元计量 以时间 的商品数量计量 以每单位商品的美元价格计量 表示持有货币的实际回报率,即时间 的商品与时间 的商品之比 以时间 的商品数量计量
接下来,我们需要确定货币的需求和供给函数。
对于货币需求,我们采用类似凯根(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
FONTPATH = "fonts/SourceHanSerifSC-SemiBold.otf"
mpl.font_manager.fontManager.addfont(FONTPATH)
plt.rcParams['font.family'] = ['Source Han Serif SC']
让我们设定参数并计算货币的可能稳态回报率
首先,我们创建一个 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()

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.1)、(28.2) 和 (28.3) 整合为一个简洁的一阶向量差分方程:
在这个框架下,我们需要指定初始状态
解出的结果是
现在让我们思考初始条件
自然地,我们会将已知的初始货币存量
但对于
我们期望模型能够自行决定这个值,不是吗?
确实如此,但问题在于可能存在多个与均衡相容的初始价格水平
事实上,我们很快就会看到,在方法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)

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)

Fig. 28.3 从不同的初始值
请注意我们对
使用对数刻度使我们能够更容易地通过视觉识别两个不同的常数极限增长率
28.8. 特殊的静态结果#
正如本讲座开始时所承诺的,我们遇到了以下宏观经济学概念:
政府通过印制纸币或电子货币征收的通货膨胀税
通货膨胀税率的动态拉弗曲线,该曲线具有两个静态均衡点
观察图 Fig. 28.2 中物价水平回报率的路径和图 Fig. 28.3 中的物价水平路径,我们可以看到几乎所有路径都趋向于图 Fig. 28.1 中拉弗曲线静态状态下显示的较高通货膨胀税率。
因此,我们确实发现了我们早先称为”反常”的动态现象,即在理性预期下,系统收敛到两个可能的静态通货膨胀税率中较高的那个。
这些动态之所以”反常”,不仅是因为它们意味着货币和财政当局选择通过印钞来筹集财政收入,最终征收的通货膨胀税超过了筹集财政支出所需的税收,还因为我们可以从图 Fig. 28.1 中显示的静态拉弗曲线得出以下”违反直觉”的结论:
该图表表明,通过运行更高的政府赤字(即通过印制更多货币来筹集更多资源),实际上可以降低通货膨胀率。
Note
在本讲座 通货膨胀税的拉弗曲线 中研究的模型的非线性版本中,同样的定性结果仍然适用。
28.9. 均衡选择#
我们的模型在确定价格水平路径方面存在不完整性,因为有多条满足”实际货币余额等于供给”条件的”均衡”路径
通过前面介绍的两种计算方法,我们发现这些可能的均衡路径可以通过以下两个参数之一来确定:
计算方法1中的初始回报率
计算方法2中的初始价格水平
要实际应用我们的模型,我们需要从这些可能的均衡路径中选择一条特定路径,从而完成我们的模型。
我们的分析表明:
几乎所有均衡路径最终都会收敛到两个可能的平稳通胀税率中较高的那个
只有一条独特的均衡路径与”减少政府赤字会降低通胀率”这一直觉相符
基于经济直觉和合理性考虑,我们倾向于采纳大多数宏观经济学家的观点,选择那条收敛到较低平稳通胀税率的独特均衡路径。
在后续讲座 一些不愉快的货币主义算术 中,我们将进一步接受并应用这一观点。
而在讲座 拉弗曲线与自适应预期 中,我们将探讨 [Bruno and Fischer, 1990] 等学者如何从不同角度支持这一选择。