29. 一些不愉快的货币主义算术#

29.1. 概述#

本讲座建立在 通过货币资助的政府赤字和价格水平 中介绍的概念和问题基础上。

在那个讲座中,我们探讨了通货膨胀税率及其相关货币收益率的拉弗曲线上的静态均衡点。

本讲中,我们将研究一个特殊情况:某个静态均衡只在时间 T>0 之后才成为主导状态。

t=0,,T1 期间,货币供应、价格水平和计息政府债务会沿着一条过渡路径演变,直到 t=T 时结束。

在这个过渡期内,实际货币余额 mt+1pt 与到期的一期政府债券 R~Bt1 之间的比率会逐期下降。

这种变化对于 tT 时期必须通过印钞来融资的政府总利息赤字产生了重要影响。

关键的货币与债券比率只有在时间 T 及之后才会稳定下来。

而且,T 越大,在 tT 时期必须通过印钞融资的政府总利息赤字就越大。

这些发现构成了萨金特和华莱士(Sargent and Wallace)在”不愉快的货币主义算术”一文中的核心论点 [Sargent and Wallace, 1981]

前一讲座已经介绍了本讲中使用的货币供应和需求模型,并描述了我们在本讲中将通过逆向推导得出的稳态均衡。

除了学习”不愉快的货币主义算术”外,本讲座还将教授如何实现一个用于计算初始价格水平的不动点算法。

29.2. 设置#

让我们首先回顾 通过货币资助的政府赤字和价格水平 中的模型设定。

如有需要,请参考那篇讲义并查看我们将在本讲中继续使用的Python代码。

对于 t1实际货币余额的变化遵循以下方程:

mt+1ptmtpt1pt1pt=g

或者

(29.1)#btbt1Rt1=g

其中

  • bt=mt+1pt 是第 t 期末的实际余额

  • Rt1=pt1pt 是从 t1t 期间实际余额的毛收益率

对实际余额的需求是

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

其中 γ1>γ2>0.

29.3. 货币与财政政策#

通过货币资助的政府赤字和价格水平的基础模型基础上,我们引入了一期通胀指数化政府债券,作为政府筹集财政资金的另一种渠道。

假设 R~>1 是政府一期通胀指数化债券的固定实际回报率。

有了这个额外的融资工具,政府在时间 t0 的预算约束可以表示为

Bt+mt+1pt=R~Bt1+mtpt+g

在模型开始前,公众持有两种资产:mˇ0 单位的货币(以美元计)和价值 R~Bˇ1 的一期指数化债券(以时间 0 的商品计量)。

这两个数值作为模型的初始条件给定。

值得注意的是,mˇ0 是一个名义变量(以美元计),而 R~Bˇ1 是一个实际变量(以商品计量)。

29.3.1. 公开市场操作#

在时间 0 时,政府可以调整其债务结构,但必须遵循以下公开市场操作约束:

R~B1+m0p0=R~Bˇ1+mˇ0p0

(29.3)#B1Bˇ1=1p0R~(mˇ0m0)

该方程表明,政府(特别是中央银行)可以通过增加债券持有量(B1 相对于 Bˇ1)来减少货币供应(m0 相对于 mˇ0),反之亦然。

这实际上描述了中央银行的公开市场操作——一种货币政策工具,通过买卖政府债券来调节经济中的货币供应量。当中央银行购买政府债券时,它向经济注入资金;当出售债券时,则从流通中收回资金。

29.4. 初始公开市场操作的影响#

我们将按照萨金特和华莱士 [Sargent and Wallace, 1981] 的分析框架,探讨一个关键问题:在面对持续性财政赤字(即正值 g)时,中央银行能否通过公开市场操作有效地控制物价水平?

在模型的初始阶段(t=0 之前),政府需要决定初始货币供应量和债券水平 (m0,B1),同时遵守公开市场操作约束条件 (29.3)

对于 t=0,1,,T1

Bt=R~Bt1+gmt+1=m0

而对于 tT

Bt=BT1mt+1=mt+ptg

其中

(29.4)#g=[(R~1)BT1+g]

我们的目标是计算这一方案下的均衡序列 {pt,mt,bt,Rt}t=0,这些序列体现了货币和财政政策的执行结果。

在这里,财政政策是指政府决定一系列净利息赤字 {gt}t=0 的行动,这些赤字必须通过向公众发行货币或有息债券来融资。

货币政策债务管理政策则是指政府决定如何在有息债务(政府债券)和无息债务(货币)之间分配其对公众的债务组合的行动。

公开市场操作是指政府(或其代表中央银行)的货币政策行动,包括用新发行的货币从公众购买政府债券,或向公众出售债券并收回流通中的货币。

29.5. 算法(基本思想)#

类似于 通货膨胀税的拉弗曲线 中的方法,我们将从 t=T 开始反向计算,首先确定与低通胀、低通胀税率平稳状态相对应的 pTRu 值。

在开始描述算法之前,我们需要回顾一下稳态收益率 R¯ 满足的二次方程

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

