29. Money Financed Government Deficits and Price Levels#
29.1. Overview#
This lecture extends and modifies the model in this lecture A Monetarist Theory of Price Levels by modifying the law of motion that governed the supply of money.
The model in this lecture consists of two components
a demand function for money
a law of motion for the supply of money
The demand function describes the public’s demand for “real balances”, defined as the ratio of nominal money balances to the price level
it assumes that the demand for real balance today varies inversely with the rate of inflation that the public forecasts to prevail between today and tomorrow
it assumes that the public’s forecast of that rate of inflation is perfect
The law of motion for the supply of money assumes that the government prints money to finance government expenditures
Our model equates the demand for money to the supply at each time
Equality between those demands and supply gives a dynamic model in which money supply and price level sequences are simultaneously determined by a set of simultaneous linear equations.
These equations take the form of what is often called vector linear difference equations.
In this lecture, we’ll roll up our sleeves and solve those equations in two different ways.
(One of the methods for solving vector linear difference equations will take advantage of a decomposition of a matrix that is studied in this lecture Eigenvalues and Eigenvectors.)
In this lecture we will encounter these concepts from macroeconomics:
an inflation tax that a government gathers by printing paper or electronic money
a dynamic Laffer curve in the inflation tax rate that has two stationary equilibria
perverse dynamics under rational expectations in which the system converges to the higher stationary inflation tax rate
a peculiar comparative stationary-state outcome connected with that stationary inflation rate: it asserts that inflation can be reduced by running higher government deficits, i.e., by raising more resources by printing money.
The same qualitative outcomes prevail in this lecture Inflation Rate Laffer Curves that studies a nonlinear version of the model in this lecture.
These outcomes set the stage for the analysis to be presented in this lecture Laffer Curves with Adaptive Expectations that studies a nonlinear version of the present model; it assumes a version of “adaptive expectations” instead of rational expectations.
That lecture will show that
replacing rational expectations with adaptive expectations leaves the two stationary inflation rates unchanged, but that
it reverses the perverse dynamics by making the lower stationary inflation rate the one to which the system typically converges
a more plausible comparative dynamic outcome emerges in which now inflation can be reduced by running lower government deficits
This outcome will be used to justify a selection of a stationary inflation rate that underlies the analysis of unpleasant monetarist arithmetic to be studied in this lecture Some Unpleasant Monetarist Arithmetic.
We’ll use these tools from linear algebra:
matrix multiplication
matrix inversion
eigenvalues and eigenvectors of a matrix
29.2. Demand for and supply of money#
We say demands and supplies (plurals) because there is one of each for each
Let
be the supply of currency at the end of time be the supply of currency brought into time from time be the government deficit that is financed by printing currency at be the demand at time for currency to bring into time be the price level at time is real balances at the end of time be the gross rate of return on currency held from time to time
It is often helpful to state units in which quantities are measured:
and are measured in dollars is measured in time goods is measured in dollars per time goods is measured in time goods per unit of time goods is measured in time goods
Our job now is to specify demand and supply functions for money.
We assume that the demand for currency satisfies the Cagan-like demand function
where
Now we turn to the supply of money.
We assume that
We set
For
According to this equation, each period, the government prints money to pay for quantity
In an equilibrium, the demand for currency equals the supply:
Let’s take a moment to think about what equation (29.3) tells us.
The demand for money at any time
The supply of money at time
So the infinite sequence of equations (29.3) for
29.3. Equilibrium price and money supply sequences#
The preceding specifications imply that for
or
The demand for real balances is
We’ll restrict our attention to parameter values and associated gross real rates of return on real balances that assure that the demand for real balances is positive, which according to (29.5) means that
which implies that
Gross real rate of return
We shall describe two distinct but closely related ways of computing a pair
But first it is instructive to describe a special type of equilibrium known as a steady state.
In a steady-state equilibrium, a subset of key variables remain constant or invariant over time, while remaining variables can be expressed as functions of those constant variables.
Finding such state variables is something of an art.
In many models, a good source of candidates for such invariant variables is a set of ratios.
This is true in the present model.
29.3.1. Steady states#
In a steady-state equilibrium of the model we are studying,
for
Notice that both
To compute a steady state, we seek gross rates of return on currency and real balances
Together these equations imply
The left side is the steady-state amount of seigniorage or government revenues that the government gathers by paying a gross rate of return
The right side is government expenditures.
Define steady-state seigniorage as
Notice that
We shall study equilibrium sequences that satisfy
Maximizing steady-state seigniorage (29.8) with respect to
and that the associated maximum seigniorage revenue that the government can gather from printing money is
It is useful to rewrite equation (29.7) as
A steady state gross rate of return
So two steady states typically exist.
29.4. Some code#
Let’s start with some imports:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
plt.rcParams['figure.dpi'] = 300
from collections import namedtuple
Let’s set some parameter values and compute possible steady-state rates of return on currency
First, we create a namedtuple
to store parameters so that we can reuse this namedtuple
in our functions throughout this lecture
# Create a namedtuple that contains parameters
MoneySupplyModel = namedtuple("MoneySupplyModel",
["γ1", "γ2", "g",
"M0", "R_u", "R_l"])
def create_model(γ1=100, γ2=50, g=3.0, M0=100):
# Calculate the steady states for 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)
Now we compute the
def seign(R, model):
γ1, γ2, g = model.γ1, model.γ2, model.g
return -γ2/R + (γ1 + γ2) - γ1 * R
msm = create_model()
# Calculate initial guess for p0
p0_guess = msm.M0 / (msm.γ1 - msm.g - msm.γ2 / msm.R_u)
print(f'p0 guess = {p0_guess:.4f}')
# Calculate seigniorage maximizing rate of return
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 guess = 2.2959
R_max, g_max = 0.7071, 8.5786
Now let’s plot seigniorage as a function of alternative potential steady-state values of
We’ll see that there are two steady-state values of
They satisfy
# Generate values for R
R_values = np.linspace(msm.γ2/msm.γ1, 1, 250)
# Calculate the function values
seign_values = seign(R_values, msm)
# Visualize seign_values against R values
fig, ax = plt.subplots(figsize=(11, 5))
plt.plot(R_values, seign_values, label='inflation tax revenue')
plt.axhline(y=msm.g, color='red', linestyle='--', label='government deficit')
plt.xlabel('$R$')
plt.ylabel('seigniorage')
plt.legend()
plt.show()

