From cc9d10758ac12137a430aaad63ad0ba0b94e614a Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Wed, 11 Mar 2026 17:38:38 +1100 Subject: [PATCH 01/18] update lecture --- lectures/affine_risk_prices.md | 717 ++++++++++++++++++++++----------- 1 file changed, 491 insertions(+), 226 deletions(-) diff --git a/lectures/affine_risk_prices.md b/lectures/affine_risk_prices.md index b769c97c3..e0ed2cf63 100644 --- a/lectures/affine_risk_prices.md +++ b/lectures/affine_risk_prices.md @@ -59,14 +59,14 @@ Instead, it Key applications we study include: -1. **Pricing risky assets** — how risk prices and exposures determine excess returns. -1. **Affine term structure models** — bond yields as affine functions of a state vector +1. *Pricing risky assets* — how risk prices and exposures determine excess returns. +1. *Affine term structure models* — bond yields as affine functions of a state vector ({cite:t}`AngPiazzesi2003`). -1. **Risk-neutral probabilities** — a change-of-measure representation of the pricing equation. -1. **Distorted beliefs** — reinterpreting risk price estimates when agents hold systematically +1. *Risk-neutral probabilities* — a change-of-measure representation of the pricing equation. +1. *Distorted beliefs* — reinterpreting risk price estimates when agents hold systematically biased forecasts ({cite:t}`piazzesi2015trend`); see also {doc}`Risk Aversion or Mistaken Beliefs? `. -We start with some standard imports: +We start with the following imports: ```{code-cell} ipython3 import numpy as np @@ -81,7 +81,7 @@ from numpy.linalg import eigvals The model has two components. -**Component 1** is a vector autoregression that describes the state of the economy +*Component 1* is a vector autoregression that describes the state of the economy and the evolution of the short rate: ```{math} @@ -106,7 +106,7 @@ Here Equation {eq}`eq_shortrate` says that the **short rate** $r_t$ — the net yield on a one-period risk-free claim — is an affine function of the state $z_t$. -**Component 2** is a vector of **risk prices** $\lambda_t$ and an associated stochastic +*Component 2* is a vector of **risk prices** $\lambda_t$ and an associated stochastic discount factor $m_{t+1}$: ```{math} @@ -130,6 +130,43 @@ to each risk component affect expected returns (as we show below). Because $\lambda_t$ is affine in $z_t$, the stochastic discount factor $m_{t+1}$ is **exponential quadratic** in the state $z_t$. +We implement the model components as follows. + +```{code-cell} ipython3 +AffineModel = namedtuple('AffineModel', + ('μ', 'φ', 'C', 'δ_0', 'δ_1', 'λ_0', 'λ_z', 'm', 'φ_rn', 'μ_rn')) + +def create_affine_model(μ, φ, C, δ_0, δ_1, λ_0, λ_z): + """Create an affine term structure model.""" + μ = np.asarray(μ, float) + φ = np.asarray(φ, float) + C = np.asarray(C, float) + δ_1 = np.asarray(δ_1, float) + λ_0, λ_z = np.asarray(λ_0, float), np.asarray(λ_z, float) + return AffineModel(μ=μ, φ=φ, C=C, δ_0=float(δ_0), δ_1=δ_1, + λ_0=λ_0, λ_z=λ_z, m=len(μ), + φ_rn=φ - C @ λ_z, μ_rn=μ - C @ λ_0) + +def simulate(model, z0, T, rng=None): + """Simulate z_{t+1} = μ + φ z_t + C ε_{t+1} for T periods.""" + if rng is None: + rng = np.random.default_rng(42) + Z = np.zeros((T + 1, model.m)) + Z[0] = z0 + for t in range(T): + ε = rng.standard_normal(model.m) + Z[t + 1] = model.μ + model.φ @ Z[t] + model.C @ ε + return Z + +def short_rate(model, z): + """Compute r_t = δ_0 + δ_1^⊤ z_t.""" + return model.δ_0 + model.δ_1 @ z + +def risk_prices(model, z): + """Compute λ_t = λ_0 + λ_z z_t.""" + return model.λ_0 + model.λ_z @ z +``` + ### Properties of the SDF Since $\lambda_t^\top\varepsilon_{t+1}$ is conditionally normal, it follows that @@ -138,12 +175,81 @@ $$ \mathbb{E}_t(m_{t+1}) = \exp(-r_t) $$ -and +and $$ -\text{std}_t(m_{t+1}) \approx |\lambda_t|. +\text{std}_t(m_{t+1}) \approx \| \lambda_t \|. $$ +```{exercise} +:label: arp_ex1 + +Show that the SDF defined in {eq}`eq_sdf` satisfies + +$$ +\mathbb{E}_t(m_{t+1}) = \exp(-r_t) +$$ + +and + +$$ +\text{std}_t(m_{t+1}) \approx \| \lambda_t \| +$$ + +where $\| \lambda_t \| = \sqrt{\lambda_t^\top\lambda_t}$ denotes the Euclidean norm of the risk price vector. + +For the second result, use the lognormal variance formula and the approximations $\exp(x) \approx 1 + x$ and $\exp(-r_t) \approx 1$ for small $x$ and $r_t$. +``` + +```{solution-start} arp_ex1 +:class: dropdown +``` + +From {eq}`eq_sdf`, we have + +$$ +m_{t+1} = \exp\left(-r_t - \frac{1}{2}\lambda_t^\top\lambda_t - \lambda_t^\top\varepsilon_{t+1}\right) +$$ + + +Since $-\lambda_t^\top \varepsilon_{t+1} \sim \mathcal{N}(0, \lambda_t^\top \lambda_t)$, we have +$\mathbb{E}_t[\exp(-\lambda_t^\top \varepsilon_{t+1})] = \exp\left(\frac{1}{2}\lambda_t^\top \lambda_t\right)$. + +Therefore, + +$$ +\mathbb{E}_t(m_{t+1}) = \exp(-r_t - \frac{1}{2}\lambda_t^\top\lambda_t) \mathbb{E}_t[\exp(-\lambda_t^\top\varepsilon_{t+1})] = \exp(-r_t) +$$ + +$m_{t+1}$ is conditionally lognormal with $\log m_{t+1} \sim \mathcal{N}(-r_t-\frac{1}{2}\lambda_t^\top\lambda_t, \lambda_t^\top \lambda_t)$. + +By the lognormal variance formula +$\text{Var}(\exp(X)) = (\exp(\sigma^2) - 1) \exp(2\mu + \sigma^2)$ for $X \sim \mathcal{N}(\mu, \sigma^2)$, we have + +$$ +\begin{aligned} +\text{Var}_t(m_{t+1}) &= (\exp(\lambda_t^\top \lambda_t) - 1) \exp(-2r_t) \\ +&\approx \lambda_t^\top \lambda_t \exp(-2r_t) +\end{aligned} +$$ + +by the approximation $\exp(x) \approx 1 + x$ for small $x$. + +Hence, + +$$ +\text{std}_t(m_{t+1}) \approx \| \lambda_t \| \exp(-r_t) +$$ + +With $\exp(-r_t) \approx 1$ for small $r_t$, we obtain + +$$ +\text{std}_t(m_{t+1}) \approx \| \lambda_t \| +$$ + +```{solution-end} +``` + The first equation confirms that $r_t$ is the net yield on a risk-free one-period bond. That is why $r_t$ is called **the short rate** in the exponential quadratic literature. @@ -191,6 +297,43 @@ formula for the mean of a lognormal random variable gives \nu_t(j) = r_t + \alpha_t(j)^\top\lambda_t ``` +```{exercise} +:label: arp_ex2 + +Using the SDF {eq}`eq_sdf` and the return specification {eq}`eq_return`, derive the expected excess return formula {eq}`eq_excess`: + +$$ +\nu_t(j) = r_t + \alpha_t(j)^\top\lambda_t +$$ + +*Hint:* Start by computing $\log(m_{t+1} R_{j,t+1})$, identify its conditional distribution, and apply the pricing condition $\mathbb{E}_t(m_{t+1}R_{j,t+1}) = 1$. +``` + +```{solution-start} arp_ex2 +:class: dropdown +``` + +Combining {eq}`eq_sdf` and {eq}`eq_return`, we get + +$$ +\log(m_{t+1} R_{j,t+1}) = -r_t + \nu_t(j) - \frac{1}{2}\lambda_t^\top\lambda_t - \frac{1}{2}\alpha_t(j)^\top\alpha_t(j) + (\alpha_t(j) - \lambda_t)^\top\varepsilon_{t+1} +$$ + +This is conditionally normal with mean $\mu = -r_t + \nu_t(j) - \frac{1}{2}\lambda_t^\top\lambda_t - \frac{1}{2}\alpha_t(j)^\top\alpha_t(j)$ and variance $\sigma^2 = (\alpha_t(j) - \lambda_t)^\top(\alpha_t(j) - \lambda_t)$. + +Since $\mathbb{E}_t[\exp(X)] = \exp(\mu + \frac{1}{2}\sigma^2)$ for $X \sim \mathcal{N}(\mu, \sigma^2)$, the pricing condition $\mathbb{E}_t(m_{t+1}R_{j,t+1}) = 1$ requires $\mu + \frac{1}{2}\sigma^2 = 0$. + +Expanding $\frac{1}{2}\sigma^2 = \frac{1}{2}\alpha_t(j)^\top\alpha_t(j) - \alpha_t(j)^\top\lambda_t + \frac{1}{2}\lambda_t^\top\lambda_t$ and adding to $\mu$, the $\frac{1}{2}\lambda_t^\top\lambda_t$ and $\frac{1}{2}\alpha_t(j)^\top\alpha_t(j)$ terms cancel, leaving + +$$ +-r_t + \nu_t(j) - \alpha_t(j)^\top\lambda_t = 0 +$$ + +which gives {eq}`eq_excess`. + +```{solution-end} +``` + This is a central result. It says: @@ -240,7 +383,7 @@ The recursion {eq}`eq_bondrecur` has an **exponential affine** solution: ```{math} :label: eq_bondprice -p_t(n) = \exp\!\bigl(\bar A_n + \bar B_n^\top z_t\bigr) +p_t(n) = \exp \bigl(\bar A_n + \bar B_n^\top z_t\bigr) ``` where the scalar $\bar A_n$ and the $m \times 1$ vector $\bar B_n$ satisfy the @@ -260,9 +403,80 @@ where the scalar $\bar A_n$ and the $m \times 1$ vector $\bar B_n$ satisfy the with initial conditions $\bar A_1 = -\delta_0$ and $\bar B_1 = -\delta_1$. +```{exercise} +:label: arp_ex3 + +Derive the Riccati difference equations {eq}`eq_riccati_A` and {eq}`eq_riccati_B` +by substituting the conjectured bond price {eq}`eq_bondprice` into the pricing +recursion {eq}`eq_bondrecur` and matching coefficients. + +*Hint:* Substitute $p_{t+1}(n) = \exp(\bar A_n + \bar B_n^\top z_{t+1})$ and +$\log m_{t+1}$ from {eq}`eq_sdf` into {eq}`eq_bondrecur`. Use the state +dynamics {eq}`eq_var` to express $z_{t+1}$ in terms of $z_t$ and +$\varepsilon_{t+1}$, then evaluate the conditional expectation using the +lognormal moment generating function. +``` + +```{solution-start} arp_ex3 +:class: dropdown +``` + +We want to show that if $p_t(n) = \exp(\bar A_n + \bar B_n^\top z_t)$, +then the recursion $p_t(n+1) = \mathbb{E}_t(m_{t+1}\, p_{t+1}(n))$ yields +$p_t(n+1) = \exp(\bar A_{n+1} + \bar B_{n+1}^\top z_t)$ with +$\bar A_{n+1}$ and $\bar B_{n+1}$ given by {eq}`eq_riccati_A` and +{eq}`eq_riccati_B`. + + +From {eq}`eq_sdf` and {eq}`eq_bondprice`, + +$$ +\log(m_{t+1}\, p_{t+1}(n)) = -r_t - \frac{1}{2}\lambda_t^\top\lambda_t - \lambda_t^\top\varepsilon_{t+1} + \bar A_n + \bar B_n^\top z_{t+1} +$$ + +Substituting $z_{t+1} = \mu + \phi z_t + C\varepsilon_{t+1}$ from {eq}`eq_var` +and $r_t = \delta_0 + \delta_1^\top z_t$ from {eq}`eq_shortrate` gives + +$$ +\log(m_{t+1}\, p_{t+1}(n)) = \bar A_n + \bar B_n^\top\mu - \delta_0 + (\bar B_n^\top\phi - \delta_1^\top) z_t - \frac{1}{2}\lambda_t^\top\lambda_t + (\bar B_n^\top C - \lambda_t^\top)\varepsilon_{t+1} +$$ + + +Since $\varepsilon_{t+1} \sim \mathcal{N}(0, I)$, and writing the exponent as $a + b^\top\varepsilon_{t+1}$ where +$b = C^\top \bar B_n - \lambda_t$, we have + +$$ +\mathbb{E}_t[\exp(a + b^\top\varepsilon_{t+1})] = \exp\left(a + \frac{1}{2}b^\top b\right) +$$ + +Computing $\frac{1}{2}b^\top b$: + +$$ +\frac{1}{2}(\bar B_n^\top C - \lambda_t^\top)(\bar B_n^\top C - \lambda_t^\top)^\top = \frac{1}{2}\bar B_n^\top CC^\top \bar B_n - \bar B_n^\top C\lambda_t + \frac{1}{2}\lambda_t^\top\lambda_t +$$ + +The $\frac{1}{2}\lambda_t^\top\lambda_t$ cancels with the $-\frac{1}{2}\lambda_t^\top\lambda_t$ already in $a$, and $-\bar B_n^\top C\lambda_t = -\bar B_n^\top C(\lambda_0 + \lambda_z z_t)$. + + +$$ +\log p_t(n+1) = \underbrace{\bar A_n + \bar B_n^\top(\mu - C\lambda_0) + \frac{1}{2}\bar B_n^\top CC^\top \bar B_n - \delta_0}_{\bar A_{n+1}} + \underbrace{(\bar B_n^\top(\phi - C\lambda_z) - \delta_1^\top)}_{\bar B_{n+1}^\top} z_t +$$ + +Matching the constant and the coefficient on $z_t$ gives the Riccati +equations {eq}`eq_riccati_A` and {eq}`eq_riccati_B`. + +Setting $n = 0$ with $p_t(1) = \exp(-r_t) = \exp(-\delta_0 - \delta_1^\top z_t)$ gives $\bar A_1 = -\delta_0$ and $\bar B_1 = -\delta_1$. + +```{solution-end} +``` + ### Yields -The **yield to maturity** on an $n$-period bond is +The **yield to maturity** on an $n$-period bond is the constant rate $y$ +at which one would discount the face value to obtain the observed price, +i.e., $p_t(n) = e^{-n\,y}$. + +Solving for $y$ gives $$ y_t(n) = -\frac{\log p_t(n)}{n} @@ -282,26 +496,10 @@ where $A_n = -\bar A_n / n$ and $B_n = -\bar B_n / n$. This is the defining property of affine term structure models. -## Python implementation - -We now implement the affine term structure model and compute bond prices, yields, -and risk premiums numerically. +We now implement the bond pricing formulas {eq}`eq_riccati_A`, {eq}`eq_riccati_B`, +and {eq}`eq_yield`. ```{code-cell} ipython3 -AffineModel = namedtuple('AffineModel', - ('μ', 'φ', 'C', 'δ_0', 'δ_1', 'λ_0', 'λ_z', 'm', 'φ_rn', 'μ_rn')) - -def create_affine_model(μ, φ, C, δ_0, δ_1, λ_0, λ_z): - """Create an affine term structure model.""" - μ = np.asarray(μ, float) - φ = np.asarray(φ, float) - C = np.asarray(C, float) - δ_1 = np.asarray(δ_1, float) - λ_0, λ_z = np.asarray(λ_0, float), np.asarray(λ_z, float) - return AffineModel(μ=μ, φ=φ, C=C, δ_0=float(δ_0), δ_1=δ_1, - λ_0=λ_0, λ_z=λ_z, m=len(μ), - φ_rn=φ - C @ λ_z, μ_rn=μ - C @ λ_0) - def bond_coefficients(model, n_max): """Compute (A_bar_n, B_bar_n) for n = 1, ..., n_max.""" A_bar = np.zeros(n_max + 1) @@ -319,39 +517,27 @@ def bond_coefficients(model, n_max): def compute_yields(model, z, n_max): """Compute yield curve y_t(n) for n = 1, ..., n_max.""" A_bar, B_bar = bond_coefficients(model, n_max) - ns = np.arange(1, n_max + 1) - return np.array([(-A_bar[n] - B_bar[n] @ z) / n for n in ns]) + return np.array([(-A_bar[n] - B_bar[n] @ z) / n + for n in range(1, n_max + 1)]) def bond_prices(model, z, n_max): """Compute bond prices p_t(n) for n = 1, ..., n_max.""" A_bar, B_bar = bond_coefficients(model, n_max) return np.array([np.exp(A_bar[n] + B_bar[n] @ z) for n in range(1, n_max + 1)]) - -def simulate(model, z0, T, rng=None): - """Simulate the state process for T periods.""" - if rng is None: - rng = np.random.default_rng(42) - Z = np.zeros((T + 1, model.m)) - Z[0] = z0 - for t in range(T): - ε = rng.standard_normal(model.m) - Z[t + 1] = model.μ + model.φ @ Z[t] + model.C @ ε - return Z - -def short_rate(model, z): - """Compute r_t = δ_0 + δ_1^⊤ z_t.""" - return model.δ_0 + model.δ_1 @ z - -def risk_prices(model, z): - """Compute λ_t = λ_0 + λ_z z_t.""" - return model.λ_0 + model.λ_z @ z ``` ### A one-factor Gaussian example To build intuition, we start with a single-factor ($m=1$) Gaussian model. +With $m = 1$, the state $z_t$ follows an AR(1) process +$z_{t+1} = \mu + \phi z_t + C\varepsilon_{t+1}$. + +The unconditional standard +deviation of $z_t$ is $\sigma_z = C / \sqrt{1 - \phi^2}$, which determines +the range of short rates the model generates via $r_t = \delta_0 + \delta_1 z_t$. + ```{code-cell} ipython3 # One-factor Gaussian model (quarterly) μ = np.array([0.0]) @@ -363,24 +549,11 @@ C = np.array([[1.0]]) λ_z = np.array([[-0.01]]) # countercyclical model_1f = create_affine_model(μ, φ, C, δ_0, δ_1, λ_0, λ_z) - -φ_Q = model_1f.φ_rn[0, 0] -half_life = np.log(2) / (-np.log(φ[0, 0])) -σ_z = 1.0 / np.sqrt(1 - φ[0, 0]**2) -print(f"Physical AR(1): φ = {φ[0,0]:.3f}" - f" (half-life {half_life:.1f} quarters)") -print(f"Risk-neutral AR(1): φ^Q = {φ_Q:.3f} " - f"({'stable' if abs(φ_Q) < 1 else 'UNSTABLE'})") -print(f"Unconditional std of z: σ_z = {σ_z:.2f}") -r_mean = short_rate(model_1f, np.array([0.0])) * 4 * 100 -print(f"Mean short rate = {r_mean:.1f}% p.a.") -print(f"Short rate range (±2σ): [{(δ_0-δ_1[0]*2*σ_z)*4*100:.1f}%, " - f"{(δ_0+δ_1[0]*2*σ_z)*4*100:.1f}%] p.a.") ``` ### Yield curve shapes -We compute yield curves across a range of short-rate states $z_t$. +We compute yield curves $y_t(n)$ across a range of short-rate states $z_t$. ```{code-cell} ipython3 n_max_1f = 60 @@ -396,22 +569,29 @@ r_low = short_rate(model_1f, z_low) * 4 * 100 r_mid = short_rate(model_1f, z_mid) * 4 * 100 r_high = short_rate(model_1f, z_high) * 4 * 100 -for z, label, color in [ - (z_low, f"Low state (r₁ = {r_low:.1f}%)", - "steelblue"), - (z_mid, f"Median state (r₁ = {r_mid:.1f}%)", - "seagreen"), - (z_high, f"High state (r₁ = {r_high:.1f}%)", - "firebrick"), +for z, label in [ + (z_low, f"Low state ($y_t(1) = ${r_low:.1f}%)"), + (z_mid, f"Median state ($y_t(1) = ${r_mid:.1f}%)"), + (z_high, f"High state ($y_t(1) = ${r_high:.1f}%)"), ]: y = compute_yields(model_1f, z, n_max_1f) * 4 * 100 - ax.plot(maturities_1f, y, color=color, lw=2.2, label=label) - ax.plot(1, y[0], 'o', color=color, ms=7, zorder=5) + line, = ax.plot(maturities_1f, y, lw=2.2, label=label) + ax.plot(1, y[0], 'o', color=line.get_color(), ms=7, zorder=5) r_bar = short_rate(model_1f, np.array([0.0])) * 4 * 100 ax.axhline(r_bar, color='grey', ls=':', lw=1.2, alpha=0.7, label=f"Mean short rate ({r_bar:.1f}%)") +# Long-run yield: B_bar_n converges, so y_inf = lim -A_bar_n / n +φ_Cλ = (model_1f.φ_rn)[0, 0] # φ - Cλ_z (scalar) +B_inf = -model_1f.δ_1[0] / (1 - φ_Cλ) # fixed point of B recursion +A_increment = (B_inf * model_1f.μ_rn[0] + + 0.5 * B_inf**2 * (model_1f.C @ model_1f.C.T)[0, 0] + - model_1f.δ_0) +y_inf = -A_increment * 4 * 100 # annualised % +ax.axhline(y_inf, color='black', ls='--', lw=1.2, alpha=0.7, + label=f"Long-run yield ({y_inf:.1f}%)") + ax.set_xlabel("Maturity (quarters)") ax.set_ylabel("Yield (% per annum)") ax.set_title("Yield Curves — One-Factor Affine Model") @@ -420,7 +600,7 @@ ax.set_xlim(1, n_max_1f) ax2 = ax.twiny() ax2.set_xlim(ax.get_xlim()) -year_ticks = [4, 8, 12, 20, 28, 40, 60] +year_ticks = [4, 20, 40, 60] ax2.set_xticks(year_ticks) ax2.set_xticklabels([f"{t/4:.0f}y" for t in year_ticks]) ax2.set_xlabel("Maturity (years)") @@ -429,10 +609,77 @@ plt.tight_layout() plt.show() ``` -The model generates upward-sloping, flat, and inverted yield curves as the short -rate moves across states — a key qualitative feature of observed bond markets. +When the short rate is low, the yield curve curve is +upward-sloping, while when the short rate is high, it is downward-sloping. + +All three curves converge to the same long-run yield $y_\infty$ at long +maturities, and the long-run yield lies below the mean short rate +$\delta_0$. + +````{exercise} +:label: arp_ex4 + +Show that the long-run yield satisfies + +```{math} +:label: eq_y_inf + +y_\infty + = \delta_0 + - \bar B_\infty^\top(\mu - C\lambda_0) + - \tfrac{1}{2}\bar B_\infty^\top CC^\top \bar B_\infty +``` + +where $\bar B_\infty = -(I - (\phi - C\lambda_z)^\top)^{-1} \delta_1$ +is the fixed point of the recursion {eq}`eq_riccati_B`. + +Then explain why $y_\infty < \delta_0$ under this parameterization. + +*Hint:* Use {eq}`eq_yield` and the Riccati equations +{eq}`eq_riccati_A`--{eq}`eq_riccati_B`. For the inequality, consider +each subtracted term separately. +```` + +```{solution-start} arp_ex4 +:class: dropdown +``` + + +**Derivation of $y_\infty$.** + +The recursion {eq}`eq_riccati_B` is a linear difference equation $\bar B_{n+1} = (\phi - C\lambda_z)^\top \bar B_n - \delta_1$. + +When $\phi - C\lambda_z$ has eigenvalues inside the unit circle, $\bar B_n$ converges to $\bar B_\infty = -(I - (\phi - C\lambda_z)^\top)^{-1} \delta_1$. + +Since $\bar B_\infty$ is finite, $\bar B_n^\top z_t / n \to 0$ in {eq}`eq_yield`, so $y_t(n) \to \lim_{n\to\infty} -\bar A_n / n$ regardless of $z_t$. + +To find this limit, write $\bar A_n = \bar A_1 + \sum_{k=1}^{n-1}(\bar A_{k+1} - \bar A_k)$. + +By {eq}`eq_riccati_A`, each increment depends on $\bar B_k$, which converges to $\bar B_\infty$, so the increment converges to $L \equiv \bar B_\infty^\top(\mu - C\lambda_0) + \tfrac{1}{2}\bar B_\infty^\top CC^\top \bar B_\infty - \delta_0$. + +Therefore $\bar A_n / n \to L$ and $y_\infty = -L$, giving {eq}`eq_y_inf`. + +**Why $y_\infty < \delta_0$.** + +Both subtracted terms in {eq}`eq_y_inf` are positive. + +The quadratic term satisfies $\tfrac{1}{2}\bar B_\infty^\top CC^\top \bar B_\infty = \tfrac{1}{2}\|C^\top \bar B_\infty\|^2 \geq 0$ always — a **convexity effect** from Jensen's inequality applied to the exponential bond-price formula. + +The linear term $\bar B_\infty^\top(\mu - C\lambda_0)$ is positive because both factors are negative. + +$\bar B_\infty < 0$ since $\delta_1 > 0$: a higher state raises the short rate, so bond prices load negatively on the state. + +$\mu - C\lambda_0 < 0$ since $\lambda_0 > 0$: positive risk prices shift the risk-neutral drift below the physical drift. + +This is a **risk-premium effect**: compensating investors for interest-rate risk lowers the long-run yield. + +Together, these two effects push $y_\infty$ below $\delta_0$. + +```{solution-end} +``` + -### Short rate dynamics +Let's also simulate the short rate path: ```{code-cell} ipython3 T = 200 @@ -443,14 +690,14 @@ r_bar_pct = short_rate(model_1f, np.array([0.0])) * 4 * 100 fig, ax = plt.subplots(figsize=(10, 4)) quarters = np.arange(T + 1) -ax.plot(quarters, short_rates, color="steelblue", lw=1.3) -ax.axhline(r_bar_pct, color="red", ls="--", lw=1.3, +line, = ax.plot(quarters, short_rates, lw=1.3) +ax.axhline(r_bar_pct, ls="--", lw=1.3, label=f"Unconditional mean ({r_bar_pct:.1f}%)") ax.fill_between(quarters, short_rates, r_bar_pct, - alpha=0.08, color="steelblue") + alpha=0.08, color=line.get_color()) ax.set_xlabel("Quarter") ax.set_ylabel("Short rate (% p.a.)") -ax.set_title("Simulated Short Rate — One-Factor Model (50 years)") +ax.set_title("Simulated Short Rate") ax.set_xlim(0, T) ax.legend(fontsize=11) plt.tight_layout() @@ -459,10 +706,45 @@ plt.show() ### A two-factor model -To match richer yield-curve dynamics, practitioners routinely use $m \geq 2$ factors. +To match richer yield-curve dynamics, practitioners routinely use $m \geq 2$ +factors. + +We now introduce a two-factor specification with state +$z_t = (z_{1t},\, z_{2t})^\top$, where + +$$ +z_{t+1} = \mu + \phi\, z_t + C\,\varepsilon_{t+1}, +\qquad +\phi = \begin{pmatrix} 0.97 & -0.03 \\ 0 & 0.90 \end{pmatrix}, +\qquad +C = I_2 +$$ + +The first factor $z_{1t}$ is highly persistent ($\phi_{11} = 0.97$) and +drives most of the variation in the short rate through $\delta_1$, so we +interpret it as a **level** factor. + +The second factor $z_{2t}$ mean-reverts faster ($\phi_{22} = 0.90$) and +affects the short rate with a smaller loading, capturing the **slope** +of the yield curve. + +The off-diagonal entry $\phi_{12} = -0.03$ allows the level factor to +respond to slope innovations. + +The short rate is $r_t = \delta_0 + \delta_1^\top z_t$ with +$\delta_1 = (0.002,\; 0.001)^\top$, so both factors raise the short +rate when positive, but the level factor has twice the impact. + +Risk prices are $\lambda_t = \lambda_0 + \lambda_z z_t$ with +$\lambda_z = \text{diag}(-0.005,\, -0.003)$. + +The negative diagonal entries mean that risk prices rise when +the state is low — investors demand higher compensation in bad states. -We now introduce a two-factor specification in which the factors -can be interpreted as a **level** component and a **slope** component. +As discussed above, this makes $\phi - C\lambda_z$ have larger +eigenvalues than $\phi$, so the state is more persistent under the +risk-neutral measure and the yield curve is more sensitive to the +current state at long horizons. ```{code-cell} ipython3 # Two-factor model: z = [level, slope] @@ -478,19 +760,8 @@ C_2 = np.eye(2) model_2f = create_affine_model(μ_2, φ_2, C_2, δ_0_2, δ_1_2, λ_0_2, λ_z_2) -print("Physical measure VAR:") -print(f" φ =\n{φ_2}") -print(f" eigenvalues of φ: {eigvals(φ_2).real.round(4)}") -print() -print("Risk-neutral measure VAR:") -print(f" φ^Q = φ - Cλ_z =\n{model_2f.φ_rn.round(4)}") -eigs_Q = eigvals(model_2f.φ_rn).real -stable = all(abs(e) < 1 for e in eigs_Q) -status = "stable" if stable else "UNSTABLE" -print(f" eigenvalues of φ^Q: {eigs_Q.round(4)}" - f" ({status})") -print() -print("Risk prices make Q dynamics more persistent than P dynamics.") +print(f"Eigenvalues of φ: {eigvals(φ_2).real.round(4)}") +print(f"Eigenvalues of φ - Cλ_z: {eigvals(model_2f.φ_rn).real.round(4)}") ``` ```{code-cell} ipython3 @@ -505,17 +776,13 @@ states = { fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5.5)) -colors_2f = ["seagreen", "steelblue", "firebrick"] -for (label, z), color in zip(states.items(), colors_2f): +for label, z in states.items(): r_now = short_rate(model_2f, z) * 4 * 100 y = compute_yields(model_2f, z, n_max_2f) * 4 * 100 - ax1.plot(maturities_2f, y, lw=2.2, color=color, - label=f"{label} (r₁ = {r_now:.1f}%)") - ax1.plot(1, y[0], 'o', color=color, ms=7, zorder=5) + line, = ax1.plot(maturities_2f, y, lw=2.2, + label=f"{label} (r₁ = {r_now:.1f}%)") + ax1.plot(1, y[0], 'o', color=line.get_color(), ms=7, zorder=5) -ax1.annotate("Curves converge as\nmean reversion dominates", - xy=(50, 3.8), fontsize=9, color="gray", ha='center', - style='italic') ax1.set_xlabel("Maturity (quarters)") ax1.set_ylabel("Yield (% p.a.)") ax1.set_title("Yield Curves — Two-Factor Model") @@ -526,9 +793,9 @@ A_bar, B_bar = bond_coefficients(model_2f, n_max_2f) ns = np.arange(1, n_max_2f + 1) B_n = np.array([-B_bar[n] / n for n in ns]) -ax2.plot(ns, B_n[:, 0], lw=2.2, color="purple", +ax2.plot(ns, B_n[:, 0], lw=2.2, label=r"Level loading $B_{n,1}$") -ax2.plot(ns, B_n[:, 1], lw=2.2, color="orange", +ax2.plot(ns, B_n[:, 1], lw=2.2, label=r"Slope loading $B_{n,2}$") ax2.axhline(0, color='black', lw=0.6) ax2.set_xlabel("Maturity (quarters)") @@ -536,9 +803,6 @@ ax2.set_ylabel(r"Yield loading $B_{n,k}$") ax2.set_title("Factor Loadings on Yields") ax2.legend(fontsize=11) ax2.set_xlim(1, n_max_2f) -ax2.annotate("Level factor stays\nimportant at long maturities", - xy=(45, B_n[44, 0]), fontsize=9, color="purple", - ha='center', va='bottom') for ax in (ax1, ax2): ax_top = ax.twiny() @@ -584,12 +848,11 @@ z_states_tp = { fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5.5)) -tp_colors = ["steelblue", "firebrick"] -for (label, z), color in zip(z_states_tp.items(), tp_colors): +for label, z in z_states_tp.items(): tp = term_premiums(model_2f, z, n_max_tp) * 4 * 100 r_now = short_rate(model_2f, z) * 4 * 100 lam = risk_prices(model_2f, z) - ax1.plot(maturities_tp, tp, color=color, lw=2.2, + ax1.plot(maturities_tp, tp, lw=2.2, label=(f"{label}\n r={r_now:.1f}%," f" λ=[{lam[0]:.3f}, {lam[1]:.3f}]")) @@ -613,9 +876,9 @@ tp_slope = np.array([-B_bar_d[n, 1] * C_lam[1] tp_total = tp_level + tp_slope ax2.plot(maturities_tp, tp_total, 'k-', lw=2.2, label="Total") -ax2.plot(maturities_tp, tp_level, color="purple", lw=1.8, ls="--", +ax2.plot(maturities_tp, tp_level, lw=1.8, ls="--", label="Level factor") -ax2.plot(maturities_tp, tp_slope, color="orange", lw=1.8, ls="--", +ax2.plot(maturities_tp, tp_slope, lw=1.8, ls="--", label="Slope factor") ax2.axhline(0, color="black", lw=0.6, ls=":") ax2.set_xlabel("Maturity (quarters)") @@ -637,72 +900,103 @@ plt.show() ## Risk-neutral probabilities -The stochastic discount factor {eq}`eq_sdf` defines a **change of measure** from the -physical measure $P$ to the **risk-neutral measure** $Q$. +We return to the VAR and short-rate equations +{eq}`eq_var`--{eq}`eq_shortrate`, which for convenience we repeat here: -Define the likelihood ratio +$$ +z_{t+1} = \mu + \phi z_t + C\varepsilon_{t+1}, \qquad +r_t = \delta_0 + \delta_1^\top z_t +$$ + +where $\varepsilon_{t+1} \sim \mathcal{N}(0, I)$. + +We suppose that this structure describes the data-generating mechanism. + +Finance economists call this the **physical measure** $P$, to distinguish it +from the **risk-neutral measure** $Q$ that we now describe. + +Under the physical measure, the conditional distribution of $z_{t+1}$ given +$z_t$ is $\mathcal{N}(\mu + \phi z_t,\; CC^\top)$. + +### Change of measure + +With the risk-price vector $\lambda_t = \lambda_0 + \lambda_z z_t$ from +{eq}`eq_riskprices`, define the non-negative random variable ```{math} :label: eq_RN_ratio -\frac{\xi^Q_{t+1}}{\xi^Q_t} = \exp\!\left(-\frac{1}{2}\lambda_t^\top\lambda_t - \lambda_t^\top\varepsilon_{t+1}\right) +\frac{\xi^Q_{t+1}}{\xi^Q_t} + = \exp\!\left(-\tfrac{1}{2}\lambda_t^\top\lambda_t + - \lambda_t^\top\varepsilon_{t+1}\right) ``` -Then +This is a log-normal random variable with mean 1, so it is a valid +likelihood ratio that can be used to twist the conditional distribution of +$z_{t+1}$. + +Multiplying the physical conditional distribution by this likelihood ratio +transforms it into the **risk-neutral conditional distribution** $$ -m_{t+1} = \frac{\xi^Q_{t+1}}{\xi^Q_t}\exp(-r_t) +z_{t+1} \mid z_t \;\overset{Q}{\sim}\; + \mathcal{N}\!\bigl(\mu - C\lambda_0 + (\phi - C\lambda_z)z_t,\; CC^\top\bigr) $$ -and the pricing equation $\mathbb{E}^P_t(m_{t+1}R_{j,t+1}) = 1$ becomes +In other words, under $Q$ the state follows -```{math} -:label: eq_Qpricing +$$ +z_{t+1} = (\mu - C\lambda_0) + (\phi - C\lambda_z)\,z_t + + C\varepsilon^Q_{t+1} +$$ -\mathbb{E}^Q_t R_{j,t+1} = \exp(r_t) -``` +where $\varepsilon^Q_{t+1} \sim \mathcal{N}(0, I)$ under $Q$. + +The risk-neutral distribution twists the conditional mean from +$\mu + \phi z_t$ to $\mu - C\lambda_0 + (\phi - C\lambda_z)z_t$. -*Under the risk-neutral measure, expected returns on all assets equal the risk-free return.* +The adjustments $-C\lambda_0$ (constant) and $-C\lambda_z$ +(state-dependent) encode how the pricing equation +$\mathbb{E}^P_t m_{t+1} R_{j,t+1} = 1$ adjusts expected returns for +exposure to the risks $\varepsilon_{t+1}$. -### The risk-neutral VAR +### Asset pricing in a nutshell -Multiplying the physical conditional distribution of $z_{t+1}$ by the likelihood -ratio {eq}`eq_RN_ratio` gives the **risk-neutral conditional distribution** +Using {eq}`eq_RN_ratio`, we can factor the SDF {eq}`eq_sdf` as $$ -z_{t+1} \mid z_t \;\overset{Q}{\sim}\; \mathcal{N}\!\bigl(\mu - C\lambda_0 + (\phi - C\lambda_z)z_t,\; CC^\top\bigr) +m_{t+1} = \frac{\xi^Q_{t+1}}{\xi^Q_t}\,\exp(-r_t) $$ -In other words, under $Q$ the state vector follows +The pricing condition $\mathbb{E}^P_t(m_{t+1} R_{j,t+1}) = 1$ then becomes -$$ -z_{t+1} = (\mu - C\lambda_0) + (\phi - C\lambda_z)\,z_t + C\varepsilon^Q_{t+1} -$$ +```{math} +:label: eq_Qpricing -where $\varepsilon^Q_{t+1} \sim \mathcal{N}(0, I)$ under $Q$. +\mathbb{E}^Q_t R_{j,t+1} = \exp(r_t) +``` -The risk-neutral drift adjustments $-C\lambda_0$ (constant) and $-C\lambda_z$ (state-dependent) -encode exactly how the asset pricing formula $\mathbb{E}^P_t m_{t+1}R_{j,t+1}=1$ adjusts -expected returns for exposure to the risks $\varepsilon_{t+1}$. +*Under the risk-neutral measure, expected returns on all assets equal +the risk-free return.* ### Verification via risk-neutral pricing Bond prices can be computed by discounting at $r_t$ under $Q$: $$ -p_t(n) = \mathbb{E}^Q_t\! \left[\exp\!\left(-\sum_{s=0}^{n-1}r_{t+s}\right)\right] +p_t(n) = \mathbb{E}^Q_t \left[\exp \left(-\sum_{s=0}^{n-1}r_{t+s}\right)\right] $$ We can verify that this agrees with {eq}`eq_bondprice` by iterating the affine recursion under the risk-neutral VAR. -Below we confirm this numerically. +Below we confirm this numerically ```{code-cell} ipython3 def bond_price_mc_Q(model, z0, n, n_sims=50_000, rng=None): """Estimate p_t(n) by Monte Carlo under Q.""" if rng is None: - rng = np.random.default_rng(2024) + rng = np.random.default_rng(0) m = len(z0) Z = np.tile(z0, (n_sims, 1)) disc = np.zeros(n_sims) @@ -715,9 +1009,9 @@ def bond_price_mc_Q(model, z0, n, n_sims=50_000, rng=None): z_test = np.array([0.01, 0.005]) p_analytic = bond_prices(model_2f, z_test, 40) -rng = np.random.default_rng(2024) +rng = np.random.default_rng(0) maturities_check = [4, 12, 24, 40] -mc_prices = [bond_price_mc_Q(model_2f, z_test, n, n_sims=80_000, rng=rng) +mc_prices = [bond_price_mc_Q(model_2f, z_test, n, n_sims=100_000, rng=rng) for n in maturities_check] header = (f"{'Maturity':>10} {'Analytic':>12}" @@ -735,70 +1029,93 @@ Riccati recursion {eq}`eq_riccati_A`–{eq}`eq_riccati_B`. ## Distorted beliefs -{cite:t}`piazzesi2015trend` assemble survey -evidence suggesting that economic experts' forecasts are *systematically biased* -relative to the physical measure. +{cite:t}`piazzesi2015trend` assemble survey evidence suggesting that economic +experts' forecasts are systematically biased relative to the physical measure. ### The subjective measure -Let $\hat z_{t+1}$ be one-period-ahead expert forecasts. +Let $\{z_t\}_{t=1}^T$ be a record of observations on the state and let +$\{\check z_{t+1}\}_{t=1}^T$ be a record of one-period-ahead expert forecasts. -Regressing these on $z_t$: +Let $\check\mu, \check\phi$ be the regression coefficients in $$ -\hat z_{t+1} = \hat\mu + \hat\phi\, z_t + e_{t+1} +\check z_{t+1} = \check\mu + \check\phi\, z_t + e_{t+1} $$ -yields estimates $\hat\mu, \hat\phi$ that differ from the physical parameters $\mu, \phi$. +where the residual $e_{t+1}$ has mean zero, is orthogonal to $z_t$, and +satisfies $\mathbb{E}\,e_{t+1} e_{t+1}^\top = CC^\top$. + +By comparing estimates of $\mu, \phi$ from {eq}`eq_var` with estimates of +$\check\mu, \check\phi$ from the experts' forecasts, {cite:t}`piazzesi2015trend` +deduce that the experts' beliefs are systematically distorted. -To formalise the distortion, let $\kappa_t = \kappa_0 + \kappa_z z_t$ and define +To organize this evidence, let $\kappa_t = \kappa_0 + \kappa_z z_t$ and define the likelihood ratio ```{math} :label: eq_Srat \frac{\xi^S_{t+1}}{\xi^S_t} -= \exp\!\left(-\frac{1}{2}\kappa_t^\top\kappa_t - \kappa_t^\top\varepsilon_{t+1}\right) + = \exp\!\left(-\tfrac{1}{2}\kappa_t^\top\kappa_t + - \kappa_t^\top\varepsilon_{t+1}\right) ``` -Multiplying the physical conditional distribution of $z_{t+1}$ by this likelihood -ratio gives the **subjective (S) conditional distribution** +This is log-normal with mean 1, so it is a valid likelihood ratio. + +Multiplying the physical conditional distribution of $z_{t+1}$ by this +likelihood ratio transforms it to the experts' **subjective conditional +distribution** $$ z_{t+1} \mid z_t \;\overset{S}{\sim}\; -\mathcal{N}\!\bigl(\mu - C\kappa_0 + (\phi - C\kappa_z)\,z_t,\; CC^\top\bigr) + \mathcal{N}\!\bigl(\mu - C\kappa_0 + (\phi - C\kappa_z)\,z_t,\; CC^\top\bigr) $$ -Comparing with the regression implies +In the experts' forecast regression, $\check\mu$ estimates +$\mu - C\kappa_0$ and $\check\phi$ estimates $\phi - C\kappa_z$. + +{cite:t}`piazzesi2015trend` find that the experts behave as if the level and +slope of the yield curve are more persistent than under the physical measure: +$\check\phi$ has larger eigenvalues than $\phi$. + +### Pricing under distorted beliefs + +Suppose a representative agent with subjective beliefs $S$ and true risk +prices $\lambda^\star_t$ prices assets according to $$ -\hat\mu = \mu - C\kappa_0, \qquad \hat\phi = \phi - C\kappa_z +\mathbb{E}^S_t\bigl(m^\star_{t+1}\, R_{j,t+1}\bigr) = 1 $$ -Piazzesi et al. find that experts behave as if the level and slope of the yield -curve are *more persistent* than under the physical measure: $\hat\phi$ has -larger eigenvalues than $\phi$. - -### Pricing under distorted beliefs +where $m^\star_{t+1} = \exp(-r_t - \tfrac{1}{2}\lambda_t^{\star\top}\lambda^\star_t +- \lambda_t^{\star\top}\varepsilon_{t+1})$. -A representative agent with subjective beliefs $S$ and risk prices $\lambda^\star_t$ -satisfies +Expanding in terms of the physical measure $P$, the subjective pricing +equation becomes $$ -\mathbb{E}^S_t\bigl(m^\star_{t+1} R_{j,t+1}\bigr) = 1 +\mathbb{E}^P_t\!\left[ + \exp\!\left(-r_t + - \tfrac{1}{2}(\lambda^\star_t + \kappa_t)^\top(\lambda^\star_t + \kappa_t) + - (\lambda^\star_t + \kappa_t)^\top\varepsilon_{t+1} + \right) R_{j,t+1} +\right] = 1 $$ -Expanding this in terms of the physical measure $P$, one finds that the -**rational-expectations econometrician** who imposes $P$ will estimate risk prices +Comparing this with the rational-expectations econometrician's pricing +equation $\mathbb{E}^P_t(m_{t+1}\, R_{j,t+1}) = 1$, we see that what the +econometrician interprets as $\lambda_t$ is actually $$ \hat\lambda_t = \lambda^\star_t + \kappa_t $$ -That is, the econometrician's estimate conflates true risk prices $\lambda^\star_t$ +The econometrician's estimate conflates true risk prices $\lambda^\star_t$ and belief distortions $\kappa_t$. -Part of what looks like a high price of risk is actually a systematic forecast bias. +Part of what looks like a high price of risk is actually a systematic +forecast bias. ### Numerical illustration @@ -813,29 +1130,11 @@ Part of what looks like a high price of risk is actually a systematic forecast b κ_z = np.linalg.solve(C_2, φ_P - φ_S) κ_0 = np.linalg.solve(C_2, μ_P - μ_S) -print("Distortion parameters" - " (κ quantifies how experts' beliefs" - " differ from P):") -print(f" κ_0 = {κ_0.round(4)}") -print(f" κ_z =\n{κ_z.round(4)}") -print() -print("Eigenvalue comparison:") -eig_P = sorted(eigvals(φ_P).real, reverse=True) -eig_S = sorted(eigvals(φ_S).real, reverse=True) -print(f" Physical φ eigenvalues: {[round(e, 4) for e in eig_P]}") -print(f" Subjective φ̂ eigenvalues: {[round(e, 4) for e in eig_S]}") -print(" Experts believe both factors are more persistent.") -print() - λ_star_0 = np.array([0.03, 0.015]) λ_star_z = np.array([[-0.006, 0.0], [0.0, -0.004]]) λ_hat_0 = λ_star_0 + κ_0 λ_hat_z = λ_star_z + κ_z - -print("True risk prices: λ*_0 =", λ_star_0.round(4)) -print("Econometrician estimates: λ̂_0 =", λ_hat_0.round(4)) -print(f" Belief distortion inflates λ̂_0 by κ_0 = {κ_0.round(4)}.") ``` ```{code-cell} ipython3 @@ -844,11 +1143,6 @@ model_true = create_affine_model( model_econ = create_affine_model( μ_2, φ_2, C_2, δ_0_2, δ_1_2, λ_hat_0, λ_hat_z) -for name, mdl in [("True", model_true), ("Econometrician", model_econ)]: - eigs = eigvals(mdl.φ_rn).real - status = "stable" if all(abs(e) < 1 for e in eigs) else "UNSTABLE" - print(f"{name} model: φ^Q eigenvalues = {eigs.round(4)} ({status})") - z_ref = np.array([0.0, 0.0]) n_max_db = 60 maturities_db = np.arange(1, n_max_db + 1) @@ -858,13 +1152,13 @@ tp_econ = term_premiums(model_econ, z_ref, n_max_db) * 4 * 100 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5.5)) -ax1.plot(maturities_db, tp_true, lw=2.2, color="steelblue", +ax1.plot(maturities_db, tp_true, lw=2.2, label=r"True risk prices $\lambda^\star_t$") -ax1.plot(maturities_db, tp_econ, lw=2.2, color="firebrick", ls="--", +line_econ, = ax1.plot(maturities_db, tp_econ, lw=2.2, ls="--", label=(r"RE econometrician" r" $\hat\lambda_t = \lambda^\star_t + \kappa_t$")) ax1.fill_between(maturities_db, tp_true, tp_econ, - alpha=0.15, color="firebrick", + alpha=0.15, color=line_econ.get_color(), label="Belief distortion component") ax1.axhline(0, color="black", lw=0.8, ls=":") ax1.set_xlabel("Maturity (quarters)") @@ -877,7 +1171,7 @@ mask = np.abs(tp_true) > 1e-8 ratio = np.full_like(tp_true, np.nan) ratio[mask] = tp_econ[mask] / tp_true[mask] -ax2.plot(maturities_db[mask], ratio[mask], lw=2.2, color="darkred") +ax2.plot(maturities_db[mask], ratio[mask], lw=2.2) ax2.axhline(1, color="black", lw=0.8, ls="--", label="No distortion (ratio = 1)") ax2.set_xlabel("Maturity (quarters)") @@ -907,35 +1201,6 @@ data — for example, the survey forecasts used by Piazzesi, Salomao, and Schnei Our {doc}`Risk Aversion or Mistaken Beliefs? ` lecture explores this confounding in greater depth. -## The bond price recursion - -We verify the exponential affine form {eq}`eq_bondprice` by induction. - -**Claim:** If $p_{t+1}(n) = \exp(\bar A_n + \bar B_n^\top z_{t+1})$, then -$p_t(n+1) = \exp(\bar A_{n+1} + \bar B_{n+1}^\top z_t)$ with $\bar A_{n+1}$ and -$\bar B_{n+1}$ given by {eq}`eq_riccati_A`–{eq}`eq_riccati_B`. - -**Proof sketch.** Using the SDF {eq}`eq_sdf` and the VAR {eq}`eq_var`: - -$$ -\log m_{t+1} + \log p_{t+1}(n) -= -r_t - \tfrac{1}{2}\lambda_t^\top\lambda_t - + (\bar A_n + \bar B_n^\top\mu + \bar B_n^\top\phi z_t) - + (-\lambda_t + C^\top\bar B_n)^\top\varepsilon_{t+1} -$$ - -Taking the conditional expectation (and using $\varepsilon_{t+1}\sim\mathcal{N}(0,I)$): - -$$ -\log p_t(n+1) = -r_t - \tfrac{1}{2}\lambda_t^\top\lambda_t - + \bar A_n + \bar B_n^\top(\mu + \phi z_t) - + \tfrac{1}{2}(\lambda_t - C^\top\bar B_n)^\top(\lambda_t - C^\top\bar B_n) -$$ - -Substituting $r_t = \delta_0 + \delta_1^\top z_t$ and $\lambda_t = \lambda_0 + \lambda_z z_t$, -collecting constant and linear-in-$z_t$ terms, and equating coefficients gives -exactly {eq}`eq_riccati_A`–{eq}`eq_riccati_B`. $\blacksquare$ - ## Concluding remarks The affine model of the stochastic discount factor provides a flexible and tractable From f807a155e32eb213fbe1e4a5cb8a89962bdc9f83 Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Wed, 11 Mar 2026 18:14:24 +1100 Subject: [PATCH 02/18] updates --- lectures/affine_risk_prices.md | 82 ++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 19 deletions(-) diff --git a/lectures/affine_risk_prices.md b/lectures/affine_risk_prices.md index e0ed2cf63..1fce64cd8 100644 --- a/lectures/affine_risk_prices.md +++ b/lectures/affine_risk_prices.md @@ -962,13 +962,22 @@ exposure to the risks $\varepsilon_{t+1}$. ### Asset pricing in a nutshell -Using {eq}`eq_RN_ratio`, we can factor the SDF {eq}`eq_sdf` as +Let $\mathbb{E}^P$ denote an expectation under the physical measure that +nature uses to generate the data. + +Our key asset pricing equation is +$\mathbb{E}^P_t m_{t+1} R_{j,t+1} = 1$ for all returns $R_{j,t+1}$. + +Using {eq}`eq_RN_ratio`, we can express the SDF {eq}`eq_sdf` as $$ m_{t+1} = \frac{\xi^Q_{t+1}}{\xi^Q_t}\,\exp(-r_t) $$ -The pricing condition $\mathbb{E}^P_t(m_{t+1} R_{j,t+1}) = 1$ then becomes +Then the condition +$\mathbb{E}^P_t\bigl(\exp(-r_t)\, +\tfrac{\xi^Q_{t+1}}{\xi^Q_t}\, R_{j,t+1}\bigr) = 1$ +is equivalent to ```{math} :label: eq_Qpricing @@ -1081,18 +1090,45 @@ $\check\phi$ has larger eigenvalues than $\phi$. ### Pricing under distorted beliefs -Suppose a representative agent with subjective beliefs $S$ and true risk -prices $\lambda^\star_t$ prices assets according to +{cite:t}`piazzesi2015trend` explore the hypothesis that a representative +agent with these distorted beliefs prices assets and makes returns satisfy $$ \mathbb{E}^S_t\bigl(m^\star_{t+1}\, R_{j,t+1}\bigr) = 1 $$ -where $m^\star_{t+1} = \exp(-r_t - \tfrac{1}{2}\lambda_t^{\star\top}\lambda^\star_t -- \lambda_t^{\star\top}\varepsilon_{t+1})$. +where $\mathbb{E}^S_t$ is the conditional expectation under the subjective +$S$ measure and $m^\star_{t+1}$ is the SDF of an agent with these beliefs. + +In particular, the agent's SDF is + +$$ +m^\star_{t+1} = \exp\!\left(-r^\star_t + - \tfrac{1}{2}\lambda_t^{\star\top}\lambda^\star_t + - \lambda_t^{\star\top}\varepsilon_{t+1}\right) +$$ + +where $r^\star_t$ is the short rate and $\lambda^\star_t$ is the agent's +vector of risk prices. + +Using {eq}`eq_Srat` to convert to the physical measure, the subjective +pricing equation becomes + +$$ +\mathbb{E}^P_t\!\left[ + \exp\!\left(-r^\star_t + - \tfrac{1}{2}\lambda_t^{\star\top}\lambda^\star_t + - \lambda_t^{\star\top}\varepsilon_{t+1} + \right) + \exp\!\left( + - \tfrac{1}{2}\kappa_t^\top\kappa_t + - \kappa_t^\top\varepsilon_{t+1} + \right) + R_{j,t+1} +\right] = 1 +$$ -Expanding in terms of the physical measure $P$, the subjective pricing -equation becomes +Combining the two exponentials gives $$ \mathbb{E}^P_t\!\left[ @@ -1103,19 +1139,26 @@ $$ \right] = 1 $$ +where $r_t = r^\star_t - \lambda_t^{\star\top}\kappa_t$. + Comparing this with the rational-expectations econometrician's pricing -equation $\mathbb{E}^P_t(m_{t+1}\, R_{j,t+1}) = 1$, we see that what the -econometrician interprets as $\lambda_t$ is actually +equation $$ -\hat\lambda_t = \lambda^\star_t + \kappa_t +\mathbb{E}^P_t\!\left[ + \exp\!\left(-r_t + - \tfrac{1}{2}\lambda_t^\top\lambda_t + - \lambda_t^\top\varepsilon_{t+1} + \right) R_{j,t+1} +\right] = 1 $$ -The econometrician's estimate conflates true risk prices $\lambda^\star_t$ -and belief distortions $\kappa_t$. +we see that what the econometrician interprets as $\lambda_t$ is actually +$\lambda^\star_t + \kappa_t$. -Part of what looks like a high price of risk is actually a systematic -forecast bias. +Because the econometrician's estimates partly reflect systematic +distortions in subjective beliefs, they overstate the representative +agent's true risk prices $\lambda^\star_t$. ### Numerical illustration @@ -1191,12 +1234,13 @@ plt.tight_layout() plt.show() ``` -When expert beliefs are overly persistent ($\hat\phi$ has larger eigenvalues than -$\phi$), the rational-expectations econometrician attributes too much of the -observed risk premium to risk aversion. +When expert beliefs are overly persistent ($\check\phi$ has larger eigenvalues +than $\phi$), the rational-expectations econometrician attributes too much of +the observed risk premium to risk aversion. Disentangling belief distortions from genuine risk prices requires additional -data — for example, the survey forecasts used by Piazzesi, Salomao, and Schneider. +data — for example, the survey forecasts used by +{cite:t}`piazzesi2015trend`. Our {doc}`Risk Aversion or Mistaken Beliefs? ` lecture explores this confounding in greater depth. From 863d4de8a09b1160b5be6cc405e76925fb3cbb96 Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Wed, 11 Mar 2026 22:07:21 +1100 Subject: [PATCH 03/18] updates --- lectures/affine_risk_prices.md | 248 ++++++++++++++++++++++++--------- 1 file changed, 179 insertions(+), 69 deletions(-) diff --git a/lectures/affine_risk_prices.md b/lectures/affine_risk_prices.md index 1fce64cd8..0c846cdbb 100644 --- a/lectures/affine_risk_prices.md +++ b/lectures/affine_risk_prices.md @@ -284,7 +284,7 @@ The components of $\alpha_t(j)$ express the **exposures** of $\log R_{j,t+1}$ to corresponding components of the risk vector $\varepsilon_{t+1}$. The specification {eq}`eq_return` implies $\mathbb{E}_t R_{j,t+1} = \exp(\nu_t(j))$, -so $\nu_t(j)$ is the expected net log return. +so $\nu_t(j)$ is the log of the expected gross return. ### Expected excess returns @@ -338,7 +338,7 @@ This is a central result. It says: -> The expected net return on asset $j$ equals the short rate plus the inner product +> The log expected gross return on asset $j$ equals the short rate plus the inner product > of the asset's exposure vector $\alpha_t(j)$ with the risk price vector $\lambda_t$. Each component of $\lambda_t$ prices the corresponding component of $\varepsilon_{t+1}$. @@ -390,13 +390,13 @@ where the scalar $\bar A_n$ and the $m \times 1$ vector $\bar B_n$ satisfy the **Riccati difference equations** ```{math} -:label: eq_riccati_A +:label: eq_riccati_a \bar A_{n+1} = \bar A_n + \bar B_n^\top(\mu - C\lambda_0) + \frac{1}{2}\bar B_n^\top CC^\top\bar B_n - \delta_0 ``` ```{math} -:label: eq_riccati_B +:label: eq_riccati_b \bar B_{n+1}^\top = \bar B_n^\top(\phi - C\lambda_z) - \delta_1^\top ``` @@ -406,7 +406,7 @@ with initial conditions $\bar A_1 = -\delta_0$ and $\bar B_1 = -\delta_1$. ```{exercise} :label: arp_ex3 -Derive the Riccati difference equations {eq}`eq_riccati_A` and {eq}`eq_riccati_B` +Derive the Riccati difference equations {eq}`eq_riccati_a` and {eq}`eq_riccati_b` by substituting the conjectured bond price {eq}`eq_bondprice` into the pricing recursion {eq}`eq_bondrecur` and matching coefficients. @@ -424,8 +424,8 @@ lognormal moment generating function. We want to show that if $p_t(n) = \exp(\bar A_n + \bar B_n^\top z_t)$, then the recursion $p_t(n+1) = \mathbb{E}_t(m_{t+1}\, p_{t+1}(n))$ yields $p_t(n+1) = \exp(\bar A_{n+1} + \bar B_{n+1}^\top z_t)$ with -$\bar A_{n+1}$ and $\bar B_{n+1}$ given by {eq}`eq_riccati_A` and -{eq}`eq_riccati_B`. +$\bar A_{n+1}$ and $\bar B_{n+1}$ given by {eq}`eq_riccati_a` and +{eq}`eq_riccati_b`. From {eq}`eq_sdf` and {eq}`eq_bondprice`, @@ -463,7 +463,7 @@ $$ $$ Matching the constant and the coefficient on $z_t$ gives the Riccati -equations {eq}`eq_riccati_A` and {eq}`eq_riccati_B`. +equations {eq}`eq_riccati_a` and {eq}`eq_riccati_b`. Setting $n = 0$ with $p_t(1) = \exp(-r_t) = \exp(-\delta_0 - \delta_1^\top z_t)$ gives $\bar A_1 = -\delta_0$ and $\bar B_1 = -\delta_1$. @@ -496,7 +496,7 @@ where $A_n = -\bar A_n / n$ and $B_n = -\bar B_n / n$. This is the defining property of affine term structure models. -We now implement the bond pricing formulas {eq}`eq_riccati_A`, {eq}`eq_riccati_B`, +We now implement the bond pricing formulas {eq}`eq_riccati_a`, {eq}`eq_riccati_b`, and {eq}`eq_yield`. ```{code-cell} ipython3 @@ -545,8 +545,8 @@ the range of short rates the model generates via $r_t = \delta_0 + \delta_1 z_t$ C = np.array([[1.0]]) δ_0 = 0.01 # 1%/quarter ≈ 4% p.a. δ_1 = np.array([0.001]) -λ_0 = np.array([0.05]) -λ_z = np.array([[-0.01]]) # countercyclical +λ_0 = np.array([-0.05]) +λ_z = np.array([[-0.01]]) model_1f = create_affine_model(μ, φ, C, δ_0, δ_1, λ_0, λ_z) ``` @@ -556,6 +556,12 @@ model_1f = create_affine_model(μ, φ, C, δ_0, δ_1, λ_0, λ_z) We compute yield curves $y_t(n)$ across a range of short-rate states $z_t$. ```{code-cell} ipython3 +--- +mystnb: + figure: + caption: Yield curves under the one-factor affine model + name: fig-yield-curves-1f +--- n_max_1f = 60 maturities_1f = np.arange(1, n_max_1f + 1) @@ -594,7 +600,6 @@ ax.axhline(y_inf, color='black', ls='--', lw=1.2, alpha=0.7, ax.set_xlabel("Maturity (quarters)") ax.set_ylabel("Yield (% per annum)") -ax.set_title("Yield Curves — One-Factor Affine Model") ax.legend(fontsize=10, loc='best') ax.set_xlim(1, n_max_1f) @@ -609,11 +614,11 @@ plt.tight_layout() plt.show() ``` -When the short rate is low, the yield curve curve is +When the short rate is low, the yield curve is upward-sloping, while when the short rate is high, it is downward-sloping. All three curves converge to the same long-run yield $y_\infty$ at long -maturities, and the long-run yield lies below the mean short rate +maturities, and the long-run yield lies above the mean short rate $\delta_0$. ````{exercise} @@ -631,12 +636,12 @@ y_\infty ``` where $\bar B_\infty = -(I - (\phi - C\lambda_z)^\top)^{-1} \delta_1$ -is the fixed point of the recursion {eq}`eq_riccati_B`. +is the fixed point of the recursion {eq}`eq_riccati_b`. -Then explain why $y_\infty < \delta_0$ under this parameterization. +Then explain why $y_\infty > \delta_0$ under this parameterization. *Hint:* Use {eq}`eq_yield` and the Riccati equations -{eq}`eq_riccati_A`--{eq}`eq_riccati_B`. For the inequality, consider +{eq}`eq_riccati_a`--{eq}`eq_riccati_b`. For the inequality, consider each subtracted term separately. ```` @@ -645,9 +650,7 @@ each subtracted term separately. ``` -**Derivation of $y_\infty$.** - -The recursion {eq}`eq_riccati_B` is a linear difference equation $\bar B_{n+1} = (\phi - C\lambda_z)^\top \bar B_n - \delta_1$. +The recursion {eq}`eq_riccati_b` is a linear difference equation $\bar B_{n+1} = (\phi - C\lambda_z)^\top \bar B_n - \delta_1$. When $\phi - C\lambda_z$ has eigenvalues inside the unit circle, $\bar B_n$ converges to $\bar B_\infty = -(I - (\phi - C\lambda_z)^\top)^{-1} \delta_1$. @@ -655,25 +658,17 @@ Since $\bar B_\infty$ is finite, $\bar B_n^\top z_t / n \to 0$ in {eq}`eq_yield` To find this limit, write $\bar A_n = \bar A_1 + \sum_{k=1}^{n-1}(\bar A_{k+1} - \bar A_k)$. -By {eq}`eq_riccati_A`, each increment depends on $\bar B_k$, which converges to $\bar B_\infty$, so the increment converges to $L \equiv \bar B_\infty^\top(\mu - C\lambda_0) + \tfrac{1}{2}\bar B_\infty^\top CC^\top \bar B_\infty - \delta_0$. +By {eq}`eq_riccati_a`, each increment depends on $\bar B_k$, which converges to $\bar B_\infty$, so the increment converges to $L \equiv \bar B_\infty^\top(\mu - C\lambda_0) + \tfrac{1}{2}\bar B_\infty^\top CC^\top \bar B_\infty - \delta_0$. Therefore $\bar A_n / n \to L$ and $y_\infty = -L$, giving {eq}`eq_y_inf`. -**Why $y_\infty < \delta_0$.** - -Both subtracted terms in {eq}`eq_y_inf` are positive. - -The quadratic term satisfies $\tfrac{1}{2}\bar B_\infty^\top CC^\top \bar B_\infty = \tfrac{1}{2}\|C^\top \bar B_\infty\|^2 \geq 0$ always — a **convexity effect** from Jensen's inequality applied to the exponential bond-price formula. +To see why $y_\infty > \delta_0$, note that the two subtracted terms in {eq}`eq_y_inf` have opposite signs under this parameterization. -The linear term $\bar B_\infty^\top(\mu - C\lambda_0)$ is positive because both factors are negative. +The quadratic term $\tfrac{1}{2}\bar B_\infty^\top CC^\top \bar B_\infty = \tfrac{1}{2}\|C^\top \bar B_\infty\|^2 \geq 0$ always — a **convexity effect** from Jensen's inequality that pushes $y_\infty$ below $\delta_0$. -$\bar B_\infty < 0$ since $\delta_1 > 0$: a higher state raises the short rate, so bond prices load negatively on the state. +The linear term $\bar B_\infty^\top(\mu - C\lambda_0)$ is negative because $\bar B_\infty < 0$ (since $\delta_1 > 0$) while $\mu - C\lambda_0 > 0$ (since $\lambda_0 < 0$). Subtracting this negative quantity raises $y_\infty$ above $\delta_0$ — a **risk-premium effect**: positive term premiums tilt the average yield curve upward. -$\mu - C\lambda_0 < 0$ since $\lambda_0 > 0$: positive risk prices shift the risk-neutral drift below the physical drift. - -This is a **risk-premium effect**: compensating investors for interest-rate risk lowers the long-run yield. - -Together, these two effects push $y_\infty$ below $\delta_0$. +Under this parameterization the risk-premium effect dominates the convexity effect, so $y_\infty > \delta_0$. ```{solution-end} ``` @@ -682,6 +677,12 @@ Together, these two effects push $y_\infty$ below $\delta_0$. Let's also simulate the short rate path: ```{code-cell} ipython3 +--- +mystnb: + figure: + caption: Simulated short rate path + name: fig-simulated-short-rate +--- T = 200 Z = simulate(model_1f, np.array([0.0]), T) short_rates = np.array([short_rate(model_1f, Z[t]) * 4 * 100 @@ -697,7 +698,6 @@ ax.fill_between(quarters, short_rates, r_bar_pct, alpha=0.08, color=line.get_color()) ax.set_xlabel("Quarter") ax.set_ylabel("Short rate (% p.a.)") -ax.set_title("Simulated Short Rate") ax.set_xlim(0, T) ax.legend(fontsize=11) plt.tight_layout() @@ -729,19 +729,17 @@ affects the short rate with a smaller loading, capturing the **slope** of the yield curve. The off-diagonal entry $\phi_{12} = -0.03$ allows the level factor to -respond to slope innovations. +respond to the current slope state $z_{2t}$. The short rate is $r_t = \delta_0 + \delta_1^\top z_t$ with $\delta_1 = (0.002,\; 0.001)^\top$, so both factors raise the short rate when positive, but the level factor has twice the impact. Risk prices are $\lambda_t = \lambda_0 + \lambda_z z_t$ with +$\lambda_0 = (-0.01,\; -0.005)^\top$ and $\lambda_z = \text{diag}(-0.005,\, -0.003)$. -The negative diagonal entries mean that risk prices rise when -the state is low — investors demand higher compensation in bad states. - -As discussed above, this makes $\phi - C\lambda_z$ have larger +The negative diagonal entries of $\lambda_z$ make $\phi - C\lambda_z$ have larger eigenvalues than $\phi$, so the state is more persistent under the risk-neutral measure and the yield curve is more sensitive to the current state at long horizons. @@ -754,7 +752,7 @@ current state at long horizons. C_2 = np.eye(2) δ_0_2 = 0.01 δ_1_2 = np.array([0.002, 0.001]) -λ_0_2 = np.array([0.01, 0.005]) +λ_0_2 = np.array([-0.01, -0.005]) λ_z_2 = np.array([[-0.005, 0.0], [ 0.0, -0.003]]) @@ -765,6 +763,12 @@ print(f"Eigenvalues of φ - Cλ_z: {eigvals(model_2f.φ_rn).real.round(4)}") ``` ```{code-cell} ipython3 +--- +mystnb: + figure: + caption: Yield curves and factor loadings under the two-factor model + name: fig-yield-curves-2f +--- n_max_2f = 60 maturities_2f = np.arange(1, n_max_2f + 1) @@ -785,7 +789,6 @@ for label, z in states.items(): ax1.set_xlabel("Maturity (quarters)") ax1.set_ylabel("Yield (% p.a.)") -ax1.set_title("Yield Curves — Two-Factor Model") ax1.legend(fontsize=10) ax1.set_xlim(1, n_max_2f) @@ -800,7 +803,6 @@ ax2.plot(ns, B_n[:, 1], lw=2.2, ax2.axhline(0, color='black', lw=0.6) ax2.set_xlabel("Maturity (quarters)") ax2.set_ylabel(r"Yield loading $B_{n,k}$") -ax2.set_title("Factor Loadings on Yields") ax2.legend(fontsize=11) ax2.set_xlim(1, n_max_2f) @@ -817,25 +819,121 @@ plt.show() ## Risk premiums -A key object in the affine term structure model is the **term premium** — the extra -expected return on a long-term bond relative to rolling over short-term bonds. +A key object in the affine term structure model is the **term premium** — the +expected excess return on a long-term bond relative to rolling over short-term bonds. -For an $(n+1)$-period bond held for one period, the excess log return is -approximately +For an $(n+1)$-period bond held for one period, the shock loading is +$\alpha_n = C^\top \bar B_n$, so {eq}`eq_excess` gives $$ -\mathbb{E}_t\left[\log R_{t+1}^{(n+1)}\right] - r_t \;=\; -\bar B_n^\top C \lambda_t +\log \mathbb{E}_t R_{t+1}^{(n+1)} - r_t \;=\; \bar B_n^\top C \lambda_t $$ -That is, the term premium equals (minus) the product of the bond's exposure to -the shocks $(-\bar B_n^\top C)$ with the risk prices $\lambda_t$. +The term premium equals the inner product of the bond's shock exposure +$\bar B_n^\top C$ with the risk price vector $\lambda_t$. + +To understand the sign of the term premium, note that when $\delta_1 > 0$ +a positive shock $\varepsilon_{t+1}$ raises the short rate and lowers +long-bond prices, so the bond shock loading +$\alpha_n = C^\top \bar B_n$ is negative. + +A negative $\lambda_0$ then means the stochastic discount factor +$m_{t+1}$ loads positively on $\varepsilon_{t+1}$, i.e. the SDF is +high in states where interest rates rise and bond prices fall. + +This makes $\text{Cov}(m_{t+1}, R_{t+1}^{(n+1)}) < 0$, so long bonds +are risky and must offer a positive term premium to compensate +investors — algebraically, $\bar B_n < 0$ and $C\lambda_0 < 0$ combine +to give $\bar B_n^\top C \lambda_0 > 0$. + +```{exercise} +:label: arp_ex5 + +Derive the term premium formula above by computing the one-period holding +return on an $(n+1)$-period bond and identifying its shock loading. + +*Hint:* Use $R_{t+1}^{(n+1)} = p_{t+1}(n)/p_t(n+1)$ with +$\log p_t(n) = \bar A_n + \bar B_n^\top z_t$, substitute the state +dynamics {eq}`eq_var`, and apply the Riccati equations +{eq}`eq_riccati_a`--{eq}`eq_riccati_b` to simplify. +``` + +```{solution-start} arp_ex5 +:class: dropdown +``` + +The one-period holding return on an $(n+1)$-period bond is +$R_{t+1}^{(n+1)} = p_{t+1}(n)/p_t(n+1)$, so + +$$ +\log R_{t+1}^{(n+1)} = \bar A_n + \bar B_n^\top z_{t+1} - \bar A_{n+1} - \bar B_{n+1}^\top z_t +$$ + +Substituting $z_{t+1} = \mu + \phi z_t + C\varepsilon_{t+1}$ from {eq}`eq_var`: + +$$ += \underbrace{(\bar A_n + \bar B_n^\top \mu - \bar A_{n+1})}_{\text{constant}} + + \underbrace{(\bar B_n^\top \phi - \bar B_{n+1}^\top)}_{\text{loading on } z_t} z_t + + \underbrace{\bar B_n^\top C}_{\text{shock loading}}\, \varepsilon_{t+1} +$$ + +We now use the Riccati equations to simplify each piece. + +For the constant piece, {eq}`eq_riccati_a` gives +$\bar A_{n+1} = \bar A_n + \bar B_n^\top(\mu - C\lambda_0) + \tfrac{1}{2}\bar B_n^\top CC^\top \bar B_n - \delta_0$, so + +$$ +\bar A_n + \bar B_n^\top \mu - \bar A_{n+1} + = \bar B_n^\top C\lambda_0 - \tfrac{1}{2}\bar B_n^\top CC^\top \bar B_n + \delta_0 +$$ + +For the $z_t$ coefficient, {eq}`eq_riccati_b` gives +$\bar B_{n+1}^\top = \bar B_n^\top(\phi - C\lambda_z) - \delta_1^\top$, so + +$$ +\bar B_n^\top \phi - \bar B_{n+1}^\top = \bar B_n^\top C\lambda_z + \delta_1^\top +$$ + +Combining the pieces: + +$$ +\log R_{t+1}^{(n+1)} + = \underbrace{(\delta_0 + \delta_1^\top z_t)}_{r_t} + + \bar B_n^\top C\underbrace{(\lambda_0 + \lambda_z z_t)}_{\lambda_t} + - \tfrac{1}{2}\bar B_n^\top CC^\top \bar B_n + + \bar B_n^\top C\,\varepsilon_{t+1} +$$ + +Writing $\alpha_n = C^\top \bar B_n$, this takes the generic return form {eq}`eq_return`: + +$$ +\log R_{t+1}^{(n+1)} + = \underbrace{(r_t + \alpha_n^\top \lambda_t)}_{\nu_t} + - \tfrac{1}{2}\alpha_n^\top \alpha_n + + \alpha_n^\top \varepsilon_{t+1} +$$ + +Since $\mathbb{E}_t R_{t+1}^{(n+1)} = \exp(\nu_t)$, we obtain + +$$ +\log \mathbb{E}_t R_{t+1}^{(n+1)} - r_t = \alpha_n^\top \lambda_t = \bar B_n^\top C \lambda_t +$$ + +```{solution-end} +``` ```{code-cell} ipython3 +--- +mystnb: + figure: + caption: Term premiums and factor decomposition under the two-factor model + name: fig-term-premiums-2f +--- def term_premiums(model, z, n_max): - """Approximate term premiums for maturities 1 to n_max.""" + """Compute term premiums for maturities 1 to n_max.""" A_bar, B_bar = bond_coefficients(model, n_max + 1) λ_t = risk_prices(model, z) - return np.array([-B_bar[n] @ model.C @ λ_t + return np.array([B_bar[n-1] @ model.C @ λ_t for n in range(1, n_max + 1)]) n_max_tp = 60 @@ -859,8 +957,6 @@ for label, z in z_states_tp.items(): ax1.axhline(0, color="black", lw=0.8, ls="--") ax1.set_xlabel("Maturity (quarters)") ax1.set_ylabel("Term premium (% p.a.)") -ax1.set_title("Term Premiums — Two Regimes\n" - r"($\lambda_z < 0$: higher premiums when rates are low)") ax1.legend(fontsize=9) ax1.set_xlim(1, n_max_tp) @@ -869,9 +965,9 @@ A_bar_d, B_bar_d = bond_coefficients(model_2f, n_max_tp + 1) λ_t = risk_prices(model_2f, z_decomp) C_lam = model_2f.C @ λ_t -tp_level = np.array([-B_bar_d[n, 0] * C_lam[0] +tp_level = np.array([B_bar_d[n-1, 0] * C_lam[0] for n in range(1, n_max_tp + 1)]) * 4 * 100 -tp_slope = np.array([-B_bar_d[n, 1] * C_lam[1] +tp_slope = np.array([B_bar_d[n-1, 1] * C_lam[1] for n in range(1, n_max_tp + 1)]) * 4 * 100 tp_total = tp_level + tp_slope @@ -883,7 +979,6 @@ ax2.plot(maturities_tp, tp_slope, lw=1.8, ls="--", ax2.axhline(0, color="black", lw=0.6, ls=":") ax2.set_xlabel("Maturity (quarters)") ax2.set_ylabel("Term premium (% p.a.)") -ax2.set_title("Factor Decomposition at z = [0, 0]") ax2.legend(fontsize=10) ax2.set_xlim(1, n_max_tp) @@ -924,7 +1019,7 @@ With the risk-price vector $\lambda_t = \lambda_0 + \lambda_z z_t$ from {eq}`eq_riskprices`, define the non-negative random variable ```{math} -:label: eq_RN_ratio +:label: eq_rn_ratio \frac{\xi^Q_{t+1}}{\xi^Q_t} = \exp\!\left(-\tfrac{1}{2}\lambda_t^\top\lambda_t @@ -968,7 +1063,7 @@ nature uses to generate the data. Our key asset pricing equation is $\mathbb{E}^P_t m_{t+1} R_{j,t+1} = 1$ for all returns $R_{j,t+1}$. -Using {eq}`eq_RN_ratio`, we can express the SDF {eq}`eq_sdf` as +Using {eq}`eq_rn_ratio`, we can express the SDF {eq}`eq_sdf` as $$ m_{t+1} = \frac{\xi^Q_{t+1}}{\xi^Q_t}\,\exp(-r_t) @@ -980,7 +1075,7 @@ $\mathbb{E}^P_t\bigl(\exp(-r_t)\, is equivalent to ```{math} -:label: eq_Qpricing +:label: eq_qpricing \mathbb{E}^Q_t R_{j,t+1} = \exp(r_t) ``` @@ -1034,7 +1129,7 @@ for n, mc in zip(maturities_check, mc_prices): ``` The analytical and Monte Carlo bond prices agree closely, validating the -Riccati recursion {eq}`eq_riccati_A`–{eq}`eq_riccati_B`. +Riccati recursion {eq}`eq_riccati_a`–{eq}`eq_riccati_b`. ## Distorted beliefs @@ -1063,7 +1158,7 @@ To organize this evidence, let $\kappa_t = \kappa_0 + \kappa_z z_t$ and define the likelihood ratio ```{math} -:label: eq_Srat +:label: eq_srat \frac{\xi^S_{t+1}}{\xi^S_t} = \exp\!\left(-\tfrac{1}{2}\kappa_t^\top\kappa_t @@ -1111,7 +1206,7 @@ $$ where $r^\star_t$ is the short rate and $\lambda^\star_t$ is the agent's vector of risk prices. -Using {eq}`eq_Srat` to convert to the physical measure, the subjective +Using {eq}`eq_srat` to convert to the physical measure, the subjective pricing equation becomes $$ @@ -1157,10 +1252,21 @@ we see that what the econometrician interprets as $\lambda_t$ is actually $\lambda^\star_t + \kappa_t$. Because the econometrician's estimates partly reflect systematic -distortions in subjective beliefs, they overstate the representative -agent's true risk prices $\lambda^\star_t$. +distortions in subjective beliefs, they can overstate the representative +agent's true risk prices $\lambda^\star_t$ in this calibration. -### Numerical illustration +Below we construct a numerical example to illustrate this point. + +We start with the two-factor model from above, which we take as the true data-generating process. + +We then set the subjective parameters $\check\mu, \check\phi$ to match the evidence in +{cite:t}`piazzesi2015trend` that experts behave as if the level and slope of the yield curve are more persistent than under the physical measure. + +In particular, we use + +$$ +\check\phi = \begin{pmatrix} 0.985 & -0.025 \\ 0.00 & 0.94 \end{pmatrix} +$$ ```{code-cell} ipython3 φ_P = φ_2.copy() @@ -1168,12 +1274,12 @@ agent's true risk prices $\lambda^\star_t$. # Subjective parameters: experts believe factors are MORE persistent φ_S = np.array([[0.985, -0.025], [0.00, 0.94]]) -μ_S = np.array([-0.005, 0.0]) +μ_S = np.array([0.005, 0.0]) κ_z = np.linalg.solve(C_2, φ_P - φ_S) κ_0 = np.linalg.solve(C_2, μ_P - μ_S) -λ_star_0 = np.array([0.03, 0.015]) +λ_star_0 = np.array([-0.03, -0.015]) λ_star_z = np.array([[-0.006, 0.0], [0.0, -0.004]]) λ_hat_0 = λ_star_0 + κ_0 @@ -1181,6 +1287,12 @@ agent's true risk prices $\lambda^\star_t$. ``` ```{code-cell} ipython3 +--- +mystnb: + figure: + caption: True vs. distorted-belief term premiums and overstatement ratio + name: fig-distorted-beliefs +--- model_true = create_affine_model( μ_2, φ_2, C_2, δ_0_2, δ_1_2, λ_star_0, λ_star_z) model_econ = create_affine_model( @@ -1206,7 +1318,6 @@ ax1.fill_between(maturities_db, tp_true, tp_econ, ax1.axhline(0, color="black", lw=0.8, ls=":") ax1.set_xlabel("Maturity (quarters)") ax1.set_ylabel("Term premium (% p.a.)") -ax1.set_title("True vs. Distorted-Belief Term Premiums") ax1.legend(fontsize=9.5) ax1.set_xlim(1, n_max_db) @@ -1219,7 +1330,6 @@ ax2.axhline(1, color="black", lw=0.8, ls="--", label="No distortion (ratio = 1)") ax2.set_xlabel("Maturity (quarters)") ax2.set_ylabel(r"$\hat{tp}\, /\, tp^\star$") -ax2.set_title("Overstatement Ratio from Ignoring Belief Bias") ax2.legend(fontsize=11) ax2.set_xlim(1, n_max_db) From 9693a0d06c92c50e469c8272326414fbd848d280 Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Wed, 11 Mar 2026 22:54:49 +1100 Subject: [PATCH 04/18] updates --- lectures/affine_risk_prices.md | 84 ++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 28 deletions(-) diff --git a/lectures/affine_risk_prices.md b/lectures/affine_risk_prices.md index 0c846cdbb..5f07fdac2 100644 --- a/lectures/affine_risk_prices.md +++ b/lectures/affine_risk_prices.md @@ -40,7 +40,7 @@ $$ where $r_t = \rho + \gamma\mu - \frac{1}{2}\sigma_c^2\gamma^2$. This model asserts that exposure to the random part of aggregate consumption growth, -$\sigma_c\varepsilon_{t+1}$, is the *only* priced risk — the sole source of discrepancies +$\sigma_c\varepsilon_{t+1}$, is the *only* priced risk, the sole source of discrepancies among expected returns across assets. Empirical difficulties with this specification (the equity premium puzzle, the @@ -59,11 +59,11 @@ Instead, it Key applications we study include: -1. *Pricing risky assets* — how risk prices and exposures determine excess returns. -1. *Affine term structure models* — bond yields as affine functions of a state vector +1. *Pricing risky assets*: how risk prices and exposures determine excess returns. +1. *Affine term structure models*: bond yields as affine functions of a state vector ({cite:t}`AngPiazzesi2003`). -1. *Risk-neutral probabilities* — a change-of-measure representation of the pricing equation. -1. *Distorted beliefs* — reinterpreting risk price estimates when agents hold systematically +1. *Risk-neutral probabilities*: a change-of-measure representation of the pricing equation. +1. *Distorted beliefs*: reinterpreting risk price estimates when agents hold systematically biased forecasts ({cite:t}`piazzesi2015trend`); see also {doc}`Risk Aversion or Mistaken Beliefs? `. We start with the following imports: @@ -103,8 +103,8 @@ Here * $\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ is an i.i.d. $m \times 1$ random vector, * $z_t$ is an $m \times 1$ state vector. -Equation {eq}`eq_shortrate` says that the **short rate** $r_t$ — the net yield on a -one-period risk-free claim — is an affine function of the state $z_t$. +Equation {eq}`eq_shortrate` says that the **short rate** $r_t$, the net yield on a +one-period risk-free claim, is an affine function of the state $z_t$. *Component 2* is a vector of **risk prices** $\lambda_t$ and an associated stochastic discount factor $m_{t+1}$: @@ -255,7 +255,7 @@ The first equation confirms that $r_t$ is the net yield on a risk-free one-perio That is why $r_t$ is called **the short rate** in the exponential quadratic literature. The second equation says that the conditional standard deviation of the SDF -is approximately the magnitude of the vector of risk prices — a measure of overall +is approximately the magnitude of the vector of risk prices, a measure of overall **market price of risk**. ## Pricing risky assets @@ -411,7 +411,9 @@ by substituting the conjectured bond price {eq}`eq_bondprice` into the pricing recursion {eq}`eq_bondrecur` and matching coefficients. *Hint:* Substitute $p_{t+1}(n) = \exp(\bar A_n + \bar B_n^\top z_{t+1})$ and -$\log m_{t+1}$ from {eq}`eq_sdf` into {eq}`eq_bondrecur`. Use the state +$\log m_{t+1}$ from {eq}`eq_sdf` into {eq}`eq_bondrecur`. + +Use the state dynamics {eq}`eq_var` to express $z_{t+1}$ in terms of $z_t$ and $\varepsilon_{t+1}$, then evaluate the conditional expectation using the lognormal moment generating function. @@ -664,9 +666,13 @@ Therefore $\bar A_n / n \to L$ and $y_\infty = -L$, giving {eq}`eq_y_inf`. To see why $y_\infty > \delta_0$, note that the two subtracted terms in {eq}`eq_y_inf` have opposite signs under this parameterization. -The quadratic term $\tfrac{1}{2}\bar B_\infty^\top CC^\top \bar B_\infty = \tfrac{1}{2}\|C^\top \bar B_\infty\|^2 \geq 0$ always — a **convexity effect** from Jensen's inequality that pushes $y_\infty$ below $\delta_0$. +The quadratic term $\tfrac{1}{2}\bar B_\infty^\top CC^\top \bar B_\infty = \tfrac{1}{2}\|C^\top \bar B_\infty\|^2 \geq 0$ always. + +This is a **convexity effect** from Jensen's inequality that pushes $y_\infty$ below $\delta_0$. + +The linear term $\bar B_\infty^\top(\mu - C\lambda_0)$ is negative because $\bar B_\infty < 0$ (since $\delta_1 > 0$) while $\mu - C\lambda_0 > 0$ (since $\lambda_0 < 0$). Subtracting this negative quantity raises $y_\infty$ above $\delta_0$. -The linear term $\bar B_\infty^\top(\mu - C\lambda_0)$ is negative because $\bar B_\infty < 0$ (since $\delta_1 > 0$) while $\mu - C\lambda_0 > 0$ (since $\lambda_0 < 0$). Subtracting this negative quantity raises $y_\infty$ above $\delta_0$ — a **risk-premium effect**: positive term premiums tilt the average yield curve upward. +This is a **risk-premium effect**: positive term premiums tilt the average yield curve upward. Under this parameterization the risk-premium effect dominates the convexity effect, so $y_\infty > \delta_0$. @@ -762,6 +768,10 @@ print(f"Eigenvalues of φ: {eigvals(φ_2).real.round(4)}") print(f"Eigenvalues of φ - Cλ_z: {eigvals(model_2f.φ_rn).real.round(4)}") ``` +This confirms that the eigenvalues of $\phi - C\lambda_z$ are larger than those of $\phi$, so the state is more persistent under the risk-neutral measure. + +The following figure shows yield curves across different states of the world, as well as the factor loadings $B_{n,1}$ and $B_{n,2}$ that determine how yields load on the level and slope factors at each maturity + ```{code-cell} ipython3 --- mystnb: @@ -817,9 +827,11 @@ plt.tight_layout() plt.show() ``` +We can see that the level factor dominates at long maturities. + ## Risk premiums -A key object in the affine term structure model is the **term premium** — the +A key object in the affine term structure model is the **term premium**, the expected excess return on a long-term bond relative to rolling over short-term bonds. For an $(n+1)$-period bond held for one period, the shock loading is @@ -832,19 +844,31 @@ $$ The term premium equals the inner product of the bond's shock exposure $\bar B_n^\top C$ with the risk price vector $\lambda_t$. -To understand the sign of the term premium, note that when $\delta_1 > 0$ -a positive shock $\varepsilon_{t+1}$ raises the short rate and lowers -long-bond prices, so the bond shock loading +Because the term premium equals $\bar B_n^\top C \lambda_t$, its sign +depends on the *current* risk-price vector $\lambda_t$, which is +state-dependent whenever $\lambda_z \neq 0$. + +To see this more concretely, consider a state where $C\lambda_t$ is negative +componentwise (for example, $z_t = 0$ in our calibration below). + +When $\delta_1 > 0$, a positive shock $\varepsilon_{t+1}$ raises the +short rate and lowers long-bond prices, so the bond shock loading $\alpha_n = C^\top \bar B_n$ is negative. -A negative $\lambda_0$ then means the stochastic discount factor +A negative $C\lambda_t$ then means the stochastic discount factor $m_{t+1}$ loads positively on $\varepsilon_{t+1}$, i.e. the SDF is high in states where interest rates rise and bond prices fall. -This makes $\text{Cov}(m_{t+1}, R_{t+1}^{(n+1)}) < 0$, so long bonds -are risky and must offer a positive term premium to compensate -investors — algebraically, $\bar B_n < 0$ and $C\lambda_0 < 0$ combine -to give $\bar B_n^\top C \lambda_0 > 0$. +This makes $\text{Cov}_t(m_{t+1}, R_{t+1}^{(n+1)}) < 0$, so long bonds +are risky and carry a positive term premium. + +Algebraically, $\bar B_n < 0$ and $C\lambda_t < 0$ combine +to give $\bar B_n^\top C \lambda_t > 0$. + +In other states, however, $\lambda_t$ may change sign (e.g. the +first component flips in the low-rate regime of our two-state +calibration), and long-bond term premiums can become negative at +longer maturities. ```{exercise} :label: arp_ex5 @@ -922,6 +946,8 @@ $$ ```{solution-end} ``` +The following figure plots term premiums across maturities for different states of the world, as well as the level and slope factor contributions to the term premium in the normal state + ```{code-cell} ipython3 --- mystnb: @@ -940,8 +966,8 @@ n_max_tp = 60 maturities_tp = np.arange(1, n_max_tp + 1) z_states_tp = { - "Low rate (z₁ < 0)": np.array([-3.0, 2.0]), - "High rate (z₁ > 0)": np.array([3.0, -2.0]), + "Low rate ($z_1 < 0$)": np.array([-3.0, 2.0]), + "High rate ($z_1 > 0$)": np.array([3.0, -2.0]), } fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5.5)) @@ -993,6 +1019,8 @@ plt.tight_layout() plt.show() ``` +We see that the term premium is positive at all maturities in the low-rate state, but becomes negative at longer maturities in the high-rate state. + ## Risk-neutral probabilities We return to the VAR and short-rate equations @@ -1257,7 +1285,7 @@ agent's true risk prices $\lambda^\star_t$ in this calibration. Below we construct a numerical example to illustrate this point. -We start with the two-factor model from above, which we take as the true data-generating process. +We keep the same physical state dynamics and short-rate specification as above, but choose a separate true risk-price process $(\lambda_t^\star)$ and a distorted-belief econometrician process $(\hat\lambda_t)$ to illustrate the decomposition. We then set the subjective parameters $\check\mu, \check\phi$ to match the evidence in {cite:t}`piazzesi2015trend` that experts behave as if the level and slope of the yield curve are more persistent than under the physical measure. @@ -1349,7 +1377,7 @@ than $\phi$), the rational-expectations econometrician attributes too much of the observed risk premium to risk aversion. Disentangling belief distortions from genuine risk prices requires additional -data — for example, the survey forecasts used by +data, for example, the survey forecasts used by {cite:t}`piazzesi2015trend`. Our {doc}`Risk Aversion or Mistaken Beliefs? ` lecture @@ -1362,14 +1390,14 @@ framework for studying asset prices. Key features are: -1. **Analytical tractability** — Bond prices are exponential affine in $z_t$; +1. **Analytical tractability:** Bond prices are exponential affine in $z_t$; expected returns decompose cleanly into a short rate plus a risk-price×exposure inner product. -2. **Empirical flexibility** — The free parameters $(\mu, \phi, C, \delta_0, \delta_1, \lambda_0, \lambda_z)$ +2. **Empirical flexibility:** The free parameters $(\mu, \phi, C, \delta_0, \delta_1, \lambda_0, \lambda_z)$ can be estimated by maximum likelihood (the {doc}`Kalman filter ` chapter describes the relevant methods) without imposing restrictions from a full general equilibrium model. -3. **Multiple risks** — The vector structure accommodates many sources of risk (monetary +3. **Multiple risks:** The vector structure accommodates many sources of risk (monetary policy, real activity, volatility, etc.). -4. **Belief distortions** — The framework naturally accommodates non-rational beliefs via +4. **Belief distortions:** The framework naturally accommodates non-rational beliefs via likelihood-ratio twists of the physical measure, as in {cite:t}`piazzesi2015trend`. From 84a700bde3ba50ca33db542d3eed5d113dd8e3b7 Mon Sep 17 00:00:00 2001 From: thomassargent30 Date: Wed, 11 Mar 2026 14:01:07 -0400 Subject: [PATCH 05/18] Tom's light edits of affine lecture --- lectures/affine_risk_prices.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lectures/affine_risk_prices.md b/lectures/affine_risk_prices.md index 5f07fdac2..e17231b32 100644 --- a/lectures/affine_risk_prices.md +++ b/lectures/affine_risk_prices.md @@ -48,8 +48,10 @@ risk-free rate puzzle, and the Hansen-Jagannathan bounds discussed in {doc}`Doubts or Variability? `) motivate the alternative approach described in this lecture. +Put bluntly, the model to be studied in this lecture declares the Lucas asset pricing model's stochastic discount factor to be a failure. + The **affine model** maintains $\mathbb{E}(m_{t+1}R_{j,t+1}) = 1$ but *divorces* the -stochastic discount factor from consumption risk. +stochastic discount factor from consumption risk, and consequently, from much of macroeconomics too. Instead, it @@ -57,13 +59,18 @@ Instead, it * uses overidentifying restrictions from $\mathbb{E}(m_{t+1}R_{j,t+1}) = 1$ applied to $N$ assets to let the data reveal risks and their prices. +```{note} +Researchers including {cite}`bansal2004risks` and {cite}`hansen2008consumption` have been less willing +to give up on consumption-based models of the stochastic discount factor. +``` + Key applications we study include: 1. *Pricing risky assets*: how risk prices and exposures determine excess returns. -1. *Affine term structure models*: bond yields as affine functions of a state vector +2. *Affine term structure models*: bond yields as affine functions of a state vector ({cite:t}`AngPiazzesi2003`). -1. *Risk-neutral probabilities*: a change-of-measure representation of the pricing equation. -1. *Distorted beliefs*: reinterpreting risk price estimates when agents hold systematically +3. *Risk-neutral probabilities*: a change-of-measure representation of the pricing equation. +4. *Distorted beliefs*: reinterpreting risk price estimates when agents hold systematically biased forecasts ({cite:t}`piazzesi2015trend`); see also {doc}`Risk Aversion or Mistaken Beliefs? `. We start with the following imports: From ecc85d100fa8c0af4fa6fbdd85de9d6abead34fb Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Thu, 12 Mar 2026 16:36:54 +1100 Subject: [PATCH 06/18] updates --- lectures/risk_aversion_or_mistaken_beliefs.md | 56 ++++++++++++++----- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/lectures/risk_aversion_or_mistaken_beliefs.md b/lectures/risk_aversion_or_mistaken_beliefs.md index e9c93f832..9374ab404 100644 --- a/lectures/risk_aversion_or_mistaken_beliefs.md +++ b/lectures/risk_aversion_or_mistaken_beliefs.md @@ -201,7 +201,7 @@ y_{t+1} = D\,x_t + G\,\varepsilon_{t+1} ``` where $y_{t+1}$ collects utility-relevant variables (e.g., consumption growth), -$r_t = \bar{r}\,x_t$ is the risk-free one-period interest rate, and +$r_t = \delta_0 + \bar{r}\,x_t$ is the risk-free one-period interest rate, and $d_t = \bar{d}\,x_t$ is the payout process from an asset. ```{figure} /_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fig2_tom.png @@ -226,7 +226,7 @@ zero-coupon risk-free claim to one dollar at time $t+n$ as: ```{math} :label: eq_rn_recursion -p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,E_t\,p_{t+1}(n), \qquad p_t(n) = \exp(B_n\,x_t) +p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,E_t\,p_{t+1}(n), \qquad p_t(n) = \exp(\bar{A}_n + B_n\,x_t) ``` These formulas work "pretty well" for conditional means but less well for @@ -234,6 +234,8 @@ conditional variances — the Shiller *volatility puzzles*. ### Modern asset pricing: adding risk aversion +It would be convenient if versions of the same pricing formulas worked even when investors are risk averse or hold distorted beliefs — the likelihood ratio makes this possible. + Let the likelihood ratio increment be ```{math} @@ -265,7 +267,7 @@ For the term structure (Dai–Singleton–Backus–Zin): ```{math} :label: eq_ts_lr -p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,E_t\bigl(m_{t+1}^\lambda\,p_{t+1}(n)\bigr), \qquad p_t(n) = \exp(B_n\,x_t) +p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,E_t\bigl(m_{t+1}^\lambda\,p_{t+1}(n)\bigr), \qquad p_t(n) = \exp(\bar{A}_n + B_n\,x_t) ``` ### Risk-neutral dynamics @@ -294,7 +296,7 @@ $$ Under the risk-neutral dynamics, the term structure theory becomes: $$ -p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,\tilde{E}_t\,p_{t+1}(n), \qquad p_t(n) = \exp(\tilde{B}_n\,x_t) +p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,\tilde{E}_t\,p_{t+1}(n), \qquad p_t(n) = \exp(\tilde{\bar{A}}_n + \tilde{B}_n\,x_t) $$ These are the same formulas as rational-expectations asset pricing, but @@ -468,6 +470,8 @@ plt.tight_layout() plt.show() ``` +Both factors are more persistent under the risk-neutral measure $Q$ than under the physical measure $P$, because $A_Q = A - C\Lambda$ has eigenvalues closer to unity when risk prices $\Lambda$ shift the dynamics. + ## An identification challenge The vector $\lambda_t$ can be interpreted as either: @@ -476,8 +480,7 @@ The vector $\lambda_t$ can be interpreted as either: - the representative agent's **belief distortion** relative to the econometrician's model. -The asset pricing formulas {eq}`eq_stock_lr`–{eq}`eq_ts_lr` are identical under both -interpretations, and so are the econometric fits. +Because the pricing formulas {eq}`eq_stock_lr`–{eq}`eq_ts_lr` depend only on the composite $\lambda_t$ — not on whether it reflects risk aversion or belief distortion — the two interpretations produce identical asset prices and econometric fits. > Relative to the model of a risk-averse representative investor with rational > expectations, a model of a risk-neutral investor with appropriately mistaken @@ -615,6 +618,9 @@ PSS find that experts perceive the level and slope of the yield curve to be *mor Subjective risk prices $\lambda^* x_t$ vary less than the $\lambda x_t$ estimated by the rational-expectations econometrician. +However, PSS offer no explanation for *why* beliefs are distorted — are they mistakes, ignorance of good econometrics, or something else? + +The next two sections address this question: first by reviewing why rational expectations may be a poor approximation, and then by developing a robust control theory that *rationalises* belief distortions as optimal responses to model uncertainty. ## Rationalizing rational expectations @@ -645,6 +651,7 @@ An agent who is like a good econometrician: - fears that one of those other models actually prevails, and - seeks "good enough" decisions under *all* such alternative models — **robustness**. +Robust control theory formalises this idea by having the agent optimally distort probability assessments toward a worst-case scenario, producing belief distortions that look like the "mistakes" identified by PSS but that arise from a coherent response to model uncertainty rather than from ignorance. ## A theory of belief distortions: robust control @@ -707,7 +714,11 @@ Discounted entropy ball around the econometrician's model. Discounted entropy includes models that undiscounted entropy excludes. -Undiscounted entropy over infinite sequences excludes many models that are very difficult to distinguish from the econometrician's model with limited data, because undiscounted entropy includes only models that share laws of large numbers. +Undiscounted entropy over infinite sequences requires alternative models to share the same long-run averages as the baseline, thereby excluding models that differ only in persistent, low-frequency dynamics. + +But those persistent alternatives are precisely the models that are hardest to distinguish from the econometrician's model with finite data and that matter most for pricing long-lived assets. + +Discounted entropy, by treating future divergences less severely, admits these statistically elusive but economically important alternatives into the set of models that the dubious agent contemplates. ### Entropy and the likelihood ratio @@ -743,7 +754,7 @@ $$ ### Outcome: constant worst-case distortion -The worst-case mean distortion turns out to be a *constant vector*: +Because the econometrician's model is linear Gaussian and the entropy constraint is a scalar bound $\eta$, the worst-case mean distortion turns out to be a *constant vector*: $$ w_t = \bar{w} @@ -751,7 +762,9 @@ $$ The consequence is that the contribution of $w_t$ to risk prices is *state-independent*. -This does *not* help explain countercyclical prices of risk (or prices of model uncertainty). +This does *not* help explain countercyclical prices of risk (or prices of model uncertainty) — motivating the more refined "tilted" entropy ball in the next section. + +We compute $\bar{w}$ using the multiplier formulation (see {ref}`the multiplier preferences section below `), in which the parameter $\theta$ penalises entropy: larger $\theta$ means less concern about misspecification. ```{code-cell} ipython3 def hansen_worst_case(A, C, D, G, β, θ): @@ -794,6 +807,8 @@ The inclusion of those alternative parametric models *tilts* the entropy ball, which affects the worst-case model in a way that can produce countercyclical uncertainty prices. +"Tilting" means replacing the constant entropy bound $\eta$ with a state-dependent bound $\xi(x_t)$ that is larger in states where the feared parametric alternative deviates more from the baseline. + ### Concern about other parametric models The investor wants to include particular alternative models with @@ -822,14 +837,13 @@ This sets the stage for *state-dependent* mean distortions in the worst-case mod ### Concern about bigger long-run risk -Inspired by {cite:t}`Bansal_Yaron_2004`, an agent fears particular long-run risks -expressed by +Inspired by {cite:t}`Bansal_Yaron_2004`, an agent fears that the true state dynamics are more persistent than the econometrician's model implies, expressed by $$ x_{t+1} = \bar{A}\,x_t + C\,\tilde\varepsilon_{t+1} $$ -This corresponds to $\bar{w}_t = \bar{w}\,x_t$ with +Since $\bar{A}x_t = Ax_t + C(-C^{-1}(\bar{A}-A))x_t = Ax_t - C\bar{w}x_t$, this feared model is equivalent to shifting the mean of $\varepsilon_{t+1}$ by $-\bar{w}x_t$, giving $\bar{w}_t = \bar{w}\,x_t$ with $$ \bar{w} = -C^{-1}(\bar{A} - A) @@ -849,7 +863,7 @@ Tilted discounted entropy balls. Including particular parametric alternatives wi ### The Szőke agent's sequence problem -The resulting linear-quadratic problem is: +Attaching a Lagrange multiplier $\tilde\theta \geq 0$ to the tilted entropy constraint {eq}`eq_tilted_constraint` yields the following linear-quadratic problem: ```{math} :label: eq_szoke_seq @@ -984,7 +998,7 @@ The key innovation of the tilted entropy ball is visible: the Szőke worst-case When the state is far from its mean, the agent's worst-case model deviates more from the econometrician's model. -By contrast, Hansen's constant distortion $\bar{w}$ contributes nothing state-dependent. +By contrast, Hansen's constant distortion $\bar{w}$ has entropy $\frac{1}{2}\bar{w}'\bar{w}$ that does not vary with $x_t$ (shown at zero in the plot to emphasise the absence of state dependence). The Szőke parabola lies inside the feared model's entropy budget $\frac{1}{2}\xi(x_t)$, confirming the worst-case distortion respects the tilted entropy constraint. @@ -1027,6 +1041,7 @@ plt.tight_layout() plt.show() ``` +Each twister shifts the econometrician's $\mathcal{N}(0,1)$ density to the left by a different amount, reflecting its respective source of pessimism about future shocks. ## Empirical challenges and model performances @@ -1114,6 +1129,8 @@ As {cite:t}`szoke2022estimating` puts it: ### Szőke's empirical strategy +In the Szőke framework, the rational-expectations econometrician's single likelihood ratio $m_{t+1}^\lambda$ is decomposed into two multiplicative components: a worst-case belief distortion $m_{t+1}^{\tilde{w}}$ and a residual risk price $m_{t+1}^{\tilde{\lambda}}$, paralleling the PSS decomposition $\lambda = \lambda^* + w^*$. + **Stage I: Estimation** 1. Use $\{x_t, c_t\}_{t=0}^T$ to estimate the econometrician's $A$, $C$, $D$, $G$. @@ -1167,8 +1184,13 @@ print(f"\nWorst-case model is {status} " f"the econometrician's model.") ``` +The Szőke worst-case model has lower discounted entropy than the feared long-run risk model, meaning it is statistically harder to distinguish from the econometrician's baseline — yet it still generates the state-dependent uncertainty prices needed to match term-structure dynamics. + +(mult_pref_section)= ## Multiplier preferences +The constraint formulation {eq}`eq_hansen_seq` bounds discounted entropy by $\eta$, but an equivalent **multiplier** formulation replaces the constraint with a penalty term weighted by a Lagrange multiplier $\theta$. + The **multiplier preference** version of the dubious agent's problem is: ```{math} @@ -1206,12 +1228,16 @@ $$ W(x_t, c_t \mid \tilde\theta) = J(x_t, c_t \mid \eta) + \tilde\theta\,\eta $$ +Each choice of $\tilde\theta$ in the multiplier problem corresponds to a particular entropy bound $\eta$ in the constraint problem, so the two formulations are equivalent. + +The operator $T_t$ defined above is a **risk-sensitivity operator** that maps the continuation value through an exponential tilt, downweighting good outcomes and upweighting bad ones. + ```{code-cell} ipython3 def T_operator(V, θ, probs=None): """Risk-sensitivity operator: T[V] = -θ log E[exp(-V/θ)].""" if probs is None: probs = np.ones(len(V)) / len(V) - V_s = V / θ + V_s = -V / θ max_v = np.max(V_s) return -θ * (max_v + np.log(np.sum(probs * np.exp(V_s - max_v)))) From b5a77f733ef7b3aae6809ecef9b05830b155ff69 Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Fri, 13 Mar 2026 08:07:21 +1100 Subject: [PATCH 07/18] updates --- lectures/risk_aversion_or_mistaken_beliefs.md | 379 +++++++++++++----- 1 file changed, 284 insertions(+), 95 deletions(-) diff --git a/lectures/risk_aversion_or_mistaken_beliefs.md b/lectures/risk_aversion_or_mistaken_beliefs.md index 9374ab404..e28b73382 100644 --- a/lectures/risk_aversion_or_mistaken_beliefs.md +++ b/lectures/risk_aversion_or_mistaken_beliefs.md @@ -22,8 +22,7 @@ kernelspec: ## Overview -This lecture explores how *risk aversion* and *mistaken beliefs* are -confounded in asset pricing data. +This lecture explores how *risk aversion* and *mistaken beliefs* are confounded in asset pricing data. In a rational expectations equilibrium containing a risk-averse representative investor, higher mean returns compensate for higher risks. @@ -33,17 +32,14 @@ Wrong beliefs contribute what look like "stochastic discount factor shocks" when Those different perspectives can potentially explain observed countercyclical risk prices. -We organize a discussion of these ideas around a single mathematical device, namely, a **likelihood ratio**, -a non-negative random variable with unit mean that twists one probability -distribution into another. +We organize a discussion of these ideas around a single mathematical device, namely, a **likelihood ratio**, a non-negative random variable with unit mean that twists one probability distribution into another. -Likelihood ratios — equivalently, multiplicative martingale increments — appear -in at least four distinct roles in modern asset pricing: +Likelihood ratios — equivalently, multiplicative martingale increments — appear in at least four distinct roles in modern asset pricing: | Probability | Likelihood ratio | Describes | |:--------------|:----------------------------------|:----------------------| -| Econometric | $1$ | macro risk factors | -| Risk neutral | $m_{t+1}^\lambda$ | prices of risks | +| Econometric | $1$ (no twist) | macro risk factors | +| Risk neutral | $m_{t+1}^\Lambda$ | prices of risks | | Mistaken | $m_{t+1}^w$ | experts' forecasts | | Doubtful | $m_{t+1} \in \mathcal{M}$ | misspecification fears| @@ -77,9 +73,7 @@ from numpy.linalg import inv, eigvals, norm Let $\varepsilon$ denote a vector of risks to be taken and priced. -Under the -econometrician's probability model, $\varepsilon$ has a standard multivariate -normal density: +Under the econometrician's probability model, $\varepsilon$ has a standard multivariate normal density: ```{math} :label: eq_baseline @@ -113,10 +107,48 @@ which is a $\mathcal{N}(-\lambda, I)$ density. The likelihood ratio has shifted the mean of $\varepsilon$ from $0$ to $-\lambda$ while preserving the covariance. +````{exercise} +:label: lr_exercise_1 + +Verify that: + +1. $E\,m(\varepsilon) = 1$ by computing $\int m(\varepsilon)\,\phi(\varepsilon)\,d\varepsilon$ using the moment-generating function of a standard normal. +2. The twisted density $\hat\phi(\varepsilon) = m(\varepsilon)\,\phi(\varepsilon)$ is indeed $\mathcal{N}(-\lambda, I)$ by combining exponents: + +$$ +m(\varepsilon)\,\phi(\varepsilon) \propto \exp\!\left(-\lambda'\varepsilon - \tfrac{1}{2}\lambda'\lambda\right) \exp\!\left(-\tfrac{1}{2}\varepsilon'\varepsilon\right) = \exp\!\left(-\tfrac{1}{2}\bigl[\varepsilon'\varepsilon + 2\lambda'\varepsilon + \lambda'\lambda\bigr]\right) +$$ + +and complete the square to obtain $-\frac{1}{2}(\varepsilon + \lambda)'(\varepsilon + \lambda)$. + +```` + +````{solution} lr_exercise_1 +:class: dropdown + +**Part 1.** +Write $E\,m(\varepsilon) = \int \exp(-\lambda'\varepsilon - \tfrac{1}{2}\lambda'\lambda)\,\phi(\varepsilon)\,d\varepsilon = \exp(-\tfrac{1}{2}\lambda'\lambda)\,E[\exp(-\lambda'\varepsilon)]$. + +The moment-generating function of $\varepsilon \sim \mathcal{N}(0,I)$ gives $E[\exp(-\lambda'\varepsilon)] = \exp(\tfrac{1}{2}\lambda'\lambda)$. + +So $E\,m(\varepsilon) = \exp(-\tfrac{1}{2}\lambda'\lambda)\exp(\tfrac{1}{2}\lambda'\lambda) = 1$. + +**Part 2.** +Combine the exponents: + +$$ +m(\varepsilon)\,\phi(\varepsilon) \propto \exp\!\left(-\tfrac{1}{2}\varepsilon'\varepsilon - \lambda'\varepsilon - \tfrac{1}{2}\lambda'\lambda\right) +$$ + +Recognise the argument as $-\tfrac{1}{2}(\varepsilon'\varepsilon + 2\lambda'\varepsilon + \lambda'\lambda) = -\tfrac{1}{2}(\varepsilon + \lambda)'(\varepsilon + \lambda)$. + +This is the kernel of a $\mathcal{N}(-\lambda, I)$ density. + +```` + ### Relative entropy -The **relative entropy** (Kullback–Leibler divergence) of the twisted density -with respect to the baseline density is +The **relative entropy** (Kullback–Leibler divergence) of the twisted density with respect to the baseline density is ```{math} :label: eq_entropy @@ -132,6 +164,8 @@ Depending on context it represents *risk prices*, *belief distortions*, or *wors ### Visualising the twist +For illustration, consider the scalar case $\varepsilon \in \mathbb{R}$ with $\lambda = 1.5$. + ```{code-cell} ipython3 from scipy.stats import norm as normal_dist @@ -180,7 +214,7 @@ The right panel shows the resulting twisted density $\hat\phi(\varepsilon) = \ma ### State dynamics -The econometrician works with a linear Gaussian state-space system: +The econometrician works with a linear Gaussian state-space system at a *monthly* frequency: ```{math} :label: eq_state @@ -200,9 +234,17 @@ y_{t+1} = D\,x_t + G\,\varepsilon_{t+1} \varepsilon_{t+1} \sim \mathcal{N}(0, I) ``` -where $y_{t+1}$ collects utility-relevant variables (e.g., consumption growth), -$r_t = \delta_0 + \bar{r}\,x_t$ is the risk-free one-period interest rate, and -$d_t = \bar{d}\,x_t$ is the payout process from an asset. +Here $x_t$ is an $n \times 1$ state vector and $\varepsilon_{t+1}$ is a $k \times 1$ shock vector. + +Throughout, we assume $n = k$ and that the volatility matrix $C$ is square and invertible — this is needed whenever we back out mean distortions $w = -C^{-1}(\cdot)$ from alternative transition matrices. + +The observation $y_{t+1}$ represents consumption growth, $c_{t+1} - c_t = D\,x_t + G\,\varepsilon_{t+1}$. + +Separately, the risk-free one-period interest rate and the payout process from a risky asset are linear functions of the state: + +$$ +r_t = \delta_0 + \bar{r}'\,x_t, \qquad d_t = \bar{d}'\,x_t +$$ ```{figure} /_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fig2_tom.png The econometrician's model: estimated state dynamics. @@ -213,44 +255,45 @@ The econometrician's model: estimated state dynamics. ### Risk-neutral rational expectations pricing -Under rational expectations with a risk-neutral representative investor, -stock prices satisfy: +Under rational expectations with a risk-neutral representative investor, the stock price $p_t$ (the ex-dividend market value of a claim to the stream $\{d_{t+j}\}_{j=1}^\infty$) satisfies: $$ p_t = \exp(-r_t)\,E_t(p_{t+1} + d_{t+1}) $$ -The expectations theory of the term structure of interest rates prices a -zero-coupon risk-free claim to one dollar at time $t+n$ as: +The expectations theory of the term structure of interest rates prices a zero-coupon risk-free claim to one dollar at time $t+n$ as: ```{math} :label: eq_rn_recursion -p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,E_t\,p_{t+1}(n), \qquad p_t(n) = \exp(\bar{A}_n + B_n\,x_t) +p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,E_t\,p_{t+1}(n), \qquad p_t(n) = \exp(\bar{A}_n^{RN} + B_n^{RN}\,x_t) ``` -These formulas work "pretty well" for conditional means but less well for -conditional variances — the Shiller *volatility puzzles*. +The last equality states that bond prices take an **exponential-affine** form in the state — this is a consequence of the linear Gaussian structure and can be verified by substituting the guess into the recursion and matching coefficients (see {ref}`Exercise 3 ` in {doc}`Affine Models of Asset Prices `). + +These formulas work "pretty well" for conditional means but less well for conditional variances — the Shiller *volatility puzzles*. ### Modern asset pricing: adding risk aversion It would be convenient if versions of the same pricing formulas worked even when investors are risk averse or hold distorted beliefs — the likelihood ratio makes this possible. -Let the likelihood ratio increment be +We now promote the static vector $\lambda$ from {eq}`eq_lr` to a *state-dependent* risk price vector by writing $\lambda_t = \Lambda\,x_t$, where $\Lambda$ is a $k \times n$ matrix of risk price coefficients. + +In the code below, this matrix is the parameter `Λ`. + +The likelihood ratio increment is ```{math} :label: eq_sdf_lr -m_{t+1}^\lambda = \exp\!\left(-\lambda_t'\,\varepsilon_{t+1} - \frac{1}{2}\,\lambda_t'\lambda_t\right), \qquad \lambda_t = \lambda\,x_t +m_{t+1}^\Lambda = \exp\!\left(-\lambda_t'\,\varepsilon_{t+1} - \frac{1}{2}\,\lambda_t'\lambda_t\right), \qquad \lambda_t = \Lambda\,x_t ``` -with $E_t\,m_{t+1}^\lambda = 1$ and $m_{t+1}^\lambda \geq 0$. +with $E_t\,m_{t+1}^\Lambda = 1$ and $m_{t+1}^\Lambda \geq 0$. -The likelihood ratio $m_{t+1}^\lambda$ distorts the conditional distribution -of $\varepsilon_{t+1}$ from $\mathcal{N}(0,I)$ to $\mathcal{N}(-\lambda\,x_t, I)$. +The likelihood ratio $m_{t+1}^\Lambda$ distorts the conditional distribution of $\varepsilon_{t+1}$ from $\mathcal{N}(0,I)$ to $\mathcal{N}(-\Lambda\,x_t, I)$. -Covariances of returns with $m_{t+1}^\lambda$ affect mean returns — this is the -channel through which risk aversion prices risks. +Covariances of returns with $m_{t+1}^\Lambda$ affect mean returns — this is the channel through which risk aversion prices risks. With this device, *modern asset pricing* takes the form: @@ -259,7 +302,7 @@ For stocks (Lucas–Hansen): ```{math} :label: eq_stock_lr -p_t = \exp(-r_t)\,E_t\bigl(m_{t+1}^\lambda\,(p_{t+1} + d_{t+1})\bigr) +p_t = \exp(-r_t)\,E_t\bigl(m_{t+1}^\Lambda\,(p_{t+1} + d_{t+1})\bigr) ``` For the term structure (Dai–Singleton–Backus–Zin): @@ -267,27 +310,32 @@ For the term structure (Dai–Singleton–Backus–Zin): ```{math} :label: eq_ts_lr -p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,E_t\bigl(m_{t+1}^\lambda\,p_{t+1}(n)\bigr), \qquad p_t(n) = \exp(\bar{A}_n + B_n\,x_t) +p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,E_t\bigl(m_{t+1}^\Lambda\,p_{t+1}(n)\bigr), \qquad p_t(n) = \exp(\bar{A}_n + B_n\,x_t) ``` +Note that the coefficients $\bar{A}_n$, $B_n$ here differ from the risk-neutral coefficients $\bar{A}_n^{RN}$, $B_n^{RN}$ in {eq}`eq_rn_recursion` because the likelihood ratio modifies the recursion. + ### Risk-neutral dynamics -The risk-neutral representation implies **twisted dynamics**: +The risk-neutral representation implies **twisted dynamics**. + +Under the twisted measure, define $\tilde\varepsilon_{t+1} := \varepsilon_{t+1} + \lambda_t = \varepsilon_{t+1} + \Lambda\, x_t$. + +Since $\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under the econometrician's measure, the change of measure makes $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under the risk-neutral measure. + +Substituting $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - \Lambda\, x_t$ into {eq}`eq_state` gives: ```{math} :label: eq_rn_dynamics -x_{t+1} = (A - C\lambda)\,x_t + C\,\tilde\varepsilon_{t+1}, \qquad \tilde\varepsilon_{t+1} \sim \mathcal{N}(0,I) +x_{t+1} = (A - C\Lambda)\,x_t + C\,\tilde\varepsilon_{t+1}, \qquad \tilde\varepsilon_{t+1} \sim \mathcal{N}(0,I) ``` -The risk-neutral dynamics assert that the shock distribution $\varepsilon_{t+1}$ has conditional mean $-\lambda_t$ instead of $0$. - -The dependence of $\lambda_t = \lambda\,x_t$ on the state modifies the dynamics relative to the econometrician's model. +The dependence of $\lambda_t = \Lambda\,x_t$ on the state modifies the dynamics relative to the econometrician's model. ### Expectation under a twisted distribution -The mathematical expectation of $y_{t+1}$ under the probability distribution -twisted by likelihood ratio $m_{t+1}$ is +The mathematical expectation of $y_{t+1}$ under the probability distribution twisted by likelihood ratio $m_{t+1}$ is $$ \tilde{E}_t\,y_{t+1} = E_t\,m_{t+1}\,y_{t+1} @@ -299,9 +347,9 @@ $$ p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,\tilde{E}_t\,p_{t+1}(n), \qquad p_t(n) = \exp(\tilde{\bar{A}}_n + \tilde{B}_n\,x_t) $$ -These are the same formulas as rational-expectations asset pricing, but -expectations are taken with respect to a probability measure **twisted by -risk aversion**. +These are the same formulas as rational-expectations asset pricing, but expectations are taken with respect to a probability measure *twisted by risk aversion*. + +The derivation of the recursive bond price coefficients is the same as in {ref}`Exercise 3 ` of {doc}`Affine Models of Asset Prices `, applied here under the risk-neutral dynamics {eq}`eq_rn_dynamics`. ## Python implementation @@ -397,7 +445,7 @@ G = np.array([[0.004, 0.003]]) # consumption shock loading δ_0 = 0.004 # short rate intercept (~4.8% annual) r_bar = np.array([0.06, 0.04]) # short rate loading -# Risk prices: λ_t = Λ x_t (state-dependent) +# Risk prices Λ = np.array([[-3.0, 0.0], [ 0.0, -6.0]]) @@ -422,7 +470,7 @@ states = { fig, ax = plt.subplots(figsize=(9, 5)) for label, x in states.items(): - y = model.yields(x, n_max) * 1200 # annualise (monthly → ×1200) + y = model.yields(x, n_max) * 1200 # annualise (monthly, x1200) ax.plot(maturities, y, lw=2, label=label) ax.set_xlabel("Maturity (months)") @@ -474,7 +522,7 @@ Both factors are more persistent under the risk-neutral measure $Q$ than under t ## An identification challenge -The vector $\lambda_t$ can be interpreted as either: +The risk price vector $\lambda_t = \Lambda\, x_t$ can be interpreted as either: - a **risk price vector** expressing the representative agent's risk aversion, or - the representative agent's **belief distortion** relative to the econometrician's @@ -497,7 +545,7 @@ To distinguish risk aversion from belief distortion, one needs either x_test = np.array([0.01, 0.005]) y_risk_averse = model.yields(x_test, 60) * 1200 -# "Mistaken belief" model: zero risk prices but twisted A +# Mistaken belief model model_mistaken = LikelihoodRatioModel( A=model.A_Q, C=C, D=D, G=G, r_bar=r_bar, Λ=np.zeros_like(Λ), δ_0=δ_0 @@ -526,14 +574,14 @@ Without additional information (e.g., surveys of forecasters), we cannot tell th ### The PSS framework -{cite:t}`piazzesi2015trend` (henceforth PSS) exploit data on -professional forecasters' expectations to decompose the likelihood ratio -into risk prices and belief distortions. Their setup posits: +{cite:t}`piazzesi2015trend` (henceforth PSS) exploit data on professional forecasters' expectations to decompose the likelihood ratio into risk prices and belief distortions. + +Their setup posits: - The representative agent's risk aversion leads him to price risks - $\varepsilon_{t+1}$ with prices $\lambda_t^* = \lambda^* x_t$. -- The representative agent has **twisted beliefs** $(A^*, C) = (A - Cw^*, C)$ - relative to the econometrician's model $(A, C)$. + $\varepsilon_{t+1}$ with prices $\lambda_t^* = \Lambda^*\, x_t$, where $\Lambda^*$ is a $k \times n$ matrix. +- The representative agent has **twisted beliefs** $(A^*, C) = (A - C\,W^*, C)$ + relative to the econometrician's model $(A, C)$, where $W^*$ is a $k \times n$ matrix of belief distortion coefficients. - Professional forecasters use the twisted beliefs $(A^*, C)$ to answer survey questions about their forecasts. @@ -542,27 +590,27 @@ into risk prices and belief distortions. Their setup posits: PSS proceed in four steps: 1. Use data $\{x_t\}_{t=0}^T$ to estimate the econometrician's model $A$, $C$. -2. Project experts' forecasts $\{\hat{x}_{t+1}\}$ on $x_t$ to obtain - $\hat{x}_{t+1} = A^* x_t$ and interpret $A^*$ as incorporating belief +2. Project experts' one-step-ahead forecasts $E_t^*[x_{t+1}]$ on $x_t$ to obtain + $E_t^*[x_{t+1}] = A^* x_t$ and interpret $A^*$ as incorporating belief distortions. -3. Back out the mean distortion $w^* x_t = -C^{-1}(A^* - A) x_t$ to the - density of $\varepsilon_{t+1}$. -4. Reinterpret the $\lambda$ estimated by the rational-expectations econometrician - as $\lambda = \lambda^* + w^*$, where $\lambda_t^* = \lambda^* x_t$ is the +3. Back out the mean distortion matrix $W^* = -C^{-1}(A^* - A)$, so that $w_t^* = W^*\,x_t$ is the state-dependent mean shift applied to the + density of $\varepsilon_{t+1}$. (This requires $C$ to be invertible.) +4. Reinterpret the $\Lambda$ estimated by the rational-expectations econometrician + as $\Lambda = \Lambda^* + W^*$, where $\lambda_t^* = \Lambda^*\, x_t$ is the (smaller) price of risk vector actually charged by the representative agent with distorted beliefs. -An econometrician who mistakenly imposes rational expectations estimates risk -prices $\lambda_t$ that sum two parts: -- *smaller risk prices* $\lambda_t^*$ actually charged by the erroneous-beliefs +An econometrician who mistakenly imposes rational expectations estimates risk prices $\lambda_t = \Lambda\, x_t$ that sum two parts: +- *smaller risk prices* $\lambda_t^* = \Lambda^*\, x_t$ actually charged by the erroneous-beliefs representative agent, and -- *conditional mean distortions* $w_t^*$ of the risks $\varepsilon_{t+1}$ that +- *conditional mean distortions* $w_t^* = W^*\, x_t$ of the risks $\varepsilon_{t+1}$ that the twisted-beliefs representative agent's model displays relative to the econometrician's. ### Numerical illustration ```{code-cell} ipython3 +# Same A, C as the two-factor model above A_econ = np.array([[0.97, -0.03], [0.00, 0.90]]) @@ -572,7 +620,7 @@ A_star = np.array([[0.985, -0.025], # experts' subjective transition C_mat = np.array([[0.007, 0.000], [0.000, 0.010]]) -# Belief distortion: w* = -C⁻¹(A* - A) +# Belief distortion w_star = -inv(C_mat) @ (A_star - A_econ) Λ_total = np.array([[-3.0, 0.0], @@ -616,7 +664,7 @@ plt.show() PSS find that experts perceive the level and slope of the yield curve to be *more persistent* than the econometrician's estimates imply. -Subjective risk prices $\lambda^* x_t$ vary less than the $\lambda x_t$ estimated by the rational-expectations econometrician. +Subjective risk prices $\Lambda^*\, x_t$ vary less than the $\Lambda\, x_t$ estimated by the rational-expectations econometrician. However, PSS offer no explanation for *why* beliefs are distorted — are they mistakes, ignorance of good econometrics, or something else? @@ -667,8 +715,7 @@ Inspired by robust control theory, consider a dubious investor who: ### Valuation under the econometrician's model -Taking the log consumption process to be linear Gaussian with shocks -$\varepsilon_{t+1} \sim \mathcal{N}(0,I)$: +Taking the log consumption process to be linear Gaussian with shocks $\varepsilon_{t+1} \sim \mathcal{N}(0,I)$: $$ c_{t+1} - c_t = D\,x_t + G\,\varepsilon_{t+1}, \qquad x_{t+1} = A\,x_t + C\,\varepsilon_{t+1} @@ -680,9 +727,15 @@ $$ V(x_0, c_0) := E\!\left[\sum_{t=0}^{\infty} \beta^t\,c_t \;\middle|\; x_0, c_0\right] = c_0 + \beta\,E\!\left[V(x_1, c_1) \;\middle|\; x_0, c_0\right] $$ +Note that the objective is *linear* in consumption — there is no concave utility function $u(c_t)$. + +All aversion to uncertainty here comes from the *worst-case model selection* (the $\min$ over likelihood ratios below), not from utility curvature. + +This separation is a key feature of the robust control approach: the agent expresses doubt through the entropy ball, rather than through a curved utility function. + ### The sequence problem -The dubious agent solves: +The dubious agent solves a *min* problem — a malevolent "nature" chooses the worst-case probability distortion subject to an entropy budget: ```{math} :label: eq_hansen_seq @@ -704,6 +757,10 @@ $$ M_{t+1} = M_t\,m_{t+1}, \qquad E[m_{t+1} \mid x_t, c_t] = 1, \qquad M_0 = 1 $$ +The cumulative likelihood ratio $M_t = \prod_{s=0}^{t-1} m_{s+1}$ converts the original probability measure into the distorted one. + +The constraint bounds the *discounted entropy* — the $M_t$ weighting ensures entropy is measured under the *distorted* measure and the $\beta^t$ discounting means future divergences are penalised less, admitting persistent alternatives. + The likelihood ratio process $\{M_t\}_{t=0}^{\infty}$ is a multiplicative **martingale**. ```{figure} /_static/lecture_specific/risk_aversion_or_mistaken_beliefs/eggs_backus.png @@ -734,7 +791,7 @@ $$ E\!\left[m_{t+1}\log m_{t+1} \;\middle|\; x_t, c_t\right] = \frac{1}{2}\,w_t' w_t $$ -Substituting into {eq}`eq_hansen_seq` yields the reformulated problem: +Substituting into {eq}`eq_hansen_seq` and performing a change of measure (replacing $E[\cdot]$ with $E^w[\cdot]$ under the distorted model) yields the reformulated problem: ```{math} :label: eq_hansen_reform @@ -752,6 +809,10 @@ $$ \frac{1}{2}\,E^w\!\left[\sum_{t=0}^{\infty} \beta^t\,w_t' w_t \;\middle|\; x_0, c_0\right] \leq \eta $$ +Here $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under $E^w$, and we have substituted $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - w_t$ (so $E[\varepsilon_{t+1}] = -w_t$ under the distorted measure). + +The shift $-w_t$ *reduces* expected consumption growth by $G\,w_t$ and shifts the state dynamics by $-C\,w_t$ — this is how the worst-case model makes the agent worse off. + ### Outcome: constant worst-case distortion Because the econometrician's model is linear Gaussian and the entropy constraint is a scalar bound $\eta$, the worst-case mean distortion turns out to be a *constant vector*: @@ -766,6 +827,24 @@ This does *not* help explain countercyclical prices of risk (or prices of model We compute $\bar{w}$ using the multiplier formulation (see {ref}`the multiplier preferences section below `), in which the parameter $\theta$ penalises entropy: larger $\theta$ means less concern about misspecification. +**Derivation sketch.** In the multiplier formulation, the agent minimises + +$$ +E^w\!\left[\sum_{t=0}^\infty \beta^t \bigl(c_t + \tfrac{\theta}{2}\,w_t'w_t\bigr)\right] +$$ + +over $\{w_t\}$ subject to the shifted dynamics. + +Since $c_t = c_0 + \sum_{s=0}^{t-1}(D\,x_s + G\,\varepsilon_{s+1})$ and $\varepsilon_{s+1} = \tilde\varepsilon_{s+1} - w_s$, the first-order condition for $w_t$ balances the entropy penalty $\theta\, w_t$ against the marginal effect on discounted consumption: + +$$ +\theta\,\bar{w} = \frac{\beta}{1-\beta}\,G' + \beta\,C'\,v +$$ + +where $v$ solves $v = \frac{\beta}{1-\beta}\,D' + \beta\,A'\,v$, or equivalently $v = \beta\,(I - \beta A')^{-1}\,D'\,/\,(1-\beta)$. + +The vector $v$ captures the discounted cumulative effect of a unit change in $x_t$ on future consumption. + ```{code-cell} ipython3 def hansen_worst_case(A, C, D, G, β, θ): """Constant worst-case distortion w_bar for Hansen's dubious agent.""" @@ -789,13 +868,56 @@ The worst-case distortion $\bar{w}$ is constant — it does not depend on the st Larger $\theta$ (less concern about misspecification) yields a smaller distortion. +````{exercise} +:label: lr_exercise_3 + +Derive the formula for $\bar{w}$. + +1. Write the discounted consumption path as $\sum_{t=0}^\infty \beta^t c_t = \frac{c_0}{1-\beta} + \sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}(D\,x_s - G\,w_s + G\,\tilde\varepsilon_{s+1})$. +2. Use the state recursion $x_{t+1} = A\,x_t - C\,w_t + C\,\tilde\varepsilon_{t+1}$ and take first-order conditions with respect to the constant $w_t = \bar{w}$. +3. Verify that the first-order condition gives $\theta\,\bar{w} = \frac{\beta}{1-\beta}\,G' + \beta\,C'\,v$ with $v = \beta(I - \beta A')^{-1} D' / (1-\beta)$. +4. Check numerically that larger $\theta$ brings $\bar{w}$ closer to zero. + +```` + +````{solution} lr_exercise_3 +:class: dropdown + +**Part 1.** +Since $c_t = c_0 + \sum_{s=0}^{t-1}(D\,x_s + G\,\tilde\varepsilon_{s+1} - G\,w_s)$, we have: + +$$ +\sum_{t=0}^\infty \beta^t c_t = \frac{c_0}{1-\beta} + \sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}\bigl(D\,x_s - G\,\bar{w} + G\,\tilde\varepsilon_{s+1}\bigr) +$$ + +**Part 2.** +The multiplier objective is $E^w[\sum \beta^t(c_t + \tfrac{\theta}{2}\bar{w}'\bar{w})]$. + +Taking $\partial/\partial \bar{w}$ and setting to zero, the entropy penalty contributes $\theta\,\bar{w}$. + +The consumption term contributes $-\sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}G' = -\frac{\beta}{1-\beta}\frac{1}{1-\beta}G'$ from the direct shock effect, plus indirect effects through $x_s$ via $C$. + +**Part 3.** +The indirect effect on $x_s$ requires summing $\sum_{t=s+1}^\infty \beta^t D' = \beta^{s+1}\frac{D'}{1-\beta}$, discounted back: + +$$ +\sum_{s=0}^\infty \beta^s \cdot \beta \frac{D'}{1-\beta} \cdot \frac{\partial x_s}{\partial \bar{w}} = \beta\,C'\,v +$$ + +where $v = \beta(I-\beta A')^{-1}\frac{D'}{1-\beta}$ solves $v = \frac{\beta}{1-\beta}D' + \beta A'v$. + +So the first-order condition is $\theta\,\bar{w} = \frac{\beta}{1-\beta}G' + \beta\,C'\,v$, giving $\bar{w} = \frac{1}{\theta}\bigl(\frac{\beta}{1-\beta}G' + \beta\,C'\,v\bigr)$. + +**Part 4.** +As $\theta \to \infty$, $\bar{w} = \frac{1}{\theta}(\cdots) \to 0$, which the numerical table confirms. + +```` ## Tilting the entropy ball ### Hansen and Szőke's more refined dubious agent -To generate *state-dependent* uncertainty prices, Hansen and Szőke introduce a -more refined dubious agent who: +To generate *state-dependent* uncertainty prices, Hansen and Szőke introduce a more refined dubious agent who: - shares the econometrician's model $A$, $C$, $D$, $G$, - expresses doubts by using a continuum of likelihood ratios to form a @@ -803,9 +925,7 @@ more refined dubious agent who: - also insists that some martingales representing particular alternative *parametric* models be included in the discounted entropy ball. -The inclusion of those alternative parametric models *tilts* the entropy ball, -which affects the worst-case model in a way that can produce countercyclical -uncertainty prices. +The inclusion of those alternative parametric models *tilts* the entropy ball, which affects the worst-case model in a way that can produce countercyclical uncertainty prices. "Tilting" means replacing the constant entropy bound $\eta$ with a state-dependent bound $\xi(x_t)$ that is larger in states where the feared parametric alternative deviates more from the baseline. @@ -849,7 +969,7 @@ $$ \bar{w} = -C^{-1}(\bar{A} - A) $$ -which implies a *quadratic* $\xi$ function: +(again using the assumption that $C$ is square and invertible), which implies a *quadratic* $\xi$ function: ```{math} :label: eq_xi @@ -891,6 +1011,25 @@ $$ ### Implementation: tilted entropy ball +**Derivation of the iteration.** +Guess a quadratic value function $J(x) = x'\,P\,x + \text{const}$ for the inner minimisation over $\{w_t\}$ in {eq}`eq_szoke_seq`. + +Since $w_t = W\,x_t$ is linear in the state, the first-order condition for $w_t$ at each $t$ gives: + +$$ +\tilde\theta\,W = \beta\,C'\,P\,(A - C\,W) \quad \Longrightarrow \quad (\tilde\theta\,I + 2\beta\,C' P\,C)\,W = 2\beta\,C'\,P\,A +$$ + +(where we write $\tilde\theta$ as $\theta$ in the code). + +Substituting back into the Bellman equation and matching quadratic terms in $x$ gives the $P$ update: + +$$ +P = -\tfrac{\theta}{2}\,\Xi + \tfrac{\theta}{2}\,W'W + \beta\,(A - CW)'\,P\,(A - CW) +$$ + +The code iterates on the $(P, W)$ system until convergence. + ```{code-cell} ipython3 class TiltedEntropyModel: """ @@ -919,6 +1058,7 @@ class TiltedEntropyModel: β, θ = self.β, self.θ P = np.zeros((n, n)) + converged = False for _ in range(2000): M = θ * np.eye(k) + 2 * β * self.C.T @ P @ self.C W = np.linalg.solve(M, 2 * β * self.C.T @ P @ self.A) @@ -928,9 +1068,12 @@ class TiltedEntropyModel: + β * A_w.T @ P @ A_w) P_new = 0.5 * (P_new + P_new.T) if np.max(np.abs(P_new - P)) < 1e-12: + converged = True break P = P_new + if not converged: + print("Warning: (P, W) iteration did not converge") self._P_quad = P return W @@ -946,7 +1089,7 @@ class TiltedEntropyModel: ``` ```{code-cell} ipython3 -# Feared parametric model: more persistent dynamics +# Feared parametric model A_bar = np.array([[0.995, -0.03], [0.000, 0.96]]) @@ -968,6 +1111,53 @@ print(f"\nEigenvalues of A: {eigvals(A).round(4)}") print(f"Eigenvalues of A_tilde: {eigvals(tilted.A_tilde).round(4)}") ``` +````{exercise} +:label: lr_exercise_4 + +Derive the first-order condition for the tilted entropy problem. + +1. Start from {eq}`eq_szoke_seq` and write $w_t = W x_t$. Using the dynamics $x_{t+1} = (A - CW)x_t + C\tilde\varepsilon_{t+1}$, argue that the objective is quadratic in $x_t$. +2. Take the first-order condition $\partial / \partial W$ and show that it gives $\theta\, W = 2\beta\, C' P (A - CW)$, which can be rearranged to the system solved in the code. +3. Derive the $P$ update by substituting the optimal $W$ back into the Bellman equation. + +```` + +````{solution} lr_exercise_4 +:class: dropdown + +**Part 1.** +With $w_t = Wx_t$ and $x_{t+1} = (A-CW)x_t + C\tilde\varepsilon_{t+1}$, the period-$t$ payoff in {eq}`eq_szoke_seq` is: + +$$ +c_t + \tfrac{\theta}{2}(w_t'w_t - x_t'\Xi\,x_t) = c_t + \tfrac{\theta}{2}\,x_t'(W'W - \Xi)\,x_t +$$ + +Since $c_t$ is linear in past $x_s$ and the dynamics are linear, the value function is quadratic: $J_t = x_t'Px_t + \text{linear and constant terms}$. + +**Part 2.** +The first-order condition for $W$ from the quadratic Bellman equation is: + +$$ +\frac{\partial}{\partial W}\bigl[\tfrac{\theta}{2}x_t'W'Wx_t + \beta\,x_t'(A-CW)'P(A-CW)x_t\bigr] = 0 +$$ + +This gives $\theta\,W - 2\beta\,C'P(A-CW) = 0$. + +Rearranging: $(\theta\,I + 2\beta\,C'PC)\,W = 2\beta\,C'PA$. + +**Part 3.** +Substitute the optimal $W$ back into the Bellman equation. + +The quadratic terms in $x_t$ give: + +$$ +P = -\tfrac{\theta}{2}\,\Xi + \tfrac{\theta}{2}\,W'W + \beta\,(A-CW)'P(A-CW) +$$ + +This is the matrix Riccati equation that the code iterates to convergence. + +```` + ### State-dependent entropy: the key innovation ```{code-cell} ipython3 @@ -978,15 +1168,19 @@ entropy_tilted = np.array([tilted.conditional_entropy(np.array([x, 0.005])) ξ_vals = np.array([tilted.xi_function(np.array([x, 0.005])) for x in x_grid]) +# Hansen's constant entropy +w_hansen = hansen_worst_case(A, C, D, G, β, θ_tilt) +hansen_ent = 0.5 * w_hansen @ w_hansen + fig, ax = plt.subplots(figsize=(9, 5)) -ax.axhline(0, color='steelblue', lw=2, ls='--', - label=r"Hansen: constant $\bar{w}$") +ax.axhline(hansen_ent, color='steelblue', lw=2, ls='--', + label=rf"Hansen: constant $\frac{{1}}{{2}}\bar{{w}}'\bar{{w}} = {hansen_ent:.4f}$") ax.plot(x_grid, entropy_tilted, 'firebrick', lw=2, label=r"Szőke: $\frac{1}{2}\tilde{w}_t'\tilde{w}_t$") ax.plot(x_grid, 0.5 * ξ_vals, 'seagreen', lw=1.5, ls=':', label=r"Feared model: $\frac{1}{2}\xi(x_t)$") ax.set_xlabel(r"Level factor $x_{1,t}$") -ax.set_ylabel("State-dependent conditional entropy") +ax.set_ylabel("Conditional entropy") ax.set_title("State-dependent vs. constant worst-case distortions") ax.legend() plt.tight_layout() @@ -995,10 +1189,9 @@ plt.show() The key innovation of the tilted entropy ball is visible: the Szőke worst-case distortion $\tilde{w}_t = \tilde{W}\,x_t$ grows with $|x_t|$, producing *countercyclical uncertainty prices*. - When the state is far from its mean, the agent's worst-case model deviates more from the econometrician's model. -By contrast, Hansen's constant distortion $\bar{w}$ has entropy $\frac{1}{2}\bar{w}'\bar{w}$ that does not vary with $x_t$ (shown at zero in the plot to emphasise the absence of state dependence). +By contrast, Hansen's constant distortion $\bar{w}$ has entropy $\frac{1}{2}\bar{w}'\bar{w}$ that does not vary with $x_t$ (shown as a horizontal line). The Szőke parabola lies inside the feared model's entropy budget $\frac{1}{2}\xi(x_t)$, confirming the worst-case distortion respects the tilted entropy constraint. @@ -1113,9 +1306,7 @@ The two explanations represent *alternative channels* for the same observed term ## Cross-equation restrictions and estimation -A key appeal of the robust control approach is that it lets us deviate from -rational expectations while still preserving a set of powerful **cross-equation -restrictions** on decision makers' beliefs. +A key appeal of the robust control approach is that it lets us deviate from rational expectations while still preserving a set of powerful **cross-equation restrictions** on decision makers' beliefs. As {cite:t}`szoke2022estimating` puts it: @@ -1129,7 +1320,7 @@ As {cite:t}`szoke2022estimating` puts it: ### Szőke's empirical strategy -In the Szőke framework, the rational-expectations econometrician's single likelihood ratio $m_{t+1}^\lambda$ is decomposed into two multiplicative components: a worst-case belief distortion $m_{t+1}^{\tilde{w}}$ and a residual risk price $m_{t+1}^{\tilde{\lambda}}$, paralleling the PSS decomposition $\lambda = \lambda^* + w^*$. +In the Szőke framework, the rational-expectations econometrician's single likelihood ratio $m_{t+1}^\Lambda$ is decomposed into two multiplicative components: a worst-case belief distortion $m_{t+1}^{\tilde{w}}$ and a residual risk price $m_{t+1}^{\tilde{\lambda}}$, paralleling the PSS decomposition $\Lambda = \Lambda^* + W^*$. **Stage I: Estimation** @@ -1184,7 +1375,9 @@ print(f"\nWorst-case model is {status} " f"the econometrician's model.") ``` -The Szőke worst-case model has lower discounted entropy than the feared long-run risk model, meaning it is statistically harder to distinguish from the econometrician's baseline — yet it still generates the state-dependent uncertainty prices needed to match term-structure dynamics. +The Szőke worst-case model has lower discounted entropy than the feared long-run risk model, meaning it is statistically harder to distinguish from the econometrician's baseline. + +Yet it still generates the state-dependent uncertainty prices needed to match term-structure dynamics. (mult_pref_section)= ## Multiplier preferences @@ -1218,11 +1411,10 @@ $$ where the right-hand side is attained by $$ -m_{t+1}^* \propto \exp\!\left(-\frac{W(x_{t+1}, c_{t+1})}{\theta}\right) +m_{t+1}^* \propto \exp\!\left(-\frac{\beta\,W(x_{t+1}, c_{t+1})}{\theta}\right) $$ -**Relationship between multiplier and constraint problems.** By Lagrange -multiplier theory, +**Relationship between multiplier and constraint problems.** By Lagrange multiplier theory, $$ W(x_t, c_t \mid \tilde\theta) = J(x_t, c_t \mid \eta) + \tilde\theta\,\eta @@ -1275,8 +1467,7 @@ As $\theta$ shrinks, the operator places more weight on bad outcomes, reflecting ## Who cares? -Joint probability distributions of interest rates and macroeconomic shocks are -important throughout macroeconomics: +Joint probability distributions of interest rates and macroeconomic shocks are important throughout macroeconomics: - **Costs of aggregate fluctuations.** Welfare assessments of business cycles depend sensitively on how risks are priced. @@ -1292,9 +1483,7 @@ important throughout macroeconomics: hypothesis is difficult to detect statistically, yet an agent who fears it in the sense formalised above may behave very differently than one who does not. -Understanding whether observed asset prices reflect risk aversion, mistaken -beliefs, or fears of model misspecification — and quantifying each component — -is interesting for both positive and normative macroeconomics. +Understanding whether observed asset prices reflect risk aversion, mistaken beliefs, or fears of model misspecification — and quantifying each component — is interesting for both positive and normative macroeconomics. ## Related lectures From 064d93bb416dfd3088ce44bb0e4802be509e893a Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Fri, 13 Mar 2026 11:05:17 +1100 Subject: [PATCH 08/18] updates --- .../fred_data.csv | 862 ++++++++++++++++++ 1 file changed, 862 insertions(+) create mode 100644 lectures/_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fred_data.csv diff --git a/lectures/_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fred_data.csv b/lectures/_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fred_data.csv new file mode 100644 index 000000000..bf41c8d4d --- /dev/null +++ b/lectures/_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fred_data.csv @@ -0,0 +1,862 @@ +DATE,GS1,GS5,GS10,DFII5,DFII10,USREC +1953-04-01,2.36,2.62,2.83,,,0 +1953-05-01,2.48,2.87,3.05,,,0 +1953-06-01,2.45,2.94,3.11,,,0 +1953-07-01,2.38,2.75,2.93,,,0 +1953-08-01,2.28,2.8,2.95,,,1 +1953-09-01,2.2,2.71,2.87,,,1 +1953-10-01,1.79,2.43,2.66,,,1 +1953-11-01,1.67,2.42,2.68,,,1 +1953-12-01,1.66,2.32,2.59,,,1 +1954-01-01,1.41,2.17,2.48,,,1 +1954-02-01,1.14,2.04,2.47,,,1 +1954-03-01,1.13,1.93,2.37,,,1 +1954-04-01,0.96,1.87,2.29,,,1 +1954-05-01,0.85,1.92,2.37,,,1 +1954-06-01,0.82,1.92,2.38,,,0 +1954-07-01,0.84,1.85,2.3,,,0 +1954-08-01,0.88,1.9,2.36,,,0 +1954-09-01,1.03,1.96,2.38,,,0 +1954-10-01,1.17,2.02,2.43,,,0 +1954-11-01,1.14,2.09,2.48,,,0 +1954-12-01,1.21,2.16,2.51,,,0 +1955-01-01,1.39,2.32,2.61,,,0 +1955-02-01,1.57,2.38,2.65,,,0 +1955-03-01,1.59,2.48,2.68,,,0 +1955-04-01,1.75,2.55,2.75,,,0 +1955-05-01,1.9,2.56,2.76,,,0 +1955-06-01,1.91,2.59,2.78,,,0 +1955-07-01,2.02,2.72,2.9,,,0 +1955-08-01,2.37,2.86,2.97,,,0 +1955-09-01,2.36,2.85,2.97,,,0 +1955-10-01,2.39,2.76,2.88,,,0 +1955-11-01,2.48,2.81,2.89,,,0 +1955-12-01,2.73,2.93,2.96,,,0 +1956-01-01,2.58,2.84,2.9,,,0 +1956-02-01,2.49,2.74,2.84,,,0 +1956-03-01,2.61,2.93,2.96,,,0 +1956-04-01,2.92,3.2,3.18,,,0 +1956-05-01,2.94,3.08,3.07,,,0 +1956-06-01,2.74,2.97,3.0,,,0 +1956-07-01,2.76,3.12,3.11,,,0 +1956-08-01,3.1,3.41,3.33,,,0 +1956-09-01,3.35,3.47,3.38,,,0 +1956-10-01,3.28,3.4,3.34,,,0 +1956-11-01,3.44,3.56,3.49,,,0 +1956-12-01,3.68,3.7,3.59,,,0 +1957-01-01,3.37,3.47,3.46,,,0 +1957-02-01,3.38,3.39,3.34,,,0 +1957-03-01,3.42,3.46,3.41,,,0 +1957-04-01,3.49,3.53,3.48,,,0 +1957-05-01,3.48,3.64,3.6,,,0 +1957-06-01,3.65,3.83,3.8,,,0 +1957-07-01,3.81,4.0,3.93,,,0 +1957-08-01,4.01,4.0,3.93,,,0 +1957-09-01,4.07,4.03,3.92,,,1 +1957-10-01,4.01,4.08,3.97,,,1 +1957-11-01,3.57,3.72,3.72,,,1 +1957-12-01,3.18,3.08,3.21,,,1 +1958-01-01,2.65,2.88,3.09,,,1 +1958-02-01,1.99,2.78,3.05,,,1 +1958-03-01,1.84,2.64,2.98,,,1 +1958-04-01,1.45,2.46,2.88,,,1 +1958-05-01,1.37,2.41,2.92,,,0 +1958-06-01,1.23,2.46,2.97,,,0 +1958-07-01,1.61,2.77,3.2,,,0 +1958-08-01,2.5,3.29,3.54,,,0 +1958-09-01,3.05,3.69,3.76,,,0 +1958-10-01,3.19,3.78,3.8,,,0 +1958-11-01,3.1,3.7,3.74,,,0 +1958-12-01,3.29,3.82,3.86,,,0 +1959-01-01,3.36,4.01,4.02,,,0 +1959-02-01,3.54,3.96,3.96,,,0 +1959-03-01,3.61,3.99,3.99,,,0 +1959-04-01,3.72,4.12,4.12,,,0 +1959-05-01,3.96,4.35,4.31,,,0 +1959-06-01,4.07,4.5,4.34,,,0 +1959-07-01,4.39,4.58,4.4,,,0 +1959-08-01,4.42,4.57,4.43,,,0 +1959-09-01,5.0,4.9,4.68,,,0 +1959-10-01,4.8,4.72,4.53,,,0 +1959-11-01,4.81,4.75,4.53,,,0 +1959-12-01,5.14,5.01,4.69,,,0 +1960-01-01,5.03,4.92,4.72,,,0 +1960-02-01,4.66,4.69,4.49,,,0 +1960-03-01,4.02,4.31,4.25,,,0 +1960-04-01,4.04,4.29,4.28,,,0 +1960-05-01,4.21,4.49,4.35,,,1 +1960-06-01,3.36,4.12,4.15,,,1 +1960-07-01,3.2,3.79,3.9,,,1 +1960-08-01,2.95,3.62,3.8,,,1 +1960-09-01,3.07,3.61,3.8,,,1 +1960-10-01,3.04,3.76,3.89,,,1 +1960-11-01,3.08,3.81,3.93,,,1 +1960-12-01,2.86,3.67,3.84,,,1 +1961-01-01,2.81,3.67,3.84,,,1 +1961-02-01,2.93,3.66,3.78,,,1 +1961-03-01,2.88,3.6,3.74,,,0 +1961-04-01,2.88,3.57,3.78,,,0 +1961-05-01,2.87,3.47,3.71,,,0 +1961-06-01,3.06,3.81,3.88,,,0 +1961-07-01,2.92,3.84,3.92,,,0 +1961-08-01,3.06,3.96,4.04,,,0 +1961-09-01,3.06,3.9,3.98,,,0 +1961-10-01,3.05,3.8,3.92,,,0 +1961-11-01,3.07,3.82,3.94,,,0 +1961-12-01,3.18,3.91,4.06,,,0 +1962-01-01,3.28,3.94,4.08,,,0 +1962-02-01,3.28,3.89,4.04,,,0 +1962-03-01,3.06,3.68,3.93,,,0 +1962-04-01,2.99,3.6,3.84,,,0 +1962-05-01,3.03,3.66,3.87,,,0 +1962-06-01,3.03,3.64,3.91,,,0 +1962-07-01,3.29,3.8,4.01,,,0 +1962-08-01,3.2,3.71,3.98,,,0 +1962-09-01,3.06,3.7,3.98,,,0 +1962-10-01,2.98,3.64,3.93,,,0 +1962-11-01,3.0,3.6,3.92,,,0 +1962-12-01,3.01,3.56,3.86,,,0 +1963-01-01,3.04,3.58,3.83,,,0 +1963-02-01,3.01,3.66,3.92,,,0 +1963-03-01,3.03,3.68,3.93,,,0 +1963-04-01,3.11,3.74,3.97,,,0 +1963-05-01,3.12,3.72,3.93,,,0 +1963-06-01,3.2,3.81,3.99,,,0 +1963-07-01,3.48,3.89,4.02,,,0 +1963-08-01,3.53,3.89,4.0,,,0 +1963-09-01,3.57,3.96,4.08,,,0 +1963-10-01,3.64,3.97,4.11,,,0 +1963-11-01,3.74,4.01,4.12,,,0 +1963-12-01,3.81,4.04,4.13,,,0 +1964-01-01,3.79,4.07,4.17,,,0 +1964-02-01,3.78,4.03,4.15,,,0 +1964-03-01,3.91,4.14,4.22,,,0 +1964-04-01,3.91,4.15,4.23,,,0 +1964-05-01,3.84,4.05,4.2,,,0 +1964-06-01,3.83,4.02,4.17,,,0 +1964-07-01,3.72,4.03,4.19,,,0 +1964-08-01,3.74,4.05,4.19,,,0 +1964-09-01,3.84,4.08,4.2,,,0 +1964-10-01,3.86,4.07,4.19,,,0 +1964-11-01,3.91,4.04,4.15,,,0 +1964-12-01,4.02,4.09,4.18,,,0 +1965-01-01,3.94,4.1,4.19,,,0 +1965-02-01,4.03,4.15,4.21,,,0 +1965-03-01,4.06,4.15,4.21,,,0 +1965-04-01,4.04,4.15,4.2,,,0 +1965-05-01,4.03,4.15,4.21,,,0 +1965-06-01,3.99,4.15,4.21,,,0 +1965-07-01,3.98,4.15,4.2,,,0 +1965-08-01,4.07,4.2,4.25,,,0 +1965-09-01,4.2,4.25,4.29,,,0 +1965-10-01,4.3,4.34,4.35,,,0 +1965-11-01,4.37,4.46,4.45,,,0 +1965-12-01,4.72,4.72,4.62,,,0 +1966-01-01,4.88,4.86,4.61,,,0 +1966-02-01,4.94,4.98,4.83,,,0 +1966-03-01,4.97,4.92,4.87,,,0 +1966-04-01,4.9,4.83,4.75,,,0 +1966-05-01,4.93,4.89,4.78,,,0 +1966-06-01,4.97,4.97,4.81,,,0 +1966-07-01,5.17,5.17,5.02,,,0 +1966-08-01,5.54,5.5,5.22,,,0 +1966-09-01,5.82,5.5,5.18,,,0 +1966-10-01,5.58,5.27,5.01,,,0 +1966-11-01,5.54,5.36,5.16,,,0 +1966-12-01,5.2,5.0,4.84,,,0 +1967-01-01,4.75,4.7,4.58,,,0 +1967-02-01,4.71,4.74,4.63,,,0 +1967-03-01,4.35,4.54,4.54,,,0 +1967-04-01,4.11,4.51,4.59,,,0 +1967-05-01,4.15,4.75,4.85,,,0 +1967-06-01,4.48,5.01,5.02,,,0 +1967-07-01,5.01,5.23,5.16,,,0 +1967-08-01,5.13,5.31,5.28,,,0 +1967-09-01,5.24,5.4,5.3,,,0 +1967-10-01,5.37,5.57,5.48,,,0 +1967-11-01,5.61,5.78,5.75,,,0 +1967-12-01,5.71,5.75,5.7,,,0 +1968-01-01,5.43,5.54,5.53,,,0 +1968-02-01,5.41,5.59,5.56,,,0 +1968-03-01,5.58,5.76,5.74,,,0 +1968-04-01,5.71,5.69,5.64,,,0 +1968-05-01,6.14,6.04,5.87,,,0 +1968-06-01,5.98,5.85,5.72,,,0 +1968-07-01,5.65,5.6,5.5,,,0 +1968-08-01,5.43,5.5,5.42,,,0 +1968-09-01,5.45,5.48,5.46,,,0 +1968-10-01,5.57,5.55,5.58,,,0 +1968-11-01,5.75,5.66,5.7,,,0 +1968-12-01,6.19,6.12,6.03,,,0 +1969-01-01,6.34,6.25,6.04,,,0 +1969-02-01,6.41,6.34,6.19,,,0 +1969-03-01,6.34,6.41,6.3,,,0 +1969-04-01,6.26,6.3,6.17,,,0 +1969-05-01,6.42,6.54,6.32,,,0 +1969-06-01,7.04,6.75,6.57,,,0 +1969-07-01,7.6,7.01,6.72,,,0 +1969-08-01,7.54,7.03,6.69,,,0 +1969-09-01,7.82,7.57,7.16,,,0 +1969-10-01,7.64,7.51,7.1,,,0 +1969-11-01,7.89,7.53,7.14,,,0 +1969-12-01,8.17,7.96,7.65,,,0 +1970-01-01,8.1,8.17,7.79,,,1 +1970-02-01,7.59,7.82,7.24,,,1 +1970-03-01,6.97,7.21,7.07,,,1 +1970-04-01,7.06,7.5,7.39,,,1 +1970-05-01,7.75,7.97,7.91,,,1 +1970-06-01,7.55,7.85,7.84,,,1 +1970-07-01,7.1,7.59,7.46,,,1 +1970-08-01,6.98,7.57,7.53,,,1 +1970-09-01,6.73,7.29,7.39,,,1 +1970-10-01,6.43,7.12,7.33,,,1 +1970-11-01,5.51,6.47,6.84,,,1 +1970-12-01,5.0,5.95,6.39,,,0 +1971-01-01,4.57,5.89,6.24,,,0 +1971-02-01,3.89,5.56,6.11,,,0 +1971-03-01,3.69,5.0,5.7,,,0 +1971-04-01,4.3,5.65,5.83,,,0 +1971-05-01,5.04,6.28,6.39,,,0 +1971-06-01,5.64,6.53,6.52,,,0 +1971-07-01,6.04,6.85,6.73,,,0 +1971-08-01,5.8,6.55,6.58,,,0 +1971-09-01,5.41,6.14,6.14,,,0 +1971-10-01,4.91,5.93,5.93,,,0 +1971-11-01,4.67,5.78,5.81,,,0 +1971-12-01,4.6,5.69,5.93,,,0 +1972-01-01,4.28,5.59,5.95,,,0 +1972-02-01,4.27,5.69,6.08,,,0 +1972-03-01,4.67,5.87,6.07,,,0 +1972-04-01,4.96,6.17,6.19,,,0 +1972-05-01,4.64,5.85,6.13,,,0 +1972-06-01,4.93,5.91,6.11,,,0 +1972-07-01,4.96,5.97,6.11,,,0 +1972-08-01,4.98,6.02,6.21,,,0 +1972-09-01,5.52,6.25,6.55,,,0 +1972-10-01,5.52,6.18,6.48,,,0 +1972-11-01,5.27,6.12,6.28,,,0 +1972-12-01,5.52,6.16,6.36,,,0 +1973-01-01,5.89,6.34,6.46,,,0 +1973-02-01,6.19,6.6,6.64,,,0 +1973-03-01,6.85,6.8,6.71,,,0 +1973-04-01,6.85,6.67,6.67,,,0 +1973-05-01,6.89,6.8,6.85,,,0 +1973-06-01,7.31,6.69,6.9,,,0 +1973-07-01,8.39,7.33,7.13,,,0 +1973-08-01,8.82,7.63,7.4,,,0 +1973-09-01,8.31,7.05,7.09,,,0 +1973-10-01,7.4,6.77,6.79,,,0 +1973-11-01,7.57,6.92,6.73,,,0 +1973-12-01,7.27,6.8,6.74,,,1 +1974-01-01,7.42,6.95,6.99,,,1 +1974-02-01,6.88,6.82,6.96,,,1 +1974-03-01,7.76,7.31,7.21,,,1 +1974-04-01,8.62,7.92,7.51,,,1 +1974-05-01,8.78,8.18,7.58,,,1 +1974-06-01,8.67,8.1,7.54,,,1 +1974-07-01,8.8,8.38,7.81,,,1 +1974-08-01,9.36,8.63,8.04,,,1 +1974-09-01,8.87,8.37,8.04,,,1 +1974-10-01,8.05,7.97,7.9,,,1 +1974-11-01,7.66,7.68,7.68,,,1 +1974-12-01,7.31,7.31,7.43,,,1 +1975-01-01,6.83,7.41,7.5,,,1 +1975-02-01,5.98,7.11,7.39,,,1 +1975-03-01,6.11,7.3,7.73,,,1 +1975-04-01,6.9,7.99,8.23,,,0 +1975-05-01,6.39,7.72,8.06,,,0 +1975-06-01,6.29,7.51,7.86,,,0 +1975-07-01,7.11,7.92,8.06,,,0 +1975-08-01,7.7,8.33,8.4,,,0 +1975-09-01,7.75,8.37,8.43,,,0 +1975-10-01,6.95,7.97,8.14,,,0 +1975-11-01,6.49,7.8,8.05,,,0 +1975-12-01,6.6,7.76,8.0,,,0 +1976-01-01,5.81,7.46,7.74,,,0 +1976-02-01,5.91,7.45,7.79,,,0 +1976-03-01,6.21,7.49,7.73,,,0 +1976-04-01,5.92,7.25,7.56,,,0 +1976-05-01,6.4,7.59,7.9,,,0 +1976-06-01,6.52,7.61,7.86,,,0 +1976-07-01,6.2,7.49,7.83,,,0 +1976-08-01,6.0,7.31,7.77,,,0 +1976-09-01,5.84,7.13,7.59,,,0 +1976-10-01,5.5,6.75,7.41,,,0 +1976-11-01,5.29,6.52,7.29,,,0 +1976-12-01,4.89,6.1,6.87,,,0 +1977-01-01,5.29,6.58,7.21,,,0 +1977-02-01,5.47,6.83,7.39,,,0 +1977-03-01,5.5,6.93,7.46,,,0 +1977-04-01,5.44,6.79,7.37,,,0 +1977-05-01,5.84,6.94,7.46,,,0 +1977-06-01,5.8,6.76,7.28,,,0 +1977-07-01,5.94,6.84,7.33,,,0 +1977-08-01,6.37,7.03,7.4,,,0 +1977-09-01,6.53,7.04,7.34,,,0 +1977-10-01,6.97,7.32,7.52,,,0 +1977-11-01,6.95,7.34,7.58,,,0 +1977-12-01,6.96,7.48,7.69,,,0 +1978-01-01,7.28,7.77,7.96,,,0 +1978-02-01,7.34,7.83,8.03,,,0 +1978-03-01,7.31,7.86,8.04,,,0 +1978-04-01,7.45,7.98,8.15,,,0 +1978-05-01,7.82,8.18,8.35,,,0 +1978-06-01,8.09,8.36,8.46,,,0 +1978-07-01,8.39,8.54,8.64,,,0 +1978-08-01,8.31,8.33,8.41,,,0 +1978-09-01,8.64,8.43,8.42,,,0 +1978-10-01,9.14,8.61,8.64,,,0 +1978-11-01,10.01,8.84,8.81,,,0 +1978-12-01,10.3,9.08,9.01,,,0 +1979-01-01,10.41,9.2,9.1,,,0 +1979-02-01,10.24,9.13,9.1,,,0 +1979-03-01,10.25,9.2,9.12,,,0 +1979-04-01,10.12,9.25,9.18,,,0 +1979-05-01,10.12,9.24,9.25,,,0 +1979-06-01,9.57,8.85,8.91,,,0 +1979-07-01,9.64,8.9,8.95,,,0 +1979-08-01,9.98,9.06,9.03,,,0 +1979-09-01,10.84,9.41,9.33,,,0 +1979-10-01,12.44,10.63,10.3,,,0 +1979-11-01,12.39,10.93,10.65,,,0 +1979-12-01,11.98,10.42,10.39,,,0 +1980-01-01,12.06,10.74,10.8,,,0 +1980-02-01,13.92,12.6,12.41,,,1 +1980-03-01,15.82,13.47,12.75,,,1 +1980-04-01,13.3,11.84,11.47,,,1 +1980-05-01,9.39,9.95,10.18,,,1 +1980-06-01,8.16,9.21,9.78,,,1 +1980-07-01,8.65,9.53,10.25,,,1 +1980-08-01,10.24,10.84,11.1,,,0 +1980-09-01,11.52,11.62,11.51,,,0 +1980-10-01,12.49,11.86,11.75,,,0 +1980-11-01,14.15,12.83,12.68,,,0 +1980-12-01,14.88,13.25,12.84,,,0 +1981-01-01,14.08,12.77,12.57,,,0 +1981-02-01,14.57,13.41,13.19,,,0 +1981-03-01,13.71,13.41,13.12,,,0 +1981-04-01,14.32,13.99,13.68,,,0 +1981-05-01,16.2,14.63,14.1,,,0 +1981-06-01,14.86,13.95,13.47,,,0 +1981-07-01,15.72,14.79,14.28,,,0 +1981-08-01,16.72,15.56,14.94,,,1 +1981-09-01,16.52,15.93,15.32,,,1 +1981-10-01,15.38,15.41,15.15,,,1 +1981-11-01,12.41,13.38,13.39,,,1 +1981-12-01,12.85,13.6,13.72,,,1 +1982-01-01,14.32,14.65,14.59,,,1 +1982-02-01,14.73,14.54,14.43,,,1 +1982-03-01,13.95,13.98,13.86,,,1 +1982-04-01,13.98,14.0,13.87,,,1 +1982-05-01,13.34,13.75,13.62,,,1 +1982-06-01,14.07,14.43,14.3,,,1 +1982-07-01,13.24,14.07,13.95,,,1 +1982-08-01,11.43,13.0,13.06,,,1 +1982-09-01,10.85,12.25,12.34,,,1 +1982-10-01,9.32,10.8,10.91,,,1 +1982-11-01,9.16,10.38,10.55,,,1 +1982-12-01,8.91,10.22,10.54,,,0 +1983-01-01,8.62,10.03,10.46,,,0 +1983-02-01,8.92,10.26,10.72,,,0 +1983-03-01,9.04,10.08,10.51,,,0 +1983-04-01,8.98,10.02,10.4,,,0 +1983-05-01,8.9,10.03,10.38,,,0 +1983-06-01,9.66,10.63,10.85,,,0 +1983-07-01,10.2,11.21,11.38,,,0 +1983-08-01,10.53,11.63,11.85,,,0 +1983-09-01,10.16,11.43,11.65,,,0 +1983-10-01,9.81,11.28,11.54,,,0 +1983-11-01,9.94,11.41,11.69,,,0 +1983-12-01,10.11,11.54,11.83,,,0 +1984-01-01,9.9,11.37,11.67,,,0 +1984-02-01,10.04,11.54,11.84,,,0 +1984-03-01,10.59,12.02,12.32,,,0 +1984-04-01,10.9,12.37,12.63,,,0 +1984-05-01,11.66,13.17,13.41,,,0 +1984-06-01,12.08,13.48,13.56,,,0 +1984-07-01,12.03,13.27,13.36,,,0 +1984-08-01,11.82,12.68,12.72,,,0 +1984-09-01,11.58,12.53,12.52,,,0 +1984-10-01,10.9,12.06,12.16,,,0 +1984-11-01,9.82,11.33,11.57,,,0 +1984-12-01,9.33,11.07,11.5,,,0 +1985-01-01,9.02,10.93,11.38,,,0 +1985-02-01,9.29,11.13,11.51,,,0 +1985-03-01,9.86,11.52,11.86,,,0 +1985-04-01,9.14,11.01,11.43,,,0 +1985-05-01,8.46,10.34,10.85,,,0 +1985-06-01,7.8,9.6,10.16,,,0 +1985-07-01,7.86,9.7,10.31,,,0 +1985-08-01,8.05,9.81,10.33,,,0 +1985-09-01,8.07,9.81,10.37,,,0 +1985-10-01,8.01,9.69,10.24,,,0 +1985-11-01,7.88,9.28,9.78,,,0 +1985-12-01,7.67,8.73,9.26,,,0 +1986-01-01,7.73,8.68,9.19,,,0 +1986-02-01,7.61,8.34,8.7,,,0 +1986-03-01,7.03,7.46,7.78,,,0 +1986-04-01,6.44,7.05,7.3,,,0 +1986-05-01,6.65,7.52,7.71,,,0 +1986-06-01,6.73,7.64,7.8,,,0 +1986-07-01,6.27,7.06,7.3,,,0 +1986-08-01,5.93,6.8,7.17,,,0 +1986-09-01,5.77,6.92,7.45,,,0 +1986-10-01,5.72,6.83,7.43,,,0 +1986-11-01,5.8,6.76,7.25,,,0 +1986-12-01,5.87,6.67,7.11,,,0 +1987-01-01,5.78,6.64,7.08,,,0 +1987-02-01,5.96,6.79,7.25,,,0 +1987-03-01,6.03,6.79,7.25,,,0 +1987-04-01,6.5,7.57,8.02,,,0 +1987-05-01,7.0,8.26,8.61,,,0 +1987-06-01,6.8,8.02,8.4,,,0 +1987-07-01,6.68,8.01,8.45,,,0 +1987-08-01,7.03,8.32,8.76,,,0 +1987-09-01,7.67,8.94,9.42,,,0 +1987-10-01,7.59,9.08,9.52,,,0 +1987-11-01,6.96,8.35,8.86,,,0 +1987-12-01,7.17,8.45,8.99,,,0 +1988-01-01,6.99,8.18,8.67,,,0 +1988-02-01,6.64,7.71,8.21,,,0 +1988-03-01,6.71,7.83,8.37,,,0 +1988-04-01,7.01,8.19,8.72,,,0 +1988-05-01,7.4,8.58,9.09,,,0 +1988-06-01,7.49,8.49,8.92,,,0 +1988-07-01,7.75,8.66,9.06,,,0 +1988-08-01,8.17,8.94,9.26,,,0 +1988-09-01,8.09,8.69,8.98,,,0 +1988-10-01,8.11,8.51,8.8,,,0 +1988-11-01,8.48,8.79,8.96,,,0 +1988-12-01,8.99,9.09,9.11,,,0 +1989-01-01,9.05,9.15,9.09,,,0 +1989-02-01,9.25,9.27,9.17,,,0 +1989-03-01,9.57,9.51,9.36,,,0 +1989-04-01,9.36,9.3,9.18,,,0 +1989-05-01,8.98,8.91,8.86,,,0 +1989-06-01,8.44,8.29,8.28,,,0 +1989-07-01,7.89,7.83,8.02,,,0 +1989-08-01,8.18,8.09,8.11,,,0 +1989-09-01,8.22,8.17,8.19,,,0 +1989-10-01,7.99,7.97,8.01,,,0 +1989-11-01,7.77,7.81,7.87,,,0 +1989-12-01,7.72,7.75,7.84,,,0 +1990-01-01,7.92,8.12,8.21,,,0 +1990-02-01,8.11,8.42,8.47,,,0 +1990-03-01,8.35,8.6,8.59,,,0 +1990-04-01,8.4,8.77,8.79,,,0 +1990-05-01,8.32,8.74,8.76,,,0 +1990-06-01,8.1,8.43,8.48,,,0 +1990-07-01,7.94,8.33,8.47,,,0 +1990-08-01,7.78,8.44,8.75,,,1 +1990-09-01,7.76,8.51,8.89,,,1 +1990-10-01,7.55,8.33,8.72,,,1 +1990-11-01,7.31,8.02,8.39,,,1 +1990-12-01,7.05,7.73,8.08,,,1 +1991-01-01,6.64,7.7,8.09,,,1 +1991-02-01,6.27,7.47,7.85,,,1 +1991-03-01,6.4,7.77,8.11,,,1 +1991-04-01,6.24,7.7,8.04,,,0 +1991-05-01,6.13,7.7,8.07,,,0 +1991-06-01,6.36,7.94,8.28,,,0 +1991-07-01,6.31,7.91,8.27,,,0 +1991-08-01,5.78,7.43,7.9,,,0 +1991-09-01,5.57,7.14,7.65,,,0 +1991-10-01,5.33,6.87,7.53,,,0 +1991-11-01,4.89,6.62,7.42,,,0 +1991-12-01,4.38,6.19,7.09,,,0 +1992-01-01,4.15,6.24,7.03,,,0 +1992-02-01,4.29,6.58,7.34,,,0 +1992-03-01,4.63,6.95,7.54,,,0 +1992-04-01,4.3,6.78,7.48,,,0 +1992-05-01,4.19,6.69,7.39,,,0 +1992-06-01,4.17,6.48,7.26,,,0 +1992-07-01,3.6,5.84,6.84,,,0 +1992-08-01,3.47,5.6,6.59,,,0 +1992-09-01,3.18,5.38,6.42,,,0 +1992-10-01,3.3,5.6,6.59,,,0 +1992-11-01,3.68,6.04,6.87,,,0 +1992-12-01,3.71,6.08,6.77,,,0 +1993-01-01,3.5,5.83,6.6,,,0 +1993-02-01,3.39,5.43,6.26,,,0 +1993-03-01,3.33,5.19,5.98,,,0 +1993-04-01,3.24,5.13,5.97,,,0 +1993-05-01,3.36,5.2,6.04,,,0 +1993-06-01,3.54,5.22,5.96,,,0 +1993-07-01,3.47,5.09,5.81,,,0 +1993-08-01,3.44,5.03,5.68,,,0 +1993-09-01,3.36,4.73,5.36,,,0 +1993-10-01,3.39,4.71,5.33,,,0 +1993-11-01,3.58,5.06,5.72,,,0 +1993-12-01,3.61,5.15,5.77,,,0 +1994-01-01,3.54,5.09,5.75,,,0 +1994-02-01,3.87,5.4,5.97,,,0 +1994-03-01,4.32,5.94,6.48,,,0 +1994-04-01,4.82,6.52,6.97,,,0 +1994-05-01,5.31,6.78,7.18,,,0 +1994-06-01,5.27,6.7,7.1,,,0 +1994-07-01,5.48,6.91,7.3,,,0 +1994-08-01,5.56,6.88,7.24,,,0 +1994-09-01,5.76,7.08,7.46,,,0 +1994-10-01,6.11,7.4,7.74,,,0 +1994-11-01,6.54,7.72,7.96,,,0 +1994-12-01,7.14,7.78,7.81,,,0 +1995-01-01,7.05,7.76,7.78,,,0 +1995-02-01,6.7,7.37,7.47,,,0 +1995-03-01,6.43,7.05,7.2,,,0 +1995-04-01,6.27,6.86,7.06,,,0 +1995-05-01,6.0,6.41,6.63,,,0 +1995-06-01,5.64,5.93,6.17,,,0 +1995-07-01,5.59,6.01,6.28,,,0 +1995-08-01,5.75,6.24,6.49,,,0 +1995-09-01,5.62,6.0,6.2,,,0 +1995-10-01,5.59,5.86,6.04,,,0 +1995-11-01,5.43,5.69,5.93,,,0 +1995-12-01,5.31,5.51,5.71,,,0 +1996-01-01,5.09,5.36,5.65,,,0 +1996-02-01,4.94,5.38,5.81,,,0 +1996-03-01,5.34,5.97,6.27,,,0 +1996-04-01,5.54,6.3,6.51,,,0 +1996-05-01,5.64,6.48,6.74,,,0 +1996-06-01,5.81,6.69,6.91,,,0 +1996-07-01,5.85,6.64,6.87,,,0 +1996-08-01,5.67,6.39,6.64,,,0 +1996-09-01,5.83,6.6,6.83,,,0 +1996-10-01,5.55,6.27,6.53,,,0 +1996-11-01,5.42,5.97,6.2,,,0 +1996-12-01,5.47,6.07,6.3,,,0 +1997-01-01,5.61,6.33,6.58,,,0 +1997-02-01,5.53,6.2,6.42,,,0 +1997-03-01,5.8,6.54,6.69,,,0 +1997-04-01,5.99,6.76,6.89,,,0 +1997-05-01,5.87,6.57,6.71,,,0 +1997-06-01,5.69,6.38,6.49,,,0 +1997-07-01,5.54,6.12,6.22,,,0 +1997-08-01,5.56,6.16,6.3,,,0 +1997-09-01,5.52,6.11,6.21,,,0 +1997-10-01,5.46,5.93,6.03,,,0 +1997-11-01,5.46,5.8,5.88,,,0 +1997-12-01,5.53,5.77,5.81,,,0 +1998-01-01,5.24,5.42,5.54,,,0 +1998-02-01,5.31,5.49,5.57,,,0 +1998-03-01,5.39,5.61,5.65,,,0 +1998-04-01,5.38,5.61,5.64,,,0 +1998-05-01,5.44,5.63,5.65,,,0 +1998-06-01,5.41,5.52,5.5,,,0 +1998-07-01,5.36,5.46,5.46,,,0 +1998-08-01,5.21,5.27,5.34,,,0 +1998-09-01,4.71,4.62,4.81,,,0 +1998-10-01,4.12,4.18,4.53,,,0 +1998-11-01,4.53,4.54,4.83,,,0 +1998-12-01,4.52,4.45,4.65,,,0 +1999-01-01,4.51,4.6,4.72,,,0 +1999-02-01,4.7,4.91,5.0,,,0 +1999-03-01,4.78,5.14,5.23,,,0 +1999-04-01,4.69,5.08,5.18,,,0 +1999-05-01,4.85,5.44,5.54,,,0 +1999-06-01,5.1,5.81,5.9,,,0 +1999-07-01,5.03,5.68,5.79,,,0 +1999-08-01,5.2,5.84,5.94,,,0 +1999-09-01,5.25,5.8,5.92,,,0 +1999-10-01,5.43,6.03,6.11,,,0 +1999-11-01,5.55,5.97,6.03,,,0 +1999-12-01,5.84,6.19,6.28,,,0 +2000-01-01,6.12,6.58,6.66,,,0 +2000-02-01,6.22,6.68,6.52,,,0 +2000-03-01,6.22,6.5,6.26,,,0 +2000-04-01,6.15,6.26,5.99,,,0 +2000-05-01,6.33,6.69,6.44,,,0 +2000-06-01,6.17,6.3,6.1,,,0 +2000-07-01,6.08,6.18,6.05,,,0 +2000-08-01,6.18,6.06,5.83,,,0 +2000-09-01,6.13,5.93,5.8,,,0 +2000-10-01,6.01,5.78,5.74,,,0 +2000-11-01,6.09,5.7,5.72,,,0 +2000-12-01,5.6,5.17,5.24,,,0 +2001-01-01,4.81,4.86,5.16,,,0 +2001-02-01,4.68,4.89,5.1,,,0 +2001-03-01,4.3,4.64,4.89,,,0 +2001-04-01,3.98,4.76,5.14,,,1 +2001-05-01,3.78,4.93,5.39,,,1 +2001-06-01,3.58,4.81,5.28,,,1 +2001-07-01,3.62,4.76,5.24,,,1 +2001-08-01,3.47,4.57,4.97,,,1 +2001-09-01,2.82,4.12,4.73,,,1 +2001-10-01,2.33,3.91,4.57,,,1 +2001-11-01,2.18,3.97,4.65,,,1 +2001-12-01,2.22,4.39,5.09,,,0 +2002-01-01,2.16,4.34,5.04,,,0 +2002-02-01,2.23,4.3,4.91,,,0 +2002-03-01,2.57,4.74,5.28,,,0 +2002-04-01,2.48,4.65,5.21,,,0 +2002-05-01,2.35,4.49,5.16,,,0 +2002-06-01,2.2,4.19,4.93,,,0 +2002-07-01,1.96,3.81,4.65,,,0 +2002-08-01,1.76,3.29,4.26,,,0 +2002-09-01,1.72,2.94,3.87,,,0 +2002-10-01,1.65,2.95,3.94,,,0 +2002-11-01,1.49,3.05,4.05,,,0 +2002-12-01,1.45,3.03,4.03,,,0 +2003-01-01,1.36,3.05,4.05,1.65,2.29,0 +2003-02-01,1.3,2.9,3.9,1.24,1.99,0 +2003-03-01,1.24,2.78,3.81,1.09,1.94,0 +2003-04-01,1.27,2.93,3.96,1.36,2.18,0 +2003-05-01,1.18,2.52,3.57,1.18,1.91,0 +2003-06-01,1.01,2.27,3.33,0.91,1.72,0 +2003-07-01,1.12,2.87,3.98,1.3,2.11,0 +2003-08-01,1.31,3.37,4.45,1.48,2.32,0 +2003-09-01,1.24,3.18,4.27,1.29,2.19,0 +2003-10-01,1.25,3.19,4.29,1.21,2.08,0 +2003-11-01,1.34,3.29,4.3,1.27,1.96,0 +2003-12-01,1.31,3.27,4.27,1.23,1.98,0 +2004-01-01,1.24,3.12,4.15,1.09,1.89,0 +2004-02-01,1.24,3.07,4.08,0.86,1.76,0 +2004-03-01,1.19,2.79,3.83,0.52,1.47,0 +2004-04-01,1.43,3.39,4.35,1.02,1.9,0 +2004-05-01,1.78,3.85,4.72,1.34,2.09,0 +2004-06-01,2.12,3.93,4.73,1.41,2.15,0 +2004-07-01,2.1,3.69,4.5,1.29,2.02,0 +2004-08-01,2.02,3.47,4.28,1.12,1.86,0 +2004-09-01,2.12,3.36,4.13,1.1,1.8,0 +2004-10-01,2.23,3.35,4.1,0.97,1.73,0 +2004-11-01,2.5,3.53,4.19,0.9,1.68,0 +2004-12-01,2.67,3.6,4.23,0.92,1.67,0 +2005-01-01,2.86,3.71,4.22,1.13,1.72,0 +2005-02-01,3.03,3.77,4.17,1.08,1.63,0 +2005-03-01,3.3,4.17,4.5,1.29,1.79,0 +2005-04-01,3.32,4.0,4.34,1.23,1.71,0 +2005-05-01,3.33,3.85,4.14,1.28,1.65,0 +2005-06-01,3.36,3.77,4.0,1.39,1.67,0 +2005-07-01,3.64,3.98,4.18,1.67,1.88,0 +2005-08-01,3.87,4.12,4.26,1.71,1.89,0 +2005-09-01,3.85,4.01,4.2,1.4,1.7,0 +2005-10-01,4.18,4.33,4.46,1.7,1.94,0 +2005-11-01,4.33,4.45,4.54,1.97,2.06,0 +2005-12-01,4.35,4.39,4.47,2.09,2.12,0 +2006-01-01,4.45,4.35,4.42,1.93,2.01,0 +2006-02-01,4.68,4.57,4.57,1.98,2.05,0 +2006-03-01,4.77,4.72,4.72,2.09,2.2,0 +2006-04-01,4.9,4.9,4.99,2.26,2.41,0 +2006-05-01,5.0,5.0,5.11,2.3,2.45,0 +2006-06-01,5.16,5.07,5.11,2.45,2.53,0 +2006-07-01,5.22,5.04,5.09,2.46,2.51,0 +2006-08-01,5.08,4.82,4.88,2.27,2.29,0 +2006-09-01,4.97,4.67,4.72,2.38,2.32,0 +2006-10-01,5.01,4.69,4.73,2.51,2.41,0 +2006-11-01,5.01,4.58,4.6,2.41,2.29,0 +2006-12-01,4.94,4.53,4.56,2.28,2.25,0 +2007-01-01,5.06,4.75,4.76,2.47,2.44,0 +2007-02-01,5.05,4.71,4.72,2.34,2.36,0 +2007-03-01,4.92,4.48,4.56,2.04,2.18,0 +2007-04-01,4.93,4.59,4.69,2.12,2.26,0 +2007-05-01,4.91,4.67,4.75,2.29,2.37,0 +2007-06-01,4.96,5.03,5.1,2.65,2.69,0 +2007-07-01,4.96,4.88,5.0,2.6,2.64,0 +2007-08-01,4.47,4.43,4.67,2.39,2.44,0 +2007-09-01,4.14,4.2,4.52,2.14,2.26,0 +2007-10-01,4.1,4.2,4.53,2.01,2.2,0 +2007-11-01,3.5,3.67,4.15,1.35,1.77,0 +2007-12-01,3.26,3.49,4.1,1.27,1.79,0 +2008-01-01,2.71,2.98,3.74,0.86,1.47,1 +2008-02-01,2.05,2.78,3.74,0.65,1.41,1 +2008-03-01,1.54,2.48,3.51,0.23,1.09,1 +2008-04-01,1.74,2.84,3.68,0.62,1.36,1 +2008-05-01,2.06,3.15,3.88,0.79,1.46,1 +2008-06-01,2.42,3.49,4.1,0.97,1.63,1 +2008-07-01,2.28,3.3,4.01,0.84,1.57,1 +2008-08-01,2.18,3.14,3.89,1.15,1.68,1 +2008-09-01,1.91,2.88,3.69,1.55,1.85,1 +2008-10-01,1.42,2.73,3.81,2.75,2.75,1 +2008-11-01,1.07,2.29,3.53,3.69,2.89,1 +2008-12-01,0.49,1.52,2.42,1.76,2.17,1 +2009-01-01,0.44,1.6,2.52,1.59,1.91,1 +2009-02-01,0.62,1.87,2.87,1.29,1.75,1 +2009-03-01,0.64,1.82,2.82,1.23,1.71,1 +2009-04-01,0.55,1.86,2.93,1.11,1.57,1 +2009-05-01,0.5,2.13,3.29,1.07,1.72,1 +2009-06-01,0.51,2.71,3.72,1.18,1.86,1 +2009-07-01,0.48,2.46,3.56,1.18,1.82,0 +2009-08-01,0.46,2.57,3.59,1.29,1.77,0 +2009-09-01,0.4,2.37,3.4,1.03,1.64,0 +2009-10-01,0.37,2.33,3.39,0.83,1.48,0 +2009-11-01,0.31,2.23,3.4,0.48,1.28,0 +2009-12-01,0.37,2.34,3.59,0.43,1.36,0 +2010-01-01,0.35,2.48,3.73,0.42,1.37,0 +2010-02-01,0.35,2.36,3.69,0.42,1.42,0 +2010-03-01,0.4,2.43,3.73,0.56,1.51,0 +2010-04-01,0.45,2.58,3.85,0.62,1.5,0 +2010-05-01,0.37,2.18,3.42,0.41,1.31,0 +2010-06-01,0.32,2.0,3.2,0.34,1.26,0 +2010-07-01,0.29,1.76,3.01,0.34,1.24,0 +2010-08-01,0.26,1.47,2.7,0.13,1.02,0 +2010-09-01,0.26,1.41,2.65,0.13,0.91,0 +2010-10-01,0.23,1.18,2.54,-0.32,0.53,0 +2010-11-01,0.25,1.35,2.76,-0.21,0.67,0 +2010-12-01,0.29,1.93,3.29,0.21,1.04,0 +2011-01-01,0.27,1.99,3.39,0.06,1.06,0 +2011-02-01,0.29,2.26,3.58,0.25,1.24,0 +2011-03-01,0.26,2.11,3.41,-0.09,0.96,0 +2011-04-01,0.25,2.17,3.46,-0.14,0.86,0 +2011-05-01,0.19,1.84,3.17,-0.34,0.78,0 +2011-06-01,0.18,1.58,3.0,-0.38,0.76,0 +2011-07-01,0.19,1.54,3.0,-0.49,0.62,0 +2011-08-01,0.11,1.02,2.3,-0.75,0.14,0 +2011-09-01,0.1,0.9,1.98,-0.72,0.08,0 +2011-10-01,0.11,1.06,2.15,-0.63,0.19,0 +2011-11-01,0.11,0.91,2.01,-0.85,0.0,0 +2011-12-01,0.12,0.89,1.98,-0.78,-0.03,0 +2012-01-01,0.12,0.84,1.97,-0.92,-0.11,0 +2012-02-01,0.16,0.83,1.97,-1.11,-0.25,0 +2012-03-01,0.19,1.02,2.17,-1.03,-0.14,0 +2012-04-01,0.18,0.89,2.05,-1.06,-0.21,0 +2012-05-01,0.19,0.76,1.8,-1.12,-0.34,0 +2012-06-01,0.19,0.71,1.62,-1.05,-0.5,0 +2012-07-01,0.19,0.62,1.53,-1.15,-0.6,0 +2012-08-01,0.18,0.71,1.68,-1.19,-0.59,0 +2012-09-01,0.18,0.67,1.72,-1.47,-0.71,0 +2012-10-01,0.18,0.71,1.75,-1.47,-0.75,0 +2012-11-01,0.18,0.67,1.65,-1.38,-0.77,0 +2012-12-01,0.16,0.7,1.72,-1.4,-0.76,0 +2013-01-01,0.15,0.81,1.91,-1.39,-0.61,0 +2013-02-01,0.16,0.85,1.98,-1.39,-0.57,0 +2013-03-01,0.15,0.82,1.96,-1.43,-0.59,0 +2013-04-01,0.12,0.71,1.76,-1.38,-0.65,0 +2013-05-01,0.12,0.84,1.93,-1.14,-0.36,0 +2013-06-01,0.14,1.2,2.3,-0.59,0.25,0 +2013-07-01,0.12,1.4,2.58,-0.45,0.46,0 +2013-08-01,0.13,1.52,2.74,-0.33,0.55,0 +2013-09-01,0.12,1.6,2.81,-0.17,0.66,0 +2013-10-01,0.12,1.37,2.62,-0.41,0.43,0 +2013-11-01,0.12,1.37,2.72,-0.38,0.55,0 +2013-12-01,0.13,1.58,2.9,-0.09,0.74,0 +2014-01-01,0.12,1.65,2.86,-0.09,0.63,0 +2014-02-01,0.12,1.52,2.71,-0.26,0.55,0 +2014-03-01,0.13,1.64,2.72,-0.14,0.56,0 +2014-04-01,0.11,1.7,2.71,-0.11,0.54,0 +2014-05-01,0.1,1.59,2.56,-0.34,0.37,0 +2014-06-01,0.1,1.68,2.6,-0.29,0.37,0 +2014-07-01,0.11,1.7,2.54,-0.27,0.28,0 +2014-08-01,0.11,1.63,2.42,-0.21,0.22,0 +2014-09-01,0.11,1.77,2.53,0.1,0.46,0 +2014-10-01,0.1,1.55,2.3,0.06,0.38,0 +2014-11-01,0.13,1.62,2.33,0.14,0.45,0 +2014-12-01,0.21,1.64,2.21,0.37,0.51,0 +2015-01-01,0.2,1.37,1.88,0.17,0.27,0 +2015-02-01,0.22,1.47,1.98,0.11,0.26,0 +2015-03-01,0.25,1.52,2.04,0.04,0.28,0 +2015-04-01,0.23,1.35,1.94,-0.26,0.08,0 +2015-05-01,0.24,1.54,2.2,-0.1,0.33,0 +2015-06-01,0.28,1.68,2.36,0.05,0.5,0 +2015-07-01,0.3,1.63,2.32,0.14,0.5,0 +2015-08-01,0.38,1.54,2.17,0.31,0.56,0 +2015-09-01,0.37,1.49,2.17,0.33,0.65,0 +2015-10-01,0.26,1.39,2.07,0.21,0.57,0 +2015-11-01,0.48,1.67,2.26,0.4,0.69,0 +2015-12-01,0.65,1.7,2.24,0.46,0.73,0 +2016-01-01,0.54,1.52,2.09,0.33,0.67,0 +2016-02-01,0.53,1.22,1.78,0.14,0.47,0 +2016-03-01,0.66,1.38,1.89,-0.03,0.34,0 +2016-04-01,0.56,1.26,1.81,-0.22,0.19,0 +2016-05-01,0.59,1.3,1.81,-0.22,0.21,0 +2016-06-01,0.55,1.17,1.64,-0.27,0.17,0 +2016-07-01,0.51,1.07,1.5,-0.32,0.04,0 +2016-08-01,0.57,1.13,1.56,-0.17,0.09,0 +2016-09-01,0.59,1.18,1.63,-0.17,0.12,0 +2016-10-01,0.66,1.27,1.76,-0.26,0.1,0 +2016-11-01,0.74,1.6,2.14,-0.07,0.32,0 +2016-12-01,0.87,1.96,2.49,0.15,0.56,0 +2017-01-01,0.83,1.92,2.43,0.03,0.42,0 +2017-02-01,0.82,1.9,2.42,0.01,0.4,0 +2017-03-01,1.01,2.01,2.48,0.18,0.49,0 +2017-04-01,1.04,1.82,2.3,0.08,0.39,0 +2017-05-01,1.12,1.84,2.3,0.09,0.47,0 +2017-06-01,1.2,1.77,2.19,0.14,0.46,0 +2017-07-01,1.22,1.87,2.32,0.23,0.55,0 +2017-08-01,1.23,1.78,2.21,0.16,0.43,0 +2017-09-01,1.28,1.8,2.2,0.12,0.37,0 +2017-10-01,1.4,1.98,2.36,0.25,0.5,0 +2017-11-01,1.56,2.05,2.35,0.3,0.5,0 +2017-12-01,1.7,2.18,2.4,0.42,0.5,0 +2018-01-01,1.8,2.38,2.58,0.45,0.54,0 +2018-02-01,1.96,2.6,2.86,0.63,0.76,0 +2018-03-01,2.06,2.63,2.84,0.61,0.75,0 +2018-04-01,2.15,2.7,2.87,0.65,0.74,0 +2018-05-01,2.27,2.82,2.98,0.72,0.84,0 +2018-06-01,2.33,2.78,2.91,0.71,0.79,0 +2018-07-01,2.39,2.78,2.89,0.74,0.77,0 +2018-08-01,2.45,2.77,2.89,0.79,0.79,0 +2018-09-01,2.56,2.89,3.0,0.89,0.88,0 +2018-10-01,2.65,3.0,3.15,1.01,1.04,0 +2018-11-01,2.7,2.95,3.12,1.1,1.11,0 +2018-12-01,2.66,2.68,2.83,1.08,1.02,0 +2019-01-01,2.58,2.54,2.71,0.91,0.92,0 +2019-02-01,2.55,2.49,2.68,0.73,0.8,0 +2019-03-01,2.49,2.37,2.57,0.56,0.66,0 +2019-04-01,2.42,2.33,2.53,0.49,0.6,0 +2019-05-01,2.34,2.19,2.4,0.48,0.57,0 +2019-06-01,2.0,1.83,2.07,0.28,0.37,0 +2019-07-01,1.96,1.83,2.06,0.25,0.31,0 +2019-08-01,1.77,1.49,1.63,0.11,0.04,0 +2019-09-01,1.8,1.57,1.7,0.17,0.11,0 +2019-10-01,1.61,1.53,1.71,0.12,0.15,0 +2019-11-01,1.57,1.64,1.81,0.09,0.17,0 +2019-12-01,1.55,1.68,1.86,0.06,0.14,0 +2020-01-01,1.53,1.56,1.76,-0.09,0.04,0 +2020-02-01,1.41,1.32,1.5,-0.26,-0.11,0 +2020-03-01,0.33,0.59,0.87,-0.08,-0.12,1 +2020-04-01,0.18,0.39,0.66,-0.37,-0.45,1 +2020-05-01,0.16,0.34,0.67,-0.43,-0.44,0 +2020-06-01,0.18,0.34,0.73,-0.67,-0.54,0 +2020-07-01,0.15,0.28,0.62,-1.03,-0.83,0 +2020-08-01,0.13,0.27,0.65,-1.28,-1.01,0 +2020-09-01,0.13,0.27,0.68,-1.26,-0.98,0 +2020-10-01,0.13,0.34,0.79,-1.23,-0.92,0 +2020-11-01,0.12,0.39,0.87,-1.24,-0.84,0 +2020-12-01,0.1,0.39,0.93,-1.48,-0.98,0 +2021-01-01,0.1,0.45,1.08,-1.66,-1.0,0 +2021-02-01,0.07,0.54,1.26,-1.77,-0.92,0 +2021-03-01,0.08,0.82,1.61,-1.67,-0.66,0 +2021-04-01,0.06,0.86,1.64,-1.67,-0.71,0 +2021-05-01,0.05,0.82,1.62,-1.83,-0.85,0 +2021-06-01,0.07,0.84,1.52,-1.63,-0.82,0 +2021-07-01,0.08,0.76,1.32,-1.73,-1.01,0 +2021-08-01,0.07,0.77,1.28,-1.72,-1.07,0 +2021-09-01,0.08,0.86,1.37,-1.63,-0.97,0 +2021-10-01,0.11,1.11,1.58,-1.64,-0.95,0 +2021-11-01,0.18,1.2,1.56,-1.78,-1.06,0 +2021-12-01,0.3,1.23,1.47,-1.52,-0.99,0 +2022-01-01,0.55,1.54,1.76,-1.26,-0.69,0 +2022-02-01,1.0,1.81,1.93,-1.06,-0.52,0 +2022-03-01,1.34,2.11,2.13,-1.3,-0.72,0 +2022-04-01,1.89,2.78,2.75,-0.54,-0.14,0 +2022-05-01,2.06,2.87,2.9,-0.15,0.21,0 +2022-06-01,2.65,3.19,3.14,0.3,0.53,0 +2022-07-01,3.02,2.96,2.9,0.38,0.53,0 +2022-08-01,3.28,3.03,2.9,0.34,0.39,0 +2022-09-01,3.89,3.7,3.52,1.25,1.14,0 +2022-10-01,4.43,4.18,3.98,1.71,1.59,0 +2022-11-01,4.73,4.06,3.89,1.61,1.52,0 +2022-12-01,4.68,3.76,3.62,1.45,1.36,0 +2023-01-01,4.69,3.64,3.53,1.41,1.29,0 +2023-02-01,4.93,3.94,3.75,1.5,1.41,0 +2023-03-01,4.68,3.82,3.66,1.45,1.36,0 +2023-04-01,4.68,3.54,3.46,1.23,1.19,0 +2023-05-01,4.91,3.59,3.57,1.44,1.36,0 +2023-06-01,5.24,3.95,3.75,1.81,1.55,0 +2023-07-01,5.37,4.14,3.9,1.93,1.6,0 +2023-08-01,5.37,4.31,4.17,2.07,1.83,0 +2023-09-01,5.44,4.49,4.38,2.23,2.04,0 +2023-10-01,5.42,4.77,4.8,2.46,2.41,0 +2023-11-01,5.28,4.49,4.5,2.24,2.2,0 +2023-12-01,4.96,4.0,4.02,1.88,1.84,0 +2024-01-01,4.79,3.98,4.06,1.76,1.79,0 +2024-02-01,4.92,4.19,4.21,1.87,1.93,0 +2024-03-01,4.99,4.2,4.21,1.82,1.9,0 +2024-04-01,5.14,4.56,4.54,2.11,2.15,0 +2024-05-01,5.16,4.5,4.48,2.17,2.15,0 +2024-06-01,5.11,4.32,4.31,2.1,2.05,0 +2024-07-01,4.9,4.16,4.25,1.98,1.97,0 +2024-08-01,4.43,3.71,3.87,1.74,1.76,0 +2024-09-01,4.03,3.5,3.72,1.53,1.62,0 +2024-10-01,4.2,3.91,4.1,1.68,1.81,0 +2024-11-01,4.33,4.23,4.36,1.84,2.03,0 +2024-12-01,4.23,4.25,4.39,1.89,2.09,0 From ebccc60ee334d048fa7e2c9eef967f00ab9bcfec Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Fri, 13 Mar 2026 11:17:19 +1100 Subject: [PATCH 09/18] update --- lectures/risk_aversion_or_mistaken_beliefs.md | 320 ++++++++++-------- 1 file changed, 181 insertions(+), 139 deletions(-) diff --git a/lectures/risk_aversion_or_mistaken_beliefs.md b/lectures/risk_aversion_or_mistaken_beliefs.md index e28b73382..fc8b8a5dd 100644 --- a/lectures/risk_aversion_or_mistaken_beliefs.md +++ b/lectures/risk_aversion_or_mistaken_beliefs.md @@ -44,7 +44,7 @@ Likelihood ratios — equivalently, multiplicative martingale increments — app | Doubtful | $m_{t+1} \in \mathcal{M}$ | misspecification fears| Each likelihood ratio takes the log-normal form -$m_{t+1}^b = \exp(-b_t' \varepsilon_{t+1} - \frac{1}{2} b_t' b_t)$ +$m_{t+1}^b = \exp(-b_t^\top \varepsilon_{t+1} - \frac{1}{2} b_t^\top b_t)$ with $b_t = 0$, $\lambda_t$, $w_t$, or a worst-case distortion. The lecture draws primarily on three lines of work: @@ -63,8 +63,11 @@ We start with some standard imports: ```{code-cell} ipython3 import numpy as np import matplotlib.pyplot as plt +import pandas as pd +from datetime import datetime from scipy.linalg import solve_discrete_lyapunov from numpy.linalg import inv, eigvals, norm +from scipy.stats import norm as normal_dist ``` ## Likelihood ratios and twisted densities @@ -78,20 +81,18 @@ Under the econometrician's probability model, $\varepsilon$ has a standard multi ```{math} :label: eq_baseline -\phi(\varepsilon) \propto \exp\!\left(-\frac{1}{2}\,\varepsilon'\varepsilon\right), \qquad \varepsilon \sim \mathcal{N}(0, I) +\phi(\varepsilon) \propto \exp\!\left(-\frac{1}{2} \varepsilon^\top\varepsilon\right), \qquad \varepsilon \sim \mathcal{N}(0, I) ``` -### The likelihood ratio - Define a **likelihood ratio** ```{math} :label: eq_lr -m(\varepsilon) = \exp\!\left(-\lambda'\varepsilon - \frac{1}{2}\,\lambda'\lambda\right) \geq 0 +m(\varepsilon) = \exp\!\left(-\lambda^\top\varepsilon - \frac{1}{2} \lambda^\top\lambda\right) \geq 0 ``` -which satisfies $E\, m(\varepsilon) = 1$ when the mathematical expectation $E$ is taken with respect to the econometrician's model. +which satisfies $E m(\varepsilon) = 1$ when the mathematical expectation $E$ is taken with respect to the econometrician's model. ### The twisted density @@ -100,7 +101,7 @@ The **twisted density** is ```{math} :label: eq_twisted -\hat\phi(\varepsilon) = m(\varepsilon)\,\phi(\varepsilon) \propto \exp\!\left(-\frac{1}{2}(\varepsilon + \lambda)'(\varepsilon + \lambda)\right) +\hat\phi(\varepsilon) = m(\varepsilon) \phi(\varepsilon) \propto \exp\!\left(-\frac{1}{2}(\varepsilon + \lambda)^\top(\varepsilon + \lambda)\right) ``` which is a $\mathcal{N}(-\lambda, I)$ density. @@ -112,14 +113,14 @@ The likelihood ratio has shifted the mean of $\varepsilon$ from $0$ to $-\lambda Verify that: -1. $E\,m(\varepsilon) = 1$ by computing $\int m(\varepsilon)\,\phi(\varepsilon)\,d\varepsilon$ using the moment-generating function of a standard normal. -2. The twisted density $\hat\phi(\varepsilon) = m(\varepsilon)\,\phi(\varepsilon)$ is indeed $\mathcal{N}(-\lambda, I)$ by combining exponents: +1. $E m(\varepsilon) = 1$ by computing $\int m(\varepsilon) \phi(\varepsilon) d\varepsilon$ using the moment-generating function of a standard normal. +2. The twisted density $\hat\phi(\varepsilon) = m(\varepsilon) \phi(\varepsilon)$ is indeed $\mathcal{N}(-\lambda, I)$ by combining exponents: $$ -m(\varepsilon)\,\phi(\varepsilon) \propto \exp\!\left(-\lambda'\varepsilon - \tfrac{1}{2}\lambda'\lambda\right) \exp\!\left(-\tfrac{1}{2}\varepsilon'\varepsilon\right) = \exp\!\left(-\tfrac{1}{2}\bigl[\varepsilon'\varepsilon + 2\lambda'\varepsilon + \lambda'\lambda\bigr]\right) +m(\varepsilon) \phi(\varepsilon) \propto \exp\!\left(-\lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda\right) \exp\!\left(-\tfrac{1}{2}\varepsilon^\top\varepsilon\right) = \exp\!\left(-\tfrac{1}{2}\bigl[\varepsilon^\top\varepsilon + 2\lambda^\top\varepsilon + \lambda^\top\lambda\bigr]\right) $$ -and complete the square to obtain $-\frac{1}{2}(\varepsilon + \lambda)'(\varepsilon + \lambda)$. +and complete the square to obtain $-\frac{1}{2}(\varepsilon + \lambda)^\top(\varepsilon + \lambda)$. ```` @@ -127,20 +128,20 @@ and complete the square to obtain $-\frac{1}{2}(\varepsilon + \lambda)'(\varepsi :class: dropdown **Part 1.** -Write $E\,m(\varepsilon) = \int \exp(-\lambda'\varepsilon - \tfrac{1}{2}\lambda'\lambda)\,\phi(\varepsilon)\,d\varepsilon = \exp(-\tfrac{1}{2}\lambda'\lambda)\,E[\exp(-\lambda'\varepsilon)]$. +Write $E m(\varepsilon) = \int \exp(-\lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda) \phi(\varepsilon) d\varepsilon = \exp(-\tfrac{1}{2}\lambda^\top\lambda) E[\exp(-\lambda^\top\varepsilon)]$. -The moment-generating function of $\varepsilon \sim \mathcal{N}(0,I)$ gives $E[\exp(-\lambda'\varepsilon)] = \exp(\tfrac{1}{2}\lambda'\lambda)$. +The moment-generating function of $\varepsilon \sim \mathcal{N}(0,I)$ gives $E[\exp(-\lambda^\top\varepsilon)] = \exp(\tfrac{1}{2}\lambda^\top\lambda)$. -So $E\,m(\varepsilon) = \exp(-\tfrac{1}{2}\lambda'\lambda)\exp(\tfrac{1}{2}\lambda'\lambda) = 1$. +So $E m(\varepsilon) = \exp(-\tfrac{1}{2}\lambda^\top\lambda)\exp(\tfrac{1}{2}\lambda^\top\lambda) = 1$. **Part 2.** Combine the exponents: $$ -m(\varepsilon)\,\phi(\varepsilon) \propto \exp\!\left(-\tfrac{1}{2}\varepsilon'\varepsilon - \lambda'\varepsilon - \tfrac{1}{2}\lambda'\lambda\right) +m(\varepsilon) \phi(\varepsilon) \propto \exp\!\left(-\tfrac{1}{2}\varepsilon^\top\varepsilon - \lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda\right) $$ -Recognise the argument as $-\tfrac{1}{2}(\varepsilon'\varepsilon + 2\lambda'\varepsilon + \lambda'\lambda) = -\tfrac{1}{2}(\varepsilon + \lambda)'(\varepsilon + \lambda)$. +Recognise the argument as $-\tfrac{1}{2}(\varepsilon^\top\varepsilon + 2\lambda^\top\varepsilon + \lambda^\top\lambda) = -\tfrac{1}{2}(\varepsilon + \lambda)^\top(\varepsilon + \lambda)$. This is the kernel of a $\mathcal{N}(-\lambda, I)$ density. @@ -153,7 +154,7 @@ The **relative entropy** (Kullback–Leibler divergence) of the twisted density ```{math} :label: eq_entropy -E\bigl[m(\varepsilon)\log m(\varepsilon)\bigr] = \frac{1}{2}\,\lambda'\lambda +E\bigl[m(\varepsilon)\log m(\varepsilon)\bigr] = \frac{1}{2} \lambda^\top\lambda ``` a convenient scalar measure of the statistical distance between the two models. @@ -162,13 +163,9 @@ The vector $\lambda$ is the key object. Depending on context it represents *risk prices*, *belief distortions*, or *worst-case mean perturbations* under model uncertainty. -### Visualising the twist - For illustration, consider the scalar case $\varepsilon \in \mathbb{R}$ with $\lambda = 1.5$. ```{code-cell} ipython3 -from scipy.stats import norm as normal_dist - ε = np.linspace(-5, 5, 500) λ_val = 1.5 @@ -179,21 +176,16 @@ m_lr = np.exp(-λ_val * ε - 0.5 * λ_val**2) fig, axes = plt.subplots(1, 3, figsize=(14, 4)) axes[0].plot(ε, ϕ_base, 'steelblue', lw=2) -axes[0].set_title(r"Baseline $\phi(\varepsilon)$: $\mathcal{N}(0,1)$") axes[0].set_xlabel(r"$\varepsilon$") axes[1].plot(ε, m_lr, 'firebrick', lw=2) axes[1].axhline(1, color='grey', lw=0.8, ls='--') -axes[1].set_title(rf"Likelihood ratio $m(\varepsilon)$, $\lambda={λ_val}$") axes[1].set_xlabel(r"$\varepsilon$") -axes[2].plot(ε, ϕ_base, 'steelblue', lw=1.5, +axes[2].plot(ε, ϕ_base, 'steelblue', lw=2, ls='--', alpha=0.6, label='Baseline') axes[2].plot(ε, ϕ_twist, 'firebrick', lw=2, label='Twisted') -axes[2].set_title( - r"Twisted $\hat\phi(\varepsilon)$:" - r" $\mathcal{N}(-\lambda, 1)$") axes[2].set_xlabel(r"$\varepsilon$") axes[2].legend() @@ -219,13 +211,13 @@ The econometrician works with a linear Gaussian state-space system at a *monthly ```{math} :label: eq_state -x_{t+1} = A\,x_t + C\,\varepsilon_{t+1} +x_{t+1} = A x_t + C \varepsilon_{t+1} ``` ```{math} :label: eq_obs -y_{t+1} = D\,x_t + G\,\varepsilon_{t+1} +y_{t+1} = D x_t + G \varepsilon_{t+1} ``` ```{math} @@ -238,12 +230,12 @@ Here $x_t$ is an $n \times 1$ state vector and $\varepsilon_{t+1}$ is a $k \time Throughout, we assume $n = k$ and that the volatility matrix $C$ is square and invertible — this is needed whenever we back out mean distortions $w = -C^{-1}(\cdot)$ from alternative transition matrices. -The observation $y_{t+1}$ represents consumption growth, $c_{t+1} - c_t = D\,x_t + G\,\varepsilon_{t+1}$. +The observation $y_{t+1}$ represents consumption growth, $c_{t+1} - c_t = D x_t + G \varepsilon_{t+1}$. Separately, the risk-free one-period interest rate and the payout process from a risky asset are linear functions of the state: $$ -r_t = \delta_0 + \bar{r}'\,x_t, \qquad d_t = \bar{d}'\,x_t +r_t = \delta_0 + \bar{r}^\top x_t, \qquad d_t = \bar{d}^\top x_t $$ ```{figure} /_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fig2_tom.png @@ -258,7 +250,7 @@ The econometrician's model: estimated state dynamics. Under rational expectations with a risk-neutral representative investor, the stock price $p_t$ (the ex-dividend market value of a claim to the stream $\{d_{t+j}\}_{j=1}^\infty$) satisfies: $$ -p_t = \exp(-r_t)\,E_t(p_{t+1} + d_{t+1}) +p_t = \exp(-r_t) E_t(p_{t+1} + d_{t+1}) $$ The expectations theory of the term structure of interest rates prices a zero-coupon risk-free claim to one dollar at time $t+n$ as: @@ -266,7 +258,7 @@ The expectations theory of the term structure of interest rates prices a zero-co ```{math} :label: eq_rn_recursion -p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,E_t\,p_{t+1}(n), \qquad p_t(n) = \exp(\bar{A}_n^{RN} + B_n^{RN}\,x_t) +p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t) E_t p_{t+1}(n), \qquad p_t(n) = \exp(\bar{A}_n^{RN} + B_n^{RN} x_t) ``` The last equality states that bond prices take an **exponential-affine** form in the state — this is a consequence of the linear Gaussian structure and can be verified by substituting the guess into the recursion and matching coefficients (see {ref}`Exercise 3 ` in {doc}`Affine Models of Asset Prices `). @@ -277,7 +269,7 @@ These formulas work "pretty well" for conditional means but less well for condit It would be convenient if versions of the same pricing formulas worked even when investors are risk averse or hold distorted beliefs — the likelihood ratio makes this possible. -We now promote the static vector $\lambda$ from {eq}`eq_lr` to a *state-dependent* risk price vector by writing $\lambda_t = \Lambda\,x_t$, where $\Lambda$ is a $k \times n$ matrix of risk price coefficients. +We now promote the static vector $\lambda$ from {eq}`eq_lr` to a *state-dependent* risk price vector by writing $\lambda_t = \Lambda x_t$, where $\Lambda$ is a $k \times n$ matrix of risk price coefficients. In the code below, this matrix is the parameter `Λ`. @@ -286,12 +278,12 @@ The likelihood ratio increment is ```{math} :label: eq_sdf_lr -m_{t+1}^\Lambda = \exp\!\left(-\lambda_t'\,\varepsilon_{t+1} - \frac{1}{2}\,\lambda_t'\lambda_t\right), \qquad \lambda_t = \Lambda\,x_t +m_{t+1}^\Lambda = \exp\!\left(-\lambda_t^\top \varepsilon_{t+1} - \frac{1}{2} \lambda_t^\top\lambda_t\right), \qquad \lambda_t = \Lambda x_t ``` -with $E_t\,m_{t+1}^\Lambda = 1$ and $m_{t+1}^\Lambda \geq 0$. +with $E_t m_{t+1}^\Lambda = 1$ and $m_{t+1}^\Lambda \geq 0$. -The likelihood ratio $m_{t+1}^\Lambda$ distorts the conditional distribution of $\varepsilon_{t+1}$ from $\mathcal{N}(0,I)$ to $\mathcal{N}(-\Lambda\,x_t, I)$. +The likelihood ratio $m_{t+1}^\Lambda$ distorts the conditional distribution of $\varepsilon_{t+1}$ from $\mathcal{N}(0,I)$ to $\mathcal{N}(-\Lambda x_t, I)$. Covariances of returns with $m_{t+1}^\Lambda$ affect mean returns — this is the channel through which risk aversion prices risks. @@ -302,7 +294,7 @@ For stocks (Lucas–Hansen): ```{math} :label: eq_stock_lr -p_t = \exp(-r_t)\,E_t\bigl(m_{t+1}^\Lambda\,(p_{t+1} + d_{t+1})\bigr) +p_t = \exp(-r_t) E_t\bigl(m_{t+1}^\Lambda (p_{t+1} + d_{t+1})\bigr) ``` For the term structure (Dai–Singleton–Backus–Zin): @@ -310,7 +302,7 @@ For the term structure (Dai–Singleton–Backus–Zin): ```{math} :label: eq_ts_lr -p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,E_t\bigl(m_{t+1}^\Lambda\,p_{t+1}(n)\bigr), \qquad p_t(n) = \exp(\bar{A}_n + B_n\,x_t) +p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t) E_t\bigl(m_{t+1}^\Lambda p_{t+1}(n)\bigr), \qquad p_t(n) = \exp(\bar{A}_n + B_n x_t) ``` Note that the coefficients $\bar{A}_n$, $B_n$ here differ from the risk-neutral coefficients $\bar{A}_n^{RN}$, $B_n^{RN}$ in {eq}`eq_rn_recursion` because the likelihood ratio modifies the recursion. @@ -319,32 +311,32 @@ Note that the coefficients $\bar{A}_n$, $B_n$ here differ from the risk-neutral The risk-neutral representation implies **twisted dynamics**. -Under the twisted measure, define $\tilde\varepsilon_{t+1} := \varepsilon_{t+1} + \lambda_t = \varepsilon_{t+1} + \Lambda\, x_t$. +Under the twisted measure, define $\tilde\varepsilon_{t+1} := \varepsilon_{t+1} + \lambda_t = \varepsilon_{t+1} + \Lambda x_t$. Since $\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under the econometrician's measure, the change of measure makes $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under the risk-neutral measure. -Substituting $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - \Lambda\, x_t$ into {eq}`eq_state` gives: +Substituting $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - \Lambda x_t$ into {eq}`eq_state` gives: ```{math} :label: eq_rn_dynamics -x_{t+1} = (A - C\Lambda)\,x_t + C\,\tilde\varepsilon_{t+1}, \qquad \tilde\varepsilon_{t+1} \sim \mathcal{N}(0,I) +x_{t+1} = (A - C\Lambda) x_t + C \tilde\varepsilon_{t+1}, \qquad \tilde\varepsilon_{t+1} \sim \mathcal{N}(0,I) ``` -The dependence of $\lambda_t = \Lambda\,x_t$ on the state modifies the dynamics relative to the econometrician's model. +The dependence of $\lambda_t = \Lambda x_t$ on the state modifies the dynamics relative to the econometrician's model. ### Expectation under a twisted distribution The mathematical expectation of $y_{t+1}$ under the probability distribution twisted by likelihood ratio $m_{t+1}$ is $$ -\tilde{E}_t\,y_{t+1} = E_t\,m_{t+1}\,y_{t+1} +\tilde{E}_t y_{t+1} = E_t m_{t+1} y_{t+1} $$ Under the risk-neutral dynamics, the term structure theory becomes: $$ -p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t)\,\tilde{E}_t\,p_{t+1}(n), \qquad p_t(n) = \exp(\tilde{\bar{A}}_n + \tilde{B}_n\,x_t) +p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t) \tilde{E}_t p_{t+1}(n), \qquad p_t(n) = \exp(\tilde{\bar{A}}_n + \tilde{B}_n x_t) $$ These are the same formulas as rational-expectations asset pricing, but expectations are taken with respect to a probability measure *twisted by risk aversion*. @@ -475,7 +467,6 @@ for label, x in states.items(): ax.set_xlabel("Maturity (months)") ax.set_ylabel("Yield (annualised %)") -ax.set_title("Yield curves under different states") ax.legend() plt.tight_layout() plt.show() @@ -484,8 +475,8 @@ plt.show() ### Econometrician's model vs. risk-neutral model A key implication is that the risk-neutral dynamics -$x_{t+1} = (A - C\Lambda)\,x_t + C\,\tilde\varepsilon_{t+1}$ -differ from the econometrician's dynamics $x_{t+1} = A\,x_t + C\,\varepsilon_{t+1}$. +$x_{t+1} = (A - C\Lambda) x_t + C \tilde\varepsilon_{t+1}$ +differ from the econometrician's dynamics $x_{t+1} = A x_t + C \varepsilon_{t+1}$. ```{code-cell} ipython3 print("A:\n", model.A) @@ -505,15 +496,14 @@ X_rn = model.simulate_twisted(x0, T, rng=rng2) fig, axes = plt.subplots(2, 1, figsize=(10, 7), sharex=True) for i, (ax, lab) in enumerate(zip(axes, ["Level factor", "Slope factor"])): - ax.plot(X_econ[:, i], 'steelblue', lw=1.2, + ax.plot(X_econ[:, i], 'steelblue', lw=2, label="Econometrician (P)") - ax.plot(X_rn[:, i], 'firebrick', lw=1.2, + ax.plot(X_rn[:, i], 'firebrick', lw=2, alpha=0.8, label="Risk-neutral (Q)") ax.set_ylabel(lab) ax.legend() axes[1].set_xlabel("Period") -axes[0].set_title("State paths: physical vs. risk-neutral") plt.tight_layout() plt.show() ``` @@ -522,7 +512,7 @@ Both factors are more persistent under the risk-neutral measure $Q$ than under t ## An identification challenge -The risk price vector $\lambda_t = \Lambda\, x_t$ can be interpreted as either: +The risk price vector $\lambda_t = \Lambda x_t$ can be interpreted as either: - a **risk price vector** expressing the representative agent's risk aversion, or - the representative agent's **belief distortion** relative to the econometrician's @@ -553,13 +543,12 @@ model_mistaken = LikelihoodRatioModel( y_mistaken = model_mistaken.yields(x_test, 60) * 1200 fig, ax = plt.subplots(figsize=(8, 5)) -ax.plot(np.arange(1, 61), y_risk_averse, 'steelblue', lw=3, +ax.plot(np.arange(1, 61), y_risk_averse, 'steelblue', lw=2, label='Risk averse + rational expectations') -ax.plot(np.arange(1, 61), y_mistaken, 'firebrick', lw=1.5, ls='--', +ax.plot(np.arange(1, 61), y_mistaken, 'firebrick', lw=2, ls='--', label='Risk neutral + mistaken beliefs') ax.set_xlabel("Maturity (months)") ax.set_ylabel("Yield (annualised %)") -ax.set_title("Observational equivalence") ax.legend() plt.tight_layout() plt.show() @@ -579,8 +568,8 @@ Without additional information (e.g., surveys of forecasters), we cannot tell th Their setup posits: - The representative agent's risk aversion leads him to price risks - $\varepsilon_{t+1}$ with prices $\lambda_t^* = \Lambda^*\, x_t$, where $\Lambda^*$ is a $k \times n$ matrix. -- The representative agent has **twisted beliefs** $(A^*, C) = (A - C\,W^*, C)$ + $\varepsilon_{t+1}$ with prices $\lambda_t^* = \Lambda^* x_t$, where $\Lambda^*$ is a $k \times n$ matrix. +- The representative agent has **twisted beliefs** $(A^*, C) = (A - C W^*, C)$ relative to the econometrician's model $(A, C)$, where $W^*$ is a $k \times n$ matrix of belief distortion coefficients. - Professional forecasters use the twisted beliefs $(A^*, C)$ to answer survey questions about their forecasts. @@ -593,17 +582,17 @@ PSS proceed in four steps: 2. Project experts' one-step-ahead forecasts $E_t^*[x_{t+1}]$ on $x_t$ to obtain $E_t^*[x_{t+1}] = A^* x_t$ and interpret $A^*$ as incorporating belief distortions. -3. Back out the mean distortion matrix $W^* = -C^{-1}(A^* - A)$, so that $w_t^* = W^*\,x_t$ is the state-dependent mean shift applied to the +3. Back out the mean distortion matrix $W^* = -C^{-1}(A^* - A)$, so that $w_t^* = W^* x_t$ is the state-dependent mean shift applied to the density of $\varepsilon_{t+1}$. (This requires $C$ to be invertible.) 4. Reinterpret the $\Lambda$ estimated by the rational-expectations econometrician - as $\Lambda = \Lambda^* + W^*$, where $\lambda_t^* = \Lambda^*\, x_t$ is the + as $\Lambda = \Lambda^* + W^*$, where $\lambda_t^* = \Lambda^* x_t$ is the (smaller) price of risk vector actually charged by the representative agent with distorted beliefs. -An econometrician who mistakenly imposes rational expectations estimates risk prices $\lambda_t = \Lambda\, x_t$ that sum two parts: -- *smaller risk prices* $\lambda_t^* = \Lambda^*\, x_t$ actually charged by the erroneous-beliefs +An econometrician who mistakenly imposes rational expectations estimates risk prices $\lambda_t = \Lambda x_t$ that sum two parts: +- *smaller risk prices* $\lambda_t^* = \Lambda^* x_t$ actually charged by the erroneous-beliefs representative agent, and -- *conditional mean distortions* $w_t^* = W^*\, x_t$ of the risks $\varepsilon_{t+1}$ that +- *conditional mean distortions* $w_t^* = W^* x_t$ of the risks $\varepsilon_{t+1}$ that the twisted-beliefs representative agent's model displays relative to the econometrician's. @@ -656,15 +645,13 @@ for i, (ax, lab) in enumerate(zip(axes, ax.set_ylabel(lab) ax.legend() -axes[0].set_title("PSS decomposition: level") -axes[1].set_title("PSS decomposition: slope") plt.tight_layout() plt.show() ``` PSS find that experts perceive the level and slope of the yield curve to be *more persistent* than the econometrician's estimates imply. -Subjective risk prices $\Lambda^*\, x_t$ vary less than the $\Lambda\, x_t$ estimated by the rational-expectations econometrician. +Subjective risk prices $\Lambda^* x_t$ vary less than the $\Lambda x_t$ estimated by the rational-expectations econometrician. However, PSS offer no explanation for *why* beliefs are distorted — are they mistakes, ignorance of good econometrics, or something else? @@ -718,13 +705,13 @@ Inspired by robust control theory, consider a dubious investor who: Taking the log consumption process to be linear Gaussian with shocks $\varepsilon_{t+1} \sim \mathcal{N}(0,I)$: $$ -c_{t+1} - c_t = D\,x_t + G\,\varepsilon_{t+1}, \qquad x_{t+1} = A\,x_t + C\,\varepsilon_{t+1} +c_{t+1} - c_t = D x_t + G \varepsilon_{t+1}, \qquad x_{t+1} = A x_t + C \varepsilon_{t+1} $$ the dubious agent's value function is $$ -V(x_0, c_0) := E\!\left[\sum_{t=0}^{\infty} \beta^t\,c_t \;\middle|\; x_0, c_0\right] = c_0 + \beta\,E\!\left[V(x_1, c_1) \;\middle|\; x_0, c_0\right] +V(x_0, c_0) := E\!\left[\sum_{t=0}^{\infty} \beta^t c_t \;\middle|\; x_0, c_0\right] = c_0 + \beta E\!\left[V(x_1, c_1) \;\middle|\; x_0, c_0\right] $$ Note that the objective is *linear* in consumption — there is no concave utility function $u(c_t)$. @@ -740,21 +727,21 @@ The dubious agent solves a *min* problem — a malevolent "nature" chooses the w ```{math} :label: eq_hansen_seq -J(x_0, c_0 \mid \eta) := \min_{\{m_{t+1}\}} E\!\left[\sum_{t=0}^{\infty} \beta^t\,M_t\,c_t \;\middle|\; x_0, c_0\right] +J(x_0, c_0 \mid \eta) := \min_{\{m_{t+1}\}} E\!\left[\sum_{t=0}^{\infty} \beta^t M_t c_t \;\middle|\; x_0, c_0\right] ``` subject to $$ -c_{t+1} - c_t = D\,x_t + G\,\varepsilon_{t+1}, \qquad x_{t+1} = A\,x_t + C\,\varepsilon_{t+1} +c_{t+1} - c_t = D x_t + G \varepsilon_{t+1}, \qquad x_{t+1} = A x_t + C \varepsilon_{t+1} $$ $$ -E\!\left[\sum_{t=0}^{\infty} \beta^t\,M_t\,E\!\left[m_{t+1}\log m_{t+1} \;\middle|\; x_t, c_t\right] \;\middle|\; x_0, c_0\right] \leq \eta +E\!\left[\sum_{t=0}^{\infty} \beta^t M_t E\!\left[m_{t+1}\log m_{t+1} \;\middle|\; x_t, c_t\right] \;\middle|\; x_0, c_0\right] \leq \eta $$ $$ -M_{t+1} = M_t\,m_{t+1}, \qquad E[m_{t+1} \mid x_t, c_t] = 1, \qquad M_0 = 1 +M_{t+1} = M_t m_{t+1}, \qquad E[m_{t+1} \mid x_t, c_t] = 1, \qquad M_0 = 1 $$ The cumulative likelihood ratio $M_t = \prod_{s=0}^{t-1} m_{s+1}$ converts the original probability measure into the distorted one. @@ -782,13 +769,13 @@ Discounted entropy, by treating future divergences less severely, admits these s With the log-normal likelihood ratio $$ -m_{t+1} := \exp\!\left(-\frac{w_t' w_t}{2} - w_t'\,\varepsilon_{t+1}\right) +m_{t+1} := \exp\!\left(-\frac{w_t^\top w_t}{2} - w_t^\top \varepsilon_{t+1}\right) $$ conditional entropy takes the simple form $$ -E\!\left[m_{t+1}\log m_{t+1} \;\middle|\; x_t, c_t\right] = \frac{1}{2}\,w_t' w_t +E\!\left[m_{t+1}\log m_{t+1} \;\middle|\; x_t, c_t\right] = \frac{1}{2} w_t^\top w_t $$ Substituting into {eq}`eq_hansen_seq` and performing a change of measure (replacing $E[\cdot]$ with $E^w[\cdot]$ under the distorted model) yields the reformulated problem: @@ -796,22 +783,22 @@ Substituting into {eq}`eq_hansen_seq` and performing a change of measure (replac ```{math} :label: eq_hansen_reform -J(x_0, c_0 \mid \eta) := \min_{\{w_t\}} E^w\!\left[\sum_{t=0}^{\infty} \beta^t\,c_t \;\middle|\; x_0, c_0\right] +J(x_0, c_0 \mid \eta) := \min_{\{w_t\}} E^w\!\left[\sum_{t=0}^{\infty} \beta^t c_t \;\middle|\; x_0, c_0\right] ``` subject to $$ -c_{t+1} - c_t = D\,x_t + G\,(\tilde\varepsilon_{t+1} - w_t), \qquad x_{t+1} = A\,x_t + C\,(\tilde\varepsilon_{t+1} - w_t) +c_{t+1} - c_t = D x_t + G (\tilde\varepsilon_{t+1} - w_t), \qquad x_{t+1} = A x_t + C (\tilde\varepsilon_{t+1} - w_t) $$ $$ -\frac{1}{2}\,E^w\!\left[\sum_{t=0}^{\infty} \beta^t\,w_t' w_t \;\middle|\; x_0, c_0\right] \leq \eta +\frac{1}{2} E^w\!\left[\sum_{t=0}^{\infty} \beta^t w_t^\top w_t \;\middle|\; x_0, c_0\right] \leq \eta $$ Here $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under $E^w$, and we have substituted $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - w_t$ (so $E[\varepsilon_{t+1}] = -w_t$ under the distorted measure). -The shift $-w_t$ *reduces* expected consumption growth by $G\,w_t$ and shifts the state dynamics by $-C\,w_t$ — this is how the worst-case model makes the agent worse off. +The shift $-w_t$ *reduces* expected consumption growth by $G w_t$ and shifts the state dynamics by $-C w_t$ — this is how the worst-case model makes the agent worse off. ### Outcome: constant worst-case distortion @@ -827,21 +814,21 @@ This does *not* help explain countercyclical prices of risk (or prices of model We compute $\bar{w}$ using the multiplier formulation (see {ref}`the multiplier preferences section below `), in which the parameter $\theta$ penalises entropy: larger $\theta$ means less concern about misspecification. -**Derivation sketch.** In the multiplier formulation, the agent minimises +In the multiplier formulation, the agent minimises $$ -E^w\!\left[\sum_{t=0}^\infty \beta^t \bigl(c_t + \tfrac{\theta}{2}\,w_t'w_t\bigr)\right] +E^w\!\left[\sum_{t=0}^\infty \beta^t \bigl(c_t + \tfrac{\theta}{2} w_t^\top w_t\bigr)\right] $$ over $\{w_t\}$ subject to the shifted dynamics. -Since $c_t = c_0 + \sum_{s=0}^{t-1}(D\,x_s + G\,\varepsilon_{s+1})$ and $\varepsilon_{s+1} = \tilde\varepsilon_{s+1} - w_s$, the first-order condition for $w_t$ balances the entropy penalty $\theta\, w_t$ against the marginal effect on discounted consumption: +Since $c_t = c_0 + \sum_{s=0}^{t-1}(D x_s + G \varepsilon_{s+1})$ and $\varepsilon_{s+1} = \tilde\varepsilon_{s+1} - w_s$, the first-order condition for $w_t$ balances the entropy penalty $\theta w_t$ against the marginal effect on discounted consumption: $$ -\theta\,\bar{w} = \frac{\beta}{1-\beta}\,G' + \beta\,C'\,v +\theta \bar{w} = \frac{\beta}{1-\beta} G^\top + \beta C^\top v $$ -where $v$ solves $v = \frac{\beta}{1-\beta}\,D' + \beta\,A'\,v$, or equivalently $v = \beta\,(I - \beta A')^{-1}\,D'\,/\,(1-\beta)$. +where $v$ solves $v = \frac{\beta}{1-\beta} D^\top + \beta A^\top v$, or equivalently $v = \beta (I - \beta A^\top)^{-1} D^\top / (1-\beta)$. The vector $v$ captures the discounted cumulative effect of a unit change in $x_t$ on future consumption. @@ -873,9 +860,9 @@ Larger $\theta$ (less concern about misspecification) yields a smaller distortio Derive the formula for $\bar{w}$. -1. Write the discounted consumption path as $\sum_{t=0}^\infty \beta^t c_t = \frac{c_0}{1-\beta} + \sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}(D\,x_s - G\,w_s + G\,\tilde\varepsilon_{s+1})$. -2. Use the state recursion $x_{t+1} = A\,x_t - C\,w_t + C\,\tilde\varepsilon_{t+1}$ and take first-order conditions with respect to the constant $w_t = \bar{w}$. -3. Verify that the first-order condition gives $\theta\,\bar{w} = \frac{\beta}{1-\beta}\,G' + \beta\,C'\,v$ with $v = \beta(I - \beta A')^{-1} D' / (1-\beta)$. +1. Write the discounted consumption path as $\sum_{t=0}^\infty \beta^t c_t = \frac{c_0}{1-\beta} + \sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}(D x_s - G w_s + G \tilde\varepsilon_{s+1})$. +2. Use the state recursion $x_{t+1} = A x_t - C w_t + C \tilde\varepsilon_{t+1}$ and take first-order conditions with respect to the constant $w_t = \bar{w}$. +3. Verify that the first-order condition gives $\theta \bar{w} = \frac{\beta}{1-\beta} G^\top + \beta C^\top v$ with $v = \beta(I - \beta A^\top)^{-1} D^\top / (1-\beta)$. 4. Check numerically that larger $\theta$ brings $\bar{w}$ closer to zero. ```` @@ -884,29 +871,29 @@ Derive the formula for $\bar{w}$. :class: dropdown **Part 1.** -Since $c_t = c_0 + \sum_{s=0}^{t-1}(D\,x_s + G\,\tilde\varepsilon_{s+1} - G\,w_s)$, we have: +Since $c_t = c_0 + \sum_{s=0}^{t-1}(D x_s + G \tilde\varepsilon_{s+1} - G w_s)$, we have: $$ -\sum_{t=0}^\infty \beta^t c_t = \frac{c_0}{1-\beta} + \sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}\bigl(D\,x_s - G\,\bar{w} + G\,\tilde\varepsilon_{s+1}\bigr) +\sum_{t=0}^\infty \beta^t c_t = \frac{c_0}{1-\beta} + \sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}\bigl(D x_s - G \bar{w} + G \tilde\varepsilon_{s+1}\bigr) $$ **Part 2.** -The multiplier objective is $E^w[\sum \beta^t(c_t + \tfrac{\theta}{2}\bar{w}'\bar{w})]$. +The multiplier objective is $E^w[\sum \beta^t(c_t + \tfrac{\theta}{2}\bar{w}^\top\bar{w})]$. -Taking $\partial/\partial \bar{w}$ and setting to zero, the entropy penalty contributes $\theta\,\bar{w}$. +Taking $\partial/\partial \bar{w}$ and setting to zero, the entropy penalty contributes $\theta \bar{w}$. -The consumption term contributes $-\sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}G' = -\frac{\beta}{1-\beta}\frac{1}{1-\beta}G'$ from the direct shock effect, plus indirect effects through $x_s$ via $C$. +The consumption term contributes $-\sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}G^\top = -\frac{\beta}{1-\beta}\frac{1}{1-\beta}G^\top$ from the direct shock effect, plus indirect effects through $x_s$ via $C$. **Part 3.** -The indirect effect on $x_s$ requires summing $\sum_{t=s+1}^\infty \beta^t D' = \beta^{s+1}\frac{D'}{1-\beta}$, discounted back: +The indirect effect on $x_s$ requires summing $\sum_{t=s+1}^\infty \beta^t D^\top = \beta^{s+1}\frac{D^\top}{1-\beta}$, discounted back: $$ -\sum_{s=0}^\infty \beta^s \cdot \beta \frac{D'}{1-\beta} \cdot \frac{\partial x_s}{\partial \bar{w}} = \beta\,C'\,v +\sum_{s=0}^\infty \beta^s \cdot \beta \frac{D^\top}{1-\beta} \cdot \frac{\partial x_s}{\partial \bar{w}} = \beta C^\top v $$ -where $v = \beta(I-\beta A')^{-1}\frac{D'}{1-\beta}$ solves $v = \frac{\beta}{1-\beta}D' + \beta A'v$. +where $v = \beta(I-\beta A^\top)^{-1}\frac{D^\top}{1-\beta}$ solves $v = \frac{\beta}{1-\beta}D^\top + \beta A^\top v$. -So the first-order condition is $\theta\,\bar{w} = \frac{\beta}{1-\beta}G' + \beta\,C'\,v$, giving $\bar{w} = \frac{1}{\theta}\bigl(\frac{\beta}{1-\beta}G' + \beta\,C'\,v\bigr)$. +So the first-order condition is $\theta \bar{w} = \frac{\beta}{1-\beta}G^\top + \beta C^\top v$, giving $\bar{w} = \frac{1}{\theta}\bigl(\frac{\beta}{1-\beta}G^\top + \beta C^\top v\bigr)$. **Part 4.** As $\theta \to \infty$, $\bar{w} = \frac{1}{\theta}(\cdots) \to 0$, which the numerical table confirms. @@ -934,13 +921,13 @@ The inclusion of those alternative parametric models *tilts* the entropy ball, w The investor wants to include particular alternative models with $$ -E_t\!\left[\bar{m}_{t+1}\log\bar{m}_{t+1}\right] = \frac{1}{2}\,\bar{w}_t'\,\bar{w}_t = \xi(x_t) +E_t\!\left[\bar{m}_{t+1}\log\bar{m}_{t+1}\right] = \frac{1}{2} \bar{w}_t^\top \bar{w}_t =: \frac{1}{2}\xi(x_t) $$ and discounted entropy $$ -E^{\bar{w}}\!\left[\sum_{t=0}^{\infty} \beta^t\,\xi(x_t) \;\middle|\; x_0, c_0\right] +\frac{1}{2}\,E^{\bar{w}}\!\left[\sum_{t=0}^{\infty} \beta^t \xi(x_t) \;\middle|\; x_0, c_0\right] $$ This is accomplished by replacing the earlier entropy constraint with @@ -948,7 +935,7 @@ This is accomplished by replacing the earlier entropy constraint with ```{math} :label: eq_tilted_constraint -\frac{1}{2}\,E^w\!\left[\sum_{t=0}^{\infty} \beta^t\,w_t' w_t \;\middle|\; x_0, c_0\right] \leq E^w\!\left[\sum_{t=0}^{\infty} \beta^t\,\xi(x_t) \;\middle|\; x_0, c_0\right] +\frac{1}{2} E^w\!\left[\sum_{t=0}^{\infty} \beta^t w_t^\top w_t \;\middle|\; x_0, c_0\right] \leq \frac{1}{2} E^w\!\left[\sum_{t=0}^{\infty} \beta^t \xi(x_t) \;\middle|\; x_0, c_0\right] ``` The time-$t$ contributions to the right-hand side of {eq}`eq_tilted_constraint` relax the discounted entropy constraint in states $x_t$ in which $\xi(x_t)$ is larger. @@ -960,10 +947,10 @@ This sets the stage for *state-dependent* mean distortions in the worst-case mod Inspired by {cite:t}`Bansal_Yaron_2004`, an agent fears that the true state dynamics are more persistent than the econometrician's model implies, expressed by $$ -x_{t+1} = \bar{A}\,x_t + C\,\tilde\varepsilon_{t+1} +x_{t+1} = \bar{A} x_t + C \tilde\varepsilon_{t+1} $$ -Since $\bar{A}x_t = Ax_t + C(-C^{-1}(\bar{A}-A))x_t = Ax_t - C\bar{w}x_t$, this feared model is equivalent to shifting the mean of $\varepsilon_{t+1}$ by $-\bar{w}x_t$, giving $\bar{w}_t = \bar{w}\,x_t$ with +Since $\bar{A}x_t = Ax_t + C(-C^{-1}(\bar{A}-A))x_t = Ax_t - C\bar{w}x_t$, this feared model is equivalent to shifting the mean of $\varepsilon_{t+1}$ by $-\bar{w}x_t$, giving $\bar{w}_t = \bar{w} x_t$ with $$ \bar{w} = -C^{-1}(\bar{A} - A) @@ -974,7 +961,7 @@ $$ ```{math} :label: eq_xi -\xi(x_t) := x_t'\,\bar{w}'\bar{w}\,x_t =: x_t'\,\Xi\,x_t +\xi(x_t) := x_t^\top \bar{w}^\top\bar{w} x_t =: x_t^\top \Xi x_t ``` ```{figure} /_static/lecture_specific/risk_aversion_or_mistaken_beliefs/eggs_backus2.png @@ -988,36 +975,36 @@ Attaching a Lagrange multiplier $\tilde\theta \geq 0$ to the tilted entropy cons ```{math} :label: eq_szoke_seq -J(x_0, c_0 \mid \Xi) := \max_{\tilde\theta \geq 0}\;\min_{\{w_t\}}\; E^w\!\left[\sum_{t=0}^{\infty} \beta^t\,c_t + \tilde\theta\,\frac{1}{2}\sum_{t=0}^{\infty} \beta^t\bigl(w_t' w_t - x_t'\,\Xi\,x_t\bigr) \;\middle|\; x_0, c_0\right] +J(x_0, c_0 \mid \Xi) := \max_{\tilde\theta \geq 0}\;\min_{\{w_t\}}\; E^w\!\left[\sum_{t=0}^{\infty} \beta^t c_t + \tilde\theta \frac{1}{2}\sum_{t=0}^{\infty} \beta^t\bigl(w_t^\top w_t - x_t^\top \Xi x_t\bigr) \;\middle|\; x_0, c_0\right] ``` subject to $$ -c_{t+1} - c_t = D\,x_t + G\,(\tilde\varepsilon_{t+1} - w_t), \qquad x_{t+1} = A\,x_t + C\,(\tilde\varepsilon_{t+1} - w_t) +c_{t+1} - c_t = D x_t + G (\tilde\varepsilon_{t+1} - w_t), \qquad x_{t+1} = A x_t + C (\tilde\varepsilon_{t+1} - w_t) $$ The worst-case shock mean distortion is now *state-dependent*: $$ -\tilde{w}_t = \tilde{w}\,x_t +\tilde{w}_t = \tilde{w} x_t $$ and the worst-case model is $(\tilde{A}, C, \tilde{D}, G)$ with $$ -\tilde{A} = A - C\,\tilde{w}, \qquad \tilde{D} = D - G\,\tilde{w} +\tilde{A} = A - C \tilde{w}, \qquad \tilde{D} = D - G \tilde{w} $$ ### Implementation: tilted entropy ball **Derivation of the iteration.** -Guess a quadratic value function $J(x) = x'\,P\,x + \text{const}$ for the inner minimisation over $\{w_t\}$ in {eq}`eq_szoke_seq`. +Guess a quadratic value function $J(x) = x^\top P x + \text{const}$ for the inner minimisation over $\{w_t\}$ in {eq}`eq_szoke_seq`. -Since $w_t = W\,x_t$ is linear in the state, the first-order condition for $w_t$ at each $t$ gives: +Since $w_t = W x_t$ is linear in the state, the first-order condition for $w_t$ at each $t$ gives: $$ -\tilde\theta\,W = \beta\,C'\,P\,(A - C\,W) \quad \Longrightarrow \quad (\tilde\theta\,I + 2\beta\,C' P\,C)\,W = 2\beta\,C'\,P\,A +\tilde\theta W = \beta C^\top P (A - C W) \quad \Longrightarrow \quad (\tilde\theta I + 2\beta C^\top P C) W = 2\beta C^\top P A $$ (where we write $\tilde\theta$ as $\theta$ in the code). @@ -1025,7 +1012,7 @@ $$ Substituting back into the Bellman equation and matching quadratic terms in $x$ gives the $P$ update: $$ -P = -\tfrac{\theta}{2}\,\Xi + \tfrac{\theta}{2}\,W'W + \beta\,(A - CW)'\,P\,(A - CW) +P = -\tfrac{\theta}{2} \Xi + \tfrac{\theta}{2} W^\top W + \beta (A - CW)^\top P (A - CW) $$ The code iterates on the $(P, W)$ system until convergence. @@ -1117,7 +1104,7 @@ print(f"Eigenvalues of A_tilde: {eigvals(tilted.A_tilde).round(4)}") Derive the first-order condition for the tilted entropy problem. 1. Start from {eq}`eq_szoke_seq` and write $w_t = W x_t$. Using the dynamics $x_{t+1} = (A - CW)x_t + C\tilde\varepsilon_{t+1}$, argue that the objective is quadratic in $x_t$. -2. Take the first-order condition $\partial / \partial W$ and show that it gives $\theta\, W = 2\beta\, C' P (A - CW)$, which can be rearranged to the system solved in the code. +2. Take the first-order condition $\partial / \partial W$ and show that it gives $\theta W = 2\beta C^\top P (A - CW)$, which can be rearranged to the system solved in the code. 3. Derive the $P$ update by substituting the optimal $W$ back into the Bellman equation. ```` @@ -1129,21 +1116,21 @@ Derive the first-order condition for the tilted entropy problem. With $w_t = Wx_t$ and $x_{t+1} = (A-CW)x_t + C\tilde\varepsilon_{t+1}$, the period-$t$ payoff in {eq}`eq_szoke_seq` is: $$ -c_t + \tfrac{\theta}{2}(w_t'w_t - x_t'\Xi\,x_t) = c_t + \tfrac{\theta}{2}\,x_t'(W'W - \Xi)\,x_t +c_t + \tfrac{\theta}{2}(w_t^\top w_t - x_t^\top \Xi x_t) = c_t + \tfrac{\theta}{2} x_t^\top(W^\top W - \Xi) x_t $$ -Since $c_t$ is linear in past $x_s$ and the dynamics are linear, the value function is quadratic: $J_t = x_t'Px_t + \text{linear and constant terms}$. +Since $c_t$ is linear in past $x_s$ and the dynamics are linear, the value function is quadratic: $J_t = x_t^\top P x_t + \text{linear and constant terms}$. **Part 2.** The first-order condition for $W$ from the quadratic Bellman equation is: $$ -\frac{\partial}{\partial W}\bigl[\tfrac{\theta}{2}x_t'W'Wx_t + \beta\,x_t'(A-CW)'P(A-CW)x_t\bigr] = 0 +\frac{\partial}{\partial W}\bigl[\tfrac{\theta}{2}x_t^\top W^\top W x_t + \beta x_t^\top(A-CW)^\top P(A-CW)x_t\bigr] = 0 $$ -This gives $\theta\,W - 2\beta\,C'P(A-CW) = 0$. +This gives $\theta W - 2\beta C^\top P(A-CW) = 0$. -Rearranging: $(\theta\,I + 2\beta\,C'PC)\,W = 2\beta\,C'PA$. +Rearranging: $(\theta I + 2\beta C^\top PC) W = 2\beta C^\top PA$. **Part 3.** Substitute the optimal $W$ back into the Bellman equation. @@ -1151,7 +1138,7 @@ Substitute the optimal $W$ back into the Bellman equation. The quadratic terms in $x_t$ give: $$ -P = -\tfrac{\theta}{2}\,\Xi + \tfrac{\theta}{2}\,W'W + \beta\,(A-CW)'P(A-CW) +P = -\tfrac{\theta}{2} \Xi + \tfrac{\theta}{2} W^\top W + \beta (A-CW)^\top P(A-CW) $$ This is the matrix Riccati equation that the code iterates to convergence. @@ -1168,30 +1155,33 @@ entropy_tilted = np.array([tilted.conditional_entropy(np.array([x, 0.005])) ξ_vals = np.array([tilted.xi_function(np.array([x, 0.005])) for x in x_grid]) -# Hansen's constant entropy -w_hansen = hansen_worst_case(A, C, D, G, β, θ_tilt) +# Calibrate Hansen's θ so constant entropy matches E[ξ(x_t)/2] +Σ_stat = solve_discrete_lyapunov(A, C @ C.T) +avg_ξ_half = 0.5 * np.trace(Ξ @ Σ_stat) +w_unit = hansen_worst_case(A, C, D, G, β, 1.0) +θ_hansen = norm(w_unit) / np.sqrt(2 * avg_ξ_half) +w_hansen = w_unit / θ_hansen hansen_ent = 0.5 * w_hansen @ w_hansen fig, ax = plt.subplots(figsize=(9, 5)) ax.axhline(hansen_ent, color='steelblue', lw=2, ls='--', - label=rf"Hansen: constant $\frac{{1}}{{2}}\bar{{w}}'\bar{{w}} = {hansen_ent:.4f}$") + label=rf"Hansen: constant $\frac{{1}}{{2}}\bar{{w}}^\top\bar{{w}} = {hansen_ent:.4f}$") ax.plot(x_grid, entropy_tilted, 'firebrick', lw=2, - label=r"Szőke: $\frac{1}{2}\tilde{w}_t'\tilde{w}_t$") -ax.plot(x_grid, 0.5 * ξ_vals, 'seagreen', lw=1.5, ls=':', + label=r"Szőke: $\frac{1}{2}\tilde{w}_t^\top\tilde{w}_t$") +ax.plot(x_grid, 0.5 * ξ_vals, 'seagreen', lw=2, ls=':', label=r"Feared model: $\frac{1}{2}\xi(x_t)$") ax.set_xlabel(r"Level factor $x_{1,t}$") ax.set_ylabel("Conditional entropy") -ax.set_title("State-dependent vs. constant worst-case distortions") ax.legend() plt.tight_layout() plt.show() ``` -The key innovation of the tilted entropy ball is visible: the Szőke worst-case distortion $\tilde{w}_t = \tilde{W}\,x_t$ grows with $|x_t|$, producing *countercyclical uncertainty prices*. +The key innovation of the tilted entropy ball is visible: the Szőke worst-case distortion $\tilde{w}_t = \tilde{W} x_t$ grows with $|x_t|$, producing *countercyclical uncertainty prices*. When the state is far from its mean, the agent's worst-case model deviates more from the econometrician's model. -By contrast, Hansen's constant distortion $\bar{w}$ has entropy $\frac{1}{2}\bar{w}'\bar{w}$ that does not vary with $x_t$ (shown as a horizontal line). +By contrast, Hansen's constant distortion $\bar{w}$ has entropy $\frac{1}{2}\bar{w}^\top\bar{w}$ that does not vary with $x_t$ (shown as a horizontal line). The Szőke parabola lies inside the feared model's entropy budget $\frac{1}{2}\xi(x_t)$, confirming the worst-case distortion respects the tilted entropy constraint. @@ -1201,7 +1191,7 @@ To summarize, three distinct probability twisters play roles in this analysis: | Symbol | Source | Describes | |:---------------|:------------------------------|:----------------------------------| -| $w_t^*$ | Piazzesi, Salomao, Schneider | Mistaken agent's beliefs | +| $w_t^*$ | Piazzesi, Salomão, Schneider | Mistaken agent's beliefs | | $\bar{w}_t$ | Szőke's feared parametric model | Especial LRR parametric worry | | $\tilde{w}_t$ | Szőke's worst-case model | Worst-case distortion | @@ -1228,7 +1218,6 @@ for w_val, label, color, ls in [ ax.set_xlabel(r"$\varepsilon_1$") ax.set_ylabel("Density") -ax.set_title("Three probability twisters (first shock component)") ax.legend() plt.tight_layout() plt.show() @@ -1238,8 +1227,63 @@ Each twister shifts the econometrician's $\mathcal{N}(0,1)$ density to the left ## Empirical challenges and model performances -```{figure} /_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fig1_tom.png -U.S. term structure of interest rates. +```{code-cell} ipython3 +--- +tags: [hide-input] +mystnb: + figure: + caption: U.S. Treasury yields and yield spread + name: fig-us-yields +--- +data = pd.read_csv( + 'https://raw.githubusercontent.com/QuantEcon/lecture-python.myst/update-asset/lectures/' + '_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fred_data.csv', + parse_dates=['DATE'], index_col='DATE' +) + +fig, axes = plt.subplots(2, 1, figsize=(12, 8), sharex=True, + gridspec_kw={'height_ratios': [2, 1]}) + +# Recession shading helper +def shade_recessions(ax, rec): + ax.fill_between(rec.index, 0, 1, + where=rec.values.flatten() == 1, + transform=ax.get_xaxis_transform(), + color='grey', alpha=0.2) + +rec = data['USREC'].dropna() + +ax = axes[0] +shade_recessions(ax, rec) + +ax.plot(data['GS1'], 'steelblue', lw=2, + label=r'$y_{\mathrm{nom}}^{(1)}$') +ax.plot(data['GS5'], 'seagreen', lw=2, + label=r'$y_{\mathrm{nom}}^{(5)}$') +ax.plot(data['GS10'], 'firebrick', lw=2, + label=r'$y_{\mathrm{nom}}^{(10)}$') +ax.plot(data['DFII5'], 'seagreen', lw=2, ls='--', + label=r'$y_{\mathrm{real}}^{(5)}$') +ax.plot(data['DFII10'], 'firebrick', lw=2, ls='--', + label=r'$y_{\mathrm{real}}^{(10)}$') + +ax.axhline(0, color='black', lw=0.5) +ax.set_ylabel('Yield (%)') +ax.legend(loc='upper right') + +ax2 = axes[1] +shade_recessions(ax2, rec) + +spread_10_1 = data['GS10'] - data['GS1'] +ax2.plot(spread_10_1, 'steelblue', lw=2, + label=r'$y^{(10)} - y^{(1)}$') +ax2.axhline(0, color='black', lw=0.5) +ax2.set_ylabel('Spread (%)') +ax2.set_xlabel('Year') +ax2.legend(loc='upper left') + +plt.tight_layout() +plt.show() ``` Several recognised patterns characterise the U.S. term structure: @@ -1266,7 +1310,7 @@ The following table summarises how various models perform: Szőke's framework delivers: -1. A theory of *state-dependent belief distortions* $\tilde{w}_t = \tilde{w}\,x_t$. +1. A theory of *state-dependent belief distortions* $\tilde{w}_t = \tilde{w} x_t$. 2. A theory about the *question that professional forecasters answer*: they respond with their worst-case model because they hear "tell me forecasts that rationalise your (max-min) decisions." @@ -1279,13 +1323,13 @@ model_rn = LikelihoodRatioModel( model_uncert = LikelihoodRatioModel( A, C, D, G, r_bar, Λ=tilted.w_tilde, δ_0=δ_0) -x_test = np.array([0.01, 0.005]) +x_test = np.array([0.01, -0.03]) n_max = 120 mats = np.arange(1, n_max + 1) fig, ax = plt.subplots(figsize=(9, 5)) ax.plot(mats, model_rn.yields(x_test, n_max) * 1200, - 'grey', lw=1.5, ls=':', label='Risk neutral') + 'grey', lw=2, ls=':', label='Risk neutral') ax.plot(mats, model.yields(x_test, n_max) * 1200, 'steelblue', lw=2, label=r'Risk aversion ($\Lambda x_t$)') ax.plot(mats, model_uncert.yields(x_test, n_max) * 1200, @@ -1293,7 +1337,6 @@ ax.plot(mats, model_uncert.yields(x_test, n_max) * 1200, label=r'Model uncertainty ($\tilde{W} x_t$)') ax.set_xlabel("Maturity (months)") ax.set_ylabel("Yield (annualised %)") -ax.set_title("Yield curves: alternative sources of term premia") ax.legend() plt.tight_layout() plt.show() @@ -1326,18 +1369,18 @@ In the Szőke framework, the rational-expectations econometrician's single likel 1. Use $\{x_t, c_t\}_{t=0}^T$ to estimate the econometrician's $A$, $C$, $D$, $G$. 2. View $\Xi$ as a matrix of additional free parameters and estimate them - simultaneously with risk prices $\tilde\lambda\,x_t$ from data + simultaneously with risk prices $\tilde\lambda x_t$ from data $\{p_t(n+1)\}_{n=1}^N$, $t = 0, \ldots, T$, by imposing cross-equation restrictions: $$ -p_t(n+1) = \exp(-r_t)\,E_t\!\left[m_{t+1}^{\tilde{w}}\,m_{t+1}^{\tilde\lambda}\,p_{t+1}(n)\right] +p_t(n+1) = \exp(-r_t) E_t\!\left[m_{t+1}^{\tilde{w}} m_{t+1}^{\tilde\lambda} p_{t+1}(n)\right] $$ where $$ -m_{t+1}^{\tilde{w}} = \exp\!\left(-\tilde{w}_t'\varepsilon_{t+1} - \frac{\tilde{w}_t'\tilde{w}_t}{2}\right), \qquad m_{t+1}^{\tilde\lambda} = \exp\!\left(-\tilde\lambda_t'\varepsilon_{t+1} - \frac{\tilde\lambda_t'\tilde\lambda_t}{2}\right) +m_{t+1}^{\tilde{w}} = \exp\!\left(-\tilde{w}_t^\top\varepsilon_{t+1} - \frac{\tilde{w}_t^\top\tilde{w}_t}{2}\right), \qquad m_{t+1}^{\tilde\lambda} = \exp\!\left(-\tilde\lambda_t^\top\varepsilon_{t+1} - \frac{\tilde\lambda_t^\top\tilde\lambda_t}{2}\right) $$ **Stage II: Assessment** @@ -1389,10 +1432,10 @@ The **multiplier preference** version of the dubious agent's problem is: ```{math} :label: eq_mult_seq -W(x_0, c_0 \mid \theta) := \min_{\{m_{t+1}\}} E\!\left[\sum_{t=0}^{\infty} \beta^t\,M_t\bigl(c_t + \theta\,m_{t+1}\log m_{t+1}\bigr) \;\middle|\; x_0, c_0\right] +W(x_0, c_0 \mid \theta) := \min_{\{m_{t+1}\}} E\!\left[\sum_{t=0}^{\infty} \beta^t M_t\bigl(c_t + \theta m_{t+1}\log m_{t+1}\bigr) \;\middle|\; x_0, c_0\right] ``` -with $M_{t+1} = M_t\,m_{t+1}$, $E[m_{t+1} \mid x_t, c_t] = 1$, $M_0 = 1$. +with $M_{t+1} = M_t m_{t+1}$, $E[m_{t+1} \mid x_t, c_t] = 1$, $M_0 = 1$. The recursive formulation is: @@ -1411,13 +1454,13 @@ $$ where the right-hand side is attained by $$ -m_{t+1}^* \propto \exp\!\left(-\frac{\beta\,W(x_{t+1}, c_{t+1})}{\theta}\right) +m_{t+1}^* \propto \exp\!\left(-\frac{\beta W(x_{t+1}, c_{t+1})}{\theta}\right) $$ **Relationship between multiplier and constraint problems.** By Lagrange multiplier theory, $$ -W(x_t, c_t \mid \tilde\theta) = J(x_t, c_t \mid \eta) + \tilde\theta\,\eta +W(x_t, c_t \mid \tilde\theta) = J(x_t, c_t \mid \eta) + \tilde\theta \eta $$ Each choice of $\tilde\theta$ in the multiplier problem corresponds to a particular entropy bound $\eta$ in the constraint problem, so the two formulations are equivalent. @@ -1446,7 +1489,6 @@ ax.axhline(E_V, color='steelblue', lw=1.5, ls='--', label=r"$E[V]$ (risk neutral)") ax.set_xlabel(r"Robustness parameter $\theta$") ax.set_ylabel("Value") -ax.set_title(r"Risk-sensitivity operator $T_\theta$") ax.legend() ax.annotate(r"$\theta \to \infty$: risk neutral", xy=(500, E_V), fontsize=11, color='steelblue', From 78bb24d54346ed8c0ff0954a4abe3cc8cd1faeb8 Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Fri, 13 Mar 2026 18:50:32 +1100 Subject: [PATCH 10/18] update --- lectures/risk_aversion_or_mistaken_beliefs.md | 279 ++++++++++-------- 1 file changed, 158 insertions(+), 121 deletions(-) diff --git a/lectures/risk_aversion_or_mistaken_beliefs.md b/lectures/risk_aversion_or_mistaken_beliefs.md index fc8b8a5dd..6fadf5de7 100644 --- a/lectures/risk_aversion_or_mistaken_beliefs.md +++ b/lectures/risk_aversion_or_mistaken_beliefs.md @@ -34,12 +34,12 @@ Those different perspectives can potentially explain observed countercyclical ri We organize a discussion of these ideas around a single mathematical device, namely, a **likelihood ratio**, a non-negative random variable with unit mean that twists one probability distribution into another. -Likelihood ratios — equivalently, multiplicative martingale increments — appear in at least four distinct roles in modern asset pricing: +Likelihood ratios, equivalently multiplicative martingale increments, appear in at least four distinct roles in modern asset pricing: | Probability | Likelihood ratio | Describes | |:--------------|:----------------------------------|:----------------------| | Econometric | $1$ (no twist) | macro risk factors | -| Risk neutral | $m_{t+1}^\Lambda$ | prices of risks | +| Risk neutral | $m_{t+1}^\lambda$ | prices of risks | | Mistaken | $m_{t+1}^w$ | experts' forecasts | | Doubtful | $m_{t+1} \in \mathcal{M}$ | misspecification fears| @@ -127,15 +127,13 @@ and complete the square to obtain $-\frac{1}{2}(\varepsilon + \lambda)^\top(\var ````{solution} lr_exercise_1 :class: dropdown -**Part 1.** -Write $E m(\varepsilon) = \int \exp(-\lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda) \phi(\varepsilon) d\varepsilon = \exp(-\tfrac{1}{2}\lambda^\top\lambda) E[\exp(-\lambda^\top\varepsilon)]$. +For part 1, write $E m(\varepsilon) = \int \exp(-\lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda) \phi(\varepsilon) d\varepsilon = \exp(-\tfrac{1}{2}\lambda^\top\lambda) E[\exp(-\lambda^\top\varepsilon)]$. The moment-generating function of $\varepsilon \sim \mathcal{N}(0,I)$ gives $E[\exp(-\lambda^\top\varepsilon)] = \exp(\tfrac{1}{2}\lambda^\top\lambda)$. So $E m(\varepsilon) = \exp(-\tfrac{1}{2}\lambda^\top\lambda)\exp(\tfrac{1}{2}\lambda^\top\lambda) = 1$. -**Part 2.** -Combine the exponents: +For part 2, combine the exponents: $$ m(\varepsilon) \phi(\varepsilon) \propto \exp\!\left(-\tfrac{1}{2}\varepsilon^\top\varepsilon - \lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda\right) @@ -149,7 +147,7 @@ This is the kernel of a $\mathcal{N}(-\lambda, I)$ density. ### Relative entropy -The **relative entropy** (Kullback–Leibler divergence) of the twisted density with respect to the baseline density is +The **relative entropy** (Kullback-Leibler divergence) of the twisted density with respect to the baseline density is ```{math} :label: eq_entropy @@ -228,7 +226,9 @@ y_{t+1} = D x_t + G \varepsilon_{t+1} Here $x_t$ is an $n \times 1$ state vector and $\varepsilon_{t+1}$ is a $k \times 1$ shock vector. -Throughout, we assume $n = k$ and that the volatility matrix $C$ is square and invertible — this is needed whenever we back out mean distortions $w = -C^{-1}(\cdot)$ from alternative transition matrices. +Throughout, we assume $n = k$ and that the volatility matrix $C$ is square and invertible. + +This assumption is needed whenever we back out mean distortions $w = -C^{-1}(\cdot)$ from alternative transition matrices. The observation $y_{t+1}$ represents consumption growth, $c_{t+1} - c_t = D x_t + G \varepsilon_{t+1}$. @@ -261,15 +261,19 @@ The expectations theory of the term structure of interest rates prices a zero-co p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t) E_t p_{t+1}(n), \qquad p_t(n) = \exp(\bar{A}_n^{RN} + B_n^{RN} x_t) ``` -The last equality states that bond prices take an **exponential-affine** form in the state — this is a consequence of the linear Gaussian structure and can be verified by substituting the guess into the recursion and matching coefficients (see {ref}`Exercise 3 ` in {doc}`Affine Models of Asset Prices `). +The last equality states that bond prices take an **exponential-affine** form in the state. + +This is a consequence of the linear Gaussian structure and can be verified by substituting the guess into the recursion and matching coefficients (see {ref}`Exercise 3 ` in {doc}`Affine Models of Asset Prices `). -These formulas work "pretty well" for conditional means but less well for conditional variances — the Shiller *volatility puzzles*. +These formulas work "pretty well" for conditional means but less well for conditional variances, i.e. the Shiller *volatility puzzles*. ### Modern asset pricing: adding risk aversion -It would be convenient if versions of the same pricing formulas worked even when investors are risk averse or hold distorted beliefs — the likelihood ratio makes this possible. +It would be convenient if versions of the same pricing formulas worked even when investors are risk averse or hold distorted beliefs. + +The likelihood ratio makes this possible. -We now promote the static vector $\lambda$ from {eq}`eq_lr` to a *state-dependent* risk price vector by writing $\lambda_t = \Lambda x_t$, where $\Lambda$ is a $k \times n$ matrix of risk price coefficients. +We now promote the static vector $\lambda$ from {eq}`eq_lr` to a *state-dependent* risk price vector by writing $\lambda_t = \lambda x_t$, where $\lambda$ is a $k \times n$ matrix of risk price coefficients. In the code below, this matrix is the parameter `Λ`. @@ -278,31 +282,33 @@ The likelihood ratio increment is ```{math} :label: eq_sdf_lr -m_{t+1}^\Lambda = \exp\!\left(-\lambda_t^\top \varepsilon_{t+1} - \frac{1}{2} \lambda_t^\top\lambda_t\right), \qquad \lambda_t = \Lambda x_t +m_{t+1}^\lambda = \exp\!\left(-\lambda_t^\top \varepsilon_{t+1} - \frac{1}{2} \lambda_t^\top\lambda_t\right), \qquad \lambda_t = \lambda x_t ``` -with $E_t m_{t+1}^\Lambda = 1$ and $m_{t+1}^\Lambda \geq 0$. +with $E_t m_{t+1}^\lambda = 1$ and $m_{t+1}^\lambda \geq 0$. -The likelihood ratio $m_{t+1}^\Lambda$ distorts the conditional distribution of $\varepsilon_{t+1}$ from $\mathcal{N}(0,I)$ to $\mathcal{N}(-\Lambda x_t, I)$. +The likelihood ratio $m_{t+1}^\lambda$ distorts the conditional distribution of $\varepsilon_{t+1}$ from $\mathcal{N}(0,I)$ to $\mathcal{N}(-\lambda x_t, I)$. -Covariances of returns with $m_{t+1}^\Lambda$ affect mean returns — this is the channel through which risk aversion prices risks. +Covariances of returns with $m_{t+1}^\lambda$ affect mean returns. + +This is the channel through which risk aversion prices risks. With this device, *modern asset pricing* takes the form: -For stocks (Lucas–Hansen): +For stocks (Lucas-Hansen): ```{math} :label: eq_stock_lr -p_t = \exp(-r_t) E_t\bigl(m_{t+1}^\Lambda (p_{t+1} + d_{t+1})\bigr) +p_t = \exp(-r_t) E_t\bigl(m_{t+1}^\lambda (p_{t+1} + d_{t+1})\bigr) ``` -For the term structure (Dai–Singleton–Backus–Zin): +For the term structure (Dai-Singleton-Backus-Zin): ```{math} :label: eq_ts_lr -p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t) E_t\bigl(m_{t+1}^\Lambda p_{t+1}(n)\bigr), \qquad p_t(n) = \exp(\bar{A}_n + B_n x_t) +p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t) E_t\bigl(m_{t+1}^\lambda p_{t+1}(n)\bigr), \qquad p_t(n) = \exp(\bar{A}_n + B_n x_t) ``` Note that the coefficients $\bar{A}_n$, $B_n$ here differ from the risk-neutral coefficients $\bar{A}_n^{RN}$, $B_n^{RN}$ in {eq}`eq_rn_recursion` because the likelihood ratio modifies the recursion. @@ -311,19 +317,19 @@ Note that the coefficients $\bar{A}_n$, $B_n$ here differ from the risk-neutral The risk-neutral representation implies **twisted dynamics**. -Under the twisted measure, define $\tilde\varepsilon_{t+1} := \varepsilon_{t+1} + \lambda_t = \varepsilon_{t+1} + \Lambda x_t$. +Under the twisted measure, define $\tilde\varepsilon_{t+1} := \varepsilon_{t+1} + \lambda_t = \varepsilon_{t+1} + \lambda x_t$. Since $\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under the econometrician's measure, the change of measure makes $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under the risk-neutral measure. -Substituting $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - \Lambda x_t$ into {eq}`eq_state` gives: +Substituting $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - \lambda x_t$ into {eq}`eq_state` gives: ```{math} :label: eq_rn_dynamics -x_{t+1} = (A - C\Lambda) x_t + C \tilde\varepsilon_{t+1}, \qquad \tilde\varepsilon_{t+1} \sim \mathcal{N}(0,I) +x_{t+1} = (A - C\lambda) x_t + C \tilde\varepsilon_{t+1}, \qquad \tilde\varepsilon_{t+1} \sim \mathcal{N}(0,I) ``` -The dependence of $\lambda_t = \Lambda x_t$ on the state modifies the dynamics relative to the econometrician's model. +The dependence of $\lambda_t = \lambda x_t$ on the state modifies the dynamics relative to the econometrician's model. ### Expectation under a twisted distribution @@ -343,9 +349,7 @@ These are the same formulas as rational-expectations asset pricing, but expectat The derivation of the recursive bond price coefficients is the same as in {ref}`Exercise 3 ` of {doc}`Affine Models of Asset Prices `, applied here under the risk-neutral dynamics {eq}`eq_rn_dynamics`. -## Python implementation - -We implement the state-space model and its asset pricing implications. +Now let's implement the state-space model and its asset pricing implications ```{code-cell} ipython3 class LikelihoodRatioModel: @@ -448,16 +452,18 @@ print(f"Eigenvalues of A_Q: {eigvals(model.A_Q).round(4)}") assert all(np.abs(eigvals(model.A_Q)) < 1), "A_Q must be stable!" ``` -### Yield curves across states +The yield curve's shape depends on the current state $x_t$. + +We evaluate the model at three representative states to see how the two factors, level and slope, generate upward-sloping, relatively flat, and inverted yield curves. ```{code-cell} ipython3 n_max = 120 maturities = np.arange(1, n_max + 1) states = { - "Low level, positive slope": np.array([-0.005, 0.01]), - "Medium": np.array([ 0.008, 0.003]), - "High level, negative slope": np.array([ 0.025, -0.01]), + "Normal (upward-sloping)": np.array([-0.005, -0.015]), + "Relatively flat": np.array([ 0.008, -0.005]), + "Inverted": np.array([ 0.020, 0.010]), } fig, ax = plt.subplots(figsize=(9, 5)) @@ -474,9 +480,25 @@ plt.show() ### Econometrician's model vs. risk-neutral model -A key implication is that the risk-neutral dynamics -$x_{t+1} = (A - C\Lambda) x_t + C \tilde\varepsilon_{t+1}$ -differ from the econometrician's dynamics $x_{t+1} = A x_t + C \varepsilon_{t+1}$. +The econometrician estimates state dynamics under the **physical measure** $P$, which governs the actual data-generating process: + +$$ +x_{t+1} = A x_t + C \varepsilon_{t+1}, \qquad \varepsilon_{t+1} \sim \mathcal{N}(0,I) \text{ under } P +$$ + +The **risk-neutral measure** $Q$ is the probability distribution twisted by the likelihood ratio $m_{t+1}^\lambda$. + +Under $Q$, the state evolves as + +$$ +x_{t+1} = A_Q x_t + C \tilde\varepsilon_{t+1}, \qquad \tilde\varepsilon_{t+1} \sim \mathcal{N}(0,I) \text{ under } Q +$$ + +where $A_Q = A - C\lambda$. + +The two measures agree on which events are possible but disagree on their probabilities. + +The physical measure $P$ governs forecasting and estimation, while the risk-neutral measure $Q$ governs asset pricing. ```{code-cell} ipython3 print("A:\n", model.A) @@ -485,6 +507,10 @@ print(f"\nEigenvalues of A: {eigvals(model.A).round(4)}") print(f"Eigenvalues of A_Q: {eigvals(model.A_Q).round(4)}") ``` +To see the difference in action, we simulate both models from the same initial state using the same shock sequence. + +Both simulations draw the same $\tilde\varepsilon$ innovations, but the transition matrices $A$ and $A_Q$ govern how those shocks cumulate over time. + ```{code-cell} ipython3 T = 300 x0 = np.array([0.01, 0.005]) @@ -508,17 +534,23 @@ plt.tight_layout() plt.show() ``` -Both factors are more persistent under the risk-neutral measure $Q$ than under the physical measure $P$, because $A_Q = A - C\Lambda$ has eigenvalues closer to unity when risk prices $\Lambda$ shift the dynamics. +Both factors are more persistent under $Q$ than under $P$: the eigenvalues of $A_Q$ are closer to unity than those of $A$. + +The risk-neutral paths (red) exhibit wider swings and slower mean reversion. + +This is because the negative risk prices $\lambda$ in our calibration make $A_Q = A - C\lambda$ larger, slowing the rate at which factors revert to zero. + +The gap between the $P$ and $Q$ dynamics is precisely what generates a term premium in bond yields, because long bonds are priced under $Q$, where risks look more persistent. ## An identification challenge -The risk price vector $\lambda_t = \Lambda x_t$ can be interpreted as either: +The risk price vector $\lambda_t = \lambda x_t$ can be interpreted as either: - a **risk price vector** expressing the representative agent's risk aversion, or - the representative agent's **belief distortion** relative to the econometrician's model. -Because the pricing formulas {eq}`eq_stock_lr`–{eq}`eq_ts_lr` depend only on the composite $\lambda_t$ — not on whether it reflects risk aversion or belief distortion — the two interpretations produce identical asset prices and econometric fits. +Because the pricing formulas {eq}`eq_stock_lr` to {eq}`eq_ts_lr` depend only on the composite $\lambda_t$, not on whether it reflects risk aversion or belief distortion, the two interpretations produce identical asset prices and econometric fits. > Relative to the model of a risk-averse representative investor with rational > expectations, a model of a risk-neutral investor with appropriately mistaken @@ -529,7 +561,7 @@ This insight was articulated by {cite:t}`HST_1999` and To distinguish risk aversion from belief distortion, one needs either *more information* (the PSS approach using survey data) or *more theory* -(the Hansen–Szőke robust control approach), or both (the {cite:t}`szoke2022estimating` approach). +(the Hansen-Szőke robust control approach), or both (the {cite:t}`szoke2022estimating` approach). ```{code-cell} ipython3 x_test = np.array([0.01, 0.005]) @@ -568,9 +600,9 @@ Without additional information (e.g., surveys of forecasters), we cannot tell th Their setup posits: - The representative agent's risk aversion leads him to price risks - $\varepsilon_{t+1}$ with prices $\lambda_t^* = \Lambda^* x_t$, where $\Lambda^*$ is a $k \times n$ matrix. -- The representative agent has **twisted beliefs** $(A^*, C) = (A - C W^*, C)$ - relative to the econometrician's model $(A, C)$, where $W^*$ is a $k \times n$ matrix of belief distortion coefficients. + $\varepsilon_{t+1}$ with prices $\lambda_t^* = \lambda^* x_t$, where $\lambda^*$ is a $k \times n$ matrix. +- The representative agent has **twisted beliefs** $(A^*, C) = (A - C w^*, C)$ + relative to the econometrician's model $(A, C)$, where $w^*$ is a $k \times n$ matrix of belief distortion coefficients. - Professional forecasters use the twisted beliefs $(A^*, C)$ to answer survey questions about their forecasts. @@ -582,17 +614,17 @@ PSS proceed in four steps: 2. Project experts' one-step-ahead forecasts $E_t^*[x_{t+1}]$ on $x_t$ to obtain $E_t^*[x_{t+1}] = A^* x_t$ and interpret $A^*$ as incorporating belief distortions. -3. Back out the mean distortion matrix $W^* = -C^{-1}(A^* - A)$, so that $w_t^* = W^* x_t$ is the state-dependent mean shift applied to the +3. Back out the mean distortion matrix $w^* = -C^{-1}(A^* - A)$, so that $w_t^* = w^* x_t$ is the state-dependent mean shift applied to the density of $\varepsilon_{t+1}$. (This requires $C$ to be invertible.) -4. Reinterpret the $\Lambda$ estimated by the rational-expectations econometrician - as $\Lambda = \Lambda^* + W^*$, where $\lambda_t^* = \Lambda^* x_t$ is the +4. Reinterpret the $\lambda$ estimated by the rational-expectations econometrician + as $\lambda = \lambda^* + w^*$, where $\lambda_t^* = \lambda^* x_t$ is the (smaller) price of risk vector actually charged by the representative agent with distorted beliefs. -An econometrician who mistakenly imposes rational expectations estimates risk prices $\lambda_t = \Lambda x_t$ that sum two parts: -- *smaller risk prices* $\lambda_t^* = \Lambda^* x_t$ actually charged by the erroneous-beliefs +An econometrician who mistakenly imposes rational expectations estimates risk prices $\lambda_t = \lambda x_t$ that sum two parts: +- *smaller risk prices* $\lambda_t^* = \lambda^* x_t$ actually charged by the erroneous-beliefs representative agent, and -- *conditional mean distortions* $w_t^* = W^* x_t$ of the risks $\varepsilon_{t+1}$ that +- *conditional mean distortions* $w_t^* = w^* x_t$ of the risks $\varepsilon_{t+1}$ that the twisted-beliefs representative agent's model displays relative to the econometrician's. @@ -651,9 +683,11 @@ plt.show() PSS find that experts perceive the level and slope of the yield curve to be *more persistent* than the econometrician's estimates imply. -Subjective risk prices $\Lambda^* x_t$ vary less than the $\Lambda x_t$ estimated by the rational-expectations econometrician. +Subjective risk prices $\lambda^* x_t$ vary less than the $\lambda x_t$ estimated by the rational-expectations econometrician. -However, PSS offer no explanation for *why* beliefs are distorted — are they mistakes, ignorance of good econometrics, or something else? +However, PSS offer no explanation for *why* beliefs are distorted. + +Are they mistakes, ignorance of good econometrics, or something else? The next two sections address this question: first by reviewing why rational expectations may be a poor approximation, and then by developing a robust control theory that *rationalises* belief distortions as optimal responses to model uncertainty. @@ -680,11 +714,11 @@ They fear that their fitted models are incorrect. An agent who is like a good econometrician: - has a parametric model estimated from limited data, -- acknowledges that many other specifications fit nearly as well — other parameter +- acknowledges that many other specifications fit nearly as well, including other parameter values, other functional forms, omitted variables, neglected nonlinearities, and history dependencies, - fears that one of those other models actually prevails, and -- seeks "good enough" decisions under *all* such alternative models — **robustness**. +- seeks "good enough" decisions under *all* such alternative models, i.e. **robustness**. Robust control theory formalises this idea by having the agent optimally distort probability assessments toward a worst-case scenario, producing belief distortions that look like the "mistakes" identified by PSS but that arise from a coherent response to model uncertainty rather than from ignorance. @@ -714,7 +748,9 @@ $$ V(x_0, c_0) := E\!\left[\sum_{t=0}^{\infty} \beta^t c_t \;\middle|\; x_0, c_0\right] = c_0 + \beta E\!\left[V(x_1, c_1) \;\middle|\; x_0, c_0\right] $$ -Note that the objective is *linear* in consumption — there is no concave utility function $u(c_t)$. +Note that the objective is *linear* in consumption. + +There is no concave utility function $u(c_t)$. All aversion to uncertainty here comes from the *worst-case model selection* (the $\min$ over likelihood ratios below), not from utility curvature. @@ -722,7 +758,7 @@ This separation is a key feature of the robust control approach: the agent expre ### The sequence problem -The dubious agent solves a *min* problem — a malevolent "nature" chooses the worst-case probability distortion subject to an entropy budget: +The dubious agent solves a *min* problem in which a malevolent "nature" chooses the worst-case probability distortion subject to an entropy budget: ```{math} :label: eq_hansen_seq @@ -746,7 +782,9 @@ $$ The cumulative likelihood ratio $M_t = \prod_{s=0}^{t-1} m_{s+1}$ converts the original probability measure into the distorted one. -The constraint bounds the *discounted entropy* — the $M_t$ weighting ensures entropy is measured under the *distorted* measure and the $\beta^t$ discounting means future divergences are penalised less, admitting persistent alternatives. +The constraint bounds the *discounted entropy*. + +The $M_t$ weighting ensures entropy is measured under the *distorted* measure and the $\beta^t$ discounting means future divergences are penalised less, admitting persistent alternatives. The likelihood ratio process $\{M_t\}_{t=0}^{\infty}$ is a multiplicative **martingale**. @@ -798,7 +836,9 @@ $$ Here $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under $E^w$, and we have substituted $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - w_t$ (so $E[\varepsilon_{t+1}] = -w_t$ under the distorted measure). -The shift $-w_t$ *reduces* expected consumption growth by $G w_t$ and shifts the state dynamics by $-C w_t$ — this is how the worst-case model makes the agent worse off. +The shift $-w_t$ *reduces* expected consumption growth by $G w_t$ and shifts the state dynamics by $-C w_t$. + +This is how the worst-case model makes the agent worse off. ### Outcome: constant worst-case distortion @@ -810,7 +850,7 @@ $$ The consequence is that the contribution of $w_t$ to risk prices is *state-independent*. -This does *not* help explain countercyclical prices of risk (or prices of model uncertainty) — motivating the more refined "tilted" entropy ball in the next section. +This does *not* help explain countercyclical prices of risk (or prices of model uncertainty), motivating the more refined "tilted" entropy ball in the next section. We compute $\bar{w}$ using the multiplier formulation (see {ref}`the multiplier preferences section below `), in which the parameter $\theta$ penalises entropy: larger $\theta$ means less concern about misspecification. @@ -851,7 +891,7 @@ for θ in θ_values: print(f"{θ:>6.1f} {w[0]:>10.4f} {w[1]:>10.4f} {0.5 * w @ w:>10.4f}") ``` -The worst-case distortion $\bar{w}$ is constant — it does not depend on the state $x_t$. +The worst-case distortion $\bar{w}$ is constant: it does not depend on the state $x_t$. Larger $\theta$ (less concern about misspecification) yields a smaller distortion. @@ -870,33 +910,41 @@ Derive the formula for $\bar{w}$. ````{solution} lr_exercise_3 :class: dropdown -**Part 1.** -Since $c_t = c_0 + \sum_{s=0}^{t-1}(D x_s + G \tilde\varepsilon_{s+1} - G w_s)$, we have: +For part 1, the consumption increment $\Delta c_{s+1} = Dx_s - G\bar{w} + G\tilde\varepsilon_{s+1}$ at date $s$ enters $c_t$ for every $t \geq s+1$, with total discounted weight $\frac{\beta^{s+1}}{1-\beta}$. + +Swapping the order of summation: $$ -\sum_{t=0}^\infty \beta^t c_t = \frac{c_0}{1-\beta} + \sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}\bigl(D x_s - G \bar{w} + G \tilde\varepsilon_{s+1}\bigr) +E\!\left[\sum_{t=0}^\infty \beta^t c_t\right] = \frac{c_0}{1-\beta} + \frac{1}{1-\beta}\sum_{s=0}^\infty \beta^{s+1}\bigl(D\, E[x_s] - G\bar{w}\bigr) $$ -**Part 2.** -The multiplier objective is $E^w[\sum \beta^t(c_t + \tfrac{\theta}{2}\bar{w}^\top\bar{w})]$. +For part 2, define $S = \sum_{s=0}^\infty \beta^{s+1} E[x_s]$. + +From $E[x_{s+1}] = A\,E[x_s] - C\bar{w}$, multiply both sides by $\beta^{s+2}$ and sum over $s = 0, 1, \ldots$: + +$$ +S - \beta x_0 = \beta A\, S - \frac{\beta^2}{1-\beta}C\bar{w} +$$ + +Solving: $S = (I - \beta A)^{-1}\!\left(\beta x_0 - \frac{\beta^2}{1-\beta}C\bar{w}\right)$. + +Substituting back, the expected objective $E[\sum \beta^t(c_t + \frac{\theta}{2}\|\bar{w}\|^2)]$ depends on $\bar{w}$ only through the term $\frac{1}{1-\beta}(D\,S - \frac{\beta}{1-\beta}G\bar{w}) + \frac{\theta}{2(1-\beta)}\|\bar{w}\|^2$. -Taking $\partial/\partial \bar{w}$ and setting to zero, the entropy penalty contributes $\theta \bar{w}$. +For part 3, differentiate with respect to $\bar{w}$ and set to zero. -The consumption term contributes $-\sum_{t=0}^\infty \beta^t \sum_{s=0}^{t-1}G^\top = -\frac{\beta}{1-\beta}\frac{1}{1-\beta}G^\top$ from the direct shock effect, plus indirect effects through $x_s$ via $C$. +The only part of $S$ that depends on $\bar{w}$ is $-\frac{\beta^2}{1-\beta}(I-\beta A)^{-1}C\bar{w}$, so $\nabla_{\bar{w}}(D\,S) = -\frac{\beta^2}{1-\beta}C^\top(I - \beta A^\top)^{-1}D^\top$. -**Part 3.** -The indirect effect on $x_s$ requires summing $\sum_{t=s+1}^\infty \beta^t D^\top = \beta^{s+1}\frac{D^\top}{1-\beta}$, discounted back: +The first-order condition is: $$ -\sum_{s=0}^\infty \beta^s \cdot \beta \frac{D^\top}{1-\beta} \cdot \frac{\partial x_s}{\partial \bar{w}} = \beta C^\top v +\frac{\theta}{1-\beta}\bar{w} = \frac{1}{1-\beta}\!\left(\frac{\beta}{1-\beta}G^\top + \frac{\beta^2}{1-\beta}C^\top(I - \beta A^\top)^{-1}D^\top\right) $$ -where $v = \beta(I-\beta A^\top)^{-1}\frac{D^\top}{1-\beta}$ solves $v = \frac{\beta}{1-\beta}D^\top + \beta A^\top v$. +Simplifying: $\theta\bar{w} = \frac{\beta}{1-\beta}G^\top + \beta C^\top v$, where $v = \frac{\beta}{1-\beta}(I - \beta A^\top)^{-1}D^\top$. -So the first-order condition is $\theta \bar{w} = \frac{\beta}{1-\beta}G^\top + \beta C^\top v$, giving $\bar{w} = \frac{1}{\theta}\bigl(\frac{\beta}{1-\beta}G^\top + \beta C^\top v\bigr)$. +Therefore $\bar{w} = \frac{1}{\theta}\bigl(\frac{\beta}{1-\beta}G^\top + \beta C^\top v\bigr)$. -**Part 4.** -As $\theta \to \infty$, $\bar{w} = \frac{1}{\theta}(\cdots) \to 0$, which the numerical table confirms. +For part 4, as $\theta \to \infty$, $\bar{w} = \frac{1}{\theta}(\cdots) \to 0$, which the numerical table confirms. ```` @@ -998,13 +1046,12 @@ $$ ### Implementation: tilted entropy ball -**Derivation of the iteration.** Guess a quadratic value function $J(x) = x^\top P x + \text{const}$ for the inner minimisation over $\{w_t\}$ in {eq}`eq_szoke_seq`. Since $w_t = W x_t$ is linear in the state, the first-order condition for $w_t$ at each $t$ gives: $$ -\tilde\theta W = \beta C^\top P (A - C W) \quad \Longrightarrow \quad (\tilde\theta I + 2\beta C^\top P C) W = 2\beta C^\top P A +\tilde\theta W = 2\beta C^\top P (A - C W) \quad \Longrightarrow \quad (\tilde\theta I + 2\beta C^\top P C) W = 2\beta C^\top P A $$ (where we write $\tilde\theta$ as $\theta$ in the code). @@ -1020,7 +1067,7 @@ The code iterates on the $(P, W)$ system until convergence. ```{code-cell} ipython3 class TiltedEntropyModel: """ - Hansen–Szőke tilted entropy ball model. + Hansen-Szőke tilted entropy ball model. Given (A, C, D, G, β, θ, Ξ), computes the worst-case state-dependent distortion w_tilde_t = W_tilde x_t. @@ -1112,8 +1159,7 @@ Derive the first-order condition for the tilted entropy problem. ````{solution} lr_exercise_4 :class: dropdown -**Part 1.** -With $w_t = Wx_t$ and $x_{t+1} = (A-CW)x_t + C\tilde\varepsilon_{t+1}$, the period-$t$ payoff in {eq}`eq_szoke_seq` is: +For part 1, with $w_t = Wx_t$ and $x_{t+1} = (A-CW)x_t + C\tilde\varepsilon_{t+1}$, the period-$t$ payoff in {eq}`eq_szoke_seq` is: $$ c_t + \tfrac{\theta}{2}(w_t^\top w_t - x_t^\top \Xi x_t) = c_t + \tfrac{\theta}{2} x_t^\top(W^\top W - \Xi) x_t @@ -1121,8 +1167,7 @@ $$ Since $c_t$ is linear in past $x_s$ and the dynamics are linear, the value function is quadratic: $J_t = x_t^\top P x_t + \text{linear and constant terms}$. -**Part 2.** -The first-order condition for $W$ from the quadratic Bellman equation is: +For part 2, the first-order condition for $W$ from the quadratic Bellman equation is: $$ \frac{\partial}{\partial W}\bigl[\tfrac{\theta}{2}x_t^\top W^\top W x_t + \beta x_t^\top(A-CW)^\top P(A-CW)x_t\bigr] = 0 @@ -1132,8 +1177,7 @@ This gives $\theta W - 2\beta C^\top P(A-CW) = 0$. Rearranging: $(\theta I + 2\beta C^\top PC) W = 2\beta C^\top PA$. -**Part 3.** -Substitute the optimal $W$ back into the Bellman equation. +For part 3, substitute the optimal $W$ back into the Bellman equation. The quadratic terms in $x_t$ give: @@ -1179,8 +1223,6 @@ plt.show() The key innovation of the tilted entropy ball is visible: the Szőke worst-case distortion $\tilde{w}_t = \tilde{W} x_t$ grows with $|x_t|$, producing *countercyclical uncertainty prices*. -When the state is far from its mean, the agent's worst-case model deviates more from the econometrician's model. - By contrast, Hansen's constant distortion $\bar{w}$ has entropy $\frac{1}{2}\bar{w}^\top\bar{w}$ that does not vary with $x_t$ (shown as a horizontal line). The Szőke parabola lies inside the feared model's entropy budget $\frac{1}{2}\xi(x_t)$, confirming the worst-case distortion respects the tilted entropy constraint. @@ -1291,8 +1333,7 @@ Several recognised patterns characterise the U.S. term structure: - The nominal yield curve usually slopes *upward*. - The long-minus-short yield spread *narrows before* U.S. recessions and *widens after* them. -- Consequently, the slope of the yield curve helps *predict* aggregate inputs - and outputs. +- Consequently, the slope of the yield curve helps *predict* recessions and economic activity. - Long and short yields are *almost equally volatile* (the Shiller "volatility puzzle"). - To solve the Shiller puzzle, risk prices (or something observationally equivalent) must *depend on volatile state variables*. @@ -1302,7 +1343,7 @@ The following table summarises how various models perform: | Model | Average slope | Slopes near recessions | Volatile long yield | |:-------------------------------|:--------------|:-----------------------|:--------------------| | {cite:t}`Lucas1978` | no | no | no | -| Epstein–Zin with LRR | maybe | yes | no | +| Epstein-Zin with LRR | maybe | yes | no | | {cite:t}`piazzesi2015trend` | built-in | built-in | yes | | {cite:t}`szoke2022estimating` | *YES* | yes | yes | @@ -1331,7 +1372,7 @@ fig, ax = plt.subplots(figsize=(9, 5)) ax.plot(mats, model_rn.yields(x_test, n_max) * 1200, 'grey', lw=2, ls=':', label='Risk neutral') ax.plot(mats, model.yields(x_test, n_max) * 1200, - 'steelblue', lw=2, label=r'Risk aversion ($\Lambda x_t$)') + 'steelblue', lw=2, label=r'Risk aversion ($\lambda x_t$)') ax.plot(mats, model_uncert.yields(x_test, n_max) * 1200, 'firebrick', lw=2, ls='--', label=r'Model uncertainty ($\tilde{W} x_t$)') @@ -1344,8 +1385,7 @@ plt.show() The risk-aversion-only and model-uncertainty-only yield curves both slope upward, generating a term premium. -The two explanations represent *alternative channels* for the same observed term premium — reinforcing the identification challenge explored throughout this lecture. - +The two explanations represent *alternative channels* for the same observed term premium, reinforcing the identification challenge explored throughout this lecture. ## Cross-equation restrictions and estimation @@ -1363,9 +1403,17 @@ As {cite:t}`szoke2022estimating` puts it: ### Szőke's empirical strategy -In the Szőke framework, the rational-expectations econometrician's single likelihood ratio $m_{t+1}^\Lambda$ is decomposed into two multiplicative components: a worst-case belief distortion $m_{t+1}^{\tilde{w}}$ and a residual risk price $m_{t+1}^{\tilde{\lambda}}$, paralleling the PSS decomposition $\Lambda = \Lambda^* + W^*$. +In the Szőke framework, the rational-expectations econometrician's single likelihood ratio $m_{t+1}^\lambda$ is decomposed as $\lambda_t = \tilde{w}_t + \tilde{\lambda}_t$, paralleling the PSS decomposition $\lambda = \lambda^* + w^*$. + +The combined likelihood ratio is + +$$ +m_{t+1}^\lambda = \exp\!\left(-\lambda_t^\top\varepsilon_{t+1} - \frac{1}{2}\lambda_t^\top\lambda_t\right), \qquad \lambda_t = \tilde{w}_t + \tilde\lambda_t +$$ -**Stage I: Estimation** +where $\tilde{w}_t = \tilde{w} x_t$ is the worst-case belief distortion and $\tilde\lambda_t = \tilde\lambda x_t$ is the residual risk price. + +In stage I (estimation): 1. Use $\{x_t, c_t\}_{t=0}^T$ to estimate the econometrician's $A$, $C$, $D$, $G$. 2. View $\Xi$ as a matrix of additional free parameters and estimate them @@ -1374,28 +1422,21 @@ In the Szőke framework, the rational-expectations econometrician's single likel restrictions: $$ -p_t(n+1) = \exp(-r_t) E_t\!\left[m_{t+1}^{\tilde{w}} m_{t+1}^{\tilde\lambda} p_{t+1}(n)\right] -$$ - -where - -$$ -m_{t+1}^{\tilde{w}} = \exp\!\left(-\tilde{w}_t^\top\varepsilon_{t+1} - \frac{\tilde{w}_t^\top\tilde{w}_t}{2}\right), \qquad m_{t+1}^{\tilde\lambda} = \exp\!\left(-\tilde\lambda_t^\top\varepsilon_{t+1} - \frac{\tilde\lambda_t^\top\tilde\lambda_t}{2}\right) +p_t(n+1) = \exp(-r_t) E_t\!\left[m_{t+1}^\lambda\, p_{t+1}(n)\right] $$ -**Stage II: Assessment** +In stage II (assessment): 1. Assess improvements in predicted behaviour of the term structure. 2. Use estimated worst-case dynamics to form distorted forecasts $\tilde{x}_{t+1} = (A - C\tilde{w})x_t$ and compare them to those of professional forecasters. -3. Compute discounted relative entropy of the worst-case twisted model - relative to the econometrician's model to assess how difficult it is - to distinguish the two models statistically. +3. Compute the discounted KL divergence $\frac{1}{2}E^w[\sum \beta^t w_t^\top w_t]$ of + each twisted model relative to the econometrician's model and compare them. ```{code-cell} ipython3 -def discounted_entropy(W, A_w, C, x0, β, T_horizon=500): - """Approximate (1/2) E^w [Σ β^t w_t'w_t] by simulation.""" +def discounted_kl(W, A_w, C, x0, β, T_horizon=500): + """Approximate discounted KL divergence (1/2) E^w [Σ β^t w_t'w_t].""" n_sims = 10_000 rng = np.random.default_rng(2024) X = np.tile(x0, (n_sims, 1)) @@ -1407,18 +1448,18 @@ def discounted_entropy(W, A_w, C, x0, β, T_horizon=500): return np.mean(total) x0_test = np.array([0.01, 0.005]) -ent_szoke = discounted_entropy(tilted.w_tilde, tilted.A_tilde, C, x0_test, β) -ent_feared = discounted_entropy(w_bar, A_bar, C, x0_test, β) +kl_szoke = discounted_kl(tilted.w_tilde, tilted.A_tilde, C, x0_test, β) +kl_feared = discounted_kl(w_bar, A_bar, C, x0_test, β) -print(f"Szőke worst-case entropy: {ent_szoke:.4f}") -print(f"Feared LRR entropy: {ent_feared:.4f}") -status = ('closer to' if ent_szoke < ent_feared +print(f"Szőke worst-case KL: {kl_szoke:.4f}") +print(f"Feared LRR KL: {kl_feared:.4f}") +status = ('closer to' if kl_szoke < kl_feared else 'farther from') print(f"\nWorst-case model is {status} " f"the econometrician's model.") ``` -The Szőke worst-case model has lower discounted entropy than the feared long-run risk model, meaning it is statistically harder to distinguish from the econometrician's baseline. +The Szőke worst-case model has lower discounted KL divergence from the econometrician's model than the feared long-run risk model, meaning it is statistically harder to distinguish from the baseline. Yet it still generates the state-dependent uncertainty prices needed to match term-structure dynamics. @@ -1457,7 +1498,7 @@ $$ m_{t+1}^* \propto \exp\!\left(-\frac{\beta W(x_{t+1}, c_{t+1})}{\theta}\right) $$ -**Relationship between multiplier and constraint problems.** By Lagrange multiplier theory, +By Lagrange multiplier theory, $$ W(x_t, c_t \mid \tilde\theta) = J(x_t, c_t \mid \eta) + \tilde\theta \eta @@ -1494,15 +1535,11 @@ ax.annotate(r"$\theta \to \infty$: risk neutral", xy=(500, E_V), fontsize=11, color='steelblue', xytext=(50, E_V - 0.8), arrowprops=dict(arrowstyle='->', color='steelblue')) -ax.annotate(r"Small $\theta$: very robust", - xy=(0.15, T_vals[1]), fontsize=11, color='firebrick', - xytext=(0.5, T_vals[1] - 0.5), - arrowprops=dict(arrowstyle='->', color='firebrick')) plt.tight_layout() plt.show() ``` -As $\theta \to \infty$, the risk-sensitivity operator converges to the ordinary expectation $E[V]$ — the agent becomes risk neutral. +As $\theta \to \infty$, the risk-sensitivity operator converges to the ordinary expectation $E[V]$, and the agent becomes risk neutral. As $\theta$ shrinks, the operator places more weight on bad outcomes, reflecting greater concern about model misspecification. @@ -1521,20 +1558,20 @@ Joint probability distributions of interest rates and macroeconomic shocks are i - **Central bank expectations management.** Forward guidance works by shifting the term structure, an exercise whose effects depend on the same likelihood ratios studied here. -- **Long-run risk and secular stagnation.** The Bansal–Yaron long-run risk +- **Long-run risk and secular stagnation.** The Bansal-Yaron long-run risk hypothesis is difficult to detect statistically, yet an agent who fears it in the sense formalised above may behave very differently than one who does not. -Understanding whether observed asset prices reflect risk aversion, mistaken beliefs, or fears of model misspecification — and quantifying each component — is interesting for both positive and normative macroeconomics. +Understanding whether observed asset prices reflect risk aversion, mistaken beliefs, or fears of model misspecification, and quantifying each component, is interesting for both positive and normative macroeconomics. ## Related lectures This lecture connects to several others in the series: -- {ref}`Doubts or Variability? ` studies how a preference for robustness generates worst-case likelihood ratios that look like stochastic discount factor shocks, complementing the analysis here with Hansen–Jagannathan bounds and detection-error probabilities. -- {ref}`Asset Pricing: Finite State Models ` introduces stochastic discount factors and risk-neutral pricing in a finite-state Markov setting — the discrete-state counterpart of the continuous Gaussian framework used here. +- {ref}`Doubts or Variability? ` studies how a preference for robustness generates worst-case likelihood ratios that look like stochastic discount factor shocks, complementing the analysis here with Hansen-Jagannathan bounds and detection-error probabilities. +- {ref}`Asset Pricing: Finite State Models ` introduces stochastic discount factors and risk-neutral pricing in a finite-state Markov setting, the discrete-state counterpart of the continuous Gaussian framework used here. - {ref}`Heterogeneous Beliefs and Bubbles ` examines how heterogeneous and possibly mistaken beliefs generate speculative asset price bubbles, providing another perspective on how beliefs affect asset prices. -- {ref}`Likelihood Ratio Processes ` develops the mathematical properties of likelihood ratios — the central device organising this lecture — including their martingale structure and statistical applications. -- {ref}`Divergence Measures ` covers Kullback–Leibler divergence and relative entropy in detail, providing the information-theoretic foundations for the entropy constraints used in the robust control sections. +- {ref}`Likelihood Ratio Processes ` develops the mathematical properties of likelihood ratios, the central device organising this lecture, including their martingale structure and statistical applications. +- {ref}`Divergence Measures ` covers Kullback-Leibler divergence and relative entropy in detail, providing the information-theoretic foundations for the entropy constraints used in the robust control sections. - {ref}`Affine Models of Asset Prices ` extends the linear Gaussian state-space framework to affine and exponential-quadratic stochastic discount factors, developing risk-neutral pricing formulas closely related to those derived here. \ No newline at end of file From 1129abf36a3856f7cbf2199025d63d39c8e6294b Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Sat, 14 Mar 2026 09:08:11 +1100 Subject: [PATCH 11/18] updates --- lectures/risk_aversion_or_mistaken_beliefs.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lectures/risk_aversion_or_mistaken_beliefs.md b/lectures/risk_aversion_or_mistaken_beliefs.md index 6fadf5de7..17d6ae567 100644 --- a/lectures/risk_aversion_or_mistaken_beliefs.md +++ b/lectures/risk_aversion_or_mistaken_beliefs.md @@ -129,7 +129,7 @@ and complete the square to obtain $-\frac{1}{2}(\varepsilon + \lambda)^\top(\var For part 1, write $E m(\varepsilon) = \int \exp(-\lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda) \phi(\varepsilon) d\varepsilon = \exp(-\tfrac{1}{2}\lambda^\top\lambda) E[\exp(-\lambda^\top\varepsilon)]$. -The moment-generating function of $\varepsilon \sim \mathcal{N}(0,I)$ gives $E[\exp(-\lambda^\top\varepsilon)] = \exp(\tfrac{1}{2}\lambda^\top\lambda)$. +The moment-generating function of $\varepsilon \sim \mathcal{N}(0,I)$ (or expectation of the log-normal random variable) gives $E[\exp(-\lambda^\top\varepsilon)] = \exp(\tfrac{1}{2}\lambda^\top\lambda)$. So $E m(\varepsilon) = \exp(-\tfrac{1}{2}\lambda^\top\lambda)\exp(\tfrac{1}{2}\lambda^\top\lambda) = 1$. @@ -187,8 +187,9 @@ axes[2].plot(ε, ϕ_twist, 'firebrick', lw=2, axes[2].set_xlabel(r"$\varepsilon$") axes[2].legend() -for ax in axes: - ax.set_ylabel("Density") +axes[0].set_ylabel("Density") +axes[1].set_ylabel("Likelihood ratio") +axes[2].set_ylabel("Density") plt.tight_layout() plt.show() ``` @@ -1265,7 +1266,11 @@ plt.tight_layout() plt.show() ``` -Each twister shifts the econometrician's $\mathcal{N}(0,1)$ density to the left by a different amount, reflecting its respective source of pessimism about future shocks. +Each twister shifts the econometrician's $\mathcal{N}(0,1)$ density by $-w_t$, where the direction and magnitude depend on the current state $x_t$. + +For the state shown here, all three distortion vectors $w_t$ are negative in their first component, so the twisted densities $\mathcal{N}(-w_t, 1)$ are shifted slightly to the right. + +The shifts are small relative to the unit variance because the state $x_t = (0.02, 0.008)$ is close to the unconditional mean. ## Empirical challenges and model performances From bcad22d765415eb71540d53c584d4ef2795f54dd Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Sat, 14 Mar 2026 09:09:06 +1100 Subject: [PATCH 12/18] update lrp lecture --- lectures/likelihood_ratio_process.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lectures/likelihood_ratio_process.md b/lectures/likelihood_ratio_process.md index 26c315dbb..687f16f14 100644 --- a/lectures/likelihood_ratio_process.md +++ b/lectures/likelihood_ratio_process.md @@ -1322,7 +1322,7 @@ plt.show() Evidently, $e^{-C(f,g)T}$ is an upper bound on the error rate. -In `{doc}`divergence_measures`, we also studied **Jensen-Shannon divergence** as +In {doc}`divergence_measures`, we also studied **Jensen-Shannon divergence** as a symmetric measure of distance between distributions. We can use Jensen-Shannon divergence to measure the distance between distributions $f$ and $g$ and From a5a01fe6748d9a02688608ff4018888320db5d4e Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Sat, 14 Mar 2026 22:05:56 +1100 Subject: [PATCH 13/18] updates --- lectures/risk_aversion_or_mistaken_beliefs.md | 232 ++++++++++-------- 1 file changed, 129 insertions(+), 103 deletions(-) diff --git a/lectures/risk_aversion_or_mistaken_beliefs.md b/lectures/risk_aversion_or_mistaken_beliefs.md index 17d6ae567..75720a5fc 100644 --- a/lectures/risk_aversion_or_mistaken_beliefs.md +++ b/lectures/risk_aversion_or_mistaken_beliefs.md @@ -64,7 +64,6 @@ We start with some standard imports: import numpy as np import matplotlib.pyplot as plt import pandas as pd -from datetime import datetime from scipy.linalg import solve_discrete_lyapunov from numpy.linalg import inv, eigvals, norm from scipy.stats import norm as normal_dist @@ -81,7 +80,7 @@ Under the econometrician's probability model, $\varepsilon$ has a standard multi ```{math} :label: eq_baseline -\phi(\varepsilon) \propto \exp\!\left(-\frac{1}{2} \varepsilon^\top\varepsilon\right), \qquad \varepsilon \sim \mathcal{N}(0, I) +\phi(\varepsilon) \propto \exp \left(-\frac{1}{2} \varepsilon^\top\varepsilon\right), \qquad \varepsilon \sim \mathcal{N}(0, I) ``` Define a **likelihood ratio** @@ -89,7 +88,7 @@ Define a **likelihood ratio** ```{math} :label: eq_lr -m(\varepsilon) = \exp\!\left(-\lambda^\top\varepsilon - \frac{1}{2} \lambda^\top\lambda\right) \geq 0 +m(\varepsilon) = \exp \left(-\lambda^\top\varepsilon - \frac{1}{2} \lambda^\top\lambda\right) \geq 0 ``` which satisfies $E m(\varepsilon) = 1$ when the mathematical expectation $E$ is taken with respect to the econometrician's model. @@ -101,7 +100,7 @@ The **twisted density** is ```{math} :label: eq_twisted -\hat\phi(\varepsilon) = m(\varepsilon) \phi(\varepsilon) \propto \exp\!\left(-\frac{1}{2}(\varepsilon + \lambda)^\top(\varepsilon + \lambda)\right) +\hat\phi(\varepsilon) = m(\varepsilon) \phi(\varepsilon) \propto \exp \left(-\frac{1}{2}(\varepsilon + \lambda)^\top(\varepsilon + \lambda)\right) ``` which is a $\mathcal{N}(-\lambda, I)$ density. @@ -117,7 +116,7 @@ Verify that: 2. The twisted density $\hat\phi(\varepsilon) = m(\varepsilon) \phi(\varepsilon)$ is indeed $\mathcal{N}(-\lambda, I)$ by combining exponents: $$ -m(\varepsilon) \phi(\varepsilon) \propto \exp\!\left(-\lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda\right) \exp\!\left(-\tfrac{1}{2}\varepsilon^\top\varepsilon\right) = \exp\!\left(-\tfrac{1}{2}\bigl[\varepsilon^\top\varepsilon + 2\lambda^\top\varepsilon + \lambda^\top\lambda\bigr]\right) +m(\varepsilon) \phi(\varepsilon) \propto \exp \left(-\lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda\right) \exp \left(-\tfrac{1}{2}\varepsilon^\top\varepsilon\right) = \exp \left(-\tfrac{1}{2}\bigl[\varepsilon^\top\varepsilon + 2\lambda^\top\varepsilon + \lambda^\top\lambda\bigr]\right) $$ and complete the square to obtain $-\frac{1}{2}(\varepsilon + \lambda)^\top(\varepsilon + \lambda)$. @@ -136,7 +135,7 @@ So $E m(\varepsilon) = \exp(-\tfrac{1}{2}\lambda^\top\lambda)\exp(\tfrac{1}{2}\l For part 2, combine the exponents: $$ -m(\varepsilon) \phi(\varepsilon) \propto \exp\!\left(-\tfrac{1}{2}\varepsilon^\top\varepsilon - \lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda\right) +m(\varepsilon) \phi(\varepsilon) \propto \exp \left(-\tfrac{1}{2}\varepsilon^\top\varepsilon - \lambda^\top\varepsilon - \tfrac{1}{2}\lambda^\top\lambda\right) $$ Recognise the argument as $-\tfrac{1}{2}(\varepsilon^\top\varepsilon + 2\lambda^\top\varepsilon + \lambda^\top\lambda) = -\tfrac{1}{2}(\varepsilon + \lambda)^\top(\varepsilon + \lambda)$. @@ -229,14 +228,14 @@ Here $x_t$ is an $n \times 1$ state vector and $\varepsilon_{t+1}$ is a $k \time Throughout, we assume $n = k$ and that the volatility matrix $C$ is square and invertible. -This assumption is needed whenever we back out mean distortions $w = -C^{-1}(\cdot)$ from alternative transition matrices. +This assumption is needed whenever we back out distortion coefficient matrices of the form $W = -C^{-1}(\cdot)$ from alternative transition matrices, so that the time-$t$ distortion is $w_t = W x_t$. The observation $y_{t+1}$ represents consumption growth, $c_{t+1} - c_t = D x_t + G \varepsilon_{t+1}$. -Separately, the risk-free one-period interest rate and the payout process from a risky asset are linear functions of the state: +Separately, the risk-free one-period interest rate is a linear function of the state: $$ -r_t = \delta_0 + \bar{r}^\top x_t, \qquad d_t = \bar{d}^\top x_t +r_t = \delta_0 + \bar{r}^\top x_t $$ ```{figure} /_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fig2_tom.png @@ -274,7 +273,9 @@ It would be convenient if versions of the same pricing formulas worked even when The likelihood ratio makes this possible. -We now promote the static vector $\lambda$ from {eq}`eq_lr` to a *state-dependent* risk price vector by writing $\lambda_t = \lambda x_t$, where $\lambda$ is a $k \times n$ matrix of risk price coefficients. +We now promote the static vector $\lambda$ from {eq}`eq_lr` to a *state-dependent* risk price vector. + +With a slight abuse of notation, we now let $\lambda$ denote a $k \times n$ **matrix** of risk price coefficients, so that $\lambda_t = \lambda x_t$ is a $k \times 1$ vector at each date $t$. In the code below, this matrix is the parameter `Λ`. @@ -283,7 +284,7 @@ The likelihood ratio increment is ```{math} :label: eq_sdf_lr -m_{t+1}^\lambda = \exp\!\left(-\lambda_t^\top \varepsilon_{t+1} - \frac{1}{2} \lambda_t^\top\lambda_t\right), \qquad \lambda_t = \lambda x_t +m_{t+1}^\lambda = \exp \left(-\lambda_t^\top \varepsilon_{t+1} - \frac{1}{2} \lambda_t^\top\lambda_t\right), \qquad \lambda_t = \lambda x_t ``` with $E_t m_{t+1}^\lambda = 1$ and $m_{t+1}^\lambda \geq 0$. @@ -320,7 +321,11 @@ The risk-neutral representation implies **twisted dynamics**. Under the twisted measure, define $\tilde\varepsilon_{t+1} := \varepsilon_{t+1} + \lambda_t = \varepsilon_{t+1} + \lambda x_t$. -Since $\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under the econometrician's measure, the change of measure makes $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under the risk-neutral measure. +Since $\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under the econometrician's measure, $\tilde\varepsilon_{t+1}$ has mean $\lambda x_t$ and is *not* standard normal under that measure. + +However, the likelihood ratio $m_{t+1}^\lambda \propto \exp\bigl(-(\lambda x_t)^\top \varepsilon_{t+1} - \tfrac{1}{2}\|\lambda x_t\|^2\bigr)$ tilts the probability measure in exactly the right way to absorb this shift. + +By the standard exponential tilting result for Gaussian models, $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under the risk-neutral measure. Substituting $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - \lambda x_t$ into {eq}`eq_state` gives: @@ -350,7 +355,7 @@ These are the same formulas as rational-expectations asset pricing, but expectat The derivation of the recursive bond price coefficients is the same as in {ref}`Exercise 3 ` of {doc}`Affine Models of Asset Prices `, applied here under the risk-neutral dynamics {eq}`eq_rn_dynamics`. -Now let's implement the state-space model and its asset pricing implications +Now let's implement the state-space model and its asset pricing implications. ```{code-cell} ipython3 class LikelihoodRatioModel: @@ -510,7 +515,7 @@ print(f"Eigenvalues of A_Q: {eigvals(model.A_Q).round(4)}") To see the difference in action, we simulate both models from the same initial state using the same shock sequence. -Both simulations draw the same $\tilde\varepsilon$ innovations, but the transition matrices $A$ and $A_Q$ govern how those shocks cumulate over time. +Both simulations draw the same standard normal random vectors, but the transition matrices $A$ and $A_Q$ govern how those shocks cumulate over time. ```{code-cell} ipython3 T = 300 @@ -602,8 +607,8 @@ Their setup posits: - The representative agent's risk aversion leads him to price risks $\varepsilon_{t+1}$ with prices $\lambda_t^* = \lambda^* x_t$, where $\lambda^*$ is a $k \times n$ matrix. -- The representative agent has **twisted beliefs** $(A^*, C) = (A - C w^*, C)$ - relative to the econometrician's model $(A, C)$, where $w^*$ is a $k \times n$ matrix of belief distortion coefficients. +- The representative agent has **twisted beliefs** $(A^*, C) = (A - C W^*, C)$ + relative to the econometrician's model $(A, C)$, where $W^*$ is a $k \times n$ matrix of belief distortion coefficients, so that $w_t^* = W^* x_t$. - Professional forecasters use the twisted beliefs $(A^*, C)$ to answer survey questions about their forecasts. @@ -615,17 +620,17 @@ PSS proceed in four steps: 2. Project experts' one-step-ahead forecasts $E_t^*[x_{t+1}]$ on $x_t$ to obtain $E_t^*[x_{t+1}] = A^* x_t$ and interpret $A^*$ as incorporating belief distortions. -3. Back out the mean distortion matrix $w^* = -C^{-1}(A^* - A)$, so that $w_t^* = w^* x_t$ is the state-dependent mean shift applied to the +3. Back out the mean distortion matrix $W^* = -C^{-1}(A^* - A)$, so that $w_t^* = W^* x_t$ is the state-dependent mean shift applied to the density of $\varepsilon_{t+1}$. (This requires $C$ to be invertible.) 4. Reinterpret the $\lambda$ estimated by the rational-expectations econometrician - as $\lambda = \lambda^* + w^*$, where $\lambda_t^* = \lambda^* x_t$ is the + as $\lambda = \lambda^* + W^*$, where $\lambda_t^* = \lambda^* x_t$ is the (smaller) price of risk vector actually charged by the representative agent with distorted beliefs. An econometrician who mistakenly imposes rational expectations estimates risk prices $\lambda_t = \lambda x_t$ that sum two parts: - *smaller risk prices* $\lambda_t^* = \lambda^* x_t$ actually charged by the erroneous-beliefs representative agent, and -- *conditional mean distortions* $w_t^* = w^* x_t$ of the risks $\varepsilon_{t+1}$ that +- *conditional mean distortions* $w_t^* = W^* x_t$ of the risks $\varepsilon_{t+1}$ that the twisted-beliefs representative agent's model displays relative to the econometrician's. @@ -643,13 +648,13 @@ C_mat = np.array([[0.007, 0.000], [0.000, 0.010]]) # Belief distortion -w_star = -inv(C_mat) @ (A_star - A_econ) +W_star = -inv(C_mat) @ (A_star - A_econ) Λ_total = np.array([[-3.0, 0.0], [ 0.0, -6.0]]) -Λ_true = Λ_total - w_star # true risk prices +Λ_true = Λ_total - W_star # true risk prices -print("Belief distortion w*:\n", w_star.round(3)) +print("Belief distortion W*:\n", W_star.round(3)) print("\nTotal risk prices Λ:\n", Λ_total.round(3)) print("\nTrue risk prices Λ*:\n", Λ_true.round(3)) ``` @@ -746,7 +751,7 @@ $$ the dubious agent's value function is $$ -V(x_0, c_0) := E\!\left[\sum_{t=0}^{\infty} \beta^t c_t \;\middle|\; x_0, c_0\right] = c_0 + \beta E\!\left[V(x_1, c_1) \;\middle|\; x_0, c_0\right] +V(x_0, c_0) := E \left[\sum_{t=0}^{\infty} \beta^t c_t \middle| x_0, c_0\right] = c_0 + \beta E \left[V(x_1, c_1) \middle| x_0, c_0\right] $$ Note that the objective is *linear* in consumption. @@ -764,7 +769,7 @@ The dubious agent solves a *min* problem in which a malevolent "nature" chooses ```{math} :label: eq_hansen_seq -J(x_0, c_0 \mid \eta) := \min_{\{m_{t+1}\}} E\!\left[\sum_{t=0}^{\infty} \beta^t M_t c_t \;\middle|\; x_0, c_0\right] +J(x_0, c_0 \mid \eta) := \min_{\{m_{t+1}\}} E \left[\sum_{t=0}^{\infty} \beta^t M_t c_t \middle| x_0, c_0\right] ``` subject to @@ -774,7 +779,7 @@ c_{t+1} - c_t = D x_t + G \varepsilon_{t+1}, \qquad x_{t+1} = A x_t + C \varepsi $$ $$ -E\!\left[\sum_{t=0}^{\infty} \beta^t M_t E\!\left[m_{t+1}\log m_{t+1} \;\middle|\; x_t, c_t\right] \;\middle|\; x_0, c_0\right] \leq \eta +E \left[\sum_{t=0}^{\infty} \beta^t M_t E \left[m_{t+1}\log m_{t+1} \middle| x_t, c_t\right] \middle| x_0, c_0\right] \leq \eta $$ $$ @@ -808,13 +813,13 @@ Discounted entropy, by treating future divergences less severely, admits these s With the log-normal likelihood ratio $$ -m_{t+1} := \exp\!\left(-\frac{w_t^\top w_t}{2} - w_t^\top \varepsilon_{t+1}\right) +m_{t+1} := \exp \left(-\frac{w_t^\top w_t}{2} - w_t^\top \varepsilon_{t+1}\right) $$ conditional entropy takes the simple form $$ -E\!\left[m_{t+1}\log m_{t+1} \;\middle|\; x_t, c_t\right] = \frac{1}{2} w_t^\top w_t +E \left[m_{t+1}\log m_{t+1} \middle| x_t, c_t\right] = \frac{1}{2} w_t^\top w_t $$ Substituting into {eq}`eq_hansen_seq` and performing a change of measure (replacing $E[\cdot]$ with $E^w[\cdot]$ under the distorted model) yields the reformulated problem: @@ -822,7 +827,7 @@ Substituting into {eq}`eq_hansen_seq` and performing a change of measure (replac ```{math} :label: eq_hansen_reform -J(x_0, c_0 \mid \eta) := \min_{\{w_t\}} E^w\!\left[\sum_{t=0}^{\infty} \beta^t c_t \;\middle|\; x_0, c_0\right] +J(x_0, c_0 \mid \eta) := \min_{\{w_t\}} E^w \left[\sum_{t=0}^{\infty} \beta^t c_t \middle| x_0, c_0\right] ``` subject to @@ -832,7 +837,7 @@ c_{t+1} - c_t = D x_t + G (\tilde\varepsilon_{t+1} - w_t), \qquad x_{t+1} = A x_ $$ $$ -\frac{1}{2} E^w\!\left[\sum_{t=0}^{\infty} \beta^t w_t^\top w_t \;\middle|\; x_0, c_0\right] \leq \eta +\frac{1}{2} E^w \left[\sum_{t=0}^{\infty} \beta^t w_t^\top w_t \middle| x_0, c_0\right] \leq \eta $$ Here $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under $E^w$, and we have substituted $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - w_t$ (so $E[\varepsilon_{t+1}] = -w_t$ under the distorted measure). @@ -858,7 +863,7 @@ We compute $\bar{w}$ using the multiplier formulation (see {ref}`the multiplier In the multiplier formulation, the agent minimises $$ -E^w\!\left[\sum_{t=0}^\infty \beta^t \bigl(c_t + \tfrac{\theta}{2} w_t^\top w_t\bigr)\right] +E^w \left[\sum_{t=0}^\infty \beta^t \bigl(c_t + \tfrac{\theta}{2} w_t^\top w_t\bigr)\right] $$ over $\{w_t\}$ subject to the shifted dynamics. @@ -916,29 +921,29 @@ For part 1, the consumption increment $\Delta c_{s+1} = Dx_s - G\bar{w} + G\tild Swapping the order of summation: $$ -E\!\left[\sum_{t=0}^\infty \beta^t c_t\right] = \frac{c_0}{1-\beta} + \frac{1}{1-\beta}\sum_{s=0}^\infty \beta^{s+1}\bigl(D\, E[x_s] - G\bar{w}\bigr) +E \left[\sum_{t=0}^\infty \beta^t c_t\right] = \frac{c_0}{1-\beta} + \frac{1}{1-\beta}\sum_{s=0}^\infty \beta^{s+1}\bigl(D E[x_s] - G\bar{w}\bigr) $$ For part 2, define $S = \sum_{s=0}^\infty \beta^{s+1} E[x_s]$. -From $E[x_{s+1}] = A\,E[x_s] - C\bar{w}$, multiply both sides by $\beta^{s+2}$ and sum over $s = 0, 1, \ldots$: +From $E[x_{s+1}] = A E[x_s] - C\bar{w}$, multiply both sides by $\beta^{s+2}$ and sum over $s = 0, 1, \ldots$: $$ -S - \beta x_0 = \beta A\, S - \frac{\beta^2}{1-\beta}C\bar{w} +S - \beta x_0 = \beta A S - \frac{\beta^2}{1-\beta}C\bar{w} $$ -Solving: $S = (I - \beta A)^{-1}\!\left(\beta x_0 - \frac{\beta^2}{1-\beta}C\bar{w}\right)$. +Solving: $S = (I - \beta A)^{-1} \left(\beta x_0 - \frac{\beta^2}{1-\beta}C\bar{w}\right)$. -Substituting back, the expected objective $E[\sum \beta^t(c_t + \frac{\theta}{2}\|\bar{w}\|^2)]$ depends on $\bar{w}$ only through the term $\frac{1}{1-\beta}(D\,S - \frac{\beta}{1-\beta}G\bar{w}) + \frac{\theta}{2(1-\beta)}\|\bar{w}\|^2$. +Substituting back, the expected objective $E[\sum \beta^t(c_t + \frac{\theta}{2}\|\bar{w}\|^2)]$ depends on $\bar{w}$ only through the term $\frac{1}{1-\beta}(D S - \frac{\beta}{1-\beta}G\bar{w}) + \frac{\theta}{2(1-\beta)}\|\bar{w}\|^2$. For part 3, differentiate with respect to $\bar{w}$ and set to zero. -The only part of $S$ that depends on $\bar{w}$ is $-\frac{\beta^2}{1-\beta}(I-\beta A)^{-1}C\bar{w}$, so $\nabla_{\bar{w}}(D\,S) = -\frac{\beta^2}{1-\beta}C^\top(I - \beta A^\top)^{-1}D^\top$. +The only part of $S$ that depends on $\bar{w}$ is $-\frac{\beta^2}{1-\beta}(I-\beta A)^{-1}C\bar{w}$, so $\nabla_{\bar{w}}(D S) = -\frac{\beta^2}{1-\beta}C^\top(I - \beta A^\top)^{-1}D^\top$. The first-order condition is: $$ -\frac{\theta}{1-\beta}\bar{w} = \frac{1}{1-\beta}\!\left(\frac{\beta}{1-\beta}G^\top + \frac{\beta^2}{1-\beta}C^\top(I - \beta A^\top)^{-1}D^\top\right) +\frac{\theta}{1-\beta}\bar{w} = \frac{1}{1-\beta} \left(\frac{\beta}{1-\beta}G^\top + \frac{\beta^2}{1-\beta}C^\top(I - \beta A^\top)^{-1}D^\top\right) $$ Simplifying: $\theta\bar{w} = \frac{\beta}{1-\beta}G^\top + \beta C^\top v$, where $v = \frac{\beta}{1-\beta}(I - \beta A^\top)^{-1}D^\top$. @@ -970,13 +975,13 @@ The inclusion of those alternative parametric models *tilts* the entropy ball, w The investor wants to include particular alternative models with $$ -E_t\!\left[\bar{m}_{t+1}\log\bar{m}_{t+1}\right] = \frac{1}{2} \bar{w}_t^\top \bar{w}_t =: \frac{1}{2}\xi(x_t) +E_t \left[\bar{m}_{t+1}\log\bar{m}_{t+1}\right] = \frac{1}{2} \bar{w}_t^\top \bar{w}_t =: \frac{1}{2}\xi(x_t) $$ and discounted entropy $$ -\frac{1}{2}\,E^{\bar{w}}\!\left[\sum_{t=0}^{\infty} \beta^t \xi(x_t) \;\middle|\; x_0, c_0\right] +\frac{1}{2} E^{\bar{W}} \left[\sum_{t=0}^{\infty} \beta^t \xi(x_t) \middle| x_0, c_0\right] $$ This is accomplished by replacing the earlier entropy constraint with @@ -984,7 +989,7 @@ This is accomplished by replacing the earlier entropy constraint with ```{math} :label: eq_tilted_constraint -\frac{1}{2} E^w\!\left[\sum_{t=0}^{\infty} \beta^t w_t^\top w_t \;\middle|\; x_0, c_0\right] \leq \frac{1}{2} E^w\!\left[\sum_{t=0}^{\infty} \beta^t \xi(x_t) \;\middle|\; x_0, c_0\right] +\frac{1}{2} E^w \left[\sum_{t=0}^{\infty} \beta^t w_t^\top w_t \middle| x_0, c_0\right] \leq \frac{1}{2} E^w \left[\sum_{t=0}^{\infty} \beta^t \xi(x_t) \middle| x_0, c_0\right] ``` The time-$t$ contributions to the right-hand side of {eq}`eq_tilted_constraint` relax the discounted entropy constraint in states $x_t$ in which $\xi(x_t)$ is larger. @@ -999,10 +1004,10 @@ $$ x_{t+1} = \bar{A} x_t + C \tilde\varepsilon_{t+1} $$ -Since $\bar{A}x_t = Ax_t + C(-C^{-1}(\bar{A}-A))x_t = Ax_t - C\bar{w}x_t$, this feared model is equivalent to shifting the mean of $\varepsilon_{t+1}$ by $-\bar{w}x_t$, giving $\bar{w}_t = \bar{w} x_t$ with +Since $\bar{A} = A - C\bar{W}$, this feared model is equivalent to shifting the mean of $\varepsilon_{t+1}$ by $-\bar{W}x_t$, giving $\bar{w}_t = \bar{W} x_t$ with $$ -\bar{w} = -C^{-1}(\bar{A} - A) +\bar{W} = -C^{-1}(\bar{A} - A) $$ (again using the assumption that $C$ is square and invertible), which implies a *quadratic* $\xi$ function: @@ -1010,7 +1015,7 @@ $$ ```{math} :label: eq_xi -\xi(x_t) := x_t^\top \bar{w}^\top\bar{w} x_t =: x_t^\top \Xi x_t +\xi(x_t) := x_t^\top \bar{W}^\top\bar{W} x_t =: x_t^\top \Xi x_t ``` ```{figure} /_static/lecture_specific/risk_aversion_or_mistaken_beliefs/eggs_backus2.png @@ -1024,7 +1029,7 @@ Attaching a Lagrange multiplier $\tilde\theta \geq 0$ to the tilted entropy cons ```{math} :label: eq_szoke_seq -J(x_0, c_0 \mid \Xi) := \max_{\tilde\theta \geq 0}\;\min_{\{w_t\}}\; E^w\!\left[\sum_{t=0}^{\infty} \beta^t c_t + \tilde\theta \frac{1}{2}\sum_{t=0}^{\infty} \beta^t\bigl(w_t^\top w_t - x_t^\top \Xi x_t\bigr) \;\middle|\; x_0, c_0\right] +J(x_0, c_0 \mid \Xi) := \max_{\tilde\theta \geq 0} \min_{\{w_t\}} E^w \left[\sum_{t=0}^{\infty} \beta^t c_t + \tilde\theta \frac{1}{2}\sum_{t=0}^{\infty} \beta^t\bigl(w_t^\top w_t - x_t^\top \Xi x_t\bigr) \middle| x_0, c_0\right] ``` subject to @@ -1033,45 +1038,53 @@ $$ c_{t+1} - c_t = D x_t + G (\tilde\varepsilon_{t+1} - w_t), \qquad x_{t+1} = A x_t + C (\tilde\varepsilon_{t+1} - w_t) $$ -The worst-case shock mean distortion is now *state-dependent*: +The worst-case distortion is now **affine** in the state: $$ -\tilde{w}_t = \tilde{w} x_t +\tilde{w}_t = a + \tilde{W} x_t $$ -and the worst-case model is $(\tilde{A}, C, \tilde{D}, G)$ with +where $a$ is a constant vector determined by the linear terms in the value function. + +The state-dependent component $\tilde{W} x_t$ is the new contribution of the tilted entropy ball, and is what generates countercyclical uncertainty prices. + +Writing $\tilde{A} = A - C \tilde{W}$ and $\tilde{D} = D - G \tilde{W}$, the worst-case dynamics are $$ -\tilde{A} = A - C \tilde{w}, \qquad \tilde{D} = D - G \tilde{w} +x_{t+1} = \tilde{A} x_t - Ca + C\tilde\varepsilon_{t+1}, \qquad c_{t+1} - c_t = \tilde{D} x_t - Ga + G\tilde\varepsilon_{t+1} $$ ### Implementation: tilted entropy ball -Guess a quadratic value function $J(x) = x^\top P x + \text{const}$ for the inner minimisation over $\{w_t\}$ in {eq}`eq_szoke_seq`. - -Since $w_t = W x_t$ is linear in the state, the first-order condition for $w_t$ at each $t$ gives: +For the inner minimisation over $\{w_t\}$ in {eq}`eq_szoke_seq`, the value function is **affine-quadratic** in the state because $c_t$ enters linearly: $$ -\tilde\theta W = 2\beta C^\top P (A - C W) \quad \Longrightarrow \quad (\tilde\theta I + 2\beta C^\top P C) W = 2\beta C^\top P A +J(x, c) = \frac{c}{1-\beta} + v^\top x + x^\top P x + K $$ -(where we write $\tilde\theta$ as $\theta$ in the code). +The first-order condition for $w_t$ decomposes into a constant part (determining $a$) and a state-dependent part (determining $\tilde{W}$). -Substituting back into the Bellman equation and matching quadratic terms in $x$ gives the $P$ update: +The state-dependent component satisfies (writing $\tilde\theta$ as $\theta$ in the code): $$ -P = -\tfrac{\theta}{2} \Xi + \tfrac{\theta}{2} W^\top W + \beta (A - CW)^\top P (A - CW) +(\theta I + 2\beta C^\top P C) \tilde{W} = 2\beta C^\top P A $$ -The code iterates on the $(P, W)$ system until convergence. +Matching quadratic terms in $x$ gives the $P$ update: + +$$ +P = -\tfrac{\theta}{2} \Xi + \tfrac{\theta}{2} \tilde{W}^\top \tilde{W} + \beta (A - C\tilde{W})^\top P (A - C\tilde{W}) +$$ + +The code below iterates on the $(P, \tilde{W})$ system to convergence, solving for the state-dependent component only; the constant $a$ requires separate linear-term equations and does not generally coincide with the Hansen $\bar{w}$. ```{code-cell} ipython3 class TiltedEntropyModel: """ Hansen-Szőke tilted entropy ball model. - Given (A, C, D, G, β, θ, Ξ), computes the worst-case - state-dependent distortion w_tilde_t = W_tilde x_t. + Given (A, C, D, G, β, θ, Ξ), computes the state-dependent + component W_tilde of the worst-case distortion w_t = a + W_tilde x_t. """ def __init__(self, A, C, D, G, β, θ, Ξ): @@ -1083,9 +1096,9 @@ class TiltedEntropyModel: self.Ξ = np.atleast_2d(Ξ).astype(float) self.n = self.A.shape[0] - self.w_tilde = self._solve_worst_case() - self.A_tilde = self.A - self.C @ self.w_tilde - self.D_tilde = self.D - self.G @ self.w_tilde + self.W_tilde = self._solve_worst_case() + self.A_tilde = self.A - self.C @ self.W_tilde + self.D_tilde = self.D - self.G @ self.W_tilde def _solve_worst_case(self): """Iterate on (P, W) system to find worst-case W_tilde.""" @@ -1112,11 +1125,13 @@ class TiltedEntropyModel: self._P_quad = P return W - def worst_case_distortion(self, x): - return self.w_tilde @ x + def state_dependent_distortion(self, x): + """State-dependent component W_tilde @ x of the worst-case distortion.""" + return self.W_tilde @ x - def conditional_entropy(self, x): - w = self.worst_case_distortion(x) + def state_dependent_entropy(self, x): + """Entropy of the state-dependent component: (1/2)(W_tilde x)'(W_tilde x).""" + w = self.state_dependent_distortion(x) return 0.5 * w @ w def xi_function(self, x): @@ -1128,19 +1143,23 @@ class TiltedEntropyModel: A_bar = np.array([[0.995, -0.03], [0.000, 0.96]]) -w_bar = -inv(C) @ (A_bar - A) -Ξ = w_bar.T @ w_bar +W_bar = -inv(C) @ (A_bar - A) +Ξ = W_bar.T @ W_bar print("Feared transition A_bar:\n", A_bar) -print("\nImplied distortion w_bar:\n", w_bar.round(3)) +print("\nImplied distortion W_bar:\n", W_bar.round(3)) print("\nTilting matrix Ξ:\n", Ξ.round(1)) ``` +In {eq}`eq_szoke_seq` the multiplier $\tilde\theta$ is determined by the outer maximisation. + +Here we fix $\theta$ at a representative value and solve only the inner minimisation, illustrating the multiplier formulation described in {ref}`the multiplier preferences section below `. + ```{code-cell} ipython3 θ_tilt = 3.0 tilted = TiltedEntropyModel(A, C, D, G, β, θ_tilt, Ξ) -print("Worst-case distortion W_tilde:\n", tilted.w_tilde.round(4)) +print("Worst-case distortion W_tilde:\n", tilted.W_tilde.round(4)) print("\nWorst-case transition A_tilde:\n", tilted.A_tilde.round(4)) print(f"\nEigenvalues of A: {eigvals(A).round(4)}") print(f"Eigenvalues of A_tilde: {eigvals(tilted.A_tilde).round(4)}") @@ -1149,26 +1168,33 @@ print(f"Eigenvalues of A_tilde: {eigvals(tilted.A_tilde).round(4)}") ````{exercise} :label: lr_exercise_4 -Derive the first-order condition for the tilted entropy problem. +Derive the first-order condition for the state-dependent component of the tilted entropy problem. -1. Start from {eq}`eq_szoke_seq` and write $w_t = W x_t$. Using the dynamics $x_{t+1} = (A - CW)x_t + C\tilde\varepsilon_{t+1}$, argue that the objective is quadratic in $x_t$. -2. Take the first-order condition $\partial / \partial W$ and show that it gives $\theta W = 2\beta C^\top P (A - CW)$, which can be rearranged to the system solved in the code. -3. Derive the $P$ update by substituting the optimal $W$ back into the Bellman equation. +1. Start from {eq}`eq_szoke_seq` and write $w_t = \bar{w} + W x_t$; +argue that the value function is affine-quadratic, $J(x,c) = c/(1-\beta) + v^\top x + x^\top P x + K$, and that the first-order condition separates into a constant part (determining $a$) and a state-dependent part (determining $W$). +2. Show that the state-dependent first-order condition gives $\theta W = 2\beta C^\top P (A - CW)$, which can be rearranged to the system solved in the code. +3. Derive the $P$ update by substituting the optimal $W$ back into the Bellman equation and matching quadratic terms in $x$. ```` ````{solution} lr_exercise_4 :class: dropdown -For part 1, with $w_t = Wx_t$ and $x_{t+1} = (A-CW)x_t + C\tilde\varepsilon_{t+1}$, the period-$t$ payoff in {eq}`eq_szoke_seq` is: +For part 1, write $w_t = \bar{w} + Wx_t$. + +Since $c_t$ is linear in past states and shocks, and the dynamics are linear, the value function takes the affine-quadratic form $J(x,c) = c/(1-\beta) + v^\top x + x^\top P x + K$. + +The first-order condition for $w_t$ at each $t$ is: $$ -c_t + \tfrac{\theta}{2}(w_t^\top w_t - x_t^\top \Xi x_t) = c_t + \tfrac{\theta}{2} x_t^\top(W^\top W - \Xi) x_t +(\theta I + 2\beta C^\top P C)\, w_t = \frac{\beta}{1-\beta} G^\top + \beta C^\top v + 2\beta C^\top P A x_t $$ -Since $c_t$ is linear in past $x_s$ and the dynamics are linear, the value function is quadratic: $J_t = x_t^\top P x_t + \text{linear and constant terms}$. +The constant terms (independent of $x_t$) determine $a$; note that this differs from the Hansen $\bar{w}$ because of the $2\beta C^\top P C$ factor on the left-hand side. + +The terms proportional to $x_t$ determine $W$. -For part 2, the first-order condition for $W$ from the quadratic Bellman equation is: +For part 2, the state-dependent first-order condition from the quadratic terms is: $$ \frac{\partial}{\partial W}\bigl[\tfrac{\theta}{2}x_t^\top W^\top W x_t + \beta x_t^\top(A-CW)^\top P(A-CW)x_t\bigr] = 0 @@ -1186,7 +1212,7 @@ $$ P = -\tfrac{\theta}{2} \Xi + \tfrac{\theta}{2} W^\top W + \beta (A-CW)^\top P(A-CW) $$ -This is the matrix Riccati equation that the code iterates to convergence. +This is the matrix Riccati equation that the code iterates to convergence. ```` @@ -1195,7 +1221,7 @@ This is the matrix Riccati equation that the code iterates to convergence. ```{code-cell} ipython3 x_grid = np.linspace(-0.03, 0.04, 200) -entropy_tilted = np.array([tilted.conditional_entropy(np.array([x, 0.005])) +entropy_tilted = np.array([tilted.state_dependent_entropy(np.array([x, 0.005])) for x in x_grid]) ξ_vals = np.array([tilted.xi_function(np.array([x, 0.005])) for x in x_grid]) @@ -1212,7 +1238,7 @@ fig, ax = plt.subplots(figsize=(9, 5)) ax.axhline(hansen_ent, color='steelblue', lw=2, ls='--', label=rf"Hansen: constant $\frac{{1}}{{2}}\bar{{w}}^\top\bar{{w}} = {hansen_ent:.4f}$") ax.plot(x_grid, entropy_tilted, 'firebrick', lw=2, - label=r"Szőke: $\frac{1}{2}\tilde{w}_t^\top\tilde{w}_t$") + label=r"Szőke (state-dep.): $\frac{1}{2}(\tilde{W}x_t)^\top(\tilde{W}x_t)$") ax.plot(x_grid, 0.5 * ξ_vals, 'seagreen', lw=2, ls=':', label=r"Feared model: $\frac{1}{2}\xi(x_t)$") ax.set_xlabel(r"Level factor $x_{1,t}$") @@ -1222,11 +1248,11 @@ plt.tight_layout() plt.show() ``` -The key innovation of the tilted entropy ball is visible: the Szőke worst-case distortion $\tilde{w}_t = \tilde{W} x_t$ grows with $|x_t|$, producing *countercyclical uncertainty prices*. +The key innovation of the tilted entropy ball is visible: the state-dependent component $\tilde{W} x_t$ of the worst-case distortion grows with $|x_t|$, producing *countercyclical uncertainty prices*. By contrast, Hansen's constant distortion $\bar{w}$ has entropy $\frac{1}{2}\bar{w}^\top\bar{w}$ that does not vary with $x_t$ (shown as a horizontal line). -The Szőke parabola lies inside the feared model's entropy budget $\frac{1}{2}\xi(x_t)$, confirming the worst-case distortion respects the tilted entropy constraint. +The Szőke parabola lies inside the feared model's entropy budget $\frac{1}{2}\xi(x_t)$ along this slice, consistent with the tilted entropy constraint {eq}`eq_tilted_constraint`. ### Three probability twisters @@ -1236,13 +1262,13 @@ To summarize, three distinct probability twisters play roles in this analysis: |:---------------|:------------------------------|:----------------------------------| | $w_t^*$ | Piazzesi, Salomão, Schneider | Mistaken agent's beliefs | | $\bar{w}_t$ | Szőke's feared parametric model | Especial LRR parametric worry | -| $\tilde{w}_t$ | Szőke's worst-case model | Worst-case distortion | +| $\tilde{W} x_t$ | Szőke's worst-case model | State-dependent component of worst-case distortion | ```{code-cell} ipython3 x_state = np.array([0.02, 0.008]) -w_pss = w_star @ x_state -w_feared = w_bar @ x_state -w_szoke = tilted.worst_case_distortion(x_state) +w_pss = W_star @ x_state +w_feared = W_bar @ x_state +w_szoke = tilted.state_dependent_distortion(x_state) ε_grid = np.linspace(-4, 4, 500) ϕ_base = normal_dist.pdf(ε_grid, 0, 1) @@ -1356,7 +1382,7 @@ The following table summarises how various models perform: Szőke's framework delivers: -1. A theory of *state-dependent belief distortions* $\tilde{w}_t = \tilde{w} x_t$. +1. A theory of *state-dependent belief distortions* with state-dependent component $\tilde{W} x_t$. 2. A theory about the *question that professional forecasters answer*: they respond with their worst-case model because they hear "tell me forecasts that rationalise your (max-min) decisions." @@ -1367,7 +1393,7 @@ Szőke's framework delivers: model_rn = LikelihoodRatioModel( A, C, D, G, r_bar, Λ=np.zeros((2, 2)), δ_0=δ_0) model_uncert = LikelihoodRatioModel( - A, C, D, G, r_bar, Λ=tilted.w_tilde, δ_0=δ_0) + A, C, D, G, r_bar, Λ=tilted.W_tilde, δ_0=δ_0) x_test = np.array([0.01, -0.03]) n_max = 120 @@ -1408,15 +1434,15 @@ As {cite:t}`szoke2022estimating` puts it: ### Szőke's empirical strategy -In the Szőke framework, the rational-expectations econometrician's single likelihood ratio $m_{t+1}^\lambda$ is decomposed as $\lambda_t = \tilde{w}_t + \tilde{\lambda}_t$, paralleling the PSS decomposition $\lambda = \lambda^* + w^*$. +In the Szőke framework, the rational-expectations econometrician's single likelihood ratio $m_{t+1}^\lambda$ is decomposed as $\lambda_t = \tilde{w}_t + \tilde{\lambda}_t$, paralleling the PSS decomposition $\lambda = \lambda^* + W^*$. The combined likelihood ratio is $$ -m_{t+1}^\lambda = \exp\!\left(-\lambda_t^\top\varepsilon_{t+1} - \frac{1}{2}\lambda_t^\top\lambda_t\right), \qquad \lambda_t = \tilde{w}_t + \tilde\lambda_t +m_{t+1}^\lambda = \exp \left(-\lambda_t^\top\varepsilon_{t+1} - \frac{1}{2}\lambda_t^\top\lambda_t\right), \qquad \lambda_t = \tilde{w}_t + \tilde\lambda_t $$ -where $\tilde{w}_t = \tilde{w} x_t$ is the worst-case belief distortion and $\tilde\lambda_t = \tilde\lambda x_t$ is the residual risk price. +where $\tilde{w}_t = a + \tilde{W} x_t$ is the worst-case belief distortion (with state-dependent component $\tilde{W} x_t$) and $\tilde\lambda_t = \tilde\lambda x_t$ is the residual risk price. In stage I (estimation): @@ -1427,14 +1453,14 @@ In stage I (estimation): restrictions: $$ -p_t(n+1) = \exp(-r_t) E_t\!\left[m_{t+1}^\lambda\, p_{t+1}(n)\right] +p_t(n+1) = \exp(-r_t) E_t \left[m_{t+1}^\lambda p_{t+1}(n)\right] $$ In stage II (assessment): 1. Assess improvements in predicted behaviour of the term structure. 2. Use estimated worst-case dynamics to form distorted forecasts - $\tilde{x}_{t+1} = (A - C\tilde{w})x_t$ and compare them to those of + $\tilde{x}_{t+1} = (A - C\tilde{W})x_t - Ca$ and compare them to those of professional forecasters. 3. Compute the discounted KL divergence $\frac{1}{2}E^w[\sum \beta^t w_t^\top w_t]$ of each twisted model relative to the econometrician's model and compare them. @@ -1453,8 +1479,8 @@ def discounted_kl(W, A_w, C, x0, β, T_horizon=500): return np.mean(total) x0_test = np.array([0.01, 0.005]) -kl_szoke = discounted_kl(tilted.w_tilde, tilted.A_tilde, C, x0_test, β) -kl_feared = discounted_kl(w_bar, A_bar, C, x0_test, β) +kl_szoke = discounted_kl(tilted.W_tilde, tilted.A_tilde, C, x0_test, β) +kl_feared = discounted_kl(W_bar, A_bar, C, x0_test, β) print(f"Szőke worst-case KL: {kl_szoke:.4f}") print(f"Feared LRR KL: {kl_feared:.4f}") @@ -1478,7 +1504,7 @@ The **multiplier preference** version of the dubious agent's problem is: ```{math} :label: eq_mult_seq -W(x_0, c_0 \mid \theta) := \min_{\{m_{t+1}\}} E\!\left[\sum_{t=0}^{\infty} \beta^t M_t\bigl(c_t + \theta m_{t+1}\log m_{t+1}\bigr) \;\middle|\; x_0, c_0\right] +\hat{J}(x_0, c_0 \mid \theta) := \min_{\{m_{t+1}\}} E \left[\sum_{t=0}^{\infty} \beta^t M_t\bigl(c_t + \theta m_{t+1}\log m_{t+1}\bigr) \middle| x_0, c_0\right] ``` with $M_{t+1} = M_t m_{t+1}$, $E[m_{t+1} \mid x_t, c_t] = 1$, $M_0 = 1$. @@ -1486,30 +1512,30 @@ with $M_{t+1} = M_t m_{t+1}$, $E[m_{t+1} \mid x_t, c_t] = 1$, $M_0 = 1$. The recursive formulation is: $$ -W(x_t, c_t \mid \theta) = c_t + \min_{m_{t+1}} E\!\left[m_{t+1}\bigl[\beta W(x_{t+1}, c_{t+1}) + \theta\log m_{t+1}\bigr] \;\middle|\; x_t, c_t\right] +\hat{J}(x_t, c_t \mid \theta) = c_t + \min_{m_{t+1}} E \left[m_{t+1}\bigl[\beta \hat{J}(x_{t+1}, c_{t+1}) + \theta\log m_{t+1}\bigr] \middle| x_t, c_t\right] $$ $$ -= c_t - \theta\log E\!\left[\exp\!\left(-\frac{\beta W(x_{t+1}, c_{t+1})}{\theta}\right) \;\middle|\; x_t, c_t\right] += c_t - \theta\log E \left[\exp \left(-\frac{\beta \hat{J}(x_{t+1}, c_{t+1})}{\theta}\right) \middle| x_t, c_t\right] $$ $$ -=: c_t + T_t\!\left[\beta W(x_{t+1}, c_{t+1})\right] +=: c_t + T_t \left[\beta \hat{J}(x_{t+1}, c_{t+1})\right] $$ where the right-hand side is attained by $$ -m_{t+1}^* \propto \exp\!\left(-\frac{\beta W(x_{t+1}, c_{t+1})}{\theta}\right) +m_{t+1}^* \propto \exp \left(-\frac{\beta \hat{J}(x_{t+1}, c_{t+1})}{\theta}\right) $$ -By Lagrange multiplier theory, +By Lagrange multiplier theory, for the **corresponding dual pair** $(\tilde\theta, \eta)$, $$ -W(x_t, c_t \mid \tilde\theta) = J(x_t, c_t \mid \eta) + \tilde\theta \eta +\hat{J}(x_t, c_t \mid \tilde\theta) = J(x_t, c_t \mid \eta) + \tilde\theta \eta $$ -Each choice of $\tilde\theta$ in the multiplier problem corresponds to a particular entropy bound $\eta$ in the constraint problem, so the two formulations are equivalent. +Each choice of $\tilde\theta$ in the multiplier problem corresponds to a particular entropy bound $\eta(\tilde\theta)$ in the constraint problem, so the two formulations are equivalent. The operator $T_t$ defined above is a **risk-sensitivity operator** that maps the continuation value through an exponential tilt, downweighting good outcomes and upweighting bad ones. From 688db7d3043ab638aca9905c12d22281eeaf8a16 Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Sat, 14 Mar 2026 22:32:35 +1100 Subject: [PATCH 14/18] updates --- lectures/risk_aversion_or_mistaken_beliefs.md | 94 ++++++++++++++++--- 1 file changed, 79 insertions(+), 15 deletions(-) diff --git a/lectures/risk_aversion_or_mistaken_beliefs.md b/lectures/risk_aversion_or_mistaken_beliefs.md index 75720a5fc..c285c6c80 100644 --- a/lectures/risk_aversion_or_mistaken_beliefs.md +++ b/lectures/risk_aversion_or_mistaken_beliefs.md @@ -1046,6 +1046,10 @@ $$ where $a$ is a constant vector determined by the linear terms in the value function. +When $P = 0$ (no tilting), the constant $a$ reduces to the Hansen $\bar{w}$ from the untilted problem. + +However, when $P \neq 0$ the two differ because the quadratic value function contributes an additional $2\beta C^\top P C$ term to the left-hand side of the first-order condition for the constant part. + The state-dependent component $\tilde{W} x_t$ is the new contribution of the tilted entropy ball, and is what generates countercyclical uncertainty prices. Writing $\tilde{A} = A - C \tilde{W}$ and $\tilde{D} = D - G \tilde{W}$, the worst-case dynamics are @@ -1076,7 +1080,7 @@ $$ P = -\tfrac{\theta}{2} \Xi + \tfrac{\theta}{2} \tilde{W}^\top \tilde{W} + \beta (A - C\tilde{W})^\top P (A - C\tilde{W}) $$ -The code below iterates on the $(P, \tilde{W})$ system to convergence, solving for the state-dependent component only; the constant $a$ requires separate linear-term equations and does not generally coincide with the Hansen $\bar{w}$. +The code below iterates on the $(P, \tilde{W})$ system to convergence, solving for the state-dependent component only; the constant $a$ requires separate linear-term equations. ```{code-cell} ipython3 class TiltedEntropyModel: @@ -1116,6 +1120,7 @@ class TiltedEntropyModel: + β * A_w.T @ P @ A_w) P_new = 0.5 * (P_new + P_new.T) if np.max(np.abs(P_new - P)) < 1e-12: + P = P_new converged = True break P = P_new @@ -1170,7 +1175,7 @@ print(f"Eigenvalues of A_tilde: {eigvals(tilted.A_tilde).round(4)}") Derive the first-order condition for the state-dependent component of the tilted entropy problem. -1. Start from {eq}`eq_szoke_seq` and write $w_t = \bar{w} + W x_t$; +1. Start from {eq}`eq_szoke_seq` and write $w_t = a + W x_t$; argue that the value function is affine-quadratic, $J(x,c) = c/(1-\beta) + v^\top x + x^\top P x + K$, and that the first-order condition separates into a constant part (determining $a$) and a state-dependent part (determining $W$). 2. Show that the state-dependent first-order condition gives $\theta W = 2\beta C^\top P (A - CW)$, which can be rearranged to the system solved in the code. 3. Derive the $P$ update by substituting the optimal $W$ back into the Bellman equation and matching quadratic terms in $x$. @@ -1180,17 +1185,73 @@ argue that the value function is affine-quadratic, $J(x,c) = c/(1-\beta) + v^\to ````{solution} lr_exercise_4 :class: dropdown -For part 1, write $w_t = \bar{w} + Wx_t$. +For part 1, write $w_t = a + Wx_t$. + +To confirm the affine-quadratic form, substitute this guess into the Bellman equation for the inner minimisation of {eq}`eq_szoke_seq`: + +$$ +J(x, c) = \min_{w} \left\{ c + \frac{\theta}{2}(w^\top w - x^\top \Xi x) + \beta\, E\bigl[J(x', c')\bigr] \right\} +$$ + +where $x' = Ax + C(\tilde\varepsilon - w)$ and $c' - c = Dx + G(\tilde\varepsilon - w)$. + +Conjecture $J(x,c) = c/(1-\beta) + v^\top x + x^\top P x + K$. + +Under this guess, $J(x',c') = c'/(1-\beta) + v^\top x' + x'^\top P x' + K$. -Since $c_t$ is linear in past states and shocks, and the dynamics are linear, the value function takes the affine-quadratic form $J(x,c) = c/(1-\beta) + v^\top x + x^\top P x + K$. +Write $c'/(1-\beta) = c/(1-\beta) + (c'-c)/(1-\beta)$, so the $c/(1-\beta)$ term passes through both sides and can be cancelled. -The first-order condition for $w_t$ at each $t$ is: +Substituting $w = a + Wx$, the next-period state is $x' = (A - CW)x - Ca + C\tilde\varepsilon$, and the consumption increment is $(c'-c) = (D - GW)x - Ga + G\tilde\varepsilon$. + +Taking $E[\cdot]$ (with $E[\tilde\varepsilon] = 0$, $E[\tilde\varepsilon\tilde\varepsilon^\top] = I$), the right-hand side after cancelling $c/(1-\beta)$ has the following structure. + +*Quadratic terms in $x$:* + +$$ +-\tfrac{\theta}{2} x^\top \Xi x + \tfrac{\theta}{2} x^\top W^\top W x + \beta x^\top (A-CW)^\top P (A-CW) x +$$ + +These come from the penalty $\frac{\theta}{2}(w^\top w - x^\top \Xi x)$ and from $x'^\top P x'$. + +*Linear terms in $x$:* + +$$ +\tfrac{1}{1-\beta}(D - GW)x + \beta v^\top (A-CW)x + \theta a^\top W x - 2\beta a^\top C^\top P(A-CW)x +$$ + +These come from $(c'-c)/(1-\beta)$, from $v^\top x'$, from the cross term in $w^\top w = (a+Wx)^\top(a+Wx)$, and from the cross term in $x'^\top P x'$. + +The remaining terms are constant (independent of $x$). + +These come from the constant part of $w^\top w$, from $x'^\top Px'$ evaluated at the constant and noise terms, and from $v^\top x'$ and $(c'-c)/(1-\beta)$ evaluated at their constant parts. + +Every term is at most quadratic in $x$, so matching coefficients reproduces the conjectured form $v^\top x + x^\top P x + K$ with updated $v$, $P$, $K$. + +This confirms self-consistency of the affine-quadratic guess. + +To derive the first-order condition, collect all terms in the Bellman RHS that depend on $w = a + Wx$. + +From the penalty $\frac{\theta}{2} w^\top w$, the contribution is $\frac{\theta}{2}(a + Wx)^\top(a + Wx)$. + +From $\beta E[v^\top x']$ with $E[x'] = (A-CW)x - Ca$, the $w$-dependent part is $-\beta v^\top C w = -\beta v^\top C(a + Wx)$. + +From $\beta E[(c'-c)/(1-\beta)]$ with $E[c'-c] = (D-GW)x - Ga$, the $w$-dependent part is $-\frac{\beta}{1-\beta} G w = -\frac{\beta}{1-\beta} G(a + Wx)$. + +From $\beta E[x'^\top P x']$ with $E[x'] = (A-CW)x - Ca$, the $w$-dependent part is $\beta [(A-CW)x - Ca]^\top P [(A-CW)x - Ca]$. + +Differentiating the sum of these four contributions with respect to $w$ and setting the result to zero gives: + +$$ +\theta w + 2\beta C^\top P C w - \beta C^\top v - \frac{\beta}{1-\beta} G^\top - 2\beta C^\top P A x = 0 +$$ + +Rearranging: $$ (\theta I + 2\beta C^\top P C)\, w_t = \frac{\beta}{1-\beta} G^\top + \beta C^\top v + 2\beta C^\top P A x_t $$ -The constant terms (independent of $x_t$) determine $a$; note that this differs from the Hansen $\bar{w}$ because of the $2\beta C^\top P C$ factor on the left-hand side. +The constant terms (independent of $x_t$) on the right determine $a$. The terms proportional to $x_t$ determine $W$. @@ -1280,7 +1341,7 @@ ax.plot(ε_grid, ϕ_base, 'black', lw=2, for w_val, label, color, ls in [ (w_pss[0], r"PSS mistaken $w^*_t$", 'steelblue', '-'), (w_feared[0], r"Feared LRR $\bar{w}_t$", 'seagreen', '--'), - (w_szoke[0], r"Szőke worst-case $\tilde{w}_t$", 'firebrick', '-'), + (w_szoke[0], r"Szőke worst-case $\tilde{W}x_t$ (state-dep.)", 'firebrick', '-'), ]: ax.plot(ε_grid, normal_dist.pdf(ε_grid, -w_val, 1), color=color, lw=2, ls=ls, label=label) @@ -1292,9 +1353,9 @@ plt.tight_layout() plt.show() ``` -Each twister shifts the econometrician's $\mathcal{N}(0,1)$ density by $-w_t$, where the direction and magnitude depend on the current state $x_t$. +Each twister shifts the econometrician's $\mathcal{N}(0,1)$ density by the displayed component, where the direction and magnitude depend on the current state $x_t$. -For the state shown here, all three distortion vectors $w_t$ are negative in their first component, so the twisted densities $\mathcal{N}(-w_t, 1)$ are shifted slightly to the right. +For the state shown here, all three displayed components are negative in their first element, so the twisted densities are shifted slightly to the right. The shifts are small relative to the unit variance because the state $x_t = (0.02, 0.008)$ is close to the unconditional mean. @@ -1414,7 +1475,9 @@ plt.tight_layout() plt.show() ``` -The risk-aversion-only and model-uncertainty-only yield curves both slope upward, generating a term premium. +The risk-aversion-only and model-uncertainty-only yield curves both slope upward, generating a term premium. + +(Note that the model-uncertainty curve uses only the state-dependent component $\tilde{W} x_t$, not the full affine distortion). The two explanations represent *alternative channels* for the same observed term premium, reinforcing the identification challenge explored throughout this lecture. @@ -1460,14 +1523,15 @@ In stage II (assessment): 1. Assess improvements in predicted behaviour of the term structure. 2. Use estimated worst-case dynamics to form distorted forecasts - $\tilde{x}_{t+1} = (A - C\tilde{W})x_t - Ca$ and compare them to those of + $\tilde{E}_t[x_{t+1}] = (A - C\tilde{W})x_t - Ca$ and compare them to those of professional forecasters. 3. Compute the discounted KL divergence $\frac{1}{2}E^w[\sum \beta^t w_t^\top w_t]$ of - each twisted model relative to the econometrician's model and compare them. + each twisted model relative to the econometrician's model and compare them + (the code below uses only the state-dependent component $W x_t$). ```{code-cell} ipython3 def discounted_kl(W, A_w, C, x0, β, T_horizon=500): - """Approximate discounted KL divergence (1/2) E^w [Σ β^t w_t'w_t].""" + """State-dependent-component KL: (1/2) E^w [Σ β^t (Wx_t)'(Wx_t)].""" n_sims = 10_000 rng = np.random.default_rng(2024) X = np.tile(x0, (n_sims, 1)) @@ -1482,7 +1546,7 @@ x0_test = np.array([0.01, 0.005]) kl_szoke = discounted_kl(tilted.W_tilde, tilted.A_tilde, C, x0_test, β) kl_feared = discounted_kl(W_bar, A_bar, C, x0_test, β) -print(f"Szőke worst-case KL: {kl_szoke:.4f}") +print(f"Szőke state-dep. KL: {kl_szoke:.4f}") print(f"Feared LRR KL: {kl_feared:.4f}") status = ('closer to' if kl_szoke < kl_feared else 'farther from') @@ -1490,7 +1554,7 @@ print(f"\nWorst-case model is {status} " f"the econometrician's model.") ``` -The Szőke worst-case model has lower discounted KL divergence from the econometrician's model than the feared long-run risk model, meaning it is statistically harder to distinguish from the baseline. +Using only the state-dependent component $\tilde{W} x_t$, the Szőke worst-case model has lower discounted KL divergence from the econometrician's model than the feared long-run risk model, meaning it is statistically harder to distinguish from the baseline. Yet it still generates the state-dependent uncertainty prices needed to match term-structure dynamics. From 8c49d591e0b382ce94d6183efb81a868e06d3250 Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Sat, 14 Mar 2026 22:48:41 +1100 Subject: [PATCH 15/18] minor fix --- lectures/risk_aversion_or_mistaken_beliefs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lectures/risk_aversion_or_mistaken_beliefs.md b/lectures/risk_aversion_or_mistaken_beliefs.md index c285c6c80..ce97a2258 100644 --- a/lectures/risk_aversion_or_mistaken_beliefs.md +++ b/lectures/risk_aversion_or_mistaken_beliefs.md @@ -1216,7 +1216,7 @@ These come from the penalty $\frac{\theta}{2}(w^\top w - x^\top \Xi x)$ and from *Linear terms in $x$:* $$ -\tfrac{1}{1-\beta}(D - GW)x + \beta v^\top (A-CW)x + \theta a^\top W x - 2\beta a^\top C^\top P(A-CW)x +\tfrac{\beta}{1-\beta}(D - GW)x + \beta v^\top (A-CW)x + \theta a^\top W x - 2\beta a^\top C^\top P(A-CW)x $$ These come from $(c'-c)/(1-\beta)$, from $v^\top x'$, from the cross term in $w^\top w = (a+Wx)^\top(a+Wx)$, and from the cross term in $x'^\top P x'$. From 7a4c491ac974f29e7d772809af513c7ae5b7ecd0 Mon Sep 17 00:00:00 2001 From: Humphrey Yang Date: Sun, 15 Mar 2026 20:59:09 +1100 Subject: [PATCH 16/18] updates --- .../fig1_tom.png | Bin 94884 -> 0 bytes lectures/risk_aversion_or_mistaken_beliefs.md | 769 +++++++++++------- 2 files changed, 453 insertions(+), 316 deletions(-) delete mode 100644 lectures/_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fig1_tom.png diff --git a/lectures/_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fig1_tom.png b/lectures/_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fig1_tom.png deleted file mode 100644 index 2284825390bb9fe4ca3318a371f25e07afcbf463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94884 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 diff --git a/lectures/risk_aversion_or_mistaken_beliefs.md b/lectures/risk_aversion_or_mistaken_beliefs.md index ce97a2258..115804bcb 100644 --- a/lectures/risk_aversion_or_mistaken_beliefs.md +++ b/lectures/risk_aversion_or_mistaken_beliefs.md @@ -65,13 +65,12 @@ import numpy as np import matplotlib.pyplot as plt import pandas as pd from scipy.linalg import solve_discrete_lyapunov -from numpy.linalg import inv, eigvals, norm +from numpy.linalg import eigvals, norm from scipy.stats import norm as normal_dist ``` ## Likelihood ratios and twisted densities -### The baseline model Let $\varepsilon$ denote a vector of risks to be taken and priced. @@ -83,7 +82,7 @@ Under the econometrician's probability model, $\varepsilon$ has a standard multi \phi(\varepsilon) \propto \exp \left(-\frac{1}{2} \varepsilon^\top\varepsilon\right), \qquad \varepsilon \sim \mathcal{N}(0, I) ``` -Define a **likelihood ratio** +To twist this baseline density into another one, we multiply it by a non-negative random variable with unit mean called a **likelihood ratio**: ```{math} :label: eq_lr @@ -91,11 +90,9 @@ Define a **likelihood ratio** m(\varepsilon) = \exp \left(-\lambda^\top\varepsilon - \frac{1}{2} \lambda^\top\lambda\right) \geq 0 ``` -which satisfies $E m(\varepsilon) = 1$ when the mathematical expectation $E$ is taken with respect to the econometrician's model. +The quadratic term $-\frac{1}{2}\lambda^\top\lambda$ in the exponent is precisely what guarantees $E m(\varepsilon) = 1$ when the mathematical expectation $E$ is taken with respect to the econometrician's model. -### The twisted density - -The **twisted density** is +Multiplying the baseline density by this likelihood ratio produces the **twisted density**: ```{math} :label: eq_twisted @@ -103,10 +100,12 @@ The **twisted density** is \hat\phi(\varepsilon) = m(\varepsilon) \phi(\varepsilon) \propto \exp \left(-\frac{1}{2}(\varepsilon + \lambda)^\top(\varepsilon + \lambda)\right) ``` -which is a $\mathcal{N}(-\lambda, I)$ density. +Completing the square in the exponent reveals that this is a $\mathcal{N}(-\lambda, I)$ density. The likelihood ratio has shifted the mean of $\varepsilon$ from $0$ to $-\lambda$ while preserving the covariance. +We will see this idea repeatedly in different contexts. + ````{exercise} :label: lr_exercise_1 @@ -146,7 +145,9 @@ This is the kernel of a $\mathcal{N}(-\lambda, I)$ density. ### Relative entropy -The **relative entropy** (Kullback-Leibler divergence) of the twisted density with respect to the baseline density is +How far apart are the baseline and twisted densities? + +The **relative entropy** (Kullback-Leibler divergence) answers this question with a single number: ```{math} :label: eq_entropy @@ -154,7 +155,7 @@ The **relative entropy** (Kullback-Leibler divergence) of the twisted density wi E\bigl[m(\varepsilon)\log m(\varepsilon)\bigr] = \frac{1}{2} \lambda^\top\lambda ``` -a convenient scalar measure of the statistical distance between the two models. +Because it equals half the squared length of $\lambda$, larger distortion vectors correspond to greater statistical distance between the two models. The vector $\lambda$ is the key object. @@ -202,9 +203,9 @@ The right panel shows the resulting twisted density $\hat\phi(\varepsilon) = \ma ## The econometrician's state-space model -### State dynamics +The econometrician works with a linear Gaussian state-space system at a *monthly* frequency. -The econometrician works with a linear Gaussian state-space system at a *monthly* frequency: +The state $x_t$, an augmented $n \times 1$ vector, evolves according to: ```{math} :label: eq_state @@ -212,30 +213,44 @@ The econometrician works with a linear Gaussian state-space system at a *monthly x_{t+1} = A x_t + C \varepsilon_{t+1} ``` +The econometrician observes $y_{t+1}$, which is a noisy linear function of the state and the same shocks: + ```{math} :label: eq_obs y_{t+1} = D x_t + G \varepsilon_{t+1} ``` +The $k \times 1$ shock vector driving both equations is i.i.d. standard normal: + ```{math} :label: eq_shocks \varepsilon_{t+1} \sim \mathcal{N}(0, I) ``` -Here $x_t$ is an $n \times 1$ state vector and $\varepsilon_{t+1}$ is a $k \times 1$ shock vector. +To accommodate constant terms easily, we assume that the first entry in the state vector is a constant $1$ so that + +$$ +x_t = \begin{bmatrix} 1 \\ \check{x}_t \end{bmatrix}, \qquad +A = \begin{bmatrix} 1 & 0 \\ 0 & \check{A} \end{bmatrix}, \qquad +C = \begin{bmatrix} 0 \\ \check{C} \end{bmatrix} +$$ + +where $\check{A}$ is a stable matrix, $\check{C}$ is square and invertible, and the first component of $x_0$ is $1$. + +With this convention, the number of shocks equals the dimension of the stochastic block: $k = n - 1$. -Throughout, we assume $n = k$ and that the volatility matrix $C$ is square and invertible. +Whenever we back out distortion coefficient matrices from alternative transition matrices, we invert only the lower block $\check{C}$ and compare the lower rows of the augmented transition matrices, not the full augmented matrix $C$. -This assumption is needed whenever we back out distortion coefficient matrices of the form $W = -C^{-1}(\cdot)$ from alternative transition matrices, so that the time-$t$ distortion is $w_t = W x_t$. +Whenever we refer to stability below, we mean stability of the stochastic block $\check{A}$ (or its distorted counterpart). The observation $y_{t+1}$ represents consumption growth, $c_{t+1} - c_t = D x_t + G \varepsilon_{t+1}$. -Separately, the risk-free one-period interest rate is a linear function of the state: +Separately, the risk-free one-period interest rate is a linear function of the augmented state: $$ -r_t = \delta_0 + \bar{r}^\top x_t +r_t = \bar{r}^\top x_t $$ ```{figure} /_static/lecture_specific/risk_aversion_or_mistaken_beliefs/fig2_tom.png @@ -247,13 +262,13 @@ The econometrician's model: estimated state dynamics. ### Risk-neutral rational expectations pricing -Under rational expectations with a risk-neutral representative investor, the stock price $p_t$ (the ex-dividend market value of a claim to the stream $\{d_{t+j}\}_{j=1}^\infty$) satisfies: +The simplest benchmark is a risk-neutral representative investor with rational expectations, for whom the stock price $p_t$ (the ex-dividend market value of a claim to the stream $\{d_{t+j}\}_{j=1}^\infty$) is simply the discounted expected payoff: $$ p_t = \exp(-r_t) E_t(p_{t+1} + d_{t+1}) $$ -The expectations theory of the term structure of interest rates prices a zero-coupon risk-free claim to one dollar at time $t+n$ as: +The same logic applies maturity by maturity to the term structure: a zero-coupon risk-free claim to one dollar at time $t+n$ is priced by iterating the one-period discounting: ```{math} :label: eq_rn_recursion @@ -295,9 +310,9 @@ Covariances of returns with $m_{t+1}^\lambda$ affect mean returns. This is the channel through which risk aversion prices risks. -With this device, *modern asset pricing* takes the form: +With this device, *modern asset pricing* replaces the ordinary conditional expectation with one that is tilted by the likelihood ratio. -For stocks (Lucas-Hansen): +For stocks, the Lucas-Hansen pricing equation discounts the next-period payoff under the distorted measure: ```{math} :label: eq_stock_lr @@ -305,7 +320,7 @@ For stocks (Lucas-Hansen): p_t = \exp(-r_t) E_t\bigl(m_{t+1}^\lambda (p_{t+1} + d_{t+1})\bigr) ``` -For the term structure (Dai-Singleton-Backus-Zin): +For the term structure, Dai-Singleton-Backus-Zin pricing applies the same distortion recursively across maturities: ```{math} :label: eq_ts_lr @@ -313,7 +328,7 @@ For the term structure (Dai-Singleton-Backus-Zin): p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t) E_t\bigl(m_{t+1}^\lambda p_{t+1}(n)\bigr), \qquad p_t(n) = \exp(\bar{A}_n + B_n x_t) ``` -Note that the coefficients $\bar{A}_n$, $B_n$ here differ from the risk-neutral coefficients $\bar{A}_n^{RN}$, $B_n^{RN}$ in {eq}`eq_rn_recursion` because the likelihood ratio modifies the recursion. +The coefficients $\bar{A}_n$, $B_n$ here differ from the risk-neutral coefficients $\bar{A}_n^{RN}$, $B_n^{RN}$ in {eq}`eq_rn_recursion` because the likelihood ratio modifies the recursion. ### Risk-neutral dynamics @@ -339,13 +354,13 @@ The dependence of $\lambda_t = \lambda x_t$ on the state modifies the dynamics r ### Expectation under a twisted distribution -The mathematical expectation of $y_{t+1}$ under the probability distribution twisted by likelihood ratio $m_{t+1}$ is +A useful notational shorthand captures the connection between the two measures: the expected value of $y_{t+1}$ under the twisted distribution can be computed as a likelihood-ratio-weighted average under the original distribution: $$ \tilde{E}_t y_{t+1} = E_t m_{t+1} y_{t+1} $$ -Under the risk-neutral dynamics, the term structure theory becomes: +With this notation, the term structure recursion under risk-neutral dynamics takes a particularly clean form: $$ p_t(1) = \exp(-r_t), \qquad p_t(n+1) = \exp(-r_t) \tilde{E}_t p_{t+1}(n), \qquad p_t(n) = \exp(\tilde{\bar{A}}_n + \tilde{B}_n x_t) @@ -360,28 +375,29 @@ Now let's implement the state-space model and its asset pricing implications. ```{code-cell} ipython3 class LikelihoodRatioModel: """ - Gaussian state-space model with likelihood ratio twists. + Gaussian state-space model with an augmented constant state. - x_{t+1} = A x_t + C ε_{t+1}, ε ~ N(0,I) + x_{t+1} = A x_t + C ε_{t+1}, ε ~ N(0,I), x_t[0] = 1 y_{t+1} = D x_t + G ε_{t+1} - r_t = delta_0 + r_bar'x_t, λ_t = Λ x_t + r_t = r_bar'x_t, λ_t = Λ x_t """ - def __init__(self, A, C, D, G, r_bar, Λ, δ_0=0.0): + def __init__(self, A, C, D, G, r_bar, Λ): self.A = np.atleast_2d(A).astype(float) self.C = np.atleast_2d(C).astype(float) self.D = np.atleast_2d(D).astype(float) self.G = np.atleast_2d(G).astype(float) self.r_bar = np.asarray(r_bar, dtype=float) self.Λ = np.atleast_2d(Λ).astype(float) - self.δ_0 = float(δ_0) self.n = self.A.shape[0] self.k = self.C.shape[1] # risk-neutral dynamics self.A_Q = self.A - self.C @ self.Λ + self.A_core = self.A[1:, 1:] + self.A_Q_core = self.A_Q[1:, 1:] def short_rate(self, x): - return self.δ_0 + self.r_bar @ x + return self.r_bar @ x def risk_prices(self, x): return self.Λ @ x @@ -394,11 +410,10 @@ class LikelihoodRatioModel: """Bond price coefficients: log p_t(n) = A_bar_n + B_n' x_t.""" A_bar = np.zeros(n_max + 1) B = np.zeros((n_max + 1, self.n)) - A_bar[1] = -self.δ_0 B[1] = -self.r_bar CCt = self.C @ self.C.T for nn in range(1, n_max): - A_bar[nn + 1] = A_bar[nn] + 0.5 * B[nn] @ CCt @ B[nn] - self.δ_0 + A_bar[nn + 1] = A_bar[nn] + 0.5 * B[nn] @ CCt @ B[nn] B[nn + 1] = self.A_Q.T @ B[nn] - self.r_bar return A_bar, B @@ -411,22 +426,51 @@ class LikelihoodRatioModel: def simulate(self, x0, T, rng=None): """Simulate under the econometrician's model.""" if rng is None: - rng = np.random.default_rng(42) + rng = np.random.default_rng(0) X = np.zeros((T + 1, self.n)) X[0] = x0 for t in range(T): X[t + 1] = self.A @ X[t] + self.C @ rng.standard_normal(self.k) + X[t + 1, 0] = 1.0 return X def simulate_twisted(self, x0, T, rng=None): """Simulate under the risk-neutral (twisted) model.""" if rng is None: - rng = np.random.default_rng(42) + rng = np.random.default_rng(0) X = np.zeros((T + 1, self.n)) X[0] = x0 for t in range(T): X[t + 1] = self.A_Q @ X[t] + self.C @ rng.standard_normal(self.k) + X[t + 1, 0] = 1.0 return X + + +def augment_state_space(A_core, C_core, D_core, G, r_bar_core, r_const=0.0): + """Add a leading constant state x0_t = 1 to a linear Gaussian model.""" + A_core = np.atleast_2d(A_core).astype(float) + C_core = np.atleast_2d(C_core).astype(float) + D_core = np.atleast_2d(D_core).astype(float) + G = np.atleast_2d(G).astype(float) + r_bar_core = np.asarray(r_bar_core, dtype=float) + + n_core = A_core.shape[0] + k = C_core.shape[1] + + A = np.eye(n_core + 1) + A[1:, 1:] = A_core + + C = np.zeros((n_core + 1, k)) + C[1:, :] = C_core + + D = np.hstack([np.zeros((D_core.shape[0], 1)), D_core]) + r_bar = np.concatenate(([r_const], r_bar_core)) + return A, C, D, G, r_bar + + +def augment_state(x_core): + """Augment a stochastic state vector with a leading constant 1.""" + return np.concatenate(([1.0], np.asarray(x_core, dtype=float))) ``` ### Example: a two-factor model @@ -435,27 +479,35 @@ We set up a two-factor model with a persistent "level" factor and a less persistent "slope" factor, mimicking the U.S. yield curve. ```{code-cell} ipython3 -A = np.array([[0.97, -0.03], - [0.00, 0.90]]) +A_core = np.array([[0.97, -0.03], + [0.00, 0.90]]) + +C_core = np.array([[0.007, 0.000], + [0.000, 0.010]]) -C = np.array([[0.007, 0.000], - [0.000, 0.010]]) +D_core = np.array([[0.5, 0.3]]) # consumption growth loading +G = np.array([[0.004, 0.003]]) # consumption shock loading -D = np.array([[0.5, 0.3]]) # consumption growth loading -G = np.array([[0.004, 0.003]]) # consumption shock loading +r_const = 0.004 # short rate intercept (~4.8% annual) +r_bar_core = np.array([0.06, 0.04]) # short rate loading -δ_0 = 0.004 # short rate intercept (~4.8% annual) -r_bar = np.array([0.06, 0.04]) # short rate loading +# Augment with a leading constant state +A, C, D, G, r_bar = augment_state_space( + A_core, C_core, D_core, G, r_bar_core, r_const=r_const +) -# Risk prices -Λ = np.array([[-3.0, 0.0], +# Risk prices: no constant loading in this benchmark calibration +Λ = np.hstack([ + np.zeros((2, 1)), + np.array([[-3.0, 0.0], [ 0.0, -6.0]]) +]) -model = LikelihoodRatioModel(A, C, D, G, r_bar, Λ, δ_0=δ_0) +model = LikelihoodRatioModel(A, C, D, G, r_bar, Λ) -print(f"Eigenvalues of A: {eigvals(A).round(4)}") -print(f"Eigenvalues of A_Q: {eigvals(model.A_Q).round(4)}") -assert all(np.abs(eigvals(model.A_Q)) < 1), "A_Q must be stable!" +print(f"Eigenvalues of check(A): {eigvals(model.A_core).round(4)}") +print(f"Eigenvalues of check(A_Q): {eigvals(model.A_Q_core).round(4)}") +assert all(np.abs(eigvals(model.A_Q_core)) < 1), "check(A_Q) must be stable!" ``` The yield curve's shape depends on the current state $x_t$. @@ -467,9 +519,9 @@ n_max = 120 maturities = np.arange(1, n_max + 1) states = { - "Normal (upward-sloping)": np.array([-0.005, -0.015]), - "Relatively flat": np.array([ 0.008, -0.005]), - "Inverted": np.array([ 0.020, 0.010]), + "Normal (upward-sloping)": augment_state(np.array([-0.005, -0.015])), + "Relatively flat": augment_state(np.array([ 0.008, -0.005])), + "Inverted": augment_state(np.array([ 0.020, 0.010])), } fig, ax = plt.subplots(figsize=(9, 5)) @@ -509,8 +561,8 @@ The physical measure $P$ governs forecasting and estimation, while the risk-neut ```{code-cell} ipython3 print("A:\n", model.A) print("\nA_Q = A - CΛ:\n", model.A_Q) -print(f"\nEigenvalues of A: {eigvals(model.A).round(4)}") -print(f"Eigenvalues of A_Q: {eigvals(model.A_Q).round(4)}") +print(f"\nEigenvalues of check(A): {eigvals(model.A_core).round(4)}") +print(f"Eigenvalues of check(A_Q): {eigvals(model.A_Q_core).round(4)}") ``` To see the difference in action, we simulate both models from the same initial state using the same shock sequence. @@ -519,7 +571,7 @@ Both simulations draw the same standard normal random vectors, but the transitio ```{code-cell} ipython3 T = 300 -x0 = np.array([0.01, 0.005]) +x0 = augment_state(np.array([0.01, 0.005])) rng1 = np.random.default_rng(123) rng2 = np.random.default_rng(123) # same seed for comparability @@ -527,10 +579,10 @@ X_econ = model.simulate(x0, T, rng=rng1) X_rn = model.simulate_twisted(x0, T, rng=rng2) fig, axes = plt.subplots(2, 1, figsize=(10, 7), sharex=True) -for i, (ax, lab) in enumerate(zip(axes, ["Level factor", "Slope factor"])): - ax.plot(X_econ[:, i], 'steelblue', lw=2, +for idx, (ax, lab) in zip([1, 2], zip(axes, ["Level factor", "Slope factor"])): + ax.plot(X_econ[:, idx], 'steelblue', lw=2, label="Econometrician (P)") - ax.plot(X_rn[:, i], 'firebrick', lw=2, + ax.plot(X_rn[:, idx], 'firebrick', lw=2, alpha=0.8, label="Risk-neutral (Q)") ax.set_ylabel(lab) ax.legend() @@ -540,7 +592,7 @@ plt.tight_layout() plt.show() ``` -Both factors are more persistent under $Q$ than under $P$: the eigenvalues of $A_Q$ are closer to unity than those of $A$. +Both factors are more persistent under $Q$ than under $P$: the eigenvalues of the stochastic block $\check{A}_Q$ are closer to unity than those of $\check{A}$. The risk-neutral paths (red) exhibit wider swings and slower mean reversion. @@ -570,13 +622,13 @@ To distinguish risk aversion from belief distortion, one needs either (the Hansen-Szőke robust control approach), or both (the {cite:t}`szoke2022estimating` approach). ```{code-cell} ipython3 -x_test = np.array([0.01, 0.005]) +x_test = augment_state(np.array([0.01, 0.005])) y_risk_averse = model.yields(x_test, 60) * 1200 # Mistaken belief model model_mistaken = LikelihoodRatioModel( A=model.A_Q, C=C, D=D, G=G, - r_bar=r_bar, Λ=np.zeros_like(Λ), δ_0=δ_0 + r_bar=r_bar, Λ=np.zeros_like(Λ) ) y_mistaken = model_mistaken.yields(x_test, 60) * 1200 @@ -620,38 +672,58 @@ PSS proceed in four steps: 2. Project experts' one-step-ahead forecasts $E_t^*[x_{t+1}]$ on $x_t$ to obtain $E_t^*[x_{t+1}] = A^* x_t$ and interpret $A^*$ as incorporating belief distortions. -3. Back out the mean distortion matrix $W^* = -C^{-1}(A^* - A)$, so that $w_t^* = W^* x_t$ is the state-dependent mean shift applied to the - density of $\varepsilon_{t+1}$. (This requires $C$ to be invertible.) +3. Back out the mean distortion matrix from the stochastic block: + + $$ + W^* = -\check{C}^{-1}(A^*_{2:n,\cdot} - A_{2:n,\cdot}) + $$ + + so that $w_t^* = W^* x_t$ is the state-dependent mean shift applied to the + density of $\varepsilon_{t+1}$. (This requires $\check{C}$ to be invertible.) 4. Reinterpret the $\lambda$ estimated by the rational-expectations econometrician as $\lambda = \lambda^* + W^*$, where $\lambda_t^* = \lambda^* x_t$ is the (smaller) price of risk vector actually charged by the representative agent with distorted beliefs. An econometrician who mistakenly imposes rational expectations estimates risk prices $\lambda_t = \lambda x_t$ that sum two parts: -- *smaller risk prices* $\lambda_t^* = \lambda^* x_t$ actually charged by the erroneous-beliefs - representative agent, and +- *smaller risk prices* $\lambda_t^* = \lambda^* x_t$ actually charged by the + representative agent with mistaken beliefs, and - *conditional mean distortions* $w_t^* = W^* x_t$ of the risks $\varepsilon_{t+1}$ that the twisted-beliefs representative agent's model displays relative to the econometrician's. -### Numerical illustration +We illustrate this using a simple numerical example with the same two-factor structure as above. + +PSS find that experts perceive the level and slope of the yield curve to be *more persistent* than the econometrician's estimates imply. + +Hence we set up the numbers to reflect that finding, with the experts' subjective transition matrix $A^*$ having larger eigenvalues than the econometrician's $A$ + ```{code-cell} ipython3 -# Same A, C as the two-factor model above -A_econ = np.array([[0.97, -0.03], - [0.00, 0.90]]) +A_econ_core = np.array([[0.97, -0.03], + [0.00, 0.90]]) -A_star = np.array([[0.985, -0.025], # experts' subjective transition - [0.000, 0.955]]) +A_star_core = np.array([[0.985, -0.025], # experts' subjective transition + [0.000, 0.955]]) -C_mat = np.array([[0.007, 0.000], - [0.000, 0.010]]) +C_mat_core = np.array([[0.007, 0.000], + [0.000, 0.010]]) + +A_econ, C_mat, _, _, _ = augment_state_space( + A_econ_core, C_mat_core, np.zeros((1, 2)), np.zeros((1, 2)), np.zeros(2) +) +A_star, _, _, _, _ = augment_state_space( + A_star_core, C_mat_core, np.zeros((1, 2)), np.zeros((1, 2)), np.zeros(2) +) -# Belief distortion -W_star = -inv(C_mat) @ (A_star - A_econ) +# Belief distortion recovered from the stochastic block +W_star = -np.linalg.solve(C_mat[1:, :], A_star[1:, :] - A_econ[1:, :]) -Λ_total = np.array([[-3.0, 0.0], - [ 0.0, -6.0]]) +Λ_total = np.hstack([ + np.zeros((2, 1)), + np.array([[-3.0, 0.0], + [ 0.0, -6.0]]) +]) Λ_true = Λ_total - W_star # true risk prices print("Belief distortion W*:\n", W_star.round(3)) @@ -665,9 +737,9 @@ fig, axes = plt.subplots(1, 2, figsize=(12, 5)) for i, (ax, lab) in enumerate(zip(axes, ["Level factor risk price", "Slope factor risk price"])): - x_vals = np.zeros((200, 2)) - x_vals[:, i] = x_grid - x_vals[:, 1 - i] = 0.005 + x_vals = np.ones((200, 3)) + x_vals[:, 1:] = 0.005 + x_vals[:, i + 1] = x_grid λ_total = np.array([Λ_total @ x for x in x_vals])[:, i] λ_true = np.array([Λ_true @ x for x in x_vals])[:, i] @@ -679,7 +751,7 @@ for i, (ax, lab) in enumerate(zip(axes, ax.fill_between(x_grid, λ_true, λ_total, alpha=0.15, color='firebrick', label=r"$w^*_t$ (belief distortion)") ax.axhline(0, color='black', lw=0.5) - ax.set_xlabel(f"State $x_{{{i+1},t}}$") + ax.set_xlabel(f"Factor $\\check{{x}}_{{{i+1},t}}$") ax.set_ylabel(lab) ax.legend() @@ -687,35 +759,21 @@ plt.tight_layout() plt.show() ``` -PSS find that experts perceive the level and slope of the yield curve to be *more persistent* than the econometrician's estimates imply. - Subjective risk prices $\lambda^* x_t$ vary less than the $\lambda x_t$ estimated by the rational-expectations econometrician. However, PSS offer no explanation for *why* beliefs are distorted. Are they mistakes, ignorance of good econometrics, or something else? -The next two sections address this question: first by reviewing why rational expectations may be a poor approximation, and then by developing a robust control theory that *rationalises* belief distortions as optimal responses to model uncertainty. - -## Rationalizing rational expectations - -### The informal justification +## A theory of belief distortions: robust control The standard justification for rational expectations treats it as the outcome of learning from an infinite history: least-squares learning converges to rational expectations. -The argument requires that: - -- agents know correct functional forms, and -- a stochastic approximation argument partitions dynamics into a fast part - (that justifies a law of large numbers) and a slow part (that justifies an ODE). +That argument requires agents to know correct functional forms and relies on a stochastic approximation argument that partitions dynamics into a fast part (justifying a law of large numbers) and a slow part (justifying an ODE). However, long intertemporal dependencies make *rates of convergence slow*. -### Good econometricians - -Good econometricians have limited data and only hunches about functional forms. - -They fear that their fitted models are incorrect. +Good econometricians have limited data and only hunches about functional forms, and they fear that their fitted models are incorrect. An agent who is like a good econometrician: @@ -728,8 +786,6 @@ An agent who is like a good econometrician: Robust control theory formalises this idea by having the agent optimally distort probability assessments toward a worst-case scenario, producing belief distortions that look like the "mistakes" identified by PSS but that arise from a coherent response to model uncertainty rather than from ignorance. -## A theory of belief distortions: robust control - ### Hansen's dubious agent Inspired by robust control theory, consider a dubious investor who: @@ -740,9 +796,7 @@ Inspired by robust control theory, consider a dubious investor who: - wants a valuation that is good for every model in the entropy ball, and - constructs a *lower bound* on values and a *worst-case model* that attains it. -### Valuation under the econometrician's model - -Taking the log consumption process to be linear Gaussian with shocks $\varepsilon_{t+1} \sim \mathcal{N}(0,I)$: +Under the econometrician's linear Gaussian model with shocks $\varepsilon_{t+1} \sim \mathcal{N}(0,I)$: $$ c_{t+1} - c_t = D x_t + G \varepsilon_{t+1}, \qquad x_{t+1} = A x_t + C \varepsilon_{t+1} @@ -764,7 +818,13 @@ This separation is a key feature of the robust control approach: the agent expre ### The sequence problem -The dubious agent solves a *min* problem in which a malevolent "nature" chooses the worst-case probability distortion subject to an entropy budget: +The dubious agent solves a *min* problem in which a malevolent "nature" chooses the worst-case probability distortion subject to an entropy budget. + +Nature's instrument is a sequence of one-step likelihood ratios $m_{t+1}$, each of which distorts the conditional distribution of $\varepsilon_{t+1}$ given information at $t$. + +These increments cumulate into a date-$t$ likelihood ratio $M_t = \prod_{s=0}^{t-1} m_{s+1}$ (with $M_0 = 1$) that converts the econometrician's probability measure into the distorted one. + +The objective, evaluated under the econometrician's measure, weights each period's consumption by $M_t$: ```{math} :label: eq_hansen_seq @@ -772,24 +832,28 @@ The dubious agent solves a *min* problem in which a malevolent "nature" chooses J(x_0, c_0 \mid \eta) := \min_{\{m_{t+1}\}} E \left[\sum_{t=0}^{\infty} \beta^t M_t c_t \middle| x_0, c_0\right] ``` -subject to +The minimisation is subject to three sets of constraints. + +First, the economy evolves according to the econometrician's model: $$ c_{t+1} - c_t = D x_t + G \varepsilon_{t+1}, \qquad x_{t+1} = A x_t + C \varepsilon_{t+1} $$ +Second, nature's total probability distortion, measured by discounted entropy, must remain within a budget $\eta$: + $$ E \left[\sum_{t=0}^{\infty} \beta^t M_t E \left[m_{t+1}\log m_{t+1} \middle| x_t, c_t\right] \middle| x_0, c_0\right] \leq \eta $$ +Third, the incremental likelihood ratios must be valid probability distortions that cumulate multiplicatively: + $$ M_{t+1} = M_t m_{t+1}, \qquad E[m_{t+1} \mid x_t, c_t] = 1, \qquad M_0 = 1 $$ The cumulative likelihood ratio $M_t = \prod_{s=0}^{t-1} m_{s+1}$ converts the original probability measure into the distorted one. -The constraint bounds the *discounted entropy*. - The $M_t$ weighting ensures entropy is measured under the *distorted* measure and the $\beta^t$ discounting means future divergences are penalised less, admitting persistent alternatives. The likelihood ratio process $\{M_t\}_{t=0}^{\infty}$ is a multiplicative **martingale**. @@ -810,19 +874,23 @@ Discounted entropy, by treating future divergences less severely, admits these s ### Entropy and the likelihood ratio -With the log-normal likelihood ratio +When the likelihood ratio takes the log-normal form used throughout this lecture, entropy simplifies dramatically. + +Writing the one-step likelihood ratio in terms of a distortion vector $w_t$: $$ m_{t+1} := \exp \left(-\frac{w_t^\top w_t}{2} - w_t^\top \varepsilon_{t+1}\right) $$ -conditional entropy takes the simple form +and computing $E[m_{t+1}\log m_{t+1} \mid x_t]$, the cross term $w_t^\top \varepsilon_{t+1}$ averages to zero, leaving only: $$ E \left[m_{t+1}\log m_{t+1} \middle| x_t, c_t\right] = \frac{1}{2} w_t^\top w_t $$ -Substituting into {eq}`eq_hansen_seq` and performing a change of measure (replacing $E[\cdot]$ with $E^w[\cdot]$ under the distorted model) yields the reformulated problem: +This means that conditional entropy equals half the squared norm of the distortion vector — it measures how far the distorted mean $-w_t$ is from the baseline mean of zero. + +Substituting this expression into {eq}`eq_hansen_seq` and performing a change of measure (replacing $E[\cdot]$ with $E^w[\cdot]$ under the distorted model) yields a reformulated problem in which nature directly chooses the mean shift $w_t$ rather than a likelihood ratio: ```{math} :label: eq_hansen_reform @@ -830,21 +898,19 @@ Substituting into {eq}`eq_hansen_seq` and performing a change of measure (replac J(x_0, c_0 \mid \eta) := \min_{\{w_t\}} E^w \left[\sum_{t=0}^{\infty} \beta^t c_t \middle| x_0, c_0\right] ``` -subject to +Under the distorted measure, $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$, and we have substituted $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - w_t$ so that the mean shift $-w_t$ appears explicitly in the dynamics: $$ c_{t+1} - c_t = D x_t + G (\tilde\varepsilon_{t+1} - w_t), \qquad x_{t+1} = A x_t + C (\tilde\varepsilon_{t+1} - w_t) $$ +The entropy constraint now takes the transparent form of bounding the cumulative squared distortion: + $$ \frac{1}{2} E^w \left[\sum_{t=0}^{\infty} \beta^t w_t^\top w_t \middle| x_0, c_0\right] \leq \eta $$ -Here $\tilde\varepsilon_{t+1} \sim \mathcal{N}(0, I)$ under $E^w$, and we have substituted $\varepsilon_{t+1} = \tilde\varepsilon_{t+1} - w_t$ (so $E[\varepsilon_{t+1}] = -w_t$ under the distorted measure). - -The shift $-w_t$ *reduces* expected consumption growth by $G w_t$ and shifts the state dynamics by $-C w_t$. - -This is how the worst-case model makes the agent worse off. +The shift $-w_t$ *reduces* expected consumption growth by $G w_t$ and shifts the state dynamics by $-C w_t$, which is how the worst-case model makes the agent worse off. ### Outcome: constant worst-case distortion @@ -858,7 +924,7 @@ The consequence is that the contribution of $w_t$ to risk prices is *state-indep This does *not* help explain countercyclical prices of risk (or prices of model uncertainty), motivating the more refined "tilted" entropy ball in the next section. -We compute $\bar{w}$ using the multiplier formulation (see {ref}`the multiplier preferences section below `), in which the parameter $\theta$ penalises entropy: larger $\theta$ means less concern about misspecification. +We compute $\bar{w}$ using the multiplier formulation developed in {ref}`the preceding section `, in which the parameter $\theta$ penalises entropy: larger $\theta$ means less concern about misspecification. In the multiplier formulation, the agent minimises @@ -902,7 +968,7 @@ The worst-case distortion $\bar{w}$ is constant: it does not depend on the state Larger $\theta$ (less concern about misspecification) yields a smaller distortion. ````{exercise} -:label: lr_exercise_3 +:label: lr_exercise_2 Derive the formula for $\bar{w}$. @@ -913,7 +979,7 @@ Derive the formula for $\bar{w}$. ```` -````{solution} lr_exercise_3 +````{solution} lr_exercise_2 :class: dropdown For part 1, the consumption increment $\Delta c_{s+1} = Dx_s - G\bar{w} + G\tilde\varepsilon_{s+1}$ at date $s$ enters $c_t$ for every $t \geq s+1$, with total discounted weight $\frac{\beta^{s+1}}{1-\beta}$. @@ -954,6 +1020,90 @@ For part 4, as $\theta \to \infty$, $\bar{w} = \frac{1}{\theta}(\cdots) \to 0$, ```` +(mult_pref_section)= +## Multiplier preferences + +The constraint formulation {eq}`eq_hansen_seq` bounds discounted entropy by $\eta$, but an equivalent **multiplier** formulation replaces the constraint with a penalty term weighted by a Lagrange multiplier $\theta$. + +The **multiplier preference** version of the dubious agent's problem is: + +```{math} +:label: eq_mult_seq + +\hat{J}(x_0, c_0 \mid \theta) := \min_{\{m_{t+1}\}} E \left[\sum_{t=0}^{\infty} \beta^t M_t\bigl(c_t + \theta m_{t+1}\log m_{t+1}\bigr) \middle| x_0, c_0\right] +``` + +with $M_{t+1} = M_t m_{t+1}$, $E[m_{t+1} \mid x_t, c_t] = 1$, $M_0 = 1$. + +To derive a Bellman equation, write the value as today's consumption plus the worst-case continuation: + +$$ +\hat{J}(x_t, c_t \mid \theta) = c_t + \min_{m_{t+1}} E \left[m_{t+1}\bigl[\beta \hat{J}(x_{t+1}, c_{t+1}) + \theta\log m_{t+1}\bigr] \middle| x_t, c_t\right] +$$ + +Solving the inner minimisation analytically (by completing the square in the exponential family) yields a closed-form expression: + +$$ += c_t - \theta\log E \left[\exp \left(-\frac{\beta \hat{J}(x_{t+1}, c_{t+1})}{\theta}\right) \middle| x_t, c_t\right] +$$ + +The second line defines the **risk-sensitivity operator** $T_t$: + +$$ +=: c_t + T_t \left[\beta \hat{J}(x_{t+1}, c_{t+1})\right] +$$ + +The minimising likelihood ratio that attains this value is: + +$$ +m_{t+1}^* \propto \exp \left(-\frac{\beta \hat{J}(x_{t+1}, c_{t+1})}{\theta}\right) +$$ + +By Lagrange multiplier theory, for the **corresponding dual pair** $(\tilde\theta, \eta)$, + +$$ +\hat{J}(x_t, c_t \mid \tilde\theta) = J(x_t, c_t \mid \eta) + \tilde\theta \eta +$$ + +Each choice of $\tilde\theta$ in the multiplier problem corresponds to a particular entropy bound $\eta(\tilde\theta)$ in the constraint problem, so the two formulations are equivalent. + +The operator $T_t$ defined above is a **risk-sensitivity operator** that maps the continuation value through an exponential tilt, downweighting good outcomes and upweighting bad ones. + +```{code-cell} ipython3 +def T_operator(V, θ, probs=None): + """Risk-sensitivity operator: T[V] = -θ log E[exp(-V/θ)].""" + if probs is None: + probs = np.ones(len(V)) / len(V) + V_s = -V / θ + max_v = np.max(V_s) + return -θ * (max_v + np.log(np.sum(probs * np.exp(V_s - max_v)))) + +rng = np.random.default_rng(0) +V_samples = rng.normal(loc=5.0, scale=1.0, size=10_000) +E_V = np.mean(V_samples) + +θ_grid = np.logspace(-1, 3, 50) +T_vals = [T_operator(V_samples, θ) for θ in θ_grid] + +fig, ax = plt.subplots(figsize=(8, 5)) +ax.semilogx(θ_grid, T_vals, 'firebrick', lw=2, label=r"$T_\theta[V]$") +ax.axhline(E_V, color='steelblue', lw=1.5, + ls='--', label=r"$E[V]$ (risk neutral)") +ax.set_xlabel(r"Robustness parameter $\theta$") +ax.set_ylabel("Value") +ax.legend() +ax.annotate(r"$\theta \to \infty$: risk neutral", + xy=(500, E_V), fontsize=11, color='steelblue', + xytext=(50, E_V - 0.8), + arrowprops=dict(arrowstyle='->', color='steelblue')) +plt.tight_layout() +plt.show() +``` + +As $\theta \to \infty$, the risk-sensitivity operator converges to the ordinary expectation $E[V]$, and the agent becomes risk neutral. + +As $\theta$ shrinks, the operator places more weight on bad outcomes, reflecting greater concern about model misspecification. + ## Tilting the entropy ball ### Hansen and Szőke's more refined dubious agent @@ -970,21 +1120,21 @@ The inclusion of those alternative parametric models *tilts* the entropy ball, w "Tilting" means replacing the constant entropy bound $\eta$ with a state-dependent bound $\xi(x_t)$ that is larger in states where the feared parametric alternative deviates more from the baseline. -### Concern about other parametric models +### The feared parametric model -The investor wants to include particular alternative models with +The investor wants the entropy ball to be large enough to include specific alternative models whose conditional entropy at each date is: $$ E_t \left[\bar{m}_{t+1}\log\bar{m}_{t+1}\right] = \frac{1}{2} \bar{w}_t^\top \bar{w}_t =: \frac{1}{2}\xi(x_t) $$ -and discounted entropy +The function $\xi(x_t)$ measures how far the feared model's conditional distribution deviates from the baseline at state $x_t$, and the total discounted divergence of the feared model is: $$ \frac{1}{2} E^{\bar{W}} \left[\sum_{t=0}^{\infty} \beta^t \xi(x_t) \middle| x_0, c_0\right] $$ -This is accomplished by replacing the earlier entropy constraint with +To ensure this feared model lies inside the entropy ball, we replace the earlier constant bound $\eta$ with a state-dependent budget: ```{math} :label: eq_tilted_constraint @@ -996,9 +1146,7 @@ The time-$t$ contributions to the right-hand side of {eq}`eq_tilted_constraint` This sets the stage for *state-dependent* mean distortions in the worst-case model. -### Concern about bigger long-run risk - -Inspired by {cite:t}`Bansal_Yaron_2004`, an agent fears that the true state dynamics are more persistent than the econometrician's model implies, expressed by +Inspired by {cite:t}`Bansal_Yaron_2004`, a concrete form of this concern is that the true state dynamics are more persistent than the econometrician's model implies, expressed by $$ x_{t+1} = \bar{A} x_t + C \tilde\varepsilon_{t+1} @@ -1007,10 +1155,10 @@ $$ Since $\bar{A} = A - C\bar{W}$, this feared model is equivalent to shifting the mean of $\varepsilon_{t+1}$ by $-\bar{W}x_t$, giving $\bar{w}_t = \bar{W} x_t$ with $$ -\bar{W} = -C^{-1}(\bar{A} - A) +\bar{W} = -\check{C}^{-1}(\bar{A}_{2:n,\cdot} - A_{2:n,\cdot}) $$ -(again using the assumption that $C$ is square and invertible), which implies a *quadratic* $\xi$ function: +(again using the assumption that $\check{C}$ is square and invertible), which implies a *quadratic* $\xi$ function: ```{math} :label: eq_xi @@ -1024,7 +1172,9 @@ Tilted discounted entropy balls. Including particular parametric alternatives wi ### The Szőke agent's sequence problem -Attaching a Lagrange multiplier $\tilde\theta \geq 0$ to the tilted entropy constraint {eq}`eq_tilted_constraint` yields the following linear-quadratic problem: +As in the multiplier preferences section, we convert the constraint problem into an unconstrained one by attaching a Lagrange multiplier $\tilde\theta \geq 0$ to the tilted entropy constraint {eq}`eq_tilted_constraint`. + +The penalty $\tilde\theta(w_t^\top w_t - x_t^\top \Xi x_t)/2$ now has two terms: the first penalises the agent's distortion, while the second rewards distortions in states where the feared model deviates more, creating a state-dependent entropy budget: ```{math} :label: eq_szoke_seq @@ -1032,63 +1182,74 @@ Attaching a Lagrange multiplier $\tilde\theta \geq 0$ to the tilted entropy cons J(x_0, c_0 \mid \Xi) := \max_{\tilde\theta \geq 0} \min_{\{w_t\}} E^w \left[\sum_{t=0}^{\infty} \beta^t c_t + \tilde\theta \frac{1}{2}\sum_{t=0}^{\infty} \beta^t\bigl(w_t^\top w_t - x_t^\top \Xi x_t\bigr) \middle| x_0, c_0\right] ``` -subject to +The dynamics under the distorted measure remain linear Gaussian: $$ c_{t+1} - c_t = D x_t + G (\tilde\varepsilon_{t+1} - w_t), \qquad x_{t+1} = A x_t + C (\tilde\varepsilon_{t+1} - w_t) $$ -The worst-case distortion is now **affine** in the state: +Because the state vector now includes a leading constant $1$, we can write the worst-case distortion as a *linear* function of the augmented state: $$ -\tilde{w}_t = a + \tilde{W} x_t +\tilde{w}_t = \tilde{W} x_t $$ -where $a$ is a constant vector determined by the linear terms in the value function. - -When $P = 0$ (no tilting), the constant $a$ reduces to the Hansen $\bar{w}$ from the untilted problem. +The first column of $\tilde{W}$ stores the constant part that would otherwise be written separately as $a$, while the remaining columns load on the stochastic factors $\check{x}_t$. -However, when $P \neq 0$ the two differ because the quadratic value function contributes an additional $2\beta C^\top P C$ term to the left-hand side of the first-order condition for the constant part. +When $\Xi = 0$ (no tilting), that first column reduces to Hansen's constant $\bar{w}$ from the untilted problem, while the remaining columns are zero. -The state-dependent component $\tilde{W} x_t$ is the new contribution of the tilted entropy ball, and is what generates countercyclical uncertainty prices. +When $\Xi \neq 0$, the nonconstant columns of $\tilde{W}$ are the new contribution of the tilted entropy ball, and are what generate countercyclical uncertainty prices. Writing $\tilde{A} = A - C \tilde{W}$ and $\tilde{D} = D - G \tilde{W}$, the worst-case dynamics are $$ -x_{t+1} = \tilde{A} x_t - Ca + C\tilde\varepsilon_{t+1}, \qquad c_{t+1} - c_t = \tilde{D} x_t - Ga + G\tilde\varepsilon_{t+1} +x_{t+1} = \tilde{A} x_t + C\tilde\varepsilon_{t+1}, \qquad c_{t+1} - c_t = \tilde{D} x_t + G\tilde\varepsilon_{t+1} $$ ### Implementation: tilted entropy ball -For the inner minimisation over $\{w_t\}$ in {eq}`eq_szoke_seq`, the value function is **affine-quadratic** in the state because $c_t$ enters linearly: +For the inner minimisation over $\{w_t\}$ in {eq}`eq_szoke_seq`, the value function is **affine-quadratic** in the augmented state because $c_t$ enters linearly: $$ J(x, c) = \frac{c}{1-\beta} + v^\top x + x^\top P x + K $$ -The first-order condition for $w_t$ decomposes into a constant part (determining $a$) and a state-dependent part (determining $\tilde{W}$). +Writing $e_1 = (1, 0, \ldots, 0)^\top$ for the selector of the constant state and $\tilde\theta$ as $\theta$ in the code, the first-order condition for $\tilde{W}$ balances the entropy penalty against the marginal effects on the value function: + +$$ +(\theta I + 2\beta C^\top P C) \tilde{W} += 2\beta C^\top P A ++ \left(\frac{\beta}{1-\beta} G^\top + \beta C^\top v\right) e_1^\top +$$ -The state-dependent component satisfies (writing $\tilde\theta$ as $\theta$ in the code): +The linear coefficient $v$ captures the discounted cumulative effect of a unit change in $x_t$ on future consumption, and satisfies: $$ -(\theta I + 2\beta C^\top P C) \tilde{W} = 2\beta C^\top P A +\bigl(I - \beta (A - C\tilde{W})^\top\bigr) v += \frac{\beta}{1-\beta} \left(D^\top - \tilde{W}^\top G^\top\right) $$ -Matching quadratic terms in $x$ gives the $P$ update: +Finally, matching quadratic terms in $x$ yields the matrix Riccati equation for $P$, which encodes the curvature of the value function: $$ P = -\tfrac{\theta}{2} \Xi + \tfrac{\theta}{2} \tilde{W}^\top \tilde{W} + \beta (A - C\tilde{W})^\top P (A - C\tilde{W}) $$ -The code below iterates on the $(P, \tilde{W})$ system to convergence, solving for the state-dependent component only; the constant $a$ requires separate linear-term equations. +The code below iterates on the coupled $(P, v, \tilde{W})$ system to convergence. + +For later comparisons, we also keep a version of $\tilde{W}$ with its first column set to zero, denoted informally by $\tilde{W}^{sd}$, which isolates the factor-dependent component. ```{code-cell} ipython3 class TiltedEntropyModel: """ Hansen-Szőke tilted entropy ball model. - Given (A, C, D, G, β, θ, Ξ), computes the state-dependent - component W_tilde of the worst-case distortion w_t = a + W_tilde x_t. + Given (A, C, D, G, β, θ, Ξ), computes the full worst-case + distortion matrix W_tilde in w_t = W_tilde @ x_t. + + The first column of W_tilde is the constant component induced by + the augmented state x_t = [1, check_x_t']'. W_tilde_state zeros + that column out and keeps only factor-dependent loadings. """ def __init__(self, A, C, D, G, β, θ, Ξ): @@ -1100,42 +1261,68 @@ class TiltedEntropyModel: self.Ξ = np.atleast_2d(Ξ).astype(float) self.n = self.A.shape[0] - self.W_tilde = self._solve_worst_case() + self.W_tilde, self.v = self._solve_worst_case() self.A_tilde = self.A - self.C @ self.W_tilde self.D_tilde = self.D - self.G @ self.W_tilde + self.W_tilde_state = self.W_tilde.copy() + self.W_tilde_state[:, 0] = 0.0 + self.A_tilde_state = self.A - self.C @ self.W_tilde_state + self.D_tilde_state = self.D - self.G @ self.W_tilde_state def _solve_worst_case(self): - """Iterate on (P, W) system to find worst-case W_tilde.""" + """Iterate on the coupled (P, v, W) system.""" n, k = self.n, self.C.shape[1] β, θ = self.β, self.θ P = np.zeros((n, n)) + v = np.zeros(n) + e1 = np.zeros(n) + e1[0] = 1.0 converged = False - for _ in range(2000): + for _ in range(10000): M = θ * np.eye(k) + 2 * β * self.C.T @ P @ self.C - W = np.linalg.solve(M, 2 * β * self.C.T @ P @ self.A) + b = β / (1 - β) * self.G.T.flatten() + β * self.C.T @ v + rhs = 2 * β * self.C.T @ P @ self.A + np.outer(b, e1) + W = np.linalg.solve(M, rhs) A_w = self.A - self.C @ W P_new = (-(θ / 2) * self.Ξ + (θ / 2) * W.T @ W + β * A_w.T @ P @ A_w) P_new = 0.5 * (P_new + P_new.T) - if np.max(np.abs(P_new - P)) < 1e-12: + D_flat = self.D.T.flatten() + G_flat = self.G.T.flatten() + rhs_v = β * (D_flat - W.T @ G_flat) / (1 - β) + v_new = np.linalg.solve(np.eye(n) - β * A_w.T, rhs_v) + if (np.max(np.abs(P_new - P)) < 1e-10 + and np.max(np.abs(v_new - v)) < 1e-10): P = P_new + v = v_new converged = True break P = P_new + v = v_new if not converged: - print("Warning: (P, W) iteration did not converge") + print("Warning: (P, v, W) iteration did not converge") self._P_quad = P - return W + self._v_lin = v + return W, v - def state_dependent_distortion(self, x): - """State-dependent component W_tilde @ x of the worst-case distortion.""" + def distortion(self, x): + """Full worst-case distortion W_tilde @ x.""" return self.W_tilde @ x + def state_dependent_distortion(self, x): + """Factor-dependent component with the constant column removed.""" + return self.W_tilde_state @ x + + def entropy(self, x): + """Full conditional entropy: (1/2)(W_tilde x)'(W_tilde x).""" + w = self.distortion(x) + return 0.5 * w @ w + def state_dependent_entropy(self, x): - """Entropy of the state-dependent component: (1/2)(W_tilde x)'(W_tilde x).""" + """Entropy of the factor-dependent component only.""" w = self.state_dependent_distortion(x) return 0.5 * w @ w @@ -1145,10 +1332,14 @@ class TiltedEntropyModel: ```{code-cell} ipython3 # Feared parametric model -A_bar = np.array([[0.995, -0.03], - [0.000, 0.96]]) +A_bar_core = np.array([[0.995, -0.03], + [0.000, 0.96]]) -W_bar = -inv(C) @ (A_bar - A) +A_bar, _, _, _, _ = augment_state_space( + A_bar_core, C_core, np.zeros((1, 2)), np.zeros((1, 2)), np.zeros(2) +) + +W_bar = -np.linalg.solve(C[1:, :], A_bar[1:, :] - A[1:, :]) Ξ = W_bar.T @ W_bar print("Feared transition A_bar:\n", A_bar) @@ -1158,34 +1349,47 @@ print("\nTilting matrix Ξ:\n", Ξ.round(1)) In {eq}`eq_szoke_seq` the multiplier $\tilde\theta$ is determined by the outer maximisation. -Here we fix $\theta$ at a representative value and solve only the inner minimisation, illustrating the multiplier formulation described in {ref}`the multiplier preferences section below `. +Here we fix $\theta$ at a representative value and solve only the inner minimisation, illustrating the multiplier formulation described in {ref}`the multiplier preferences section `. ```{code-cell} ipython3 θ_tilt = 3.0 tilted = TiltedEntropyModel(A, C, D, G, β, θ_tilt, Ξ) print("Worst-case distortion W_tilde:\n", tilted.W_tilde.round(4)) -print("\nWorst-case transition A_tilde:\n", tilted.A_tilde.round(4)) -print(f"\nEigenvalues of A: {eigvals(A).round(4)}") -print(f"Eigenvalues of A_tilde: {eigvals(tilted.A_tilde).round(4)}") +print("\nConstant column of W_tilde:\n", tilted.W_tilde[:, 0].round(4)) +W_fd = tilted.W_tilde[:, 1:].round(4) +print("\nFactor-dependent columns of W_tilde:\n", W_fd) +print("\nWorst-case transition A_tilde:\n", + tilted.A_tilde.round(4)) +eig_A = eigvals(A[1:, 1:]).round(4) +eig_At = eigvals(tilted.A_tilde[1:, 1:]).round(4) +print(f"\nEigenvalues of check(A): {eig_A}") +print(f"Eigenvalues of check(A_tilde): {eig_At}") ``` ````{exercise} -:label: lr_exercise_4 +:label: lr_exercise_3 -Derive the first-order condition for the state-dependent component of the tilted entropy problem. +Derive the first-order condition for the tilted entropy problem under the augmented-state convention. -1. Start from {eq}`eq_szoke_seq` and write $w_t = a + W x_t$; -argue that the value function is affine-quadratic, $J(x,c) = c/(1-\beta) + v^\top x + x^\top P x + K$, and that the first-order condition separates into a constant part (determining $a$) and a state-dependent part (determining $W$). -2. Show that the state-dependent first-order condition gives $\theta W = 2\beta C^\top P (A - CW)$, which can be rearranged to the system solved in the code. +1. Start from {eq}`eq_szoke_seq` and write $w_t = W x_t$, where the first column of $W$ captures the constant part of the distortion. +2. Show that the first-order condition gives + + $$ + (\theta I + 2\beta C^\top P C) W + = 2\beta C^\top P A + + \left(\frac{\beta}{1-\beta} G^\top + \beta C^\top v\right)e_1^\top + $$ + + and derive the associated linear equation for $v$. 3. Derive the $P$ update by substituting the optimal $W$ back into the Bellman equation and matching quadratic terms in $x$. ```` -````{solution} lr_exercise_4 +````{solution} lr_exercise_3 :class: dropdown -For part 1, write $w_t = a + Wx_t$. +For part 1, write $w_t = W x_t$ with $x_t = (1, \check{x}_t^\top)^\top$. To confirm the affine-quadratic form, substitute this guess into the Bellman equation for the inner minimisation of {eq}`eq_szoke_seq`: @@ -1201,7 +1405,7 @@ Under this guess, $J(x',c') = c'/(1-\beta) + v^\top x' + x'^\top P x' + K$. Write $c'/(1-\beta) = c/(1-\beta) + (c'-c)/(1-\beta)$, so the $c/(1-\beta)$ term passes through both sides and can be cancelled. -Substituting $w = a + Wx$, the next-period state is $x' = (A - CW)x - Ca + C\tilde\varepsilon$, and the consumption increment is $(c'-c) = (D - GW)x - Ga + G\tilde\varepsilon$. +Substituting $w = Wx$, the next-period state is $x' = (A - CW)x + C\tilde\varepsilon$, and the consumption increment is $(c'-c) = (D - GW)x + G\tilde\varepsilon$. Taking $E[\cdot]$ (with $E[\tilde\varepsilon] = 0$, $E[\tilde\varepsilon\tilde\varepsilon^\top] = I$), the right-hand side after cancelling $c/(1-\beta)$ has the following structure. @@ -1216,54 +1420,45 @@ These come from the penalty $\frac{\theta}{2}(w^\top w - x^\top \Xi x)$ and from *Linear terms in $x$:* $$ -\tfrac{\beta}{1-\beta}(D - GW)x + \beta v^\top (A-CW)x + \theta a^\top W x - 2\beta a^\top C^\top P(A-CW)x +\tfrac{\beta}{1-\beta}(D - GW)x + \beta v^\top (A-CW)x $$ -These come from $(c'-c)/(1-\beta)$, from $v^\top x'$, from the cross term in $w^\top w = (a+Wx)^\top(a+Wx)$, and from the cross term in $x'^\top P x'$. +These come from $(c'-c)/(1-\beta)$ and from $v^\top x'$. The remaining terms are constant (independent of $x$). -These come from the constant part of $w^\top w$, from $x'^\top Px'$ evaluated at the constant and noise terms, and from $v^\top x'$ and $(c'-c)/(1-\beta)$ evaluated at their constant parts. +These come from the noise terms and from $K$. Every term is at most quadratic in $x$, so matching coefficients reproduces the conjectured form $v^\top x + x^\top P x + K$ with updated $v$, $P$, $K$. This confirms self-consistency of the affine-quadratic guess. -To derive the first-order condition, collect all terms in the Bellman RHS that depend on $w = a + Wx$. +To derive the first-order condition, collect all terms in the Bellman RHS that depend on $w = Wx$. -From the penalty $\frac{\theta}{2} w^\top w$, the contribution is $\frac{\theta}{2}(a + Wx)^\top(a + Wx)$. +From the penalty $\frac{\theta}{2} w^\top w$, the contribution is $\frac{\theta}{2}x^\top W^\top W x$. -From $\beta E[v^\top x']$ with $E[x'] = (A-CW)x - Ca$, the $w$-dependent part is $-\beta v^\top C w = -\beta v^\top C(a + Wx)$. +From $\beta E[v^\top x']$ with $E[x'] = (A-CW)x$, the $w$-dependent part is $-\beta v^\top C W x$. -From $\beta E[(c'-c)/(1-\beta)]$ with $E[c'-c] = (D-GW)x - Ga$, the $w$-dependent part is $-\frac{\beta}{1-\beta} G w = -\frac{\beta}{1-\beta} G(a + Wx)$. +From $\beta E[(c'-c)/(1-\beta)]$ with $E[c'-c] = (D-GW)x$, the $w$-dependent part is $-\frac{\beta}{1-\beta} G W x$. -From $\beta E[x'^\top P x']$ with $E[x'] = (A-CW)x - Ca$, the $w$-dependent part is $\beta [(A-CW)x - Ca]^\top P [(A-CW)x - Ca]$. +From $\beta E[x'^\top P x']$ with $E[x'] = (A-CW)x$, the $w$-dependent part is $\beta x^\top (A-CW)^\top P (A-CW) x$. -Differentiating the sum of these four contributions with respect to $w$ and setting the result to zero gives: +Differentiating with respect to $W$ and using $e_1^\top x_t = 1$ gives: $$ -\theta w + 2\beta C^\top P C w - \beta C^\top v - \frac{\beta}{1-\beta} G^\top - 2\beta C^\top P A x = 0 +(\theta I + 2\beta C^\top P C) W += 2\beta C^\top P A ++ \left(\frac{\beta}{1-\beta} G^\top + \beta C^\top v\right)e_1^\top $$ -Rearranging: +This shows directly how the first column of $W$ carries the constant part of the distortion. $$ -(\theta I + 2\beta C^\top P C)\, w_t = \frac{\beta}{1-\beta} G^\top + \beta C^\top v + 2\beta C^\top P A x_t +\bigl(I - \beta (A - CW)^\top\bigr) v += \frac{\beta}{1-\beta} \left(D^\top - W^\top G^\top\right) $$ -The constant terms (independent of $x_t$) on the right determine $a$. - -The terms proportional to $x_t$ determine $W$. - -For part 2, the state-dependent first-order condition from the quadratic terms is: - -$$ -\frac{\partial}{\partial W}\bigl[\tfrac{\theta}{2}x_t^\top W^\top W x_t + \beta x_t^\top(A-CW)^\top P(A-CW)x_t\bigr] = 0 -$$ - -This gives $\theta W - 2\beta C^\top P(A-CW) = 0$. - -Rearranging: $(\theta I + 2\beta C^\top PC) W = 2\beta C^\top PA$. +This is the linear equation used in the code to update $v$ once $W$ is known. For part 3, substitute the optimal $W$ back into the Bellman equation. @@ -1279,39 +1474,55 @@ This is the matrix Riccati equation that the code iterates to convergence. ### State-dependent entropy: the key innovation +The following figure compares the conditional entropy of the worst-case distortion across three models as a function of the level factor $\check{x}_{1,t}$, revealing how the tilted entropy ball produces the state dependence that Hansen's original formulation lacks. + ```{code-cell} ipython3 x_grid = np.linspace(-0.03, 0.04, 200) -entropy_tilted = np.array([tilted.state_dependent_entropy(np.array([x, 0.005])) - for x in x_grid]) -ξ_vals = np.array([tilted.xi_function(np.array([x, 0.005])) - for x in x_grid]) +entropy_tilted = np.array([ + tilted.state_dependent_entropy( + augment_state(np.array([x, 0.005]))) + for x in x_grid]) +ξ_vals = np.array([ + tilted.xi_function( + augment_state(np.array([x, 0.005]))) + for x in x_grid]) # Calibrate Hansen's θ so constant entropy matches E[ξ(x_t)/2] -Σ_stat = solve_discrete_lyapunov(A, C @ C.T) -avg_ξ_half = 0.5 * np.trace(Ξ @ Σ_stat) +Σ_check = solve_discrete_lyapunov(A[1:, 1:], C[1:, :] @ C[1:, :].T) +E_xx = np.block([ + [np.ones((1, 1)), np.zeros((1, 2))], + [np.zeros((2, 1)), Σ_check] +]) +avg_ξ_half = 0.5 * np.trace(Ξ @ E_xx) w_unit = hansen_worst_case(A, C, D, G, β, 1.0) θ_hansen = norm(w_unit) / np.sqrt(2 * avg_ξ_half) w_hansen = w_unit / θ_hansen hansen_ent = 0.5 * w_hansen @ w_hansen fig, ax = plt.subplots(figsize=(9, 5)) -ax.axhline(hansen_ent, color='steelblue', lw=2, ls='--', - label=rf"Hansen: constant $\frac{{1}}{{2}}\bar{{w}}^\top\bar{{w}} = {hansen_ent:.4f}$") -ax.plot(x_grid, entropy_tilted, 'firebrick', lw=2, - label=r"Szőke (state-dep.): $\frac{1}{2}(\tilde{W}x_t)^\top(\tilde{W}x_t)$") +hansen_lab = (rf"Hansen: constant " + rf"$\frac{{1}}{{2}}\bar{{w}}^\top" + rf"\bar{{w}} = {hansen_ent:.4f}$") +ax.axhline(hansen_ent, color='steelblue', + lw=2, ls='--', label=hansen_lab) +szoke_lab = (r"Sz\H{o}ke (factor-dep.): " + r"$\frac{1}{2}(\tilde{W}^{sd}x_t)" + r"^\top(\tilde{W}^{sd}x_t)$") +ax.plot(x_grid, entropy_tilted, 'firebrick', + lw=2, label=szoke_lab) ax.plot(x_grid, 0.5 * ξ_vals, 'seagreen', lw=2, ls=':', label=r"Feared model: $\frac{1}{2}\xi(x_t)$") -ax.set_xlabel(r"Level factor $x_{1,t}$") +ax.set_xlabel(r"Level factor $\check{x}_{1,t}$") ax.set_ylabel("Conditional entropy") ax.legend() plt.tight_layout() plt.show() ``` -The key innovation of the tilted entropy ball is visible: the state-dependent component $\tilde{W} x_t$ of the worst-case distortion grows with $|x_t|$, producing *countercyclical uncertainty prices*. +The key innovation of the tilted entropy ball is visible: the factor-dependent component $\tilde{W}^{sd} x_t$ of the worst-case distortion grows with $|\check{x}_t|$, producing *countercyclical uncertainty prices*. -By contrast, Hansen's constant distortion $\bar{w}$ has entropy $\frac{1}{2}\bar{w}^\top\bar{w}$ that does not vary with $x_t$ (shown as a horizontal line). +By contrast, Hansen's constant distortion $\bar{w}$ has entropy $\frac{1}{2}\bar{w}^\top\bar{w}$ that does not vary with the state (shown as a horizontal line). The Szőke parabola lies inside the feared model's entropy budget $\frac{1}{2}\xi(x_t)$ along this slice, consistent with the tilted entropy constraint {eq}`eq_tilted_constraint`. @@ -1326,7 +1537,7 @@ To summarize, three distinct probability twisters play roles in this analysis: | $\tilde{W} x_t$ | Szőke's worst-case model | State-dependent component of worst-case distortion | ```{code-cell} ipython3 -x_state = np.array([0.02, 0.008]) +x_state = augment_state(np.array([0.02, 0.008])) w_pss = W_star @ x_state w_feared = W_bar @ x_state w_szoke = tilted.state_dependent_distortion(x_state) @@ -1341,7 +1552,9 @@ ax.plot(ε_grid, ϕ_base, 'black', lw=2, for w_val, label, color, ls in [ (w_pss[0], r"PSS mistaken $w^*_t$", 'steelblue', '-'), (w_feared[0], r"Feared LRR $\bar{w}_t$", 'seagreen', '--'), - (w_szoke[0], r"Szőke worst-case $\tilde{W}x_t$ (state-dep.)", 'firebrick', '-'), + (w_szoke[0], + r"Sz\H{o}ke worst-case $\tilde{W}^{sd}x_t$" + r" (factor-dep.)", 'firebrick', '-'), ]: ax.plot(ε_grid, normal_dist.pdf(ε_grid, -w_val, 1), color=color, lw=2, ls=ls, label=label) @@ -1357,10 +1570,12 @@ Each twister shifts the econometrician's $\mathcal{N}(0,1)$ density by the displ For the state shown here, all three displayed components are negative in their first element, so the twisted densities are shifted slightly to the right. -The shifts are small relative to the unit variance because the state $x_t = (0.02, 0.008)$ is close to the unconditional mean. +The shifts are small relative to the unit variance because the stochastic state $\check{x}_t = (0.02, 0.008)$ is close to the unconditional mean. ## Empirical challenges and model performances +Before comparing models, it helps to see the empirical regularities that any successful theory must explain. + ```{code-cell} ipython3 --- tags: [hide-input] @@ -1443,7 +1658,7 @@ The following table summarises how various models perform: Szőke's framework delivers: -1. A theory of *state-dependent belief distortions* with state-dependent component $\tilde{W} x_t$. +1. A theory of *state-dependent belief distortions* with factor-dependent component $\tilde{W}^{sd} x_t$. 2. A theory about the *question that professional forecasters answer*: they respond with their worst-case model because they hear "tell me forecasts that rationalise your (max-min) decisions." @@ -1452,11 +1667,11 @@ Szőke's framework delivers: ```{code-cell} ipython3 model_rn = LikelihoodRatioModel( - A, C, D, G, r_bar, Λ=np.zeros((2, 2)), δ_0=δ_0) + A, C, D, G, r_bar, Λ=np.zeros_like(Λ)) model_uncert = LikelihoodRatioModel( - A, C, D, G, r_bar, Λ=tilted.W_tilde, δ_0=δ_0) + A, C, D, G, r_bar, Λ=tilted.W_tilde_state) -x_test = np.array([0.01, -0.03]) +x_test = augment_state(np.array([0.01, -0.03])) n_max = 120 mats = np.arange(1, n_max + 1) @@ -1467,7 +1682,7 @@ ax.plot(mats, model.yields(x_test, n_max) * 1200, 'steelblue', lw=2, label=r'Risk aversion ($\lambda x_t$)') ax.plot(mats, model_uncert.yields(x_test, n_max) * 1200, 'firebrick', lw=2, ls='--', - label=r'Model uncertainty ($\tilde{W} x_t$)') + label=r'Model uncertainty ($\tilde{W}^{sd} x_t$)') ax.set_xlabel("Maturity (months)") ax.set_ylabel("Yield (annualised %)") ax.legend() @@ -1477,7 +1692,7 @@ plt.show() The risk-aversion-only and model-uncertainty-only yield curves both slope upward, generating a term premium. -(Note that the model-uncertainty curve uses only the state-dependent component $\tilde{W} x_t$, not the full affine distortion). +(Note that the model-uncertainty curve uses only the factor-dependent component $\tilde{W}^{sd} x_t$, not the full worst-case distortion.) The two explanations represent *alternative channels* for the same observed term premium, reinforcing the identification challenge explored throughout this lecture. @@ -1497,15 +1712,15 @@ As {cite:t}`szoke2022estimating` puts it: ### Szőke's empirical strategy -In the Szőke framework, the rational-expectations econometrician's single likelihood ratio $m_{t+1}^\lambda$ is decomposed as $\lambda_t = \tilde{w}_t + \tilde{\lambda}_t$, paralleling the PSS decomposition $\lambda = \lambda^* + W^*$. +In the Szőke framework, the rational-expectations econometrician's risk price vector $\lambda_t$ is decomposed as $\lambda_t = \tilde{w}_t + \tilde{\lambda}_t$, paralleling the PSS decomposition $\lambda = \lambda^* + W^*$. -The combined likelihood ratio is +The combined likelihood ratio retains the same log-normal form as before, but now the total distortion vector $\lambda_t$ has an explicit decomposition into belief distortion and risk price components: $$ m_{t+1}^\lambda = \exp \left(-\lambda_t^\top\varepsilon_{t+1} - \frac{1}{2}\lambda_t^\top\lambda_t\right), \qquad \lambda_t = \tilde{w}_t + \tilde\lambda_t $$ -where $\tilde{w}_t = a + \tilde{W} x_t$ is the worst-case belief distortion (with state-dependent component $\tilde{W} x_t$) and $\tilde\lambda_t = \tilde\lambda x_t$ is the residual risk price. +Here $\tilde{w}_t = \tilde{W} x_t$ is the worst-case belief distortion, whose factor-dependent component is carried by the non-first columns of $\tilde{W}$, and $\tilde\lambda_t = \tilde\lambda x_t$ is the residual risk price. In stage I (estimation): @@ -1523,30 +1738,33 @@ In stage II (assessment): 1. Assess improvements in predicted behaviour of the term structure. 2. Use estimated worst-case dynamics to form distorted forecasts - $\tilde{E}_t[x_{t+1}] = (A - C\tilde{W})x_t - Ca$ and compare them to those of + $\tilde{E}_t[x_{t+1}] = (A - C\tilde{W})x_t$ and compare them to those of professional forecasters. 3. Compute the discounted KL divergence $\frac{1}{2}E^w[\sum \beta^t w_t^\top w_t]$ of each twisted model relative to the econometrician's model and compare them - (the code below uses only the state-dependent component $W x_t$). + (the code below zeros the first column of $W$ and keeps only the factor-dependent part). ```{code-cell} ipython3 def discounted_kl(W, A_w, C, x0, β, T_horizon=500): - """State-dependent-component KL: (1/2) E^w [Σ β^t (Wx_t)'(Wx_t)].""" + """Factor-dependent KL: (1/2) E^w [Σ β^t (W x_t)'(W x_t)].""" n_sims = 10_000 + k = C.shape[1] rng = np.random.default_rng(2024) X = np.tile(x0, (n_sims, 1)) total = np.zeros(n_sims) for t in range(T_horizon): w_t = X @ W.T total += β**t * 0.5 * np.sum(w_t**2, axis=1) - X = X @ A_w.T + rng.standard_normal((n_sims, len(x0))) @ C.T + X = X @ A_w.T + rng.standard_normal((n_sims, k)) @ C.T return np.mean(total) -x0_test = np.array([0.01, 0.005]) -kl_szoke = discounted_kl(tilted.W_tilde, tilted.A_tilde, C, x0_test, β) +x0_test = augment_state(np.array([0.01, 0.005])) +kl_szoke = discounted_kl( + tilted.W_tilde_state, + tilted.A_tilde_state, C, x0_test, β) kl_feared = discounted_kl(W_bar, A_bar, C, x0_test, β) -print(f"Szőke state-dep. KL: {kl_szoke:.4f}") +print(f"Szőke factor-dep. KL: {kl_szoke:.4f}") print(f"Feared LRR KL: {kl_feared:.4f}") status = ('closer to' if kl_szoke < kl_feared else 'farther from') @@ -1554,106 +1772,25 @@ print(f"\nWorst-case model is {status} " f"the econometrician's model.") ``` -Using only the state-dependent component $\tilde{W} x_t$, the Szőke worst-case model has lower discounted KL divergence from the econometrician's model than the feared long-run risk model, meaning it is statistically harder to distinguish from the baseline. +Using only the factor-dependent component $\tilde{W}^{sd} x_t$, the Szőke worst-case model has lower discounted KL divergence from the econometrician's model than the feared long-run risk model, meaning it is statistically harder to distinguish from the baseline. Yet it still generates the state-dependent uncertainty prices needed to match term-structure dynamics. -(mult_pref_section)= -## Multiplier preferences - -The constraint formulation {eq}`eq_hansen_seq` bounds discounted entropy by $\eta$, but an equivalent **multiplier** formulation replaces the constraint with a penalty term weighted by a Lagrange multiplier $\theta$. - -The **multiplier preference** version of the dubious agent's problem is: - -```{math} -:label: eq_mult_seq - -\hat{J}(x_0, c_0 \mid \theta) := \min_{\{m_{t+1}\}} E \left[\sum_{t=0}^{\infty} \beta^t M_t\bigl(c_t + \theta m_{t+1}\log m_{t+1}\bigr) \middle| x_0, c_0\right] -``` - -with $M_{t+1} = M_t m_{t+1}$, $E[m_{t+1} \mid x_t, c_t] = 1$, $M_0 = 1$. - -The recursive formulation is: - -$$ -\hat{J}(x_t, c_t \mid \theta) = c_t + \min_{m_{t+1}} E \left[m_{t+1}\bigl[\beta \hat{J}(x_{t+1}, c_{t+1}) + \theta\log m_{t+1}\bigr] \middle| x_t, c_t\right] -$$ - -$$ -= c_t - \theta\log E \left[\exp \left(-\frac{\beta \hat{J}(x_{t+1}, c_{t+1})}{\theta}\right) \middle| x_t, c_t\right] -$$ - -$$ -=: c_t + T_t \left[\beta \hat{J}(x_{t+1}, c_{t+1})\right] -$$ - -where the right-hand side is attained by - -$$ -m_{t+1}^* \propto \exp \left(-\frac{\beta \hat{J}(x_{t+1}, c_{t+1})}{\theta}\right) -$$ - -By Lagrange multiplier theory, for the **corresponding dual pair** $(\tilde\theta, \eta)$, - -$$ -\hat{J}(x_t, c_t \mid \tilde\theta) = J(x_t, c_t \mid \eta) + \tilde\theta \eta -$$ - -Each choice of $\tilde\theta$ in the multiplier problem corresponds to a particular entropy bound $\eta(\tilde\theta)$ in the constraint problem, so the two formulations are equivalent. - -The operator $T_t$ defined above is a **risk-sensitivity operator** that maps the continuation value through an exponential tilt, downweighting good outcomes and upweighting bad ones. - -```{code-cell} ipython3 -def T_operator(V, θ, probs=None): - """Risk-sensitivity operator: T[V] = -θ log E[exp(-V/θ)].""" - if probs is None: - probs = np.ones(len(V)) / len(V) - V_s = -V / θ - max_v = np.max(V_s) - return -θ * (max_v + np.log(np.sum(probs * np.exp(V_s - max_v)))) - -rng = np.random.default_rng(42) -V_samples = rng.normal(loc=5.0, scale=1.0, size=10_000) -E_V = np.mean(V_samples) - -θ_grid = np.logspace(-1, 3, 50) -T_vals = [T_operator(V_samples, θ) for θ in θ_grid] - -fig, ax = plt.subplots(figsize=(8, 5)) -ax.semilogx(θ_grid, T_vals, 'firebrick', lw=2, label=r"$T_\theta[V]$") -ax.axhline(E_V, color='steelblue', lw=1.5, - ls='--', label=r"$E[V]$ (risk neutral)") -ax.set_xlabel(r"Robustness parameter $\theta$") -ax.set_ylabel("Value") -ax.legend() -ax.annotate(r"$\theta \to \infty$: risk neutral", - xy=(500, E_V), fontsize=11, color='steelblue', - xytext=(50, E_V - 0.8), - arrowprops=dict(arrowstyle='->', color='steelblue')) -plt.tight_layout() -plt.show() -``` - -As $\theta \to \infty$, the risk-sensitivity operator converges to the ordinary expectation $E[V]$, and the agent becomes risk neutral. - -As $\theta$ shrinks, the operator places more weight on bad outcomes, reflecting greater concern about model misspecification. - - ## Who cares? Joint probability distributions of interest rates and macroeconomic shocks are important throughout macroeconomics: -- **Costs of aggregate fluctuations.** Welfare assessments of business cycles +- *Costs of aggregate fluctuations.* Welfare assessments of business cycles depend sensitively on how risks are priced. -- **Consumption Euler equations.** The "New Keynesian IS curve" is a log-linearised +- *Consumption Euler equations.* The "New Keynesian IS curve" is a log-linearised consumption Euler equation whose risk adjustments are controlled by the stochastic discount factor. -- **Optimal taxation and government debt management.** Government bond prices embed +- *Optimal taxation and government debt management.* Government bond prices embed risk prices whose state dependence matters for optimal fiscal policy. -- **Central bank expectations management.** Forward guidance works by shifting the +- *Central bank expectations management.* Forward guidance works by shifting the term structure, an exercise whose effects depend on the same likelihood ratios studied here. -- **Long-run risk and secular stagnation.** The Bansal-Yaron long-run risk +- *Long-run risk and secular stagnation.* The Bansal-Yaron long-run risk hypothesis is difficult to detect statistically, yet an agent who fears it in the sense formalised above may behave very differently than one who does not. @@ -1669,4 +1806,4 @@ This lecture connects to several others in the series: - {ref}`Heterogeneous Beliefs and Bubbles ` examines how heterogeneous and possibly mistaken beliefs generate speculative asset price bubbles, providing another perspective on how beliefs affect asset prices. - {ref}`Likelihood Ratio Processes ` develops the mathematical properties of likelihood ratios, the central device organising this lecture, including their martingale structure and statistical applications. - {ref}`Divergence Measures ` covers Kullback-Leibler divergence and relative entropy in detail, providing the information-theoretic foundations for the entropy constraints used in the robust control sections. -- {ref}`Affine Models of Asset Prices ` extends the linear Gaussian state-space framework to affine and exponential-quadratic stochastic discount factors, developing risk-neutral pricing formulas closely related to those derived here. \ No newline at end of file +- {ref}`Affine Models of Asset Prices ` extends the linear Gaussian state-space framework to affine and exponential-quadratic stochastic discount factors, developing risk-neutral pricing formulas closely related to those derived here. From c60c1972f5eba7a862161fea0db68327a46b5d7a Mon Sep 17 00:00:00 2001 From: John Stachurski Date: Thu, 12 Mar 2026 13:55:54 +0900 Subject: [PATCH 17/18] Add optimistic initialization to Q-learning lecture (#830) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add optimistic initialization to Q-learning lecture Initialize Q-table to 20 (above true value range of 13-18) instead of zeros, which drives broader exploration via "optimism in the face of uncertainty". This speeds convergence enough to reduce the training run from 20M to 5M steps. Added a new subsection explaining the technique. Co-Authored-By: Claude Opus 4.6 * Add optimistic initialization to risk-sensitive Q-learning lecture Initialize Q-table to 1e-5 (below true Q-value range of ~1e-5 to 1e-4) instead of ones. Since the optimal policy minimizes q, optimistic means initializing below the truth — the reverse of the risk-neutral case. This speeds convergence enough to reduce training from 20M to 5M steps. Added a subsection explaining the reversed optimistic init logic. Co-Authored-By: Claude Opus 4.6 * Add \EE macro to MathJax config * Restore profit to observation list; fix risk-sensitive optimistic init value and narrative --------- Co-authored-by: Claude Opus 4.6 Co-authored-by: Matt McKay --- lectures/_config.yml | 1 + lectures/inventory_q.md | 112 +++++++++++++++++++------------------ lectures/rs_inventory_q.md | 35 ++++++++---- 3 files changed, 82 insertions(+), 66 deletions(-) diff --git a/lectures/_config.yml b/lectures/_config.yml index 698fa5b32..75d5a65bf 100644 --- a/lectures/_config.yml +++ b/lectures/_config.yml @@ -109,6 +109,7 @@ sphinx: macros: "argmax" : ["\\operatorname*{argmax}", 0] "argmin" : ["\\operatorname*{argmin}", 0] + "EE" : "\\mathbb{E}" mathjax_path: https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js # Local Redirects rediraffe_redirects: diff --git a/lectures/inventory_q.md b/lectures/inventory_q.md index 146921bf8..e9c9de9ce 100644 --- a/lectures/inventory_q.md +++ b/lectures/inventory_q.md @@ -37,18 +37,23 @@ We approach the problem in two ways. First, we solve it exactly using dynamic programming, assuming full knowledge of the model — the demand distribution, cost parameters, and transition dynamics. -Second, we show how a manager can learn the optimal policy from experience alone, using *[Q-learning](https://en.wikipedia.org/wiki/Q-learning)*. +Second, we show how a manager can learn the optimal policy from experience alone, using [Q-learning](https://en.wikipedia.org/wiki/Q-learning). -The manager observes only the inventory level, the order placed, the resulting -profit, and the next inventory level — without knowing any of the underlying -parameters. +In this setting, we assume that the manager observes only + +* the inventory level, +* the order placed, +* the resulting profit, and +* the next inventory level. + +The manager knows the interest rate -- and hence the discount factor -- but not any of the other underlying parameters. A key idea is the *Q-factor* representation, which reformulates the Bellman equation so that the optimal policy can be recovered without knowledge of the -transition function. +transition dynamics. -We show that, given enough experience, the manager's learned policy converges to -the optimal one. +We show that, given enough experience, the +manager's learned policy converges to the optimal one. The lecture proceeds as follows: @@ -67,16 +72,18 @@ import matplotlib.pyplot as plt from typing import NamedTuple ``` + ## The Model -We study a firm where a manager tries to maximize shareholder value. +We study a firm where a manager tries to maximize shareholder value by +controlling inventories. To simplify the problem, we assume that the firm only sells one product. Letting $\pi_t$ be profits at time $t$ and $r > 0$ be the interest rate, the value of the firm is $$ - V_0 = \sum_{t \geq 0} \beta^t \pi_t + V_0 = \EE \sum_{t \geq 0} \beta^t \pi_t \qquad \text{ where } \quad \beta := \frac{1}{1+r}. @@ -97,9 +104,9 @@ $$ $$ The term $A_t$ is units of stock ordered this period, which arrive at the start -of period $t+1$, after demand $D_{t+1}$ is realized and served. +of period $t+1$, after demand $D_{t+1}$ is realized and served: -**Timeline for period $t$:** observe $X_t$ → choose $A_t$ → demand $D_{t+1}$ arrives → profit realized → $X_{t+1}$ determined. +* observe $X_t$ → choose $A_t$ → demand $D_{t+1}$ arrives → profit realized → $X_{t+1}$ determined. (We use a $t$ subscript in $A_t$ to indicate the information set: it is chosen before $D_{t+1}$ is observed.) @@ -115,7 +122,7 @@ $$ Here * the sales price is set to unity (for convenience) -* revenue is the minimum of current stock and demand because orders in excess of inventory are lost rather than back-filled +* revenue is the minimum of current stock and demand because orders in excess of inventory are lost (not back-filled) * $c$ is unit product cost and $\kappa$ is a fixed cost of ordering inventory We can map our inventory problem into a dynamic program with state space $\mathsf X := \{0, \ldots, K\}$ and action space $\mathsf A := \mathsf X$. @@ -463,9 +470,10 @@ The manager does not need to know the demand distribution $\phi$, the unit cost All the manager needs to observe at each step is: 1. the current inventory level $x$, -2. the order quantity $a$ they chose, -3. the resulting profit $R_{t+1}$ (which appears on the books), and -4. the next inventory level $X_{t+1}$ (which they can read off the warehouse). +2. the order quantity $a$, which they choose, +3. the resulting profit $R_{t+1}$ (which appears on the books), +4. the discount factor $\beta$, which is determined by the interest rate, and +5. the next inventory level $X_{t+1}$ (which they can read off the warehouse). These are all directly observable quantities — no model knowledge is required. @@ -480,47 +488,29 @@ a)$ for every state-action pair $(x, a)$. At each step, the manager is in some state $x$ and must choose a specific action $a$ to take. Whichever $a$ is chosen, the manager observes profit $R_{t+1}$ -and next state $X_{t+1}$, and updates **that one entry** $q_t(x, a)$ of the +and next state $X_{t+1}$, and updates *that one entry* $q_t(x, a)$ of the table using the rule above. -**The max computes a value, not an action.** - It is tempting to read the $\max_{a'}$ in the update rule as prescribing the manager's next action — that is, to interpret the update as saying "move to -state $X_{t+1}$ and take action $\argmax_{a'} q_t(X_{t+1}, a')$." +state $X_{t+1}$ and take an action in $\argmax_{a'} q_t(X_{t+1}, a')$." -But the $\max$ plays a different role. The quantity $\max_{a' \in -\Gamma(X_{t+1})} q_t(X_{t+1}, a')$ is a **scalar** — it estimates the value of -being in state $X_{t+1}$ under the best possible continuation. This scalar -enters the update as part of the target value for $q_t(x, a)$. +But the $\max$ plays a different role. -Which action the manager *actually takes* at state $X_{t+1}$ is a separate -decision entirely. - -To see why this distinction matters, consider what happens if we modify the -update rule by replacing the $\max$ with evaluation under a fixed feasible -policy $\sigma$: - -$$ - q_{t+1}(x, a) - = (1 - \alpha_t) q_t(x, a) + - \alpha_t \left(R_{t+1} + \beta \, q_t(X_{t+1}, \sigma(X_{t+1}))\right). -$$ +The quantity $\max_{a' \in \Gamma(X_{t+1})} q_t(X_{t+1}, a')$ is just an estimate of the value of +being in state $X_{t+1}$ under the best possible continuation. -This modified update is a stochastic sample of the Bellman *evaluation* operator -for $\sigma$. The Q-table then converges to $q^\sigma$ — the Q-function -associated with the lifetime value of $\sigma$, not the optimal one. +This scalar enters the update as part of the target value for $q_t(x, a)$. -By contrast, the original update with the $\max$ is a stochastic sample of the -Bellman *optimality* operator, whose fixed point is $q^*$. The $\max$ in the -update target is therefore what drives convergence to $q^*$. +Which action the manager *actually takes* at time $t+1$ is a separate decision. -In short, the $\max$ is doing the work of finding the optimum; without it, you only evaluate a fixed policy. +In short, the $\max$ is doing the work of finding the optimum; it does not dictate the action that the manager actually takes. ### The behavior policy -The rule governing how the manager chooses actions is called the **behavior -policy**. Because the $\max$ in the update target always points toward $q^*$ +The rule governing how the manager chooses actions is called the **behavior policy**. + +Because the $\max$ in the update target always points toward $q^*$ regardless of how the manager selects actions, the behavior policy affects only which $(x, a)$ entries get visited — and hence updated — over time. @@ -545,6 +535,7 @@ We use $\alpha_t = 1 / n_t(x, a)^{0.51}$, where $n_t(x, a)$ is the number of tim This decays slowly enough to allow learning from later (better-informed) updates, while still satisfying the [Robbins–Monro conditions](https://en.wikipedia.org/wiki/Stochastic_approximation#Robbins%E2%80%93Monro_algorithm) for convergence. + ### Exploration: epsilon-greedy For our behavior policy, we use an $\varepsilon$-greedy strategy: @@ -560,6 +551,16 @@ We decay $\varepsilon$ each step: $\varepsilon_{t+1} = \max(\varepsilon_{\min},\ The stochastic demand shocks naturally drive the manager across different inventory levels, providing exploration over the state space without any artificial resets. +### Optimistic initialization + +A simple but powerful technique for accelerating learning is **optimistic initialization**: instead of starting the Q-table at zero, we initialize every entry to a value above the true optimum. + +Because every untried action looks optimistically good, the agent is "disappointed" whenever it tries one — the update pulls that entry down toward reality. This drives the agent to try other actions (which still look optimistically high), producing broad exploration of the state-action space early in training. + +This idea is sometimes called **optimism in the face of uncertainty** and is widely used in both bandit and reinforcement learning settings. + +In our problem, the value function $v^*$ ranges from about 13 to 18. We initialize the Q-table at 20 — modestly above the true maximum — to ensure optimistic exploration without being so extreme as to distort learning. + ### Implementation We first define a helper to extract the greedy policy from a Q-table. @@ -587,9 +588,9 @@ At specified step counts (given by `snapshot_steps`), we record the current gree ```{code-cell} ipython3 @numba.jit(nopython=True) def q_learning_kernel(K, p, c, κ, β, n_steps, X_init, - ε_init, ε_min, ε_decay, snapshot_steps, seed): + ε_init, ε_min, ε_decay, q_init, snapshot_steps, seed): np.random.seed(seed) - q = np.zeros((K + 1, K + 1)) + q = np.full((K + 1, K + 1), q_init) n = np.zeros((K + 1, K + 1)) # visit counts for learning rate ε = ε_init @@ -642,22 +643,21 @@ The wrapper function unpacks the model and provides default hyperparameters. ```{code-cell} ipython3 def q_learning(model, n_steps=20_000_000, X_init=0, ε_init=1.0, ε_min=0.01, ε_decay=0.999999, - snapshot_steps=None, seed=1234): + q_init=20.0, snapshot_steps=None, seed=1234): x_values, d_values, ϕ_values, p, c, κ, β = model K = len(x_values) - 1 if snapshot_steps is None: snapshot_steps = np.array([], dtype=np.int64) return q_learning_kernel(K, p, c, κ, β, n_steps, X_init, - ε_init, ε_min, ε_decay, snapshot_steps, seed) + ε_init, ε_min, ε_decay, q_init, snapshot_steps, seed) ``` -### Running Q-learning - -We run 20 million steps and take policy snapshots at steps 10,000, 1,000,000, and at the end. +Next we run $n$ = 5 million steps and take policy snapshots at steps 10,000, 1,000,000, and $n$. ```{code-cell} ipython3 -snap_steps = np.array([10_000, 1_000_000, 19_999_999], dtype=np.int64) -q, snapshots = q_learning(model, snapshot_steps=snap_steps) +n = 5_000_000 +snap_steps = np.array([10_000, 1_000_000, n], dtype=np.int64) +q, snapshots = q_learning(model, n_steps=n+1, snapshot_steps=snap_steps) ``` ### Comparing with the exact solution @@ -710,9 +710,11 @@ All panels use the **same demand sequence** (via a fixed random seed), so differ The top panel shows the optimal policy from VFI for reference. -After only 10,000 steps the agent has barely explored and its policy is poor. +After 10,000 steps the agent has barely explored and its policy is poor. + +By 1,000,000 steps the policy has improved but still differs noticeably from the optimum. -By step 20 million, the learned policy produces inventory dynamics that closely resemble the S-s pattern of the optimal solution. +By step 5 million, the learned policy produces inventory dynamics that closely resemble the S-s pattern of the optimal solution. ```{code-cell} ipython3 ts_length = 200 diff --git a/lectures/rs_inventory_q.md b/lectures/rs_inventory_q.md index cd81e6bad..347932d20 100644 --- a/lectures/rs_inventory_q.md +++ b/lectures/rs_inventory_q.md @@ -530,7 +530,7 @@ $X_{t+1}$ — no model knowledge is required. Our implementation follows the same structure as the risk-neutral Q-learning in {doc}`inventory_q`, with the modifications above: -1. **Initialize** the Q-table $q$ to ones (since Q-values are positive) and +1. **Initialize** the Q-table $q$ optimistically (see below) and visit counts $n$ to zeros. 2. **At each step:** - Draw demand $D_{t+1}$ and compute observed profit $R_{t+1}$ and next state @@ -548,6 +548,17 @@ Our implementation follows the same structure as the risk-neutral Q-learning in $\sigma(x) = \argmin_{a \in \Gamma(x)} q(x, a)$. 4. **Compare** the learned policy against the VFI solution. +### Optimistic initialization + +As in {doc}`inventory_q`, we use optimistic initialization to accelerate learning. + +The logic is the same — initialize the Q-table so that every untried action looks attractive, driving the agent to explore broadly — but the direction is reversed. + +Since the optimal policy *minimizes* $q$, "optimistic" means initializing the Q-table *below* the true values. When the agent tries an action, the update pushes $q$ upward toward reality, making that entry look worse and prompting the agent to try other actions that still appear optimistically good. + +The true Q-values are on the order of $\exp(-\gamma \, v^*) \approx 10^{-8}$ to $10^{-6}$. +We initialize the Q-table at $10^{-9}$, modestly below this range. + ### Implementation We first define a helper to extract the greedy policy from the Q-table. @@ -571,15 +582,15 @@ def greedy_policy_from_q_rs(q, K): ``` The Q-learning loop mirrors the risk-neutral version, with the key changes: -Q-table initialized to ones, the update target uses $\exp(-\gamma R_{t+1}) +the update target uses $\exp(-\gamma R_{t+1}) \cdot (\min_{a'} q_t)^\beta$, and the behavior policy follows the $\argmin$. ```{code-cell} ipython3 @numba.jit(nopython=True) def q_learning_rs_kernel(K, p, c, κ, β, γ, n_steps, X_init, - ε_init, ε_min, ε_decay, snapshot_steps, seed): + ε_init, ε_min, ε_decay, q_init, snapshot_steps, seed): np.random.seed(seed) - q = np.ones((K + 1, K + 1)) # positive Q-values, initialized to 1 + q = np.full((K + 1, K + 1), q_init) # optimistic initialization n = np.zeros((K + 1, K + 1)) # visit counts for learning rate ε = ε_init @@ -633,22 +644,23 @@ The wrapper function unpacks the model and provides default hyperparameters. ```{code-cell} ipython3 def q_learning_rs(model, n_steps=20_000_000, X_init=0, ε_init=1.0, ε_min=0.01, ε_decay=0.999999, - snapshot_steps=None, seed=1234): + q_init=1e-9, snapshot_steps=None, seed=1234): x_values, d_values, ϕ_values, p, c, κ, β, γ = model K = len(x_values) - 1 if snapshot_steps is None: snapshot_steps = np.array([], dtype=np.int64) return q_learning_rs_kernel(K, p, c, κ, β, γ, n_steps, X_init, - ε_init, ε_min, ε_decay, snapshot_steps, seed) + ε_init, ε_min, ε_decay, q_init, snapshot_steps, seed) ``` ### Running Q-learning -We run 20 million steps and take policy snapshots at steps 10,000, 1,000,000, and at the end. +We run $n$ = 5 million steps and take policy snapshots at steps 10,000, 1,000,000, and $n$. ```{code-cell} ipython3 -snap_steps = np.array([10_000, 1_000_000, 19_999_999], dtype=np.int64) -q_table, snapshots = q_learning_rs(model, snapshot_steps=snap_steps) +n = 5_000_000 +snap_steps = np.array([10_000, 1_000_000, n], dtype=np.int64) +q_table, snapshots = q_learning_rs(model, n_steps=n+1, snapshot_steps=snap_steps) ``` ### Comparing with the exact solution @@ -731,8 +743,9 @@ plt.show() After 10,000 steps, the agent has barely explored and its policy is erratic. -By 1,000,000 steps the learned policy begins to resemble the optimal one, and -by step 20 million the inventory dynamics are nearly indistinguishable from the +By 1,000,000 steps the learned policy has improved but still differs noticeably from the optimum. + +By step 5 million the inventory dynamics are nearly indistinguishable from the VFI solution. Note that the converged policy maintains lower inventory levels than in the From 85d0b361e2f58c8e65fd1945517ad379be05876e Mon Sep 17 00:00:00 2001 From: thomassargent30 Date: Mon, 16 Mar 2026 14:54:39 -0400 Subject: [PATCH 18/18] Tom's March 16 edits of Backus lecture lecture --- lectures/risk_aversion_or_mistaken_beliefs.md | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/lectures/risk_aversion_or_mistaken_beliefs.md b/lectures/risk_aversion_or_mistaken_beliefs.md index 115804bcb..2bf92343b 100644 --- a/lectures/risk_aversion_or_mistaken_beliefs.md +++ b/lectures/risk_aversion_or_mistaken_beliefs.md @@ -28,11 +28,33 @@ In a rational expectations equilibrium containing a risk-averse representative i But in a non-rational expectations model in which a representative investor holds beliefs that differ from "the econometrician's", observed average returns depend on *both* risk aversion *and* misunderstood return distributions. +```{note} +Whether beliefs are 'correct' or 'wrong' is itself subjective -- it depends on an observer's point of view. +``` + Wrong beliefs contribute what look like "stochastic discount factor shocks" when viewed from the perspective of an econometrician who trusts his model. -Those different perspectives can potentially explain observed countercyclical risk prices. +Such divergent beliefs can potentially explain what look like countercyclical risk price from the perpective of someone who trusts the +econometrician's model. + +A key building block of this model will be an econometrician's model that takes the form of a linear state-space model driven by Gaussian disturbances. + +This model will play two key roles: + +* it forms the perspective from which 'mistaken' beliefs and their consequences are viewed +* it forms the 'baseline' model of a dubious representative agent who distrusts it and wants to value assets payoffs by using alternative models that +seem to fit the historical data about as well as does the 'baseline' model. + +```{note} +When we discuss the setup with a twisted entry ball below, the econometrician's model will be one of *two* baseline models that the distrustful agent is concerned about. +``` + +We'll formalize different beliefs in terms of divergent probability distributions. + +It is convenient to characterize those differences in terms of a likelihood ratio process, the object studied in this quantecon lecture +{doc}`likelihood_ratio_process`. -We organize a discussion of these ideas around a single mathematical device, namely, a **likelihood ratio**, a non-negative random variable with unit mean that twists one probability distribution into another. +Thus, we'll organize this lecture around a single mathematical device, namely, a **likelihood ratio**, a non-negative random variable with unit mean that twists one probability distribution into another. Likelihood ratios, equivalently multiplicative martingale increments, appear in at least four distinct roles in modern asset pricing: @@ -43,7 +65,7 @@ Likelihood ratios, equivalently multiplicative martingale increments, appear in | Mistaken | $m_{t+1}^w$ | experts' forecasts | | Doubtful | $m_{t+1} \in \mathcal{M}$ | misspecification fears| -Each likelihood ratio takes the log-normal form +Each of the key likelihood ratios in this lecture takes the log-normal form $m_{t+1}^b = \exp(-b_t^\top \varepsilon_{t+1} - \frac{1}{2} b_t^\top b_t)$ with $b_t = 0$, $\lambda_t$, $w_t$, or a worst-case distortion.