二次方程 (29.5) 有两个根,Rl<Ru<1

通过货币资助的政府赤字和价格水平 末尾所描述的原因类似,我们选择较大的根 Ru

接下来,我们计算

(29.6)#RT=RubT=γ1γ2Ru1pT=m0γ1gγ2Ru1

我们可以通过连续求解方程 (29.1)(29.2) 来计算稳态序列 {Rt,bt}t=T+1 的回报率和实际余额,这些值对应于一个均衡状态,适用于 t1

bt=bt1Rt1+gRt1=γ1γ2γ21btpt=Rtpt1mt=bt1pt

29.6. 在时间 T 之前#

定义

λγ2γ1.

我们的限制 γ1>γ2>0 暗示 λ[0,1)

我们想要计算

p0=γ11[j=0λjmj]=γ11[j=0T1λjm0+j=Tλjm1+j]

因此,

(29.7)#p0=γ11m0{1λT1λ+λTRuλ}p1=γ11m0{1λT11λ+λT1Ruλ}pT1=γ11m0{1λ1λ+λRuλ}pT=γ11m0{1Ruλ}

我们可以通过迭代以下公式来实现前述公式:

pt=γ11m0+λpt+1,t=T1,T2,,0

起始于

(29.8)#pT=m0γ1gγ2Ru1=γ11m0{1Ruλ}

Remark 29.1

Ru 是二次方程 (29.5) 的根,该方程确定了货币的稳定状态回报率,所以 (29.8) 右侧两个公式是等价的。

29.7. 算法(伪代码)#

现在我们详细地以伪代码形式描述一个计算算法。

为了计算一个均衡,我们使用以下算法。

Algorithm 29.1

给定 参数 g,mˇ0,Bˇ1,R~>1,T

我们定义一个从 p0p^0 的映射,如下。

  • 设置 m0,然后计算 B1 以满足时刻 0公开市场操作的 约束

B1Bˇ1=R~p0(mˇ0m0)
  • 通过以下公式计算 BT1

BT1=R~TB1+(1R~T1R~)g
  • 计算

g=g+[R~1]BT1
  • 从公式 (29.5)(29.6) 计算 Ru,pT

  • 从公式 (29.7) 计算新的 p0 估计值,称为 p^0

  • 注意前面的步骤定义了一个映射

p^0=S(p0)
  • 我们寻找 S 的不动点,即满足 p0=S(p0) 的解。

  • 为了找到这个不动点,我们使用带松弛参数的迭代算法

p0,j+1=(1θ)S(p0,j)+θp0,j,

其中 θ[0,1) 是一个松弛参数。

29.8. 计算示例#

让我们通过一个具体示例来演示模型的计算过程。我们将参数设置为与 通货膨胀税的拉弗曲线 讲座中相同的稳态值,以便于比较结果。

基本参数设为 γ1=100,γ2=50,g=3.0。注意,在之前的讲座中我们固定了 m0=100,但在本模型中,MT 是内生决定的。

对于新参数,我们将设置 R~=1.01,Bˇ1=0,mˇ0=105,T=5

我们将考察一个”小型”公开市场操作,具体方法是设置 m0=100

这意味着在时间 0 之前,中央银行进行了一次公开市场操作,从公众手中收回了 mˇ0m0=5 单位的货币,并向公众发行了等值的政府债券。

这一操作的直接结果是公众持有的货币减少而政府债券增加。从货币供应减少的角度看,我们可以预期时间 0 的价格水平会下降。

然而,这只是初始效应。这次公开市场操作还会通过影响未来的货币供应路径 mt+1 和名义政府赤字 g¯t 产生长期影响。

首先,我们需要导入必要的库:

import numpy as np
import matplotlib.pyplot as plt
from collections import namedtuple
import matplotlib as mpl

FONTPATH = "fonts/SourceHanSerifSC-SemiBold.otf"
mpl.font_manager.fontManager.addfont(FONTPATH)
plt.rcParams['font.family'] = ['Source Han Serif SC']

现在让我们用Python来实现我们的伪代码。

# 创建一个包含参数的命名元组
MoneySupplyModel = namedtuple("MoneySupplyModel", 
                              ["γ1", "γ2", "g",
                               "R_tilde", "m0_check", "Bm1_check",
                               "T"])

def create_model(γ1=100, γ2=50, g=3.0,
                 R_tilde=1.01,
                 Bm1_check=0, m0_check=105,
                 T=5):
    
    return MoneySupplyModel(γ1=γ1, γ2=γ2, g=g,
                            R_tilde=R_tilde,
                            m0_check=m0_check, Bm1_check=Bm1_check,
                            T=T)
