A Promise the Bank Would Break

time inconsistency · Barro-Gordon model · inflation bias · rational expectations · best response · fixed point

The central bank of Tessary has promised inflation \pi^*. Its board also wishes output were higher than normal, and in this model the only way to raise output is to surprise people with more inflation than they expected. The question is whether the promise can be believed.

The model has one period. First the public forms its expected inflation \pi^e (and sets wages and prices on it); then the bank chooses inflation \pi. Output above normal (the gap, a fraction of normal output) is

y = c \, (\pi - \pi^e)

with c > 0. The bank's loss, with deviations measured in percentage points (a miss of 0.004 counts as 0.4), is

L = \big(100 \, (\pi - \pi^*)\big)^2 + \lambda \, \big(100 \, (y - k)\big)^2

where k \ge 0 is the gap the bank would like and \lambda \ge 0 how much it cares about output. All rates are fractions (2 % is 0.02). Inflation may be any real number. Four questions:

  • "commit": the bank can bind itself to \pi = \pi^*, and the public, knowing that, expects \pi^e = \pi^*.
  • "cheat": the public believes the promise, \pi^e = \pi^*, but the bank then picks the \pi with the lowest loss for that \pi^e.
  • "discretion": the public knows the bank will pick the lowest-loss \pi for whatever they expect, so they expect exactly what it will pick: \pi^e is the value at which the bank's lowest-loss choice equals \pi^e itself.
  • "rounds": a public that learns. In round n = 0, 1, 2, \ldots the public expects \pi^e_n (with \pi^e_0 = \pi^*), the bank picks its lowest-loss \pi_n for it, and the next round's expectation is \pi^e_{n+1} = \pi_n. The answer is the first round n with |\pi_n - \pi^e_n| \le tol.

Write rules_or_discretion(pi_star, c, lam, k, tol) that returns a dict whose "commit", "cheat" and "discretion" entries are each a tuple (pi, y, loss) for that case, and whose "rounds" entry is the round number.

Examples

Input:  pi_star = 0.02, c = 1, lam = 0.5, k = 0.02, tol = 0.0001
Output: {"commit": (0.02, 0.0, 2.0), "cheat": (0.0266667, 0.0066667, 1.3333333),
         "discretion": (0.03, 0.0, 3.0), "rounds": 4}   (rounded here)
Explanation: keeping the promise costs 0.5 * 2 ** 2 = 2 (output stays at normal, 2 points
short of the wish). Breaking it once pays: inflation 2.67 %, output 0.67 points up,
loss 1.33. But a public that expects this gets 3 % inflation, no extra output and a loss
of 3. Learning: the gaps |pi_n - pi_e_n| are 0.0067, 0.0022, 0.00074, 0.00025, 0.000082.

Input:  pi_star = 0.02, c = 1, lam = 0, k = 0.02, tol = 0.000001
Output: {"commit": (0.02, 0.0, 0.0), "cheat": (0.02, 0.0, 0.0), "discretion": (0.02, 0.0, 0.0), "rounds": 0}
Explanation: a bank that does not care about output has nothing to gain from a surprise.

Constraints

  • answers are compared with a tolerance of 1e-6; do not round
  • lam * c * c <= 100, and every test's learning ends within 10 000 rounds

Goals

  • Find a central bank's best inflation choice for given expectations by minimising a quadratic loss
  • Compare commitment, a one-off surprise, and discretion with expectations that see it coming
  • Find the discretionary outcome as a fixed point, by formula and by repeated learning
Starting Python…