{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "
\n", " \n", " \"QuantEcon\"\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Ramsey Plans, Time Inconsistency, Sustainable Plans\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Contents\n", "\n", "- [Ramsey Plans, Time Inconsistency, Sustainable Plans](#Ramsey-Plans,-Time-Inconsistency,-Sustainable-Plans) \n", " - [Overview](#Overview) \n", " - [The Model](#The-Model) \n", " - [Structure](#Structure) \n", " - [Intertemporal Influences](#Intertemporal-Influences) \n", " - [Four Models of Government Policy](#Four-Models-of-Government-Policy) \n", " - [A Ramsey Planner](#A-Ramsey-Planner) \n", " - [A Constrained-to-a-Constant-Growth-Rate Ramsey Government](#A-Constrained-to-a-Constant-Growth-Rate-Ramsey-Government) \n", " - [Markov Perfect Governments](#Markov-Perfect-Governments) \n", " - [Equilibrium Outcomes for Three Models of Government Policy Making](#Equilibrium-Outcomes-for-Three-Models-of-Government-Policy-Making) \n", " - [A Fourth Model of Government Decision Making](#A-Fourth-Model-of-Government-Decision-Making) \n", " - [Sustainable or Credible Plan](#Sustainable-or-Credible-Plan) \n", " - [Whose Credible Plan is it?](#Whose-Credible-Plan-is-it?) \n", " - [Comparison of Equilibrium Values](#Comparison-of-Equilibrium-Values) \n", " - [Note on Dynamic Programming Squared](#Note-on-Dynamic-Programming-Squared) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to what’s in Anaconda, this lecture will need the following libraries:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": true }, "outputs": [], "source": [ "!pip install --upgrade quantecon" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Overview\n", "\n", "This lecture describes a linear-quadratic version of a model that Guillermo Calvo [[Cal78]](https://python-programming.quantecon.org/zreferences.html#calvo1978)\n", "used to illustrate the **time inconsistency** of optimal government\n", "plans.\n", "\n", "Like Chang [[Cha98]](https://python-programming.quantecon.org/zreferences.html#chang1998credible), we use the model as a laboratory in which to explore the consequences of\n", "different timing protocols for government decision making.\n", "\n", "The model focuses attention on intertemporal tradeoffs between\n", "\n", "- welfare benefits that anticipated deflation generates by increasing a representative agent’s liquidity as measured by his or her real money balances, and \n", "- costs associated with distorting taxes that must be used to withdraw money from the economy in order to generate anticipated deflation \n", "\n", "\n", "The model features\n", "\n", "- rational expectations \n", "- costly government actions at all dates $ t \\geq 1 $ that increase household\n", " utilities at dates before $ t $ \n", "- two Bellman equations, one that expresses the private sector’s expectation of future inflation\n", " as a function of current and future government actions, another that\n", " describes the value function of a Ramsey planner \n", "\n", "\n", "A theme of this lecture is that timing protocols affect outcomes.\n", "\n", "We’ll use ideas from papers by Cagan [[Cag56]](https://python-programming.quantecon.org/zreferences.html#cagan), Calvo [[Cal78]](https://python-programming.quantecon.org/zreferences.html#calvo1978), Stokey [[Sto89]](https://python-programming.quantecon.org/zreferences.html#stokey1989reputation), [[Sto91]](https://python-programming.quantecon.org/zreferences.html#stokey1991),\n", "Chari and Kehoe [[CK90]](https://python-programming.quantecon.org/zreferences.html#chari1990sustainable), Chang [[Cha98]](https://python-programming.quantecon.org/zreferences.html#chang1998credible), and Abreu [[Abr88]](https://python-programming.quantecon.org/zreferences.html#abreu) as\n", "well as from chapter 19 of [[LS18]](https://python-programming.quantecon.org/zreferences.html#ljungqvist2012).\n", "\n", "In addition, we’ll use ideas from linear-quadratic dynamic programming\n", "described in [Linear Quadratic Control](https://python-intro.quantecon.org/lqcontrol.html) as applied to Ramsey problems\n", "in [Stackelberg problems](https://python-programming.quantecon.org/dyn_stack.html).\n", "\n", "In particular, we have specified the model in a way that allows us to use\n", "linear-quadratic dynamic programming to compute an optimal government\n", "plan under a timing protocol in which a government chooses an infinite\n", "sequence of money supply growth rates once and for all at time\n", "$ 0 $.\n", "\n", "We’ll start with some imports:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "import numpy as np\n", "from quantecon import LQ\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Model\n", "\n", "There is no uncertainty.\n", "\n", "Let:\n", "\n", "- $ p_t $ be the log of the price level \n", "- $ m_t $ be the log of nominal money balances \n", "- $ \\theta_t = p_{t+1} - p_t $ be the net rate of inflation between $ t $ and $ t+1 $ \n", "- $ \\mu_t = m_{t+1} - m_t $ be the net rate of growth of nominal balances \n", "\n", "\n", "The demand for real balances is governed by a perfect foresight\n", "version of the Cagan [[Cag56]](https://python-programming.quantecon.org/zreferences.html#cagan) demand function:\n", "\n", "\n", "\n", "$$\n", "m_t - p_t = -\\alpha(p_{t+1} - p_t) \\: , \\: \\alpha > 0 \\tag{1}\n", "$$\n", "\n", "for $ t \\geq 0 $.\n", "\n", "Equation [(1)](#equation-eq-old1) asserts that the demand for real balances is inversely\n", "related to the public’s expected rate of inflation, which here equals\n", "the actual rate of inflation.\n", "\n", "(When there is no uncertainty, an assumption of **rational expectations** simplifies to **perfect foresight**).\n", "\n", "(See [[Sar77]](https://python-programming.quantecon.org/zreferences.html#sargent77hyper) for a rational expectations version of the model when there is uncertainty)\n", "\n", "Subtracting the demand function at time $ t $ from the demand\n", "function at $ t+1 $ gives:\n", "\n", "$$\n", "\\mu_t - \\theta_t = -\\alpha \\theta_{t+1} + \\alpha \\theta_t\n", "$$\n", "\n", "or\n", "\n", "\n", "\n", "$$\n", "\\theta_t = \\frac{\\alpha}{1+\\alpha} \\theta_{t+1} + \\frac{1}{1+\\alpha} \\mu_t \\tag{2}\n", "$$\n", "\n", "Because $ \\alpha > 0 $, $ 0 < \\frac{\\alpha}{1+\\alpha} < 1 $.\n", "\n", "**Definition:** For a scalar $ x_t $, let $ L^2 $ be the space of sequences\n", "$ \\{x_t\\}_{t=0}^\\infty $ satisfying\n", "\n", "$$\n", "\\sum_{t=0}^\\infty x_t^2 < +\\infty\n", "$$\n", "\n", "We say that a sequence that belongs to $ L^2 $ is **square summable**.\n", "\n", "When we assume that the sequence $ \\vec \\mu = \\{\\mu_t\\}_{t=0}^\\infty $ is square summable and we require that the sequence\n", "$ \\vec \\theta = \\{\\theta_t\\}_{t=0}^\\infty $ is square summable,\n", "the linear difference equation [(2)](#equation-eq-old2) can be solved forward to get:\n", "\n", "\n", "\n", "$$\n", "\\theta_t = \\frac{1}{1+\\alpha} \\sum_{j=0}^\\infty \\left(\\frac{\\alpha}{1+\\alpha}\\right)^j \\mu_{t+j} \\tag{3}\n", "$$\n", "\n", "**Insight:** In the spirit of Chang [[Cha98]](https://python-programming.quantecon.org/zreferences.html#chang1998credible), note that equations [(1)](#equation-eq-old1) and [(3)](#equation-eq-old3) show that $ \\theta_t $ intermediates\n", "how choices of $ \\mu_{t+j}, \\ j=0, 1, \\ldots $ impinge on time $ t $\n", "real balances $ m_t - p_t = -\\alpha \\theta_t $.\n", "\n", "We shall use this insight to help us simplify and analyze government policy problems.\n", "\n", "That future rates of money creation influence earlier rates of inflation\n", "creates optimal government policy problems in which timing protocols\n", "matter.\n", "\n", "We can rewrite the model as:\n", "\n", "$$\n", "\\begin{bmatrix}\n", " 1 \\\\\n", " \\theta_{t+1}\n", "\\end{bmatrix} =\n", "\\begin{bmatrix}\n", " 1 & 0 \\\\\n", " 0 & \\frac{1+\\alpha}{\\alpha}\n", "\\end{bmatrix}\n", "\\begin{bmatrix}\n", " 1 \\\\\n", " \\theta_{t}\n", "\\end{bmatrix} +\n", "\\begin{bmatrix}\n", " 0 \\\\\n", " -\\frac{1}{\\alpha}\n", "\\end{bmatrix}\n", "\\mu_t\n", "$$\n", "\n", "or\n", "\n", "\n", "\n", "$$\n", "x_{t+1} = A x_t + B \\mu_t \\tag{4}\n", "$$\n", "\n", "We write the model in the state-space form [(4)](#equation-eq-old4) even though $ \\theta_0 $ is to be determined and so is not an initial condition\n", "as it ordinarily would be in the state-space model described in [Linear Quadratic Control](https://python-intro.quantecon.org/lqcontrol.html).\n", "\n", "We write the model in the form [(4)](#equation-eq-old4) because we want to apply an approach described in [Stackelberg problems](https://python-programming.quantecon.org/dyn_stack.html).\n", "\n", "Assume that a representative household’s utility of real balances at\n", "time $ t $ is:\n", "\n", "\n", "\n", "$$\n", "U(m_t - p_t) = a_0 + a_1 (m_t - p_t) - \\frac{a_2}{2} (m_t - p_t)^2, \\quad a_0 > 0, a_1 > 0, a_2 > 0 \\tag{5}\n", "$$\n", "\n", "The “bliss level” of real balances is then $ \\frac{a_1}{a_2} $.\n", "\n", "The money demand function [(1)](#equation-eq-old1) and the utility function [(5)](#equation-eq-old5)\n", "imply that utility maximizing or bliss level of real balances is attained when:\n", "\n", "$$\n", "\\theta_t = \\theta^* = -\\frac{a_1}{a_2 \\alpha}\n", "$$\n", "\n", "Below, we introduce the discount factor $ \\beta \\in (0,1) $ that a representative household and a benevolent government\n", "both use to discount future utilities.\n", "\n", "(If we set parameters so that $ \\theta^* = \\log(\\beta) $, then we can\n", "regard a recommendation to set $ \\theta_t = \\theta^* $ as a “poor\n", "man’s Friedman rule” that attains Milton Friedman’s **optimal quantity of money**)\n", "\n", "Via equation [(3)](#equation-eq-old3), a government plan\n", "$ \\vec \\mu = \\{\\mu_t \\}_{t=0}^\\infty $ leads to an equilibrium\n", "sequence of inflation outcomes\n", "$ \\vec \\theta = \\{ \\theta_t \\}_{t=0}^\\infty $.\n", "\n", "We assume that social costs $ \\frac{c}{2} \\mu_t^2 $ are incurred at\n", "$ t $ when the government changes the stock of nominal money\n", "balances at rate $ \\mu_t $.\n", "\n", "Therefore, the one-period welfare function of a benevolent government\n", "is:\n", "\n", "\n", "\n", "$$\n", "-s(\\theta_t, \\mu_t) \\equiv - r(x_t,\\mu_t) = \\begin{bmatrix} 1 \\\\ \\theta_t \\end{bmatrix}' \\begin{bmatrix} a_0 & -\\frac{a_1 \\alpha}{2} \\\\ -\\frac{a_1 \\alpha}{2} & -\\frac{a_2 \\alpha^2}{2} \\end{bmatrix} \\begin{bmatrix} 1 \\\\ \\theta_t \\end{bmatrix} - \\frac{c}{2} \\mu_t^2 = - x_t'Rx_t - Q \\mu_t^2 \\tag{6}\n", "$$\n", "\n", "Household welfare is summarized by:\n", "\n", "\n", "\n", "$$\n", "v_0 = - \\sum_{t=0}^\\infty \\beta^t r(x_t,\\mu_t) = - \\sum_{t=0}^\\infty \\beta^t s(\\theta_t,\\mu_t) \\tag{7}\n", "$$\n", "\n", "We can represent the dependence of $ v_0 $ on $ (\\vec \\theta, \\vec \\mu) $ recursively via the linear difference equation\n", "\n", "\n", "\n", "$$\n", "v_t = - s(\\theta_t, \\mu_t) + \\beta v_{t+1} \\tag{8}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Structure\n", "\n", "The following structure is induced by private agents’\n", "behavior as summarized by the demand function for money [(1)](#equation-eq-old1) that leads to equation [(3)](#equation-eq-old3) that tells how future\n", "settings of $ \\mu $ affect the current value of $ \\theta $.\n", "\n", "Equation [(3)](#equation-eq-old3) maps a **policy** sequence of money growth rates\n", "$ \\vec \\mu =\\{\\mu_t\\}_{t=0}^\\infty \\in L^2 $ into an inflation sequence\n", "$ \\vec \\theta = \\{\\theta_t\\}_{t=0}^\\infty \\in L^2 $.\n", "\n", "These, in turn, induce a discounted value to a government sequence\n", "$ \\vec v = \\{v_t\\}_{t=0}^\\infty \\in L^2 $ that satisfies the\n", "recursion\n", "\n", "$$\n", "v_t = - s(\\theta_t,\\mu_t) + \\beta v_{t+1}\n", "$$\n", "\n", "where we have called $ s(\\theta_t, \\mu_t) = r(x_t, \\mu_t) $ as\n", "above.\n", "\n", "Thus, we have a triple of sequences\n", "$ \\vec \\mu, \\vec \\theta, \\vec v $ associated with a\n", "$ \\vec \\mu \\in L^2 $.\n", "\n", "At this point $ \\vec \\mu \\in L^2 $ is an arbitrary exogenous policy.\n", "\n", "To make $ \\vec \\mu $ endogenous, we require a theory of government\n", "decisions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Intertemporal Influences\n", "\n", "Criterion function [(7)](#equation-eq-old7) and the constraint system [(4)](#equation-eq-old4) exhibit the following\n", "structure:\n", "\n", "- Setting $ \\mu_t \\neq 0 $ imposes costs\n", " $ \\frac{c}{2} \\mu_t^2 $ at time $ t $ and at no other times;\n", " but \n", "- The money growth rate $ \\mu_t $ affects the representative\n", " household’s one-period utilities at all dates\n", " $ s = 0, 1, \\ldots, t $. \n", "\n", "\n", "That settings of $ \\mu $ at one date affect household utilities at\n", "earlier dates sets the stage for the emergence of a time-inconsistent\n", "optimal government plan under a Ramsey (also called a Stackelberg) timing protocol.\n", "\n", "We’ll study outcomes under a Ramsey timing protocol below.\n", "\n", "But we’ll also study the consequences of other timing protocols." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Four Models of Government Policy\n", "\n", "We consider four models of policymakers that differ in\n", "\n", "- what a policymaker is allowed to choose, either a sequence\n", " $ \\vec \\mu $ or just a single period $ \\mu_t $. \n", "- when a policymaker chooses, either at time $ 0 $ or at times\n", " $ t \\geq 0 $. \n", "- what a policymaker assumes about how its choice of $ \\mu_t $\n", " affects private agents’ expectations about earlier and later\n", " inflation rates. \n", "\n", "\n", "In two of our models, a single policymaker chooses a sequence\n", "$ \\{\\mu_t\\}_{t=0}^\\infty $ once and for all, taking into account how\n", "$ \\mu_t $ affects household one-period utilities at dates $ s = 0, 1, \\ldots, t-1 $\n", "\n", "- these two models thus employ a **Ramsey** or **Stackelberg** timing protocol. \n", "\n", "\n", "In two other models, there is a sequence of policymakers, each of whom\n", "sets $ \\mu_t $ at one $ t $ only\n", "\n", "- Each such policymaker ignores effects that its choice of $ \\mu_t $ has on household one-period utilities at dates $ s = 0, 1, \\ldots, t-1 $. \n", "\n", "\n", "The four models differ with respect to timing protocols, constraints on\n", "government choices, and government policymakers’ beliefs about how their\n", "decisions affect private agents’ beliefs about future government\n", "decisions.\n", "\n", "The models are\n", "\n", "- A single Ramsey planner chooses a sequence\n", " $ \\{\\mu_t\\}_{t=0}^\\infty $ once and for all at time $ 0 $. \n", "- A single Ramsey planner chooses a sequence\n", " $ \\{\\mu_t\\}_{t=0}^\\infty $ once and for all at time $ 0 $\n", " subject to the constraint that $ \\mu_t = \\mu $ for all\n", " $ t \\geq 0 $. \n", "- A sequence of separate policymakers chooses $ \\mu_t $ for $ t =0, 1, 2, \\ldots $ \n", " - a time $ t $ policymaker chooses $ \\mu_t $ only and forecasts that future government decisions are unaffected by its choice. \n", "- A sequence of separate policymakers chooses $ \\mu_t $ for $ t =0, 1, 2, \\ldots $ \n", " - a time $ t $ policymaker chooses only $ \\mu_t $ but believes that its choice of $ \\mu_t $ shapes private agents’ beliefs about future rates of money creation and inflation, and through them, future government actions. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A Ramsey Planner\n", "\n", "First, we consider a Ramsey planner that chooses\n", "$ \\{\\mu_t, \\theta_t\\}_{t=0}^\\infty $ to maximize [(7)](#equation-eq-old7)\n", "subject to the law of motion [(4)](#equation-eq-old4).\n", "\n", "We can split this problem into two stages, as in [Stackelberg problems](https://python-programming.quantecon.org/dyn_stack.html) and [[LS18]](https://python-programming.quantecon.org/zreferences.html#ljungqvist2012) Chapter 19.\n", "\n", "In the first stage, we take the initial inflation rate $ \\theta_0 $ as given,\n", "and then solve the resulting LQ dynamic programming problem.\n", "\n", "In the second stage, we maximize over the initial inflation rate $ \\theta_0 $.\n", "\n", "Define a feasible set of\n", "$ (\\overrightarrow x_1, \\overrightarrow \\mu_0) $ sequences:\n", "\n", "$$\n", "\\Omega(x_0) = \\left \\lbrace ( \\overrightarrow x_1, \\overrightarrow \\mu_0) : x_{t+1}\n", "= A x_t + B \\mu_t \\: , \\: \\forall t \\geq 0 \\right \\rbrace\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Subproblem 1\n", "\n", "The value function\n", "\n", "$$\n", "J(x_0) = \\max_{(\\overrightarrow x_1, \\overrightarrow \\mu_0) \\in \\Omega(x_0)}\n", "- \\sum_{t=0}^\\infty \\beta^t r(x_t,\\mu_t)\n", "$$\n", "\n", "satisfies the Bellman equation\n", "\n", "$$\n", "J(x) = \\max_{\\mu,x'}\\{-r(x,\\mu) + \\beta J(x')\\}\n", "$$\n", "\n", "subject to:\n", "\n", "$$\n", "x' = Ax + B\\mu\n", "$$\n", "\n", "As in [Stackelberg problems](https://python-programming.quantecon.org/dyn_stack.html), we map this problem into a linear-quadratic control problem and then carefully use the\n", "optimal value function associated with it.\n", "\n", "Guessing that $ J(x) = - x'Px $ and substituting into the Bellman\n", "equation gives rise to the algebraic matrix Riccati equation:\n", "\n", "$$\n", "P = R + \\beta A'PA - \\beta^2 A'PB(Q + \\beta B'PB)^{-1} B'PA\n", "$$\n", "\n", "and the optimal decision rule\n", "\n", "$$\n", "\\mu_t = - F x_t\n", "$$\n", "\n", "where\n", "\n", "$$\n", "F = \\beta (Q + \\beta B'PB)^{-1} B'PA\n", "$$\n", "\n", "The QuantEcon [LQ](https://github.com/QuantEcon/QuantEcon.py/blob/master/quantecon/lqcontrol.py) class solves for $ F $ and $ P $ given inputs\n", "$ Q, R, A, B $, and $ \\beta $." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Subproblem 2\n", "\n", "The value of the Ramsey problem is\n", "\n", "$$\n", "V = \\max_{x_0} J(x_0)\n", "$$\n", "\n", "The value function\n", "\n", "$$\n", "J(x_0) = -\\begin{bmatrix} 1 & \\theta_0 \\end{bmatrix} \\begin{bmatrix} P_{11} & P_{12} \\\\ P_{21} & P_{22} \\end{bmatrix} \\begin{bmatrix} 1 \\\\ \\theta_0 \\end{bmatrix} = -P_{11} - 2 P_{21} \\theta_0 - P_{22} \\theta_0^2\n", "$$\n", "\n", "Maximizing this with respect to $ \\theta_0 $ yields the FOC:\n", "\n", "$$\n", "- 2 P_{21} - 2 P_{22} \\theta_0 =0\n", "$$\n", "\n", "which implies\n", "\n", "$$\n", "\\theta_0^* = - \\frac{P_{21}}{P_{22}}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Representation of Ramsey Plan\n", "\n", "The preceding calculations indicate that we can represent a Ramsey plan\n", "$ \\vec \\mu $ recursively with the following system created in the spirit of Chang [[Cha98]](https://python-programming.quantecon.org/zreferences.html#chang1998credible):\n", "\n", "\n", "\n", "$$\n", "\\begin{aligned}\n", "\\theta_0 & = \\theta_0^* \\\\\n", "\\mu_t & = b_0 + b_1 \\theta_t \\\\\n", "\\theta_{t+1} & = d_0 + d_1 \\theta_t\n", "\\end{aligned} \\tag{9}\n", "$$\n", "\n", "To interpret this system, think of the sequence\n", "$ \\{\\theta_t\\}_{t=0}^\\infty $ as a sequence of\n", "synthetic **promised inflation rates** that are just computational devices for\n", "generating a sequence $ \\vec\\mu $ of money growth rates that are to\n", "be substituted into equation [(3)](#equation-eq-old3) to form actual rates of inflation.\n", "\n", "It can be verified that if we substitute a plan\n", "$ \\vec \\mu = \\{\\mu_t\\}_{t=0}^\\infty $ that satisfies these equations\n", "into equation [(3)](#equation-eq-old3), we obtain the same sequence $ \\vec \\theta $\n", "generated by the system [(9)](#equation-eq-old9).\n", "\n", "(Here an application of the Big $ K $, little $ k $ trick could once again be enlightening)\n", "\n", "Thus, our construction of a Ramsey plan guarantees that **promised\n", "inflation** equals **actual inflation**.\n", "\n", "### Multiple roles of $ \\theta_t $\n", "\n", "The inflation rate $ \\theta_t $ that appears in the system [(9)](#equation-eq-old9) and\n", "equation [(3)](#equation-eq-old3) plays three roles simultaneously:\n", "\n", "- In equation [(3)](#equation-eq-old3), $ \\theta_t $ is the actual rate of inflation\n", " between $ t $ and $ t+1 $. \n", "- In equation [(2)](#equation-eq-old2) and [(3)](#equation-eq-old3), $ \\theta_t $ is also the public’s\n", " expected rate of inflation between $ t $ and $ t+1 $. \n", "- In system [(9)](#equation-eq-old9), $ \\theta_t $ is a promised rate of inflation\n", " chosen by the Ramsey planner at time $ 0 $. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Time Inconsistency\n", "\n", "As discussed in [Stackelberg problems](https://python-programming.quantecon.org/dyn_stack.html) and [Optimal taxation with state-contingent debt](https://python-programming.quantecon.org/opt_tax_recur.html), a continuation Ramsey plan is not a Ramsey plan.\n", "\n", "This is a concise way of characterizing the time inconsistency of a Ramsey plan.\n", "\n", "The time inconsistency of a Ramsey plan has motivated other models of government decision making\n", "that alter either\n", "\n", "- the timing protocol and/or \n", "- assumptions about how government decision makers think their decisions affect private agents’ beliefs about future government decisions " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A Constrained-to-a-Constant-Growth-Rate Ramsey Government\n", "\n", "We now consider the following peculiar model of optimal government behavior.\n", "\n", "We have created this model in order to highlight an aspect of an optimal government policy associated with its time inconsistency,\n", "namely, the feature that optimal settings of the policy instrument vary over time.\n", "\n", "Instead of allowing the Ramsey government to choose different settings of its instrument at different moments, we now assume that\n", "at time $ 0 $, a Ramsey government at time $ 0 $ once and for all chooses a **constant** sequence\n", "$ \\mu_t = \\check \\mu $ for all $ t \\geq 0 $ to maximize\n", "\n", "$$\n", "U(-\\alpha \\check \\mu) - \\frac{c}{2} \\check \\mu^2\n", "$$\n", "\n", "Here we have imposed the perfect foresight outcome implied by equation [(2)](#equation-eq-old2) that\n", "$ \\theta_t = \\check \\mu $ when the government chooses a constant\n", "$ \\mu $ for all $ t \\geq 0 $.\n", "\n", "With the quadratic form [(5)](#equation-eq-old5) for the utility function $ U $, the\n", "maximizing $ \\bar \\mu $ is\n", "\n", "$$\n", "\\check \\mu = - \\frac{\\alpha a_1}{\\alpha^2 a_2 + c }\n", "$$\n", "\n", "**Summary:** We have introduced the constrained-to-a-constant $ \\mu $\n", "government in order to highlight time-variation of\n", "$ \\mu_t $ as a telltale sign of time inconsistency of a Ramsey plan." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Markov Perfect Governments\n", "\n", "We now change the timing protocol by considering a sequence of\n", "government policymakers, the time $ t $ representative of which\n", "chooses $ \\mu_t $ and expects all future governments to set\n", "$ \\mu_{t+j} = \\bar \\mu $.\n", "\n", "This assumption mirrors an assumption made in a different setting [Markov Perfect Equilibrium](https://python-intro.quantecon.org/markov_perf.html).\n", "\n", "Further, a government policymaker at $ t $ believes that $ \\bar \\mu $ is\n", "unaffected by its choice of $ \\mu_t $.\n", "\n", "The time $ t $ rate of inflation is then:\n", "\n", "$$\n", "\\theta_t = \\frac{\\alpha}{1+\\alpha} \\bar \\mu + \\frac{1}{1+\\alpha} \\mu_t\n", "$$\n", "\n", "The time $ t $ government policymaker then chooses $ \\mu_t $ to\n", "maximize:\n", "\n", "$$\n", "W = U(-\\alpha \\theta_t) - \\frac{c}{2} \\mu_t^2 + \\beta V(\\bar \\mu)\n", "$$\n", "\n", "where $ V(\\bar \\mu) $ is the time $ 0 $ value $ v_0 $ of\n", "recursion [(8)](#equation-eq-old8) under a money supply growth rate that is forever constant\n", "at $ \\bar \\mu $.\n", "\n", "Substituting for $ U $ and $ \\theta_t $ gives:\n", "\n", "$$\n", "W = a_0 + a_1(-\\frac{\\alpha^2}{1+\\alpha} \\bar \\mu - \\frac{\\alpha}{1+\\alpha} \\mu_t) - \\frac{a_2}{2}((-\\frac{\\alpha^2}{1+\\alpha} \\bar \\mu - \\frac{\\alpha}{1+\\alpha} \\mu_t)^2 - \\frac{c}{2} \\mu_t^2 + \\beta V(\\bar \\mu)\n", "$$\n", "\n", "The first-order necessary condition for $ \\mu_t $ is then:\n", "\n", "$$\n", "- \\frac{\\alpha}{1+\\alpha} a_1 - a_2(-\\frac{\\alpha^2}{1+\\alpha} \\bar \\mu - \\frac{\\alpha}{1+\\alpha} \\mu_t)(- \\frac{\\alpha}{1+\\alpha}) - c \\mu_t = 0\n", "$$\n", "\n", "Rearranging we get:\n", "\n", "$$\n", "\\mu_t = \\frac{- a_1}{\\frac{1+\\alpha}{\\alpha}c + \\frac{\\alpha}{1+\\alpha}a_2} - \\frac{\\alpha^2 a_2}{\\left[ \\frac{1+\\alpha}{\\alpha}c + \\frac{\\alpha}{1+\\alpha} a_2 \\right] (1+\\alpha)}\\bar \\mu\n", "$$\n", "\n", "A **Markov Perfect Equilibrium** (MPE) outcome sets\n", "$ \\mu_t = \\bar \\mu $:\n", "\n", "$$\n", "\\mu_t = \\bar \\mu = \\frac{-a_1}{\\frac{1+\\alpha}{\\alpha}c + \\frac{\\alpha}{1+\\alpha} a_2 + \\frac{\\alpha^2}{1+\\alpha} a_2}\n", "$$\n", "\n", "In light of results presented in the previous section, this can be\n", "simplified to:\n", "\n", "$$\n", "\\bar \\mu = - \\frac{\\alpha a_1}{\\alpha^2 a_2 + (1+\\alpha)c}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Equilibrium Outcomes for Three Models of Government Policy Making\n", "\n", "Below we compute sequences $ \\{ \\theta_t,\\mu_t \\} $ under a Ramsey\n", "plan and compare these with the constant levels of $ \\theta $ and\n", "$ \\mu $ in a) a Markov Perfect Equilibrium, and b) a Ramsey plan\n", "in which the planner is restricted to choose $ \\mu_t = \\check\\mu $\n", "for all $ t \\geq 0 $.\n", "\n", "We denote the Ramsey sequence as $ \\theta^R, \\mu^R $ and the MPE\n", "values as $ \\theta^{MPE}, \\mu^{MPE} $.\n", "\n", "The bliss level of inflation is denoted by $ \\theta^* $.\n", "\n", "First, we will create a class ChangLQ that solves the models and stores their values" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "class ChangLQ:\n", " \"\"\"\n", " Class to solve LQ Chang model\n", " \"\"\"\n", " def __init__(self, α, α0, α1, α2, c, T=1000, θ_n=200):\n", "\n", " # Record parameters\n", " self.α, self.α0, self.α1 = α, α0, α1\n", " self.α2, self.c, self.T, self.θ_n = α2, c, T, θ_n\n", "\n", " # Create β using \"Poor Man's Friedman Rule\"\n", " self.β = np.exp(-α1 / (α * α2))\n", "\n", " # Solve the Ramsey Problem #\n", "\n", " # LQ Matrices\n", " R = -np.array([[α0, -α1 * α / 2],\n", " [-α1 * α/2, -α2 * α**2 / 2]])\n", " Q = -np.array([[-c / 2]])\n", " A = np.array([[1, 0], [0, (1 + α) / α]])\n", " B = np.array([[0], [-1 / α]])\n", "\n", " # Solve LQ Problem (Subproblem 1)\n", " lq = LQ(Q, R, A, B, beta=self.β)\n", " self.P, self.F, self.d = lq.stationary_values()\n", "\n", " # Solve Subproblem 2\n", " self.θ_R = -self.P[0, 1] / self.P[1, 1]\n", "\n", " # Find bliss level of θ\n", " self.θ_B = np.log(self.β)\n", "\n", " # Solve the Markov Perfect Equilibrium\n", " self.μ_MPE = -α1 / ((1 + α) / α * c + α / (1 + α)\n", " * α2 + α**2 / (1 + α) * α2)\n", " self.θ_MPE = self.μ_MPE\n", " self.μ_check = -α * α1 / (α2 * α**2 + c)\n", "\n", " # Calculate value under MPE and Check economy\n", " self.J_MPE = (α0 + α1 * (-α * self.μ_MPE) - α2 / 2\n", " * (-α * self.μ_MPE)**2 - c/2 * self.μ_MPE**2) / (1 - self.β)\n", " self.J_check = (α0 + α1 * (-α * self.μ_check) - α2/2\n", " * (-α * self.μ_check)**2 - c / 2 * self.μ_check**2) \\\n", " / (1 - self.β)\n", "\n", " # Simulate Ramsey plan for large number of periods\n", " θ_series = np.vstack((np.ones((1, T)), np.zeros((1, T))))\n", " μ_series = np.zeros(T)\n", " J_series = np.zeros(T)\n", " θ_series[1, 0] = self.θ_R\n", " μ_series[0] = -self.F.dot(θ_series[:, 0])\n", " J_series[0] = -θ_series[:, 0] @ self.P @ θ_series[:, 0].T\n", " for i in range(1, T):\n", " θ_series[:, i] = (A - B @ self.F) @ θ_series[:, i-1]\n", " μ_series[i] = -self.F @ θ_series[:, i]\n", " J_series[i] = -θ_series[:, i] @ self.P @ θ_series[:, i].T\n", "\n", " self.J_series = J_series\n", " self.μ_series = μ_series\n", " self.θ_series = θ_series\n", "\n", " # Find the range of θ in Ramsey plan\n", " θ_LB = min(θ_series[1, :])\n", " θ_LB = min(θ_LB, self.θ_B)\n", " θ_UB = max(θ_series[1, :])\n", " θ_UB = max(θ_UB, self.θ_MPE)\n", " θ_range = θ_UB - θ_LB\n", " self.θ_LB = θ_LB - 0.05 * θ_range\n", " self.θ_UB = θ_UB + 0.05 * θ_range\n", " self.θ_range = θ_range\n", "\n", " # Find value function and policy functions over range of θ\n", " θ_space = np.linspace(self.θ_LB, self.θ_UB, 200)\n", " J_space = np.zeros(200)\n", " check_space = np.zeros(200)\n", " μ_space = np.zeros(200)\n", " θ_prime = np.zeros(200)\n", " for i in range(200):\n", " J_space[i] = - np.array((1, θ_space[i])) \\\n", " @ self.P @ np.array((1, θ_space[i])).T\n", " μ_space[i] = - self.F @ np.array((1, θ_space[i]))\n", " x_prime = (A - B @ self.F) @ np.array((1, θ_space[i]))\n", " θ_prime[i] = x_prime[1]\n", " check_space[i] = (α0 + α1 * (-α * θ_space[i]) -\n", " α2/2 * (-α * θ_space[i])**2 - c/2 * θ_space[i]**2) / (1 - self.β)\n", "\n", " J_LB = min(J_space)\n", " J_UB = max(J_space)\n", " J_range = J_UB - J_LB\n", " self.J_LB = J_LB - 0.05 * J_range\n", " self.J_UB = J_UB + 0.05 * J_range\n", " self.J_range = J_range\n", " self.J_space = J_space\n", " self.θ_space = θ_space\n", " self.μ_space = μ_space\n", " self.θ_prime = θ_prime\n", " self.check_space = check_space" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will create an instance of ChangLQ with the following parameters" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "clq = ChangLQ(α=1, α0=1, α1=0.5, α2=3, c=2)\n", "clq.β" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following code generates a figure that plots the value function from the Ramsey Planner’s\n", "problem, which is maximized at $ \\theta^R_0 $.\n", "\n", "The figure also shows the limiting value $ \\theta_\\infty^R $ to which the inflation rate $ \\theta_t $ converges under the Ramsey plan and compares it to the MPE value and the bliss value." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "def plot_value_function(clq):\n", " \"\"\"\n", " Method to plot the value function over the relevant range of θ\n", "\n", " Here clq is an instance of ChangLQ\n", "\n", " \"\"\"\n", " fig, ax = plt.subplots()\n", "\n", " ax.set_xlim([clq.θ_LB, clq.θ_UB])\n", " ax.set_ylim([clq.J_LB, clq.J_UB])\n", "\n", " # Plot value function\n", " ax.plot(clq.θ_space, clq.J_space, lw=2)\n", " plt.xlabel(r\"$\\theta$\", fontsize=18)\n", " plt.ylabel(r\"$J(\\theta)$\", fontsize=18)\n", "\n", " t1 = clq.θ_space[np.argmax(clq.J_space)]\n", " tR = clq.θ_series[1, -1]\n", " θ_points = [t1, tR, clq.θ_B, clq.θ_MPE]\n", " labels = [r\"$\\theta_0^R$\", r\"$\\theta_\\infty^R$\",\n", " r\"$\\theta^*$\", r\"$\\theta^{MPE}$\"]\n", "\n", " # Add points for θs\n", " for θ, label in zip(θ_points, labels):\n", " ax.scatter(θ, clq.J_LB + 0.02 * clq.J_range, 60, 'black', 'v')\n", " ax.annotate(label,\n", " xy=(θ, clq.J_LB + 0.01 * clq.J_range),\n", " xytext=(θ - 0.01 * clq.θ_range,\n", " clq.J_LB + 0.08 * clq.J_range),\n", " fontsize=18)\n", " plt.tight_layout()\n", " plt.show()\n", "\n", "plot_value_function(clq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The next code generates a figure that plots the value function from the Ramsey Planner’s\n", "problem as well as that for a Ramsey planner that must choose a constant\n", "$ \\mu $ (that in turn equals an implied constant $ \\theta $)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "def compare_ramsey_check(clq):\n", " \"\"\"\n", " Method to compare values of Ramsey and Check\n", "\n", " Here clq is an instance of ChangLQ\n", " \"\"\"\n", " fig, ax = plt.subplots()\n", " check_min = min(clq.check_space)\n", " check_max = max(clq.check_space)\n", " check_range = check_max - check_min\n", " check_LB = check_min - 0.05 * check_range\n", " check_UB = check_max + 0.05 * check_range\n", " ax.set_xlim([clq.θ_LB, clq.θ_UB])\n", " ax.set_ylim([check_LB, check_UB])\n", " ax.plot(clq.θ_space, clq.J_space, lw=2, label=r\"$J(\\theta)$\")\n", "\n", " plt.xlabel(r\"$\\theta$\", fontsize=18)\n", " ax.plot(clq.θ_space, clq.check_space,\n", " lw=2, label=r\"$V^\\check(\\theta)$\")\n", " plt.legend(fontsize=14, loc='upper left')\n", "\n", " θ_points = [clq.θ_space[np.argmax(clq.J_space)],\n", " clq.μ_check]\n", " labels = [r\"$\\theta_0^R$\", r\"$\\theta^\\check$\"]\n", "\n", " for θ, label in zip(θ_points, labels):\n", " ax.scatter(θ, check_LB + 0.02 * check_range, 60, 'k', 'v')\n", " ax.annotate(label,\n", " xy=(θ, check_LB + 0.01 * check_range),\n", " xytext=(θ - 0.02 * check_range,\n", " check_LB + 0.08 * check_range),\n", " fontsize=18)\n", " plt.tight_layout()\n", " plt.show()\n", "\n", "compare_ramsey_check(clq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The next code generates figures that plot the policy functions for a continuation Ramsey\n", "planner.\n", "\n", "The left figure shows the choice of $ \\theta' $ chosen by a\n", "continuation Ramsey planner who inherits $ \\theta $.\n", "\n", "The right figure plots a continuation Ramsey planner’s choice of\n", "$ \\mu $ as a function of an inherited $ \\theta $." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "def plot_policy_functions(clq):\n", " \"\"\"\n", " Method to plot the policy functions over the relevant range of θ\n", "\n", " Here clq is an instance of ChangLQ\n", " \"\"\"\n", " fig, axes = plt.subplots(1, 2, figsize=(12, 4))\n", "\n", " labels = [r\"$\\theta_0^R$\", r\"$\\theta_\\infty^R$\"]\n", "\n", " ax = axes[0]\n", " ax.set_ylim([clq.θ_LB, clq.θ_UB])\n", " ax.plot(clq.θ_space, clq.θ_prime,\n", " label=r\"$\\theta'(\\theta)$\", lw=2)\n", " x = np.linspace(clq.θ_LB, clq.θ_UB, 5)\n", " ax.plot(x, x, 'k--', lw=2, alpha=0.7)\n", " ax.set_ylabel(r\"$\\theta'$\", fontsize=18)\n", "\n", " θ_points = [clq.θ_space[np.argmax(clq.J_space)],\n", " clq.θ_series[1, -1]]\n", "\n", " for θ, label in zip(θ_points, labels):\n", " ax.scatter(θ, clq.θ_LB + 0.02 * clq.θ_range, 60, 'k', 'v')\n", " ax.annotate(label,\n", " xy=(θ, clq.θ_LB + 0.01 * clq.θ_range),\n", " xytext=(θ - 0.02 * clq.θ_range,\n", " clq.θ_LB + 0.08 * clq.θ_range),\n", " fontsize=18)\n", "\n", " ax = axes[1]\n", " μ_min = min(clq.μ_space)\n", " μ_max = max(clq.μ_space)\n", " μ_range = μ_max - μ_min\n", " ax.set_ylim([μ_min - 0.05 * μ_range, μ_max + 0.05 * μ_range])\n", " ax.plot(clq.θ_space, clq.μ_space, lw=2)\n", " ax.set_ylabel(r\"$\\mu(\\theta)$\", fontsize=18)\n", "\n", " for ax in axes:\n", " ax.set_xlabel(r\"$\\theta$\", fontsize=18)\n", " ax.set_xlim([clq.θ_LB, clq.θ_UB])\n", "\n", " for θ, label in zip(θ_points, labels):\n", " ax.scatter(θ, μ_min - 0.03 * μ_range, 60, 'black', 'v')\n", " ax.annotate(label, xy=(θ, μ_min - 0.03 * μ_range),\n", " xytext=(θ - 0.02 * clq.θ_range,\n", " μ_min + 0.03 * μ_range),\n", " fontsize=18)\n", " plt.tight_layout()\n", " plt.show()\n", "\n", "plot_policy_functions(clq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following code generates a figure that plots sequences of $ \\mu $ and $ \\theta $\n", "in the Ramsey plan and compares these to the constant levels in a MPE\n", "and in a Ramsey plan with a government restricted to set $ \\mu_t $\n", "to a constant for all $ t $." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "def plot_ramsey_MPE(clq, T=15):\n", " \"\"\"\n", " Method to plot Ramsey plan against Markov Perfect Equilibrium\n", "\n", " Here clq is an instance of ChangLQ\n", " \"\"\"\n", " fig, axes = plt.subplots(1, 2, figsize=(12, 4))\n", "\n", " plots = [clq.θ_series[1, 0:T], clq.μ_series[0:T]]\n", " MPEs = [clq.θ_MPE, clq.μ_MPE]\n", " labels = [r\"\\theta\", r\"\\mu\"]\n", "\n", " axes[0].hlines(clq.θ_B, 0, T-1, 'r', label=r\"$\\theta^*$\")\n", "\n", " for ax, plot, MPE, label in zip(axes, plots, MPEs, labels):\n", " ax.plot(plot, label=r\"$\" + label + \"^R$\")\n", " ax.hlines(MPE, 0, T-1, 'orange', label=r\"$\" + label + \"^{MPE}$\")\n", " ax.hlines(clq.μ_check, 0, T, 'g', label=r\"$\" + label + \"^\\check$\")\n", " ax.set_xlabel(r\"$t$\", fontsize=16)\n", " ax.set_ylabel(r\"$\" + label + \"_t$\", fontsize=18)\n", " ax.legend(loc='upper right')\n", "\n", " plt.tight_layout()\n", " plt.show()\n", "\n", "plot_ramsey_MPE(clq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Time Inconsistency of Ramsey Plan\n", "\n", "The variation over time in $ \\vec \\mu $ chosen by the Ramsey planner\n", "is a symptom of time inconsistency.\n", "\n", "- The Ramsey planner reaps immediate benefits from promising lower\n", " inflation later to be achieved by costly distorting taxes. \n", "- These benefits are intermediated by reductions in expected inflation\n", " that precede the reductions in money creation rates that rationalize them, as indicated by\n", " equation [(3)](#equation-eq-old3). \n", "- A government authority offered the opportunity to ignore effects on\n", " past utilities and to reoptimize at date $ t \\geq 1 $ would, if allowed, want\n", " to deviate from a Ramsey plan. \n", "\n", "\n", "**Note:** A modified Ramsey plan constructed under the restriction that\n", "$ \\mu_t $ must be constant over time is time consistent (see\n", "$ \\check \\mu $ and $ \\check \\theta $ in the above graphs)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Meaning of Time Inconsistency\n", "\n", "In settings in which governments actually choose sequentially, many economists\n", "regard a time inconsistent plan implausible because of the incentives to\n", "deviate that occur along the plan.\n", "\n", "A way to summarize this *defect* in a Ramsey plan is to say that it\n", "is not credible because there endure incentives for policymakers\n", "to deviate from it.\n", "\n", "For that reason, the Markov perfect equilibrium concept attracts many\n", "economists.\n", "\n", "- A Markov perfect equilibrium plan is constructed to insure that government policymakers who choose sequentially do not want to deviate from it. \n", "\n", "\n", "The *no incentive to deviate from the plan* property is what makes the Markov perfect equilibrium concept attractive." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ramsey Plans Strike Back\n", "\n", "Research by Abreu [[Abr88]](https://python-programming.quantecon.org/zreferences.html#abreu), Chari and Kehoe [[CK90]](https://python-programming.quantecon.org/zreferences.html#chari1990sustainable)\n", "[[Sto89]](https://python-programming.quantecon.org/zreferences.html#stokey1989reputation), and Stokey [[Sto91]](https://python-programming.quantecon.org/zreferences.html#stokey1991) discovered conditions under which a Ramsey plan can be rescued from the complaint that it is not credible.\n", "\n", "They accomplished this by expanding the\n", "description of a plan to include expectations about **adverse consequences** of deviating from\n", "it that can serve to deter deviations.\n", "\n", "We turn to such theories of **sustainable plans** next." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A Fourth Model of Government Decision Making\n", "\n", "This is a model in which\n", "\n", "- The government chooses $ \\{\\mu_t\\}_{t=0}^\\infty $ not once and\n", " for all at $ t=0 $ but chooses to set $ \\mu_t $ at time $ t $, not before. \n", "- private agents’ forecasts of\n", " $ \\{\\mu_{t+j+1}, \\theta_{t+j+1}\\}_{j=0}^\\infty $ respond to\n", " whether the government at $ t $ **confirms** or **disappoints**\n", " their forecasts of $ \\mu_t $ brought into period $ t $ from\n", " period $ t-1 $. \n", "- the government at each time $ t $ understands how private agents’\n", " forecasts will respond to its choice of $ \\mu_t $. \n", "- at each $ t $, the government chooses $ \\mu_t $ to maximize\n", " a continuation discounted utility of a representative household. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A Theory of Government Decision Making\n", "\n", "$ \\vec \\mu $ is chosen by a sequence of government\n", "decision makers, one for each $ t \\geq 0 $.\n", "\n", "We assume the following within-period and between-period timing protocol\n", "for each $ t \\geq 0 $:\n", "\n", "- at time $ t-1 $, private agents expect that the government will set\n", " $ \\mu_t = \\tilde \\mu_t $, and more generally that it will set\n", " $ \\mu_{t+j} = \\tilde \\mu_{t+j} $ for all $ j \\geq 0 $. \n", "- The forecasts $ \\{\\tilde \\mu_{t+j}\\}_{j \\geq 0} $ determine a\n", " $ \\theta_t = \\tilde \\theta_t $ and an associated log\n", " of real balances $ m_t - p_t = -\\alpha\\tilde \\theta_t $ at\n", " $ t $. \n", "- Given those expectations and an associated $ \\theta_t = \\tilde \\theta_t $, at\n", " $ t $ a government is free to set $ \\mu_t \\in {\\bf R} $. \n", "- If the government at $ t $ **confirms** private agents’\n", " expectations by setting $ \\mu_t = \\tilde \\mu_t $ at time\n", " $ t $, private agents expect the continuation government policy\n", " $ \\{\\tilde \\mu_{t+j+1}\\}_{j=0}^\\infty $ and therefore bring\n", " expectation $ \\tilde \\theta_{t+1} $ into period $ t+1 $. \n", "- If the government at $ t $ **disappoints** private agents by setting\n", " $ \\mu_t \\neq \\tilde \\mu_t $, private agents expect\n", " $ \\{\\mu^A_j\\}_{j=0}^\\infty $ as the\n", " continuation policy for $ t+1 $, i.e.,\n", " $ \\{\\mu_{t+j+1}\\} = \\{\\mu_j^A \\}_{j=0}^\\infty $ and therefore\n", " expect an associated $ \\theta_0^A $ for $ t+1 $. Here $ \\vec \\mu^A = \\{\\mu_j^A \\}_{j=0}^\\infty $ is\n", " an alternative government plan to be described below. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Temptation to Deviate from Plan\n", "\n", "The government’s one-period return function $ s(\\theta,\\mu) $\n", "described in equation [(6)](#equation-eq-old6) above has the property that for all\n", "$ \\theta $\n", "\n", "$$\n", "- s(\\theta, 0 ) \\geq - s(\\theta, \\mu) \\quad\n", "$$\n", "\n", "This inequality implies that whenever the policy calls for the\n", "government to set $ \\mu \\neq 0 $, the government could raise its\n", "one-period payoff by setting $ \\mu =0 $.\n", "\n", "Disappointing private sector expectations in that way would increase the\n", "government’s **current** payoff but would have adverse consequences for\n", "**subsequent** government payoffs because the private sector would alter\n", "its expectations about future settings of $ \\mu $.\n", "\n", "The **temporary** gain constitutes the government’s temptation to\n", "deviate from a plan.\n", "\n", "If the government at $ t $ is to resist the temptation to raise its\n", "current payoff, it is only because it forecasts adverse consequences that\n", "its setting of $ \\mu_t $ would bring for continuation government payoffs via alterations in the private sector’s expectations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sustainable or Credible Plan\n", "\n", "We call a plan $ \\vec \\mu $ **sustainable** or **credible** if at\n", "each $ t \\geq 0 $ the government chooses to confirm private\n", "agents’ prior expectation of its setting for $ \\mu_t $.\n", "\n", "The government will choose to confirm prior expectations only if the\n", "long-term **loss** from disappointing private sector expectations –\n", "coming from the government’s understanding of the way the private sector\n", "adjusts its expectations in response to having its prior\n", "expectations at $ t $ disappointed – outweigh the short-term\n", "**gain** from disappointing those expectations.\n", "\n", "The theory of sustainable or credible plans assumes throughout that private sector\n", "expectations about what future governments will do are based on the\n", "assumption that governments at times $ t \\geq 0 $ always act to\n", "maximize the continuation discounted utilities that describe those\n", "governments’ purposes.\n", "\n", "This aspect of the theory means that credible plans always come in **pairs**:\n", "\n", "- a credible (continuation) plan to be followed if the government at\n", " $ t $ **confirms** private sector expectations \n", "- a credible plan to be followed if the government at $ t $\n", " **disappoints** private sector expectations \n", "\n", "\n", "That credible plans come in pairs threaten to bring an explosion of plans to keep track of\n", "\n", "- each credible plan itself consists of two credible plans \n", "- therefore, the number of plans underlying one plan is unbounded \n", "\n", "\n", "But Dilip Abreu showed how to render manageable the number of plans that must be kept track of.\n", "\n", "The key is an object called a **self-enforcing** plan." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Abreu’s Self-Enforcing Plan\n", "\n", "A plan $ \\vec \\mu^A $ (here the superscipt $ A $ is for Abreu) is said to be **self-enforcing** if\n", "\n", "- the consequence of disappointing private agents’ expectations at time\n", " $ j $ is to **restart** plan $ \\vec \\mu^A $ at time $ j+1 $ \n", "- the consequence of restarting the plan is sufficiently adverse that it forever deters all\n", " deviations from the plan \n", "\n", "\n", "More precisely, a government plan $ \\vec \\mu^A $ with equilibrium inflation sequence $ \\vec \\theta^A $ is\n", "**self-enforcing** if\n", "\n", "\n", "\n", "$$\n", "\\begin{aligned}\n", "v_j^A & = - s(\\theta^A_j, \\mu^A_j) + \\beta v_{j+1}^A \\\\\n", "& \\geq - s(\\theta^A_j, 0 ) + \\beta v_0^A \\equiv v_j^{A,D}, \\quad j \\geq 0\n", "\\end{aligned} \\tag{10}\n", "$$\n", "\n", "(Here it is useful to recall that setting $ \\mu=0 $ is the maximizing choice for the government’s one-period return function)\n", "\n", "The first line tells the consequences of confirming private agents’\n", "expectations by following the plan, while the second line tells the consequences of\n", "disappointing private agents’ expectations by deviating from the plan.\n", "\n", "A consequence of the inequality stated in the definition is that a self-enforcing plan is\n", "credible.\n", "\n", "Self-enforcing plans can be used to construct other credible plans, including ones with better values.\n", "\n", "Thus, where $ \\vec v^A $ is the value associated with a self-enforcing plan $ \\vec \\mu^A $,\n", "a sufficient condition for another plan $ \\vec \\mu $ associated with inflation $ \\vec \\theta $ and value $ \\vec v $ to be **credible** is that\n", "\n", "\n", "\n", "$$\n", "\\begin{aligned}\n", "v_j & = - s( \\theta_j, \\mu_j) + \\beta v_{j+1} \\\\\n", "& \\geq -s( \\theta_j, 0) + \\beta v_0^A \\quad \\forall j \\geq 0\n", "\\end{aligned} \\tag{11}\n", "$$\n", "\n", "For this condition to be satisfied it is necessary and sufficient that\n", "\n", "$$\n", "-s( \\theta_j, 0) - ( - s( \\theta_j, \\mu_j) ) < \\beta ( v_{j+1} - v_0^A )\n", "$$\n", "\n", "The left side of the above inequality is the government’s **gain** from deviating from the plan, while the right side is the government’s **loss** from deviating\n", "from the plan.\n", "\n", "A government never wants to deviate from a credible plan.\n", "\n", "Abreu taught us that key step in constructing a credible plan is first constructing a\n", "self-enforcing plan that has a low time $ 0 $ value.\n", "\n", "The idea is to use the self-enforcing plan as a continuation plan whenever\n", "the government’s choice at time $ t $ fails to confirm private\n", "agents’ expectation.\n", "\n", "We shall use a construction featured in Abreu ([[Abr88]](https://python-programming.quantecon.org/zreferences.html#abreu)) to construct a\n", "self-enforcing plan with low time $ 0 $ value." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Abreu Carrot-Stick Plan\n", "\n", "Abreu ([[Abr88]](https://python-programming.quantecon.org/zreferences.html#abreu)) invented a way to create a self-enforcing plan with a low\n", "initial value.\n", "\n", "Imitating his idea, we can construct a self-enforcing plan\n", "$ \\vec \\mu $ with a low time $ 0 $ value to the government by\n", "insisting that future government decision makers set $ \\mu_t $ to a value yielding low\n", "one-period utilities to the household for a long time, after which\n", "government decisions thereafter yield high one-period utilities.\n", "\n", "- Low one-period utilities early are a **stick** \n", "- High one-period utilities later are a **carrot** \n", "\n", "\n", "Consider a candidate plan $ \\vec \\mu^A $ that sets\n", "$ \\mu_t^A = \\bar \\mu $ (a high positive\n", "number) for $ T_A $ periods, and then reverts to the Ramsey plan.\n", "\n", "Denote this sequence by $ \\{\\mu_t^A\\}_{t=0}^\\infty $.\n", "\n", "The sequence of inflation rates implied by this plan,\n", "$ \\{\\theta_t^A\\}_{t=0}^\\infty $, can be calculated using:\n", "\n", "$$\n", "\\theta_t^A = \\frac{1}{1+\\alpha} \\sum_{j=0}^{\\infty} \\left(\\frac{\\alpha}{1+\\alpha}\\right)^j \\mu^A_{t+j}\n", "$$\n", "\n", "The value of $ \\{\\theta_t^A,\\mu_t^A \\}_{t=0}^\\infty $ at time $ 0 $ is\n", "\n", "$$\n", "v^A_0 = - \\sum_{t=0}^{T_A-1} \\beta^t s(\\theta_t^A,\\mu_t^A) +\\beta^{T_A} J(\\theta^R_0)\n", "$$\n", "\n", "For an appropriate $ T_A $, this plan can be verified to be self-enforcing and therefore credible." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example of Self-Enforcing Plan\n", "\n", "The following example implements an Abreu stick-and-carrot plan.\n", "\n", "The government sets $ \\mu_t^A = 0.1 $ for $ t=0, 1, \\ldots, 9 $\n", "and then starts the **Ramsey plan**.\n", "\n", "We have computed outcomes for this plan.\n", "\n", "For this plan, we plot the $ \\theta^A $, $ \\mu^A $ sequences as\n", "well as the implied $ v^A $ sequence.\n", "\n", "Notice that because the government sets money supply growth high for 10\n", "periods, inflation starts high.\n", "\n", "Inflation gradually slowly declines because people expect the government to lower the money growth rate after period\n", "$ 10 $.\n", "\n", "From the 10th period onwards, the inflation rate $ \\theta^A_t $\n", "associated with this **Abreu plan** starts the Ramsey plan from its\n", "beginning, i.e., $ \\theta^A_{t+10} =\\theta^R_t \\ \\ \\forall t \\geq 0 $." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "def abreu_plan(clq, T=1000, T_A=10, μ_bar=0.1, T_Plot=20):\n", "\n", " # Append Ramsey μ series to stick μ series\n", " clq.μ_A = np.append(np.ones(T_A) * μ_bar, clq.μ_series[:-T_A])\n", "\n", " # Calculate implied stick θ series\n", " clq.θ_A = np.zeros(T)\n", " discount = np.zeros(T)\n", " for t in range(T):\n", " discount[t] = (clq.α / (1 + clq.α))**t\n", " for t in range(T):\n", " length = clq.μ_A[t:].shape[0]\n", " clq.θ_A[t] = 1 / (clq.α + 1) * sum(clq.μ_A[t:] * discount[0:length])\n", "\n", " # Calculate utility of stick plan\n", " U_A = np.zeros(T)\n", " for t in range(T):\n", " U_A[t] = clq.β**t * (clq.α0 + clq.α1 * (-clq.θ_A[t])\n", " - clq.α2 / 2 * (-clq.θ_A[t])**2 - clq.c * clq.μ_A[t]**2)\n", "\n", " clq.V_A = np.zeros(T)\n", " for t in range(T):\n", " clq.V_A[t] = sum(U_A[t:] / clq.β**t)\n", "\n", " # Make sure Abreu plan is self-enforcing\n", " clq.V_dev = np.zeros(T_Plot)\n", " for t in range(T_Plot):\n", " clq.V_dev[t] = (clq.α0 + clq.α1 * (-clq.θ_A[t])\n", " - clq.α2 / 2 * (-clq.θ_A[t])**2) \\\n", " + clq.β * clq.V_A[0]\n", "\n", " fig, axes = plt.subplots(3, 1, figsize=(8, 12))\n", "\n", " axes[2].plot(clq.V_dev[0:T_Plot], label=\"$V^{A, D}_t$\", c=\"orange\")\n", "\n", " plots = [clq.θ_A, clq.μ_A, clq.V_A]\n", " labels = [r\"$\\theta_t^A$\", r\"$\\mu_t^A$\", r\"$V^A_t$\"]\n", "\n", " for plot, ax, label in zip(plots, axes, labels):\n", " ax.plot(plot[0:T_Plot], label=label)\n", " ax.set(xlabel=\"$t$\", ylabel=label)\n", " ax.legend()\n", "\n", " plt.tight_layout()\n", " plt.show()\n", "\n", "abreu_plan(clq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To confirm that the plan $ \\vec \\mu^A $ is **self-enforcing**, we\n", "plot an object that we call $ V_t^{A,D} $, defined in the key inequality in the second line of equation [(10)](#equation-eq-old10) above.\n", "\n", "$ V_t^{A,D} $ is the value at $ t $ of deviating from the\n", "self-enforcing plan $ \\vec \\mu^A $ by setting $ \\mu_t = 0 $ and\n", "then restarting the plan at $ v^A_0 $ at $ t+1 $:\n", "\n", "$$\n", "v_t^{A,D} = -s( \\theta_j, 0) + \\beta v_0^A\n", "$$\n", "\n", "In the above graph $ v_t^A > v_t^{A,D} $, which confirms that $ \\vec \\mu^A $ is a self-enforcing plan.\n", "\n", "We can also verify the inequalities required for $ \\vec \\mu^A $ to\n", "be self-confirming numerically as follows" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "np.all(clq.V_A[0:20] > clq.V_dev[0:20])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Given that plan $ \\vec \\mu^A $ is self-enforcing, we can check that\n", "the Ramsey plan $ \\vec \\mu^R $ is credible by verifying that:\n", "\n", "$$\n", "v^R_t \\geq - s(\\theta^R_t,0) + \\beta v^A_0 , \\quad \\forall t \\geq 0\n", "$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "def check_ramsey(clq, T=1000):\n", " # Make sure Ramsey plan is sustainable\n", " R_dev = np.zeros(T)\n", " for t in range(T):\n", " R_dev[t] = (clq.α0 + clq.α1 * (-clq.θ_series[1, t])\n", " - clq.α2 / 2 * (-clq.θ_series[1, t])**2) \\\n", " + clq.β * clq.V_A[0]\n", "\n", " return np.all(clq.J_series > R_dev)\n", "\n", "check_ramsey(clq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Recursive Representation of a Sustainable Plan\n", "\n", "We can represent a sustainable plan recursively by taking the\n", "continuation value $ v_t $ as a state variable.\n", "\n", "We form the following 3-tuple of functions:\n", "\n", "\n", "\n", "$$\n", "\\begin{aligned}\n", "\\hat \\mu_t & = \\nu_\\mu(v_t) \\\\\n", "\\theta_t & = \\nu_\\theta(v_t) \\\\\n", "v_{t+1} & = \\nu_v(v_t, \\mu_t )\n", "\\end{aligned} \\tag{12}\n", "$$\n", "\n", "In addition to these equations, we need an initial value $ v_0 $ to\n", "characterize a sustainable plan.\n", "\n", "The first equation of [(12)](#equation-eq-old11) tells the recommended value of\n", "$ \\hat \\mu_t $ as a function of the promised value $ v_t $.\n", "\n", "The second equation of [(12)](#equation-eq-old11) tells the inflation rate as a function of\n", "$ v_t $.\n", "\n", "The third equation of [(12)](#equation-eq-old11) updates the continuation value in a way that\n", "depends on whether the government at $ t $ confirms private agents’\n", "expectations by setting $ \\mu_t $ equal to the recommended value\n", "$ \\hat \\mu_t $, or whether it disappoints those expectations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Whose Credible Plan is it?\n", "\n", "A credible government plan $ \\vec \\mu $ plays multiple roles.\n", "\n", "- It is a sequence of actions chosen by the government. \n", "- It is a sequence of private agents’ forecasts of government actions. \n", "\n", "\n", "Thus, $ \\vec \\mu $ is both a government policy and a collection of private agents’ forecasts of government policy.\n", "\n", "Does the government *choose* policy actions or does it simply *confirm* prior private sector forecasts of those actions?\n", "\n", "An argument in favor of the *government chooses* interpretation comes from noting that the theory of credible plans builds in a theory that the government each period chooses\n", "the action that it wants.\n", "\n", "An argument in favor of the *simply confirm* interpretation is gathered from staring at the key inequality [(11)](#equation-eq-old100a) that defines a credible policy." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparison of Equilibrium Values\n", "\n", "We have computed plans for\n", "\n", "- an ordinary (unrestricted) Ramsey planner who chooses a sequence\n", " $ \\{\\mu_t\\}_{t=0}^\\infty $ at time $ 0 $ \n", "- a Ramsey planner restricted to choose a constant $ \\mu $ for all\n", " $ t \\geq 0 $ \n", "- a Markov perfect sequence of governments \n", "\n", "\n", "Below we compare equilibrium time zero values for these three.\n", "\n", "We confirm that the value delivered by the unrestricted Ramsey planner\n", "exceeds the value delivered by the restricted Ramsey planner which in\n", "turn exceeds the value delivered by the Markov perfect sequence of\n", "governments." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "clq.J_series[0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "clq.J_check" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hide-output": false }, "outputs": [], "source": [ "clq.J_MPE" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have also computed **credible plans** for a government or sequence\n", "of governments that choose sequentially.\n", "\n", "These include\n", "\n", "- a **self-enforcing** plan that gives a low initial value $ v_0 $. \n", "- a better plan – possibly one that attains values associated with\n", " Ramsey plan – that is not self-enforcing. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Note on Dynamic Programming Squared\n", "\n", "The theory deployed in this lecture is an application of what we nickname **dynamic programming squared**.\n", "\n", "The nickname refers to the fact that a value satisfying one Bellman equation is itself an argument in a second Bellman equation.\n", "\n", "Thus, our models have involved two Bellman equations:\n", "\n", "- equation [(1)](#equation-eq-old1) expresses how $ \\theta_t $ depends on $ \\mu_t $\n", " and $ \\theta_{t+1} $ \n", "- equation [(4)](#equation-eq-old4) expresses how value $ v_t $ depends on\n", " $ (\\mu_t, \\theta_t) $ and $ v_{t+1} $ \n", "\n", "\n", "A value $ \\theta $ from one Bellman equation appears as an argument of a second Bellman equation for another value $ v $." ] } ], "metadata": { "date": 1624431170.4078646, "filename": "calvo.rst", "kernelspec": { "display_name": "Python", "language": "python3", "name": "python3" }, "next_doc": { "link": "opt_tax_recur", "title": "Optimal Taxation with State-Contingent Debt" }, "prev_doc": { "link": "dyn_stack", "title": "Stackelberg Plans" }, "title": "Ramsey Plans, Time Inconsistency, Sustainable Plans" }, "nbformat": 4, "nbformat_minor": 2 }