msm = create_model()
def S(p0, m0, model):

    # 解包参数
    γ1, γ2, g = model.γ1, model.γ2, model.g
    R_tilde = model.R_tilde
    m0_check, Bm1_check = model.m0_check, model.Bm1_check
    T = model.T

    # 公开市场操作
    Bm1 = 1 / (p0 * R_tilde) * (m0_check - m0) + Bm1_check

    # 计算 B_{T-1}
    BTm1 = R_tilde ** T * Bm1 + ((1 - R_tilde ** T) / (1 - R_tilde)) * g

    # 计算 g bar
    g_bar = g + (R_tilde - 1) * BTm1

    # 解二次方程
    Ru = np.roots((-γ1, γ1 + γ2 - g_bar, -γ2)).max()

    # 计算 p0
    λ = γ2 / γ1
    p0_new = (1 / γ1) * m0 * ((1 - λ ** T) / (1 - λ) + λ ** T / (Ru - λ))

    return p0_new
def compute_fixed_point(m0, p0_guess, model, θ=0.5, tol=1e-6):

    p0 = p0_guess
    error = tol + 1

    while error > tol:
        p0_next = (1 - θ) * S(p0, m0, model) + θ * p0

        error = np.abs(p0_next - p0)
        p0 = p0_next

    return p0

让我们看看在稳态Ru均衡中,价格水平p0如何依赖于初始货币供应量m0

注意p0作为m0的函数的斜率是恒定的。

这一结果表明,我们的模型验证了货币数量论的结论, 这正是 萨金特和华莱士 [Sargent and Wallace, 1981]用来证明其标题中“货币主义”一词的合理性而刻意融入其模型的。

m0_arr = np.arange(10, 110, 10)
plt.plot(m0_arr, [compute_fixed_point(m0, 1, msm) for m0 in m0_arr])

plt.ylabel('价格水平 $p_0$')
plt.xlabel('初始货币供应量 $m_0$')

plt.show()
_images/c4ec092dbf026ed40b71147fe0c0728fb6aebfcab1ba4fb4ca035fb2adb744ea.png

现在让我们编写代码来试验前面描述的在时刻 0 的公开市场操作。

def simulate(m0, model, length=15, p0_guess=1):
    # 解包参数
    γ1, γ2, g = model.γ1, model.γ2, model.g
    R_tilde = model.R_tilde
    m0_check, Bm1_check = model.m0_check, model.Bm1_check
    T = model.T

    # (pt, mt, bt, Rt)
    paths = np.empty((4, length))

    # 公开市场操作
    p0 = compute_fixed_point(m0, 1, model)
    Bm1 = 1 / (p0 * R_tilde) * (m0_check - m0) + Bm1_check
    BTm1 = R_tilde ** T * Bm1 + ((1 - R_tilde ** T) / (1 - R_tilde)) * g
    g_bar = g + (R_tilde - 1) * BTm1
    Ru = np.roots((-γ1, γ1 + γ2 - g_bar, -γ2)).max()

    λ = γ2 / γ1

    # t = 0
    paths[0, 0] = p0
    paths[1, 0] = m0

    # 1 <= t <= T
    for t in range(1, T+1, 1):
        paths[0, t] = (1 / γ1) * m0 * \
                      ((1 - λ ** (T - t)) / (1 - λ)
                       + (λ ** (T - t) / (Ru - λ)))
        paths[1, t] = m0

    # t > T
    for t in range(T+1, length):
        paths[0, t] = paths[0, t-1] / Ru
        paths[1, t] = paths[1, t-1] + paths[0, t] * g_bar

    # Rt = pt / pt+1
    paths[3, :T] = paths[0, :T] / paths[0, 1:T+1]
    paths[3, T:] = Ru

    # bt = γ1 - γ2 / Rt
    paths[2, :] = γ1 - γ2 / paths[3, :]

    return paths
def plot_path(m0_arr, model, length=15):

    fig, axs = plt.subplots(2, 2, figsize=(8, 5))
    titles = ['$p_t$', '$m_t$', '$b_t$', '$R_t$']
    
    for m0 in m0_arr:
        paths = simulate(m0, model, length=length)
        for i, ax in enumerate(axs.flat):
            ax.plot(paths[i])
            ax.set_title(titles[i])
    
    axs[0, 1].hlines(model.m0_check, 0, length, color='r', linestyle='--')
    axs[0, 1].text(length * 0.8, model.m0_check * 0.9, r'$\check{m}_0$')
    plt.show()
plot_path([80, 100], msm)
_images/6bbe672cab38c9a9ea4e50aa6a2c01f216a1cd8bce78776465b76353fe795f05.png

Fig. 29.1 不愉快的算术#

Fig. 29.1 展示了两个实验的结果,清晰地呈现了[Sargent and Wallace, 1981] 论文中的核心观点:

  • t=0 时进行的公开市场操作减少了货币供应,从而导致当时的价格水平下降

  • 公开市场操作后的货币供应量越低,初始价格水平也就越低

  • 然而,减少初始货币供应的公开市场操作也会导致 tT 时期的货币回报率 Ru 降低。这是因为更高的政府借贷最终需要通过印钞(即征收通货膨胀税)在 tT 时期进行融资

  • 货币回报率 R 在维持货币稳定性和应对政府赤字引起的通货膨胀方面扮演着关键角色

  • 在某些情况下,政策制定者可能会选择较高的 R 值,以减轻通货膨胀对实际回报率造成的负面影响