Policy‑Relevant Inflation (PCE)

Equal‑weight composite of headline and core PCE inflation to mirror the Fed’s policy focus. Regimes: Hot, Neutral, Cool.

Abstract

This signal combines the year‑over‑year change in the PCE price index and its ex‑food‑and‑energy counterpart (Core PCE). Each series is standardised via a rolling robust z‑score and averaged 50/50. Thresholds of ±0.75 map the composite to policy‑relevant regimes.

1. Data

Both are monthly indices from BEA (via FRED). Ensure month‑end alignment before transformations.

2. Transformations

  1. YoY Inflation: \Delta\%_{12m}(X)_t = X_t/X_{t-12} − 1
  2. Robust z‑score:
    z_{rob}(X)_t = \dfrac{X_t − \mathrm{median}(X)_{t,w}}{1.4826·\mathrm{MAD}(X)_{t,w}}
    with w = 60 months (min 24). MAD scaling reduces sensitivity to outliers and level shifts.

3. Composite & Regimes

PCE\_{Composite,t} = 0.5·z(PCE\_{YoY,t}) + 0.5·z(CorePCE\_{YoY,t})
If\ C_t > 0.75 → \textit{Hot};\quad |C_t| ≤ 0.75 → \textit{Neutral};\quad C_t < −0.75 → \textit{Cool}

4. Implementation (Python)

import pandas as pd
import numpy as np

def robust_z(s, win=60, min_win=24):
    x = pd.to_numeric(s, errors="coerce").astype(float)
    w = max(min_win, min(win, x.dropna().size))
    med = x.rolling(w, min_periods=min_win).median()
    mad = (x - med).abs().rolling(w, min_periods=min_win).median()
    return (x - med) / (1.4826 * mad.replace(0, np.nan))

p = df_pce.copy()
p["PCE_YoY"]     = p["PCEPI"].pct_change(12)
p["CorePCE_YoY"] = p["PCEPILFE"].pct_change(12)

p["Z_PCE"]  = robust_z(p["PCE_YoY"]) 
p["Z_cPCE"] = robust_z(p["CorePCE_YoY"]) 

p["PCE_Composite"] = 0.5*p["Z_PCE"] + 0.5*p["Z_cPCE"]

hi, lo = 0.75, -0.75

def _regime(v):
    if pd.isna(v): return np.nan
    return "Hot" if v > hi else ("Cool" if v < lo else "Neutral")

p["PCE_Regime"] = p["PCE_Composite"].apply(_regime)

df_sig_pce = p
display(df_sig_pce.tail())

5. Interpretation

6. Limitations