Model PC#

Model PC is introduced in chapter 4 of Godley and Lavoie [2006] “Monetary Economics: An Integrated Approach to Credit, Money, Income, Production and Wealth”.

Module Contents#

As with all MacroStat models, PC is divided into Variables, Parameters (fixed constants), Scenarios, and the Behavior (model initialization and steps). The module-level documentation, such as all variables/parameters/scenarios and their notation or the behavioral equations associated with each function of BehaviorPC.py can be seen in:

The remainder of this page gives an introduction to the model, notes on how it is implemented in MacroStat and then shows some of the model dynamics by replicating the relevant graphs of Godley and Lavoie (2006).

Model Overview#

Behavioral Equations#

Similarly to model SIM, model PC is built on the idea of perfect foresight, that is, we assume that producers will sell whatever is demanded and that the households are correct in their expectations of disposable income. The PC model as introduced in Chapter 4 consists of the following 11 equations and 11 unknowns:

  1. National Income

(1)#\[Y(t) = C(t) + G(t)\]
  1. Disposable income is national income and interest earnings minus taxes

(2)#\[YD(t) = Y(t) - T(t) + r(t-1)\cdot B_h(t-1)\]
  1. Taxes are a fixed share of income

(3)#\[T(t) = \Theta \cdot \left(Y(t) + r(t-1)\cdot B_h(t-1)\right)\]
  1. Wealth increases by savings

(4)#\[V(t) = V(t-1) + (YD(t) - C(t))\]
  1. Consumption is partially out of disposable income and wealth

(5)#\[C(t) = \alpha_1\cdot YD(t) + \alpha_2\cdot V(t-1)\]
  1. Household cash holdings are the difference between wealth and bill holdings

(6)#\[H_h(t) = V(t) - B_h(t)\]
  1. The share of bills in wealth

(7)#\[\frac{B_h(t)}{V(t)}=\lambda_0 + \lambda_1\cdot r(t) - \lambda_2\cdot\left(\frac{YD(t)}{V(t)}\right)\]
  1. The share of cash in wealth (6A)

(8)#\[\frac{H_h(t)}{V(t)}=(1-\lambda_0) - \lambda_1\cdot r(t) + \lambda_2\cdot\left(\frac{YD(t)}{V(t)}\right)\]
  1. The change in the stock of outstanding government bills (also known as the government’s budget constraint). The first part represents government outlays (direct purchases and interest payments) while the second represents government revenues (taxes and central bank profits)

\begin{align} \Delta B_s(t) &= B_s(t) - B_s(t-1)\\ &= (G(t) + r(t-1)\cdot B_s(t-1)) - (T(t) + r(t-1)\cdot B_{CB}(t-1)) \end{align}
  1. The change in money circulating

(10)#\[\Delta H_s(t) = H_s(t) - H_s(t-1) = \Delta B_{CB}\]
  1. Bills held by the central bank, the central bank purchases all of the bills issued by the government that the households are not willing to buy given the current interest rate. Combined with (10) it implies the CB provides cash money on demand. Therefore, the amount of cash in the system is endogeneous and demand-led while the rate on bills is exogenous.

(11)#\[B_{CB}(t) = B_s(t) - B_h(t)\]
  1. The interest rate is fixed

(12)#\[r(t) = \bar{r}\]

With the redundant equation being

(13)#\[H_s(t) = H_h(t)\]

Transaction Flow Matrix#

Accounting Transaction Matrix for Model PC#

Household

Production

Government

CentralBank

CentralBank

Total

Current

Current

Current

Current

Capital

Consumption Household

\(-C(t)\)

\(+C(t)\)

\(0\)

Consumption Government

\(+G(t)\)

\(-G(t)\)

\(0\)

National Income

\(+Y(t)\)

\(-Y(t)\)

\(0\)

Interest Earned On Bills Household

\(+r(t-1)\cdot B_h(t-1)\)

\(-r(t-1)\cdot B_h(t-1)\)

\(0\)

Central Bank Profits

\(+r(t-1)\cdot B_{CB}(t-1)\)

\(-r(t-1)\cdot B_{CB}(t-1)\)

\(0\)

Taxes

\(-T(t)\)

\(+T(t)\)

\(0\)

Change in Money Stock

\(+H_h(t)\)

\(-H_{s}(t)\)

\(0\)

Change in Bill Stock

\(+B_h(t)\)

\(-B_s(t)\)

\(+B_{CB}(t)\)

\(0\)

Total

\(0\)