Fig. 29.1 Steady state revenue from inflation tax as function of steady state gross return on currency (solid blue curve) and real government expenditures (dotted red line) plotted against steady-state rate of return currency#
Let’s print the two steady-state rates of return
(By construction, both steady-state rates of return should raise the same amounts real revenue.)
We hope that the following code will confirm this.
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
Now let’s compute the maximum steady-state amount of seigniorage that could be gathered by printing money and the state-state rate of return on money that attains it.
29.5. Two computation strategies#
We now proceed to compute equilibria, not necessarily steady states.
We shall deploy two distinct computation strategies.
29.5.1. Method 1#
set
and compute .compute sequences
of rates of return and real balances that are associated with an equilibrium by solving equation (29.4) and (29.5) sequentially for :
Construct the associated equilibrium
from
compute
by solving the following equations sequentially
Remark 29.1
Method 1 uses an indirect approach to computing an equilibrium by first computing an equilibrium
Remark 29.2
Notice that method 1 starts by picking an initial condition
Remark 29.3
Associated with each selection of
29.5.2. Method 2#
This method deploys a direct approach.
It defines a “state vector”
where we temporarily take
The solution is
Now let’s think about the initial condition
It is natural to take the initial stock of money
But what about
Isn’t it something that we want to be determined by our model?
Yes, but sometimes we want too much, because there is actually a continuum of initial
As we shall see soon, selecting an initial
29.6. Computation method 1#
Remember that there exist two steady-state equilibrium values
We proceed as follows.
Start at
select a
compute
Then for
When we implement this part of method 1, we shall discover the following striking outcome:
starting from an
in , we shall find that always converges to a limiting “steady state” value that depends on the initial condition .there are only two possible limit points
.for almost every initial condition
, .if and only if
, .
The quantity
We shall soon see that the existence of two steady-state rates of return on currency
that serve to finance the government deficit of
Note
Arthur Laffer’s curve plots a hump shaped curve of revenue raised from a tax against the tax rate.
Its hump shape indicates that there are typically two tax rates that yield the same amount of revenue. This is due to two countervailing courses, one being that raising a tax rate typically decreases the base of the tax as people take decisions to reduce their exposure to the tax.
def simulate_system(R0, model, num_steps):
γ1, γ2, g = model.γ1, model.γ2, model.g
# Initialize arrays to store results
b_values = np.empty(num_steps)
R_values = np.empty(num_steps)
# Initial values
b_values[0] = γ1 - γ2/R0
R_values[0] = 1 / (γ1/γ2 - (1 / γ2) * b_values[0])
# Iterate over time steps
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
Let’s write some code to plot outcomes for several possible initial 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)
# Pre-compute time steps
time_steps = np.arange(num_steps)
# Iterate over R_0s and simulate the system
for R0 in R0_values:
b_values, R_values = simulate_system(R0, model, num_steps)
# Plot R_t against time
axes[0].plot(time_steps, R_values, **line_params)
# Plot b_t against time
axes[1].plot(time_steps, b_values, **line_params)
# Add line and text annotations to the subgraph
annotate_graph(axes[0], model, num_steps)
# Add Labels
axes[0].set_ylabel('$R_t$')
axes[1].set_xlabel('timestep')
axes[1].set_ylabel('$b_t$')
axes[1].xaxis.set_major_locator(MaxNLocator(integer=True))
plt.tight_layout()
plt.show()
Let’s plot distinct outcomes associated with several
Each line below shows a path associated with a different
# Create a grid of R_0s
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. 29.2 Paths of
Notice how sequences that start from
29.7. Computation method 2#
Set
Let
Represent equilibrium conditions (29.1), (29.2), and (29.3) as
or
where
H1 = np.array([[1, msm.γ2],
[1, 0]])
H2 = np.array([[0, msm.γ1],
[1, msm.g]])
Define
H = np.linalg.solve(H1, H2)
print('H = \n', H)
H =
[[ 1. 3. ]
[-0.02 1.94]]
and write the system (29.13) as
so that
where
It is natural to take
The mathematics seems to tell us that
(As usual, we should listen when mathematics talks to us.)
For now, let’s just proceed mechanically on faith.
Compute the eigenvector decomposition
where
It turns out that
where
Λ, Q = np.linalg.eig(H)
print('Λ = \n', Λ)
print('Q = \n', 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
Partition
Below we shall verify the following claims:
Claims: If we set
it turns out that
However, if we set
then
Let’s verify these claims step by step.
Note that
so that
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
For almost all initial vectors
The only way to avoid this outcome is for
To understand this situation, we use the following transformation
Dynamics of
This equation represents the dynamics of our system in a way that lets us isolate the
force that causes gross inflation to converge to the inverse of the lower steady-state rate
of inflation
Staring at equation (29.17) indicates that unless
the path of
Equation (29.18) also leads us to conclude that there is a unique setting
for the initial vector
For this to occur, the required setting of
But note that since
Sometimes this situation is described informally by saying that while
Thus, in a nutshell the unique value of the vector
The component
where
where
Solving this equation for
29.7.1. More convenient formula#
We can get the equivalent but perhaps more convenient formula (29.16) for
To get this formula, first note that because
which implies that
Therefore,
So we can write
which is our formula (29.16).
p0_bar = (Q[1, 0]/Q[0, 0]) * msm.M0
print(f'p0_bar = {p0_bar:.4f}')
p0_bar = 2.2959
It can be verified that this formula replicates itself over time in the sense that
Now let’s visualize the dynamics of
We create a function draw_iterations
to generate the plot
Show content
def draw_iterations(p0s, model, line_params, num_steps):
fig, axes = plt.subplots(3, 1, figsize=(8, 10), sharex=True)
# Pre-compute time steps
time_steps = np.arange(num_steps)
# Plot the first two y-axes in log scale
for ax in axes[:2]:
ax.set_yscale('log')
# Iterate over p_0s and calculate a series of 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, :]
# Plot R_t against time
axes[0].plot(time_steps, M, **line_params)
# Plot b_t against time
axes[1].plot(time_steps, P, **line_params)
# Calculate R_t
R = np.insert(P[:-1] / P[1:], 0, np.nan)
axes[2].plot(time_steps, R, **line_params)
# Add line and text annotations to the subgraph
annotate_graph(axes[2], model, num_steps)
# Draw labels
axes[0].set_ylabel('$m_t$')
axes[1].set_ylabel('$p_t$')
axes[2].set_ylabel('$R_t$')
axes[2].set_xlabel('timestep')
# Enforce integar axis label
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. 29.3 Starting from different initial values of
Please notice that for
Using log scales allows us to spot distinct constant limiting gross rates of growth
29.8. Peculiar stationary outcomes#
As promised at the start of this lecture, we have encountered these concepts from macroeconomics:
an inflation tax that a government gathers by printing paper or electronic money
a dynamic Laffer curve in the inflation tax rate that has two stationary equilibria
Staring at the paths of rates of return on the price level in figure Fig. 29.2 and price levels in Fig. 29.3 show indicate that almost all paths converge to the higher inflation tax rate displayed in the stationary state Laffer curve displayed in figure Fig. 29.1.
Thus, we have indeed discovered what we earlier called “perverse” dynamics under rational expectations in which the system converges to the higher of two possible stationary inflation tax rates.
Those dynamics are “perverse” not only in the sense that they imply that the monetary and fiscal authorities that have chosen to finance government expenditures eventually impose a higher inflation tax than required to finance government expenditures, but because of the following “counterintuitive” situation that we can deduce by staring at the stationary state Laffer curve displayed in figure Fig. 29.1:
the figure indicates that inflation can be reduced by running higher government deficits, i.e., by raising more resources through printing money.
Note
The same qualitative outcomes prevail in this lecture Inflation Rate Laffer Curves that studies a nonlinear version of the model in this lecture.
29.9. Equilibrium selection#
We have discovered that as a model of price level paths or model is incomplete because there is a continuum of “equilibrium” paths for
Through application of our computational methods 1 and 2, we have learned that this continuum can be indexed by choice of one of two scalars:
for computational method 1,
for computational method 2,
To apply our model, we have somehow to complete it by selecting an equilibrium path from among the continuum of possible paths.
We discovered that
all but one of the equilibrium paths converge to limits in which the higher of two possible stationary inflation tax prevails
there is a unique equilibrium path associated with “plausible” statements about how reductions in government deficits affect a stationary inflation rate
On grounds of plausibility, we recommend following many macroeconomists in selecting the unique equilibrium that converges to the lower stationary inflation tax rate.
As we shall see, we shall accept this recommendation in lecture Some Unpleasant Monetarist Arithmetic.
In lecture, Laffer Curves with Adaptive Expectations, we shall explore how [Bruno and Fischer, 1990] and others justified this in other ways.