import numpy as np
import matplotlib.pyplot as plt
# Reproducibility
np.random.seed(42)
# Plotting defaults
plt.rcParams.update({
'figure.figsize': (10, 6),
'axes.grid': True,
'grid.alpha': 0.3,
'font.size': 12
})
print("Setup complete.")Module 8 — Friedman, Lucas, and the Expectations Revolution
From Smith to Simulation: Computing the Ideas that Built Economics
University of Edinburgh
In this module we explore one of the most consequential intellectual upheavals in twentieth-century economics: the expectations revolution. Between roughly 1968 and 1982, the comfortable Keynesian consensus that governments could fine-tune output and employment by managing aggregate demand was shattered — first by theoretical argument, then by the brutal empirical reality of stagflation.
We will meet two towering figures — Milton Friedman and Robert Lucas — trace the logic of their critiques, and then simulate the whole drama in Python. By the end of this notebook you will be able to build and interpret models of adaptive and rational expectations, and you will understand from the inside why the Lucas critique changed the rules of macroeconomic policy evaluation forever.
1.1 The Phillips Curve and the Keynesian Consensus
In 1958, A. W. Phillips published a celebrated empirical study showing a stable inverse relationship between the rate of wage inflation and the unemployment rate in the United Kingdom, using data stretching back to 1861. Economists Paul Samuelson and Robert Solow quickly adapted the idea for the United States, recasting it as a trade-off between price inflation and unemployment.
The implication was intoxicating for policymakers: a government could choose its preferred point on the Phillips curve. Want lower unemployment? Accept a bit more inflation. Want price stability? Tolerate higher joblessness. Macroeconomic policy became, in this view, a matter of calibrating aggregate demand to hit the desired trade-off.
Throughout the 1960s, this framework appeared to work tolerably well. The Kennedy and Johnson administrations in the United States pursued activist fiscal policy with apparent success. The Phillips curve seemed to be a reliable menu of options.
1.2 Friedman’s Presidential Address and the Natural Rate
The first crack came from Milton Friedman (1912–2006), the intellectual leader of the Chicago School and the most prominent advocate of monetarism — the doctrine that the money supply is the primary determinant of nominal income and, in the long run, the price level.
In his landmark 1968 Presidential Address to the American Economic Association, Friedman argued that the Phillips curve trade-off was an illusion built on money illusion. Workers and firms, he said, cared about real wages, not nominal ones. Any attempt by the government to push unemployment below its “natural rate” — the rate consistent with stable inflation — would succeed only temporarily, and only because workers had not yet adjusted their expectations of inflation.
Friedman’s logic ran as follows:
- The government expands demand, pushing up prices.
- Workers, whose inflation expectations are anchored to the recent past, initially mistake higher nominal wages for higher real wages and supply more labour.
- Unemployment falls temporarily below the natural rate.
- Eventually, workers catch on: they revise their expectations upward.
- Real wages return to equilibrium, unemployment returns to the natural rate, but now inflation is higher.
- To get the same temporary employment boost, the government must generate even more inflation — an accelerating spiral.
The stable Phillips curve, Friedman concluded, was a short-run phenomenon that shifted whenever expectations changed. In the long run, the Phillips curve was vertical at the natural rate of unemployment. There was no permanent trade-off to exploit.
Edmund Phelps, working independently, reached the same conclusion. Their insight became known as the Friedman-Phelps hypothesis or the expectations-augmented Phillips curve.
1.3 Stagflation: Theory Meets Reality
The 1970s delivered a devastating confirmation. The oil price shocks of 1973 and 1979, combined with loose monetary policy, produced stagflation — the simultaneous occurrence of high inflation and high unemployment. This was precisely what the naive Phillips curve said could not happen.
If the Phillips curve were a stable downward-sloping relationship, high inflation should have accompanied low unemployment. Instead, both rose together. The data points of the 1970s scattered all over the inflation-unemployment space, destroying the tidy empirical regularity of the 1960s.
Stagflation was a crisis not just for economies but for the economics profession itself. The Keynesian framework, in its standard textbook form, had no ready explanation. Friedman’s monetarist critique suddenly looked prophetic.
1.4 Robert Lucas and Rational Expectations
Robert Lucas (1937–2023) of the University of Chicago took Friedman’s argument to its logical extreme. In a series of papers in the early 1970s, Lucas asked: if we grant that people are rational, why would we assume they form expectations by mechanically looking backward at last period’s inflation?
Lucas proposed instead that economic agents form rational expectations: they use all available information, including knowledge of government policy rules, to forecast future variables. Their forecasts may be wrong in any individual period — they are not clairvoyant — but they are unbiased. On average, rational expectations equal the true mathematical expectation conditional on available information.
The implications were revolutionary:
Under rational expectations, a systematic policy of expanding demand to reduce unemployment has no real effect, even in the short run. Agents anticipate the inflation that the policy will generate and adjust their behaviour accordingly. Only surprises — unanticipated policy changes — can move real variables, and surprises are, by definition, unsustainable as a policy strategy.
This result is sometimes called policy ineffectiveness (in its strong form, associated with Sargent and Wallace, 1975).
Lucas’s work earned him the Nobel Memorial Prize in Economic Sciences in 1995.
1.5 The Lucas Critique
Perhaps Lucas’s most lasting contribution was methodological. In his 1976 paper “Econometric Policy Evaluation: A Critique,” he argued that the parameters of large-scale econometric models — the very models used to evaluate policy — are not structural constants. They are reduced-form coefficients that depend on the policy regime in place when the data were generated.
If the government changes its policy rule, rational agents will change their behaviour, and the estimated parameters will shift. A model estimated under one regime cannot reliably predict outcomes under a different regime.
This is the Lucas critique, and it had a devastating implication: the entire practice of using large estimated models to simulate the effects of hypothetical policy changes was, in principle, invalid.
The Lucas critique forced a methodological revolution. Macroeconomists increasingly moved toward microfounded models — models built from explicit assumptions about individual optimisation and equilibrium — whose deep parameters (preferences, technology) would remain invariant to policy changes. This programme eventually became the Dynamic Stochastic General Equilibrium (DSGE) framework that dominates modern macroeconomics.
1.6 The End of Old-Style Keynesian Fine-Tuning
The combined force of Friedman’s monetarism, Lucas’s rational expectations revolution, and the empirical catastrophe of stagflation ended the era of confident Keynesian demand management. The policy response came most dramatically in the form of Paul Volcker’s appointment as Chairman of the Federal Reserve in 1979. Volcker abandoned the practice of targeting interest rates in favour of targeting monetary aggregates, deliberately inducing a severe recession to break the back of inflation expectations.
The Volcker disinflation of 1980–82 was painful — unemployment peaked above 10% — but it succeeded. Inflation fell from double digits to around 4% by 1983. The episode demonstrated both the power of expectations (once credibly anchored, inflation fell) and the cost of re-anchoring them after a decade of drift.
The intellectual landscape that emerged was fundamentally different from the one that had preceded it. Expectations were now at the centre of macroeconomic theory. The credibility of policy commitments mattered as much as the policies themselves. And the old idea that governments could permanently buy lower unemployment with higher inflation was thoroughly discredited.
1.7 Edinburgh Connection
The University of Edinburgh occupies a distinctive position in the landscape of economic thought. From David Hume’s pioneering monetary theory in the eighteenth century to the modern department’s strength in both theoretical and applied econometrics, Edinburgh has long been a place where theory and empirics meet.
The expectations revolution is precisely the kind of intellectual episode that Edinburgh’s tradition illuminates well. The debate was never purely theoretical — it was driven by empirical failures (the breakdown of the Phillips curve) and resolved, in part, by empirical success (the Volcker disinflation). At the same time, it was never purely empirical — it required deep theoretical innovation (rational expectations, the Lucas critique) to make sense of why the old empirical regularities had failed.
Edinburgh’s commitment to training economists who can move fluently between formal theory, computational modelling, and careful empirical work is exactly the skill set that the expectations revolution demanded — and that modern macroeconomics still requires.
2.1 Setup
We begin by importing our standard scientific computing libraries.
2.2 The Original Phillips Curve
The naive Phillips curve posits a simple inverse relationship between inflation (\(\pi\)) and the unemployment rate (\(u\)):
\[\pi = \alpha - \beta \,(u - u^*)\]
where \(u^*\) is some reference unemployment rate. Let us plot this stylised relationship.
# --- The Original (Naive) Phillips Curve ---
u = np.linspace(2, 10, 200) # unemployment rate (%)
u_star = 5.0 # reference / natural rate
alpha = 3.0 # baseline inflation at u = u*
beta = 1.2 # slope
pi_naive = alpha - beta * (u - u_star)
fig, ax = plt.subplots()
ax.plot(u, pi_naive, 'b-', linewidth=2, label='Naive Phillips Curve')
ax.axhline(y=alpha, color='grey', linestyle=':', alpha=0.5)
ax.axvline(x=u_star, color='grey', linestyle=':', alpha=0.5,
label=f'Natural rate $u^* = {u_star}\%$')
ax.set_xlabel('Unemployment Rate (%)')
ax.set_ylabel('Inflation Rate (%)')
ax.set_title('The Original Phillips Curve: A Stable Trade-Off?')
ax.legend()
plt.tight_layout()
plt.show()This is the relationship that policymakers in the 1960s believed they could exploit. Lower unemployment could be “purchased” with higher inflation. As we shall see, this confidence was misplaced.
2.3 Simulating an AR(1) Process for Inflation
Before diving into expectations, we need a workhorse stochastic process. Inflation is often modelled as a first-order autoregressive process, AR(1):
\[\pi_t = a + \rho\, \pi_{t-1} + \varepsilon_t, \qquad \varepsilon_t \sim N(0, \sigma^2)\]
Key properties: - The process is stationary if \(|\rho| < 1\). - The unconditional mean is \(\mu = a / (1 - \rho)\). - The unconditional variance is \(\sigma^2_{\pi} = \sigma^2 / (1 - \rho^2)\). - The autocorrelation at lag \(k\) is \(\rho^k\).
# --- AR(1) Simulation ---
def simulate_ar1(a, rho, sigma, T, pi_0=None):
"""
Simulate an AR(1) process: pi_t = a + rho * pi_{t-1} + eps_t.
Parameters
----------
a : float — intercept
rho : float — persistence parameter
sigma : float — std dev of innovation
T : int — number of periods
pi_0 : float — initial value (default: unconditional mean)
Returns
-------
pi : ndarray of shape (T,)
"""
if pi_0 is None:
pi_0 = a / (1 - rho) if abs(rho) < 1 else 0.0
pi = np.zeros(T)
pi[0] = pi_0
eps = np.random.normal(0, sigma, T)
for t in range(1, T):
pi[t] = a + rho * pi[t-1] + eps[t]
return pi
# Parameters
T = 200
a = 0.5
rho = 0.85
sigma = 0.5
pi_ar1 = simulate_ar1(a, rho, sigma, T)
# Theoretical moments
mu_theory = a / (1 - rho)
var_theory = sigma**2 / (1 - rho**2)
print(f"AR(1) parameters: a = {a}, rho = {rho}, sigma = {sigma}")
print(f"Theoretical mean: {mu_theory:.3f}")
print(f"Sample mean: {pi_ar1.mean():.3f}")
print(f"Theoretical std dev: {np.sqrt(var_theory):.3f}")
print(f"Sample std dev: {pi_ar1.std():.3f}")
fig, ax = plt.subplots()
ax.plot(pi_ar1, 'steelblue', linewidth=0.9)
ax.axhline(y=mu_theory, color='red', linestyle='--', label=f'Theoretical mean = {mu_theory:.2f}')
ax.set_xlabel('Period')
ax.set_ylabel('Inflation (%)')
ax.set_title(f'Simulated AR(1) Inflation Process ($\\rho = {rho}$)')
ax.legend()
plt.tight_layout()
plt.show()2.4 Adaptive Expectations
Under adaptive expectations, agents form their expectation of next period’s inflation by looking at what inflation was last period:
\[\pi^e_t = \pi_{t-1}\]
(More generally, adaptive expectations can be a weighted average of past values, but the simplest and most common form sets \(\pi^e_t = \pi_{t-1}\).)
This means agents are always looking backward. If inflation has been rising, they expect it to continue at yesterday’s rate — they are perpetually one step behind any systematic trend.
# --- Adaptive Expectations ---
# Use our AR(1) inflation series
pi_actual = pi_ar1.copy()
# Adaptive: expected inflation = last period's actual inflation
pi_e_adaptive = np.zeros(T)
pi_e_adaptive[0] = pi_actual[0] # initial expectation
for t in range(1, T):
pi_e_adaptive[t] = pi_actual[t - 1]
# Forecast errors under adaptive expectations
fe_adaptive = pi_actual - pi_e_adaptive
fig, axes = plt.subplots(2, 1, figsize=(10, 8), sharex=True)
# Panel 1: actual vs expected
axes[0].plot(pi_actual, 'steelblue', linewidth=0.9, label='Actual $\\pi_t$')
axes[0].plot(pi_e_adaptive, 'orangered', linewidth=0.9, linestyle='--',
label='Adaptive expectation $\\pi^e_t = \\pi_{t-1}$')
axes[0].set_ylabel('Inflation (%)')
axes[0].set_title('Adaptive Expectations: Always One Step Behind')
axes[0].legend()
# Panel 2: forecast errors
axes[1].bar(range(T), fe_adaptive, color='grey', alpha=0.5, width=1.0)
axes[1].axhline(y=0, color='black', linewidth=0.5)
axes[1].axhline(y=fe_adaptive.mean(), color='red', linestyle='--',
label=f'Mean error = {fe_adaptive.mean():.3f}')
axes[1].set_xlabel('Period')
axes[1].set_ylabel('Forecast Error')
axes[1].set_title('Adaptive Expectations: Forecast Errors')
axes[1].legend()
plt.tight_layout()
plt.show()
print(f"Mean forecast error (adaptive): {fe_adaptive.mean():.4f}")
print(f"Std of forecast error (adaptive): {fe_adaptive.std():.4f}")Notice that adaptive expectations track the actual series, but with a lag. When inflation is rising, adaptive expectations systematically underpredict; when inflation is falling, they systematically overpredict. The forecast errors are serially correlated — a rational agent should be able to do better.
2.5 Rational Expectations
Under rational expectations, agents use all available information — including knowledge of the data-generating process — to forecast inflation. If inflation follows the AR(1) process \(\pi_t = a + \rho\,\pi_{t-1} + \varepsilon_t\), and agents know \(a\), \(\rho\), and observe \(\pi_{t-1}\), then:
\[\pi^e_t = E[\pi_t \mid \mathcal{I}_{t-1}] = a + \rho\,\pi_{t-1}\]
The forecast error is simply \(\varepsilon_t\) — white noise, unpredictable by construction.
# --- Rational Expectations ---
# Rational: expected inflation = conditional expectation of AR(1)
pi_e_rational = np.zeros(T)
pi_e_rational[0] = mu_theory # unconditional mean as initial
for t in range(1, T):
pi_e_rational[t] = a + rho * pi_actual[t - 1]
# Forecast errors under rational expectations
fe_rational = pi_actual - pi_e_rational
fig, axes = plt.subplots(2, 1, figsize=(10, 8), sharex=True)
# Panel 1: actual vs expected
axes[0].plot(pi_actual, 'steelblue', linewidth=0.9, label='Actual $\\pi_t$')
axes[0].plot(pi_e_rational, 'green', linewidth=0.9, linestyle='--',
label='Rational expectation $E[\\pi_t | \\mathcal{I}_{t-1}]$')
axes[0].set_ylabel('Inflation (%)')
axes[0].set_title('Rational Expectations: Best Forecast Given Information')
axes[0].legend()
# Panel 2: forecast errors
axes[1].bar(range(T), fe_rational, color='green', alpha=0.4, width=1.0)
axes[1].axhline(y=0, color='black', linewidth=0.5)
axes[1].axhline(y=fe_rational.mean(), color='red', linestyle='--',
label=f'Mean error = {fe_rational.mean():.3f}')
axes[1].set_xlabel('Period')
axes[1].set_ylabel('Forecast Error')
axes[1].set_title('Rational Expectations: Forecast Errors (White Noise)')
axes[1].legend()
plt.tight_layout()
plt.show()
print(f"Mean forecast error (rational): {fe_rational.mean():.4f}")
print(f"Std of forecast error (rational): {fe_rational.std():.4f}")
# Compare autocorrelation of forecast errors
from numpy import corrcoef
ac_adaptive = corrcoef(fe_adaptive[1:], fe_adaptive[:-1])[0, 1]
ac_rational = corrcoef(fe_rational[1:], fe_rational[:-1])[0, 1]
print(f"\nAutocorrelation of forecast errors:")
print(f" Adaptive: {ac_adaptive:.4f} (serially correlated — inefficient!)")
print(f" Rational: {ac_rational:.4f} (approximately zero — efficient)")Under rational expectations, the forecast errors are approximately mean-zero and serially uncorrelated. No information available at time \(t-1\) can improve the forecast — this is the hallmark of rational expectations.
2.6 Policy Experiment: Exploiting the Phillips Curve
Now we come to the heart of the matter. Suppose the government tries to exploit the Phillips curve by systematically boosting aggregate demand to push unemployment below the natural rate.
We use an expectations-augmented Phillips curve:
\[\pi_t = \pi^e_t - \beta\,(u_t - u^*) + \varepsilon_t\]
and a policy rule in which the government generates extra inflation (\(\delta\)) to stimulate the economy:
\[u_t = u^* - \frac{1}{\beta}(\pi_t - \pi^e_t - \varepsilon_t)\]
We will compare outcomes under adaptive and rational expectations.
# --- Policy Experiment: Demand Stimulus ---
T_policy = 60 # periods
u_natural = 5.0 # natural rate of unemployment (%)
beta_pc = 1.0 # Phillips curve slope
sigma_pc = 0.3 # supply shock std dev
delta = 2.0 # policy-induced inflation boost (pp per period)
policy_start = 10 # policy begins at period 10
np.random.seed(123)
eps_supply = np.random.normal(0, sigma_pc, T_policy)
# ---- Adaptive Expectations ----
pi_adapt = np.zeros(T_policy)
pi_e_adapt = np.zeros(T_policy)
u_adapt = np.full(T_policy, u_natural)
pi_adapt[0] = 2.0 # initial steady-state inflation
pi_e_adapt[0] = 2.0
for t in range(1, T_policy):
# Adaptive: expected = last period's actual
pi_e_adapt[t] = pi_adapt[t - 1]
# Policy: after policy_start, government injects extra inflation
if t >= policy_start:
pi_adapt[t] = pi_e_adapt[t] + delta + eps_supply[t]
else:
pi_adapt[t] = pi_e_adapt[t] + eps_supply[t]
# Unemployment from Phillips curve: u = u* - (1/beta)(pi - pi^e - eps)
u_adapt[t] = u_natural - (1 / beta_pc) * (pi_adapt[t] - pi_e_adapt[t] - eps_supply[t])
# ---- Rational Expectations ----
pi_ration = np.zeros(T_policy)
pi_e_ration = np.zeros(T_policy)
u_ration = np.full(T_policy, u_natural)
pi_ration[0] = 2.0
pi_e_ration[0] = 2.0
for t in range(1, T_policy):
# Rational: agents know the policy rule
if t >= policy_start:
# Agents expect the government's extra inflation
pi_e_ration[t] = pi_ration[t - 1] + delta
pi_ration[t] = pi_e_ration[t] + eps_supply[t]
else:
pi_e_ration[t] = pi_ration[t - 1]
pi_ration[t] = pi_e_ration[t] + eps_supply[t]
# Unemployment: since pi = pi^e + eps, u = u* (no real effect!)
u_ration[t] = u_natural - (1 / beta_pc) * (pi_ration[t] - pi_e_ration[t] - eps_supply[t])
# ---- Plot Results ----
fig, axes = plt.subplots(2, 2, figsize=(14, 9))
# Inflation: Adaptive
axes[0, 0].plot(pi_adapt, 'steelblue', linewidth=1.5, label='Actual $\\pi$')
axes[0, 0].plot(pi_e_adapt, 'orangered', linewidth=1.2, linestyle='--', label='Expected $\\pi^e$')
axes[0, 0].axvline(x=policy_start, color='black', linestyle=':', alpha=0.6, label='Policy starts')
axes[0, 0].set_title('Inflation — Adaptive Expectations')
axes[0, 0].set_ylabel('Inflation (%)')
axes[0, 0].legend(fontsize=9)
# Unemployment: Adaptive
axes[1, 0].plot(u_adapt, 'steelblue', linewidth=1.5)
axes[1, 0].axhline(y=u_natural, color='red', linestyle='--', alpha=0.7, label=f'Natural rate = {u_natural}%')
axes[1, 0].axvline(x=policy_start, color='black', linestyle=':', alpha=0.6)
axes[1, 0].set_title('Unemployment — Adaptive Expectations')
axes[1, 0].set_xlabel('Period')
axes[1, 0].set_ylabel('Unemployment (%)')
axes[1, 0].legend(fontsize=9)
# Inflation: Rational
axes[0, 1].plot(pi_ration, 'green', linewidth=1.5, label='Actual $\\pi$')
axes[0, 1].plot(pi_e_ration, 'darkgreen', linewidth=1.2, linestyle='--', label='Expected $\\pi^e$')
axes[0, 1].axvline(x=policy_start, color='black', linestyle=':', alpha=0.6, label='Policy starts')
axes[0, 1].set_title('Inflation — Rational Expectations')
axes[0, 1].set_ylabel('Inflation (%)')
axes[0, 1].legend(fontsize=9)
# Unemployment: Rational
axes[1, 1].plot(u_ration, 'green', linewidth=1.5)
axes[1, 1].axhline(y=u_natural, color='red', linestyle='--', alpha=0.7, label=f'Natural rate = {u_natural}%')
axes[1, 1].axvline(x=policy_start, color='black', linestyle=':', alpha=0.6)
axes[1, 1].set_title('Unemployment — Rational Expectations')
axes[1, 1].set_xlabel('Period')
axes[1, 1].set_ylabel('Unemployment (%)')
axes[1, 1].legend(fontsize=9)
fig.suptitle('Policy Experiment: Government Tries to Exploit the Phillips Curve',
fontsize=14, fontweight='bold', y=1.02)
plt.tight_layout()
plt.show()Key observations:
Adaptive expectations (left panels): The policy “works” in a narrow sense — unemployment drops below the natural rate initially. But inflation ratchets upward relentlessly. Expected inflation keeps chasing actual inflation but never catches up, because the government keeps injecting new inflationary surprises. This is exactly Friedman’s accelerationist prediction.
Rational expectations (right panels): The policy has no real effect whatsoever. Unemployment stays at the natural rate (plus noise) throughout. Agents anticipate the government’s inflationary policy and adjust immediately. The only thing the policy accomplishes is to raise the level of inflation — with zero benefit to employment. This is Lucas’s result.
This contrast is the computational heart of the expectations revolution.
2.7 The Augmented vs. Naive Phillips Curve
Finally, let us visualise the difference between the naive Phillips curve and the expectations-augmented Phillips curve in the inflation-unemployment space.
# --- Augmented vs Naive Phillips Curve ---
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# Left: Naive Phillips curve — the 1960s illusion
u_range = np.linspace(2, 10, 200)
pi_naive_curve = alpha - beta * (u_range - u_star)
axes[0].plot(u_range, pi_naive_curve, 'b-', linewidth=2, label='Naive Phillips Curve')
axes[0].set_xlabel('Unemployment Rate (%)')
axes[0].set_ylabel('Inflation Rate (%)')
axes[0].set_title('Naive Phillips Curve\n(Stable trade-off — the 1960s view)')
axes[0].legend()
# Right: Expectations-augmented — short-run curves shift with expectations
pi_e_levels = [1, 3, 5, 7, 9] # different expected inflation levels
colors_aug = plt.cm.Reds(np.linspace(0.3, 0.9, len(pi_e_levels)))
for i, pe in enumerate(pi_e_levels):
pi_aug = pe - beta * (u_range - u_star)
axes[1].plot(u_range, pi_aug, color=colors_aug[i], linewidth=1.5,
label=f'$\\pi^e = {pe}\\%$')
# Long-run vertical Phillips curve
axes[1].axvline(x=u_star, color='black', linewidth=2.5, linestyle='-',
label=f'Long-run PC at $u^* = {u_star}\\%$')
axes[1].set_xlabel('Unemployment Rate (%)')
axes[1].set_ylabel('Inflation Rate (%)')
axes[1].set_title('Expectations-Augmented Phillips Curve\n(Short-run curves shift; long-run is vertical)')
axes[1].legend(fontsize=9, loc='upper right')
plt.tight_layout()
plt.show()The right panel tells the story of the expectations revolution in a single picture. Each short-run Phillips curve is conditioned on a particular level of expected inflation \(\pi^e\). When the government expands demand, it moves the economy along one short-run curve — briefly reducing unemployment. But in doing so, it raises actual inflation, which raises expected inflation, which shifts the entire short-run curve upward. The economy moves not along a single curve but from one curve to another.
In the long run, the only sustainable position is on the vertical long-run Phillips curve at \(u^*\), the natural rate. There is no permanent trade-off.
Exercise 1: AR(1) Processes — Persistence and Stationarity
In this exercise you will explore how the persistence parameter \(\rho\) affects the behaviour of an AR(1) process.
(a) Simulate four AR(1) processes, each of length \(T = 300\), with the same intercept \(a = 0.5\) and innovation standard deviation \(\sigma = 0.5\), but with different persistence parameters: \(\rho \in \{0.2,\; 0.7,\; 0.95,\; 1.0\}\). Use \(\pi_0 = 0\) for all four. Plot all four series on a single figure (2x2 subplot grid).
(b) For each of the stationary processes (\(|\rho| < 1\)), compute and print: the theoretical unconditional mean \(\mu = a/(1-\rho)\), the sample mean, the theoretical unconditional standard deviation \(\sigma_{\pi} = \sigma / \sqrt{1 - \rho^2}\), and the sample standard deviation.
(c) Compute the sample autocorrelation function for each stationary process at lags \(k = 1, 2, \ldots, 20\). Compare these with the theoretical autocorrelations \(\rho^k\). Plot both (sample and theoretical) on the same figure for each value of \(\rho\).
(d) Explain in a markdown cell: Why is the process with \(\rho = 1.0\) non-stationary? What happens to its variance over time? Why is this relevant for modelling inflation — when might economists worry that inflation has a unit root?
# ============================================================
# Exercise 1 — Starter Code
# ============================================================
# (a) Simulate and plot four AR(1) processes
T_ex1 = 300
a_ex1 = 0.5
sigma_ex1 = 0.5
rhos = [0.2, 0.7, 0.95, 1.0]
np.random.seed(2024)
fig, axes = plt.subplots(2, 2, figsize=(14, 8), sharex=True)
axes = axes.flatten()
series_dict = {}
for i, rho_i in enumerate(rhos):
pi_i = simulate_ar1(a_ex1, rho_i, sigma_ex1, T_ex1, pi_0=0.0)
series_dict[rho_i] = pi_i
axes[i].plot(pi_i, linewidth=0.8)
axes[i].set_title(f'$\\rho = {rho_i}$')
axes[i].set_ylabel('$\\pi_t$')
if rho_i < 1:
mu_i = a_ex1 / (1 - rho_i)
axes[i].axhline(y=mu_i, color='red', linestyle='--', alpha=0.6,
label=f'$\\mu = {mu_i:.2f}$')
axes[i].legend(fontsize=9)
if i >= 2:
axes[i].set_xlabel('Period')
fig.suptitle('AR(1) Processes with Different Persistence Parameters', fontsize=14)
plt.tight_layout()
plt.show()
# (b) Theoretical vs sample moments for stationary processes
print("Moments for stationary AR(1) processes:")
print(f"{'rho':>6} | {'mu_theory':>10} | {'mu_sample':>10} | {'sd_theory':>10} | {'sd_sample':>10}")
print("-" * 60)
for rho_i in rhos:
if abs(rho_i) < 1:
mu_th = a_ex1 / (1 - rho_i)
sd_th = sigma_ex1 / np.sqrt(1 - rho_i**2)
mu_sa = series_dict[rho_i].mean()
sd_sa = series_dict[rho_i].std()
print(f"{rho_i:>6.2f} | {mu_th:>10.4f} | {mu_sa:>10.4f} | {sd_th:>10.4f} | {sd_sa:>10.4f}")
# (c) Sample vs theoretical autocorrelation
max_lag = 20
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
for idx, rho_i in enumerate([0.2, 0.7, 0.95]):
s = series_dict[rho_i]
s_demeaned = s - s.mean()
var_s = np.var(s)
sample_acf = [np.mean(s_demeaned[k:] * s_demeaned[:-k]) / var_s if k > 0 else 1.0
for k in range(max_lag + 1)]
theory_acf = [rho_i**k for k in range(max_lag + 1)]
lags = range(max_lag + 1)
axes[idx].bar(lags, sample_acf, alpha=0.5, label='Sample ACF', color='steelblue')
axes[idx].plot(lags, theory_acf, 'ro-', markersize=4, label=f'Theoretical $\\rho^k$')
axes[idx].set_title(f'$\\rho = {rho_i}$')
axes[idx].set_xlabel('Lag $k$')
axes[idx].set_ylabel('Autocorrelation')
axes[idx].legend(fontsize=9)
plt.suptitle('Sample vs Theoretical Autocorrelation Functions', fontsize=13)
plt.tight_layout()
plt.show()(d) Your answer here:
When \(\rho = 1\), the process becomes a random walk: \(\pi_t = a + \pi_{t-1} + \varepsilon_t\). The unconditional variance grows without bound as \(t\) increases (\(\text{Var}(\pi_t) = t \sigma^2\)), so the process is non-stationary — it has no fixed mean or variance to revert to.
For inflation modelling, a unit root would imply that shocks to inflation are permanent — there is no tendency to revert to a long-run average. Economists worry about this in regimes where monetary policy is not anchored (e.g., the 1970s), because it suggests inflation could drift arbitrarily far. Credible central banking (e.g., inflation targeting) is precisely an attempt to make inflation stationary by anchoring expectations.
(Write your own extended answer here.)
Exercise 2: The Lucas Critique in Action
This exercise demonstrates the Lucas critique directly: a policy rule that “works” under adaptive expectations fails completely under rational expectations.
(a) Design a policy rule in which the central bank sets inflation according to:
\[\pi_t = \bar{\pi} + \gamma\,(u_{t-1} - u^*)\]
where \(\bar{\pi} = 2\%\) is the target inflation, \(\gamma = -0.8\) (the bank raises inflation when unemployment exceeds the natural rate), and \(u^* = 5\%\). Unemployment obeys the expectations-augmented Phillips curve:
\[u_t = u^* - \alpha_{pc}\,(\pi_t - \pi^e_t) + \eta_t\]
with \(\alpha_{pc} = 0.5\) and \(\eta_t \sim N(0, 0.3^2)\). Simulate this for \(T = 100\) periods under adaptive expectations (\(\pi^e_t = \pi_{t-1}\)). Plot inflation and unemployment.
(b) Now simulate the same system under rational expectations. Under RE, agents know the policy rule, so \(\pi^e_t = E[\pi_t | \mathcal{I}_{t-1}] = \bar{\pi} + \gamma(u_{t-1} - u^*)\). Show that \(\pi_t - \pi^e_t = 0\) (no surprise), so the policy has no systematic effect on unemployment.
(c) Now suppose the government changes the policy rule, doubling the response coefficient to \(\gamma = -1.6\). Re-estimate the effect under both expectation types. Under adaptive expectations, does the stronger policy appear more effective? Under rational expectations, does it make any difference?
(d) Explain in a markdown cell how this exercise illustrates the Lucas critique. Why can an econometrician not use the estimated relationship from part (a) to predict the effects of the policy change in part (c)?
# ============================================================
# Exercise 2 — Starter Code
# ============================================================
T_ex2 = 100
u_star_ex2 = 5.0
pi_bar = 2.0
alpha_pc = 0.5
sigma_eta = 0.3
def simulate_lucas_critique(gamma, expectation_type='adaptive', T=100, seed=99):
"""
Simulate the policy-rule + Phillips-curve system.
Parameters
----------
gamma : float — policy response coefficient
expectation_type : str — 'adaptive' or 'rational'
T : int — number of periods
seed : int — random seed
Returns
-------
pi, pi_e, u : ndarrays of shape (T,)
"""
np.random.seed(seed)
eta = np.random.normal(0, sigma_eta, T)
pi = np.zeros(T)
pi_e = np.zeros(T)
u = np.full(T, u_star_ex2)
pi[0] = pi_bar
pi_e[0] = pi_bar
u[0] = u_star_ex2 + eta[0]
for t in range(1, T):
# Policy rule: central bank sets inflation
pi[t] = pi_bar + gamma * (u[t-1] - u_star_ex2)
# Expectations
if expectation_type == 'adaptive':
pi_e[t] = pi[t - 1]
elif expectation_type == 'rational':
# Agents know the policy rule:
pi_e[t] = pi_bar + gamma * (u[t-1] - u_star_ex2)
# Phillips curve: unemployment
u[t] = u_star_ex2 - alpha_pc * (pi[t] - pi_e[t]) + eta[t]
return pi, pi_e, u
# (a) Adaptive expectations, gamma = -0.8
gamma_1 = -0.8
pi_a, pi_e_a, u_a = simulate_lucas_critique(gamma_1, 'adaptive')
# (b) Rational expectations, gamma = -0.8
pi_r, pi_e_r, u_r = simulate_lucas_critique(gamma_1, 'rational')
# (c) Changed policy: gamma = -1.6
gamma_2 = -1.6
pi_a2, pi_e_a2, u_a2 = simulate_lucas_critique(gamma_2, 'adaptive')
pi_r2, pi_e_r2, u_r2 = simulate_lucas_critique(gamma_2, 'rational')
# ---- Plot ----
fig, axes = plt.subplots(2, 2, figsize=(14, 9))
# (a) Adaptive, gamma = -0.8
axes[0, 0].plot(pi_a, label='$\\pi_t$', linewidth=1.2)
axes[0, 0].plot(u_a, label='$u_t$', linewidth=1.2)
axes[0, 0].axhline(y=u_star_ex2, color='grey', linestyle=':', alpha=0.5)
axes[0, 0].set_title(f'Adaptive, $\\gamma = {gamma_1}$')
axes[0, 0].legend(fontsize=9)
axes[0, 0].set_ylabel('Rate (%)')
# (b) Rational, gamma = -0.8
axes[0, 1].plot(pi_r, label='$\\pi_t$', linewidth=1.2)
axes[0, 1].plot(u_r, label='$u_t$', linewidth=1.2)
axes[0, 1].axhline(y=u_star_ex2, color='grey', linestyle=':', alpha=0.5)
axes[0, 1].set_title(f'Rational, $\\gamma = {gamma_1}$')
axes[0, 1].legend(fontsize=9)
# (c) Adaptive, gamma = -1.6
axes[1, 0].plot(pi_a2, label='$\\pi_t$', linewidth=1.2)
axes[1, 0].plot(u_a2, label='$u_t$', linewidth=1.2)
axes[1, 0].axhline(y=u_star_ex2, color='grey', linestyle=':', alpha=0.5)
axes[1, 0].set_title(f'Adaptive, $\\gamma = {gamma_2}$ (stronger policy)')
axes[1, 0].legend(fontsize=9)
axes[1, 0].set_ylabel('Rate (%)')
axes[1, 0].set_xlabel('Period')
# (c) Rational, gamma = -1.6
axes[1, 1].plot(pi_r2, label='$\\pi_t$', linewidth=1.2)
axes[1, 1].plot(u_r2, label='$u_t$', linewidth=1.2)
axes[1, 1].axhline(y=u_star_ex2, color='grey', linestyle=':', alpha=0.5)
axes[1, 1].set_title(f'Rational, $\\gamma = {gamma_2}$ (stronger policy)')
axes[1, 1].legend(fontsize=9)
axes[1, 1].set_xlabel('Period')
fig.suptitle('Exercise 2: The Lucas Critique in Action', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()
# Summary statistics
print("\nUnemployment summary (std dev from natural rate):")
print(f" Adaptive, gamma={gamma_1}: u_mean={u_a.mean():.3f}, u_std={u_a.std():.3f}")
print(f" Rational, gamma={gamma_1}: u_mean={u_r.mean():.3f}, u_std={u_r.std():.3f}")
print(f" Adaptive, gamma={gamma_2}: u_mean={u_a2.mean():.3f}, u_std={u_a2.std():.3f}")
print(f" Rational, gamma={gamma_2}: u_mean={u_r2.mean():.3f}, u_std={u_r2.std():.3f}")(d) Your answer here:
Under adaptive expectations, the policy rule creates systematic forecast errors (agents do not account for the central bank’s reaction function), which generate real effects on unemployment. An econometrician estimating the model under regime 1 (\(\gamma = -0.8\)) would find an apparent relationship between policy actions and unemployment outcomes.
But under rational expectations, agents incorporate the policy rule into their forecasts. The inflation surprise \(\pi_t - \pi^e_t = 0\) for any systematic policy, so unemployment equals \(u^* + \eta_t\) regardless of \(\gamma\). Changing \(\gamma\) changes nothing.
This is the Lucas critique in action: the estimated parameters from regime 1 are not structural — they depend on the policy rule that was in place. Using them to predict outcomes under a different rule (\(\gamma = -1.6\)) would give wildly wrong predictions if agents are rational, because the agents themselves change their behaviour when the rule changes.
(Extend this answer in your own words.)
Exercise 3: Disinflation — Cold Turkey vs. Gradualism
In this exercise you will simulate a Volcker-style disinflation — a deliberate policy to reduce inflation from a high initial level — and compare two strategies under both adaptive and rational expectations.
(a) Set up an economy with the expectations-augmented Phillips curve:
\[u_t = u^* + \alpha_{pc}\,(\pi^e_t - \pi_t) + \eta_t\]
with \(u^* = 5\%\), \(\alpha_{pc} = 0.5\), \(\eta_t \sim N(0, 0.2^2)\). Initial inflation is \(\pi_0 = 10\%\) (the “inherited” high inflation). The central bank wants to bring inflation down to \(\pi^{\text{target}} = 2\%\).
Cold turkey: The bank immediately sets \(\pi_t = 2\%\) for all \(t \geq 1\).
Gradualism: The bank reduces inflation linearly over 20 periods: \(\pi_t = \max(\pi^{\text{target}},\; \pi_0 - (\pi_0 - \pi^{\text{target}}) \cdot t / 20)\).
Simulate both strategies for \(T = 50\) under adaptive expectations (\(\pi^e_t = \pi_{t-1}\)). Plot inflation and unemployment for each.
(b) Repeat part (a) under rational expectations. Under RE, agents immediately believe the announced policy (assuming full credibility): \(\pi^e_t = \pi_t\) for cold turkey (since the target is known and credible), and \(\pi^e_t = \max(\pi^{\text{target}},\; \pi_0 - (\pi_0 - \pi^{\text{target}}) \cdot t / 20)\) for gradualism.
(c) Compute the sacrifice ratio for each scenario: the cumulative excess unemployment (above \(u^*\)) per percentage point of disinflation achieved. Compare the four cases in a bar chart.
(d) Discuss: Why is disinflation costly under adaptive expectations but (nearly) costless under rational expectations? What does this tell us about the importance of credibility in monetary policy? How does this relate to the actual Volcker disinflation of 1980-82?
# ============================================================
# Exercise 3 — Starter Code
# ============================================================
T_ex3 = 50
u_star_ex3 = 5.0
alpha_pc_ex3 = 0.5
sigma_eta_ex3 = 0.2
pi_0_ex3 = 10.0 # initial high inflation
pi_target = 2.0 # target inflation
T_gradual = 20 # periods for gradual reduction
np.random.seed(777)
eta_ex3 = np.random.normal(0, sigma_eta_ex3, T_ex3)
def disinflation_path(strategy, T):
"""Generate the central bank's chosen inflation path."""
pi_cb = np.zeros(T)
pi_cb[0] = pi_0_ex3
for t in range(1, T):
if strategy == 'cold_turkey':
pi_cb[t] = pi_target
elif strategy == 'gradual':
pi_cb[t] = max(pi_target, pi_0_ex3 - (pi_0_ex3 - pi_target) * t / T_gradual)
return pi_cb
def simulate_disinflation(strategy, exp_type, T, eta):
"""
Simulate disinflation under a given strategy and expectation type.
Returns: pi (actual CB path), pi_e (expected), u (unemployment)
"""
pi = disinflation_path(strategy, T)
pi_e = np.zeros(T)
u = np.full(T, u_star_ex3)
pi_e[0] = pi_0_ex3
for t in range(1, T):
if exp_type == 'adaptive':
pi_e[t] = pi[t - 1] # backward-looking
elif exp_type == 'rational':
pi_e[t] = pi[t] # agents know and believe the CB's plan
# Phillips curve: high pi^e relative to pi -> high unemployment
u[t] = u_star_ex3 + alpha_pc_ex3 * (pi_e[t] - pi[t]) + eta[t]
return pi, pi_e, u
# (a) Adaptive expectations
pi_ct_a, pie_ct_a, u_ct_a = simulate_disinflation('cold_turkey', 'adaptive', T_ex3, eta_ex3)
pi_gr_a, pie_gr_a, u_gr_a = simulate_disinflation('gradual', 'adaptive', T_ex3, eta_ex3)
# (b) Rational expectations
pi_ct_r, pie_ct_r, u_ct_r = simulate_disinflation('cold_turkey', 'rational', T_ex3, eta_ex3)
pi_gr_r, pie_gr_r, u_gr_r = simulate_disinflation('gradual', 'rational', T_ex3, eta_ex3)
# ---- Plot: 2x2 grid ----
fig, axes = plt.subplots(2, 2, figsize=(14, 9))
scenarios = [
(pi_ct_a, u_ct_a, 'Cold Turkey — Adaptive', axes[0, 0]),
(pi_gr_a, u_gr_a, 'Gradualism — Adaptive', axes[0, 1]),
(pi_ct_r, u_ct_r, 'Cold Turkey — Rational', axes[1, 0]),
(pi_gr_r, u_gr_r, 'Gradualism — Rational', axes[1, 1]),
]
for pi_s, u_s, title, ax in scenarios:
ax.plot(pi_s, 'b-', linewidth=1.5, label='Inflation $\\pi_t$')
ax.plot(u_s, 'r-', linewidth=1.5, label='Unemployment $u_t$')
ax.axhline(y=u_star_ex3, color='grey', linestyle=':', alpha=0.5)
ax.axhline(y=pi_target, color='blue', linestyle=':', alpha=0.3)
ax.set_title(title)
ax.set_ylabel('Rate (%)')
ax.legend(fontsize=9)
axes[1, 0].set_xlabel('Period')
axes[1, 1].set_xlabel('Period')
fig.suptitle('Exercise 3: Disinflation — Cold Turkey vs. Gradualism',
fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()
# (c) Sacrifice ratios
def sacrifice_ratio(u, pi_start, pi_end, u_star):
"""Cumulative excess unemployment per pp of disinflation."""
cum_excess_u = np.sum(np.maximum(u - u_star, 0))
disinflation = pi_start - pi_end
return cum_excess_u / disinflation if disinflation > 0 else 0.0
sr_ct_a = sacrifice_ratio(u_ct_a, pi_0_ex3, pi_target, u_star_ex3)
sr_gr_a = sacrifice_ratio(u_gr_a, pi_0_ex3, pi_target, u_star_ex3)
sr_ct_r = sacrifice_ratio(u_ct_r, pi_0_ex3, pi_target, u_star_ex3)
sr_gr_r = sacrifice_ratio(u_gr_r, pi_0_ex3, pi_target, u_star_ex3)
labels = ['Cold Turkey\nAdaptive', 'Gradualism\nAdaptive',
'Cold Turkey\nRational', 'Gradualism\nRational']
ratios = [sr_ct_a, sr_gr_a, sr_ct_r, sr_gr_r]
colors_bar = ['#c0392b', '#e74c3c', '#27ae60', '#2ecc71']
fig, ax = plt.subplots(figsize=(8, 5))
bars = ax.bar(labels, ratios, color=colors_bar, edgecolor='black', linewidth=0.5)
ax.set_ylabel('Sacrifice Ratio\n(cumulative excess unemployment per pp disinflation)')
ax.set_title('Sacrifice Ratios: The Cost of Disinflation')
for bar, val in zip(bars, ratios):
ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.05,
f'{val:.2f}', ha='center', fontsize=11, fontweight='bold')
plt.tight_layout()
plt.show()
print("Sacrifice Ratios:")
for l, r in zip(labels, ratios):
print(f" {l.replace(chr(10), ', ')}: {r:.3f}")(d) Your answer here:
Under adaptive expectations, disinflation is costly because agents’ expectations adjust only slowly. When the central bank cuts inflation abruptly (cold turkey), expected inflation remains high for several periods, creating a large gap \(\pi^e_t - \pi_t > 0\) that drives unemployment well above the natural rate. Gradualism spreads the pain over more periods but still incurs significant cumulative cost.
Under rational expectations with full credibility, disinflation is essentially costless. Agents immediately adjust their expectations to match the announced policy. Since \(\pi^e_t = \pi_t\), there is no surprise and no excess unemployment — the economy adjusts instantly.
The key insight is that credibility is the crucial variable. The rational expectations result holds only if agents believe the central bank will follow through on its announced plan. In the actual Volcker disinflation (1980-82), the cost was substantial — suggesting that credibility had to be earned through painful action, not merely announced. This is sometimes called the “credibility problem”: a central bank that has lost credibility (as the Fed had by 1979) cannot achieve costless disinflation even if agents are fundamentally rational, because they rationally doubt the bank’s commitment.
(Extend this discussion in your own words.)
Test your understanding with 10 multiple-choice questions: 5 conceptual and 5 computational.
Conceptual Questions
Q1. What is “stagflation”?
- A period of rapid economic growth combined with deflation
- A period of simultaneously high inflation and high unemployment
- A period of low inflation and low unemployment
- A period of negative GDP growth but stable prices
Answer
(b) Stagflation refers to the simultaneous occurrence of economic stagnation (high unemployment) and high inflation. It was most prominently observed in the 1970s and contradicted the naive Phillips curve prediction that high inflation should accompany low unemployment.
Q2. What is Friedman’s “natural rate” of unemployment?
- The unemployment rate at which inflation is zero
- The unemployment rate that prevails when inflation expectations are correct and there are no transitory shocks
- The lowest unemployment rate ever achieved in a country’s history
- The unemployment rate set by government regulation
Answer
(b) The natural rate is the unemployment rate consistent with stable inflation — the rate that prevails when inflation expectations are fulfilled and labour markets are in equilibrium (accounting for structural frictions like job search, matching, etc.). It is not zero unemployment, nor is it a policy target that the government directly controls.
Q3. What is the core claim of the Lucas critique?
- Monetary policy is always ineffective
- Econometric models estimated under one policy regime cannot reliably predict outcomes under a different regime, because agents’ behaviour changes with the regime
- Rational expectations are empirically false
- The Phillips curve is always vertical, even in the short run
Answer
(b) The Lucas critique argues that the parameters of econometric models are not structural constants — they are reduced-form coefficients that depend on the policy regime. When the regime changes, rational agents change their behaviour, shifting the estimated parameters. This makes naive policy simulation unreliable.
Q4. Under rational expectations, a fully anticipated increase in the money supply will:
- Reduce unemployment permanently
- Reduce unemployment temporarily, then return it to the natural rate
- Have no effect on real variables — only prices will rise
- Cause deflation
Answer
(c) Under rational expectations, a fully anticipated monetary expansion is incorporated into agents’ expectations immediately. Prices adjust, but because there is no surprise, real variables (output, unemployment) are unaffected. This is the policy ineffectiveness proposition (in its strong form).
Q5. Friedman’s monetarist position held that:
- Fiscal policy is the most effective tool for managing the economy
- The money supply is the primary determinant of nominal income, and monetary policy should follow a stable rule rather than discretionary fine-tuning
- Central banks should target the unemployment rate directly
- Inflation is always and everywhere a fiscal phenomenon
Answer
(b) Friedman argued that “inflation is always and everywhere a monetary phenomenon” and that the money supply is the key driver of nominal income. He advocated a stable monetary growth rule (the k-percent rule) rather than discretionary policy, which he believed introduced harmful instability due to long and variable lags.
Computational Questions
Q6. An AR(1) process is defined as \(\pi_t = 0.3 + 0.9\,\pi_{t-1} + \varepsilon_t\) with \(\varepsilon_t \sim N(0, 1)\). What is the unconditional mean of this process?
- 0.3
- 0.9
- 3.0
- 0.33
Answer
(c) The unconditional mean is \(\mu = a / (1 - \rho) = 0.3 / (1 - 0.9) = 0.3 / 0.1 = 3.0\).
Q7. For the same AR(1) process as Q6, what is the autocorrelation at lag 2?
- 0.9
- 0.81
- 1.8
- 0.45
Answer
(b) The autocorrelation at lag \(k\) for an AR(1) process is \(\rho^k\). At lag 2: \(0.9^2 = 0.81\).
Q8. Under adaptive expectations (\(\pi^e_t = \pi_{t-1}\)), if actual inflation follows a steadily increasing trend, the forecast errors will be:
- Mean-zero and serially uncorrelated
- Systematically negative (underprediction) and serially correlated
- Systematically positive (overprediction) and serially correlated
- Random and unpredictable
Answer
(b) When inflation is trending upward, adaptive expectations (which equal last period’s inflation) will systematically underpredict — actual inflation will consistently exceed expected inflation, producing negative forecast errors (\(\pi^e_t - \pi_t < 0\), or equivalently, positive surprise inflation \(\pi_t - \pi^e_t > 0\)). These errors will be serially correlated because the trend is persistent. A rational agent would exploit this pattern to improve forecasts.
Q9. In the policy experiment of Section 2.6, under rational expectations the government’s demand stimulus:
- Reduces unemployment permanently
- Reduces unemployment temporarily, with inflation returning to baseline
- Has no effect on unemployment but raises the inflation level
- Reduces both inflation and unemployment
Answer
(c) Under rational expectations, agents anticipate the government’s inflationary policy and adjust their expectations immediately. The inflation surprise is zero on average (\(\pi_t - \pi^e_t = \varepsilon_t\)), so unemployment remains at the natural rate (plus noise). The only effect of the policy is to raise the level of inflation with no employment benefit.
Q10. Consider an AR(1) process with \(\rho = 1.02\). Which statement is correct?
- The process is stationary with a high unconditional mean
- The process is non-stationary because \(|\rho| > 1\); it is explosive and will diverge to infinity
- The process is stationary but with very slow mean-reversion
- The process is a random walk
Answer
(b) An AR(1) process is stationary only when \(|\rho| < 1\). When \(\rho = 1\), it is a unit-root (random walk) process. When \(|\rho| > 1\), the process is explosive — each shock is amplified over time, and the series diverges. \(\rho = 1.02\) falls in this explosive category. A random walk corresponds specifically to \(\rho = 1\), not \(\rho > 1\).
Summary
In this module we have:
Traced the history of the expectations revolution — from the naive Phillips curve through Friedman’s natural rate hypothesis, the stagflation crisis, Lucas’s rational expectations, and the Lucas critique.
Built computational models of AR(1) inflation processes, adaptive and rational expectations, and used them to simulate the key policy experiments that defined this intellectual revolution.
Seen the Lucas critique in action — how a policy rule that appears effective under backward-looking expectations becomes impotent when agents use all available information.
Explored disinflation — the painful process of reducing entrenched inflation — and understood why credibility is the crucial variable.
The expectations revolution taught economists a profound lesson: people are not passive objects of policy. They think, anticipate, and adapt. Any macroeconomic theory or policy framework that ignores this will eventually fail — as the Phillips curve did in the 1970s.
In the next module, we turn to the intellectual synthesis that emerged from this revolution: the New Keynesian framework, which marries rational expectations with price rigidities to build a theory in which monetary policy can have real effects — but only through carefully designed, credible institutions.