\(0\)

\(0\)

\(0\)

\(0\)

\(0\)

Balance Sheet Matrix#

Balance Sheet for Model PC#

Household

Production

Government

CentralBank

Total

Current

Current

Current

Capital

Money Stock

\(+H_h(t)\)

\(-H_{s}(t)\)

0

Bill Stock

\(+B_h(t)\)

\(-B_s(t)\)

\(+B_{CB}(t)\)

0

Wealth

\(-V(t)\)

\(+V(t)\)

0

Implementation in MacroStat#

Transposing these eleven equations to the MacroStat framework, we consider that there are:

  1. Three parameters (fixed constants): \(\alpha_1\), \(\alpha_2\), and \(\theta\) (see Parameters)

  2. Two scenario variables : \(G_d(t)\) and \(W(t)\) (see Scenarios)

  3. The remaining 14 tracked series are variables (see Variables)

Behavioral Modeling#

The model PC imposes that the assumptions of the household on income are correct and firms supply all goods. For the implementation of the behavioral equations (see Behavior), most prior implementations have made use of some form of linear solver or iteration until the system is solved. To simplify the implementation in Macrostat, we can note that the system can be solved analytically for a given timestep as follows:

Substitute Eq. (5) into Eq. (1) to obtain

\[Y(t) = \alpha_1 YD(t) + \alpha_2 V(t-1) + G(t)\]

where \(G(t)\) is exogenous and \(V(t-1)\) is determined. Substituting further equation Eq. (2) and Eq. (3) we can obtain

\[Y(t) = \alpha_1(1-\theta)\left(Y(t) + r(t-1)B_h(t-1)\right) + \alpha_2 V(t-1) + G(t)\]

which can be rearranged to yield a solution for \(Y(t)\)

(14)#\[Y(t) = \frac{\alpha_1(1-\theta)r(t-1)B_h(t-1) + \alpha_2 V(t-1) + G(t)}{1 - \alpha_1(1-\theta)}\]

Therefore, for a given period \(t\) we can solve the system by solving, in order:

  1. Eq. (14) for national income \(Y(t)\)

  2. Eq. (3) for taxes \(T(t)\)

  3. Eq. (2) for disposable income \(YD(t)\)

  4. Eq. (5) for consumption \(C(t)\)

  5. Eq. (4) for wealth \(V(t)\)

  6. Eq. (7) for household bill holdings \(B_h(t)\)

  7. Eq. (6) for household depositis (residual) \(H_h(t)\)

  8. Eq. (9) for the government budget resulting in bill issuance \(B_s(t)\)

  9. Eq. (11) for the Central Bank holding of bills \(B_{CB}(t)\)

  10. Eq. (10) for the level of cash money \(H_s(t)\)

This is implemented as such in the Behavior class.

Model Dynamics#

Preparatory Steps#

%load_ext autoreload
%autoreload 2

import importlib
import logging
import sys

# Import the necessary libraries for plotting
from matplotlib import pyplot as plt
from matplotlib.ticker import PercentFormatter

# Import the MacroStat get_model function
from macrostat.models import get_model

# Custom matplotlib style for the documentation
plt.style.use("../../macrostat.mplstyle")
# We show the logging output in the notebook
importlib.reload(logging)
logging.basicConfig(stream=sys.stdout, level=logging.INFO)

Running the Simulation#

First, we can run the model without any shocks to see the convergence to the steady state.

GL06PCClass = get_model("GL06PC")
model = GL06PCClass()
model.simulate()
output = model.variables.to_pandas()
INFO:root:Starting simulation. Scenario: 0

Here we can also check that the variables are healthy, which means that the redundant equations hold and that all the assets and liabilities are positive. For model PC, the redundant equation is that the household money stock equals the central bank money stock.

Note

In numerical implementations, due to floating point precision it is unlikely that the redundant equation will hold exactly. Therefore, we check that the absolute percentage error is less than a given tolerance, in this case 1e-5. We use the absolute percentage error to appropriately scale the error for different magnitudes of the variables.

model.variables.check_health(tolerance=1e-5)
True

Convergence to the Steady State#

Following the derivations of section 4.5 in Godley and Lavoie [2006], we compute the steady state as

\[\begin{split}\begin{align} G^\star(t) &= G(t)\\ r^\star(t) &= r(t)\\ \alpha_3 &= \frac{1-\alpha_1}{\alpha_2}\\ YD^\star(t) &= \frac{G^\star(t)}{\frac{\theta}{1-\theta} - r^\star(t)\cdot\left(\left(\lambda_0 + \lambda_1 r^\star(t) \right)\alpha_3 - \lambda_2\right)}\\ C^\star(t) &= YD^\star(t)\\ Y^\star(t) &= C^\star(t) + G^\star(t)\\ V^\star(t) &= \alpha_3 YD^\star(t)\\ B_h^\star(t) &= \left(\left(\lambda_0 + \lambda_1 r^\star(t) \right)\alpha_3 - \lambda_2\right)\cdot YD^\star(t)\\ T^\star(t) &= \theta\cdot \left(Y^\star(t) + r^\star(t) B_h^\star(t)\right)\\ H_h^\star(t) &= V^\star(t) - B_h^\star(t)\\ B_s^\star(t) &= \frac{r^\star(t) B_{CB}^\star(t) + T^\star(t) - G^\star(t)}{r^\star(t)}\\ B_{CB}^\star(t) &= B_s^\star(t) - B_h^\star(t)\\ H_s^\star(t) &= H_{s}(t-1) + (B_{CB}(t) - B_{CB}(t-1)) \end{align}\end{split}\]
model.compute_theoretical_steady_state(scenario=0)
steadystate = model.variables.to_pandas()
INFO:root:Computing theoretical steady state. Scenario: 0
Hide code cell source
dfo = output.loc[:30]
dfs = steadystate.loc[:30]

fig, axs = plt.subplots(ncols=2, nrows=3, figsize=(8, 8))

# National Income and Consumption
axs[0,0].plot(dfo.index, dfo['NationalIncome'], color='k', label=r'National Income $Y$')
axs[0,0].step(x=dfs.index,y=dfs["NationalIncome"], color='r', linestyle='--', label=r'Steady State Income $Y^\star$')
axs[0,0].legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), frameon=False)
axs[0,0].set_title('National Income')
axs[0,1].plot(dfo.index, dfo['ConsumptionHousehold'], color='k', label=r'Consumption $C$')
axs[0,1].plot(dfo.index, dfo['DisposableIncome'], color='g', linestyle='-.', label=r'Disposable Income $YD$')
axs[0,1].step(x=dfs.index,y=dfs["ConsumptionHousehold"], color='r', linestyle='--', label=r'Steady State Consumption $C^\star$')
axs[0,1].legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), frameon=False)
axs[0,1].set_title('Consumption')

# Wealth and Savings
axs[1,0].plot(dfo.index, dfo['Wealth'], color='k', label=r'Wealth $V$')
axs[1,0].step(x=dfs.index,y=dfs["Wealth"], color='r', linestyle='--', label=r'Steady State Wealth $V^\star$')
axs[1,0].legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), frameon=False)
axs[1,0].set_title('Wealth')
axs[1,1].plot(dfo.index, dfo['Wealth'].diff(), color='k', label=r'Savings, $\Delta V$')
axs[1,1].axhline(y=0, color='r', linestyle='--', label=r'Steady State Savings $\Delta V^\star=0$')
axs[1,1].legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), frameon=False)
axs[1,1].set_title('Savings')

# Money Share and Bills Share
share_bills = steadystate['HouseholdBillStock'] / steadystate['Wealth']
axs[2,0].plot(output.index, output['HouseholdMoneyStock'] / output['Wealth'], color='k', linestyle='-', label='Money Share $H_h/V$')
axs[2,0].step(x=share_bills.index,y=1-share_bills, color='r', linestyle='--', label='Steady State Share')
axs[2,0].legend(loc='center right', frameon=False)
axs[2,0].set_xlim(0,40)
axs[2,0].set_title('Money Share')
axs[2,0].yaxis.set_major_formatter(PercentFormatter(1))

# Right panel - Bills share
axs[2,1].plot(output.index, output['HouseholdBillStock'] / output['Wealth'], color='k', linestyle='-', label='Bills Share $B_h/V$')
axs[2,1].step(x=share_bills.index,y=share_bills, color='r', linestyle='--', label='Steady State Share')
axs[2,1].legend(loc='center right', frameon=False)
axs[2,1].set_xlim(0,40)
axs[2,1].set_title('Bills Share')
axs[2,1].yaxis.set_major_formatter(PercentFormatter(1))


fig.suptitle('Figure PC.1: Model convergence to the steady state')
plt.tight_layout()
plt.show()
../../_images/e2004625463ea35102e308c3830709816d58a239fd5d56f12148d1fffbe34db2.png