Policy‑Relevant Inflation (PCE)
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 map the composite to policy‑relevant regimes. v1.1 separates the signal into level (distance from target) and momentum (direction and speed of change), and recommends publishing a confidence band that reflects recent volatility and revision risk.
1. Data
1.1 Primary series (required)
- PCEPI — Personal Consumption Expenditures: Chain‑Type Price Index (headline PCE). (Source: BEA; distributed via FRED; monthly index.)
- PCEPILFE — Personal Consumption Expenditures Excluding Food and Energy (core PCE). (Source: BEA; distributed via FRED; monthly index.)
- Release & vintage behavior: PCE is released in BEA’s Personal Income and Outlays report and may be revised with new source data and methodological changes, including annual updates/benchmark revisions.
- Frequency & lag: monthly, typically released with a lag versus the reference month (varies by calendar).
- Unit consistency: both are chain‑type indices; do not mix with “percent change” series without checking units.
- Calendar alignment: use month‑end timestamps and compute transforms on a strict monthly grid (no forward‑fill).
1.2 Optional supplementary series (not used in the core composite)
- PCETRIM1M158SFRBDAL — Dallas Fed Trimmed Mean PCE Inflation Rate. (Useful robustness check; construction uses component weights and trims tails.)
If you incorporate trimmed‑mean PCE, document that its construction (including component weights) is updated by the publisher and can change historically.
2. Transformations
2.1 Inflation rates
- YoY inflation: \Delta\%_{12m}(X)_t = X_t/X_{t-12} − 1
- Momentum (recommended): compute a shorter‑horizon annualized rate (e.g., 3‑month annualized) to represent direction/speed: \Delta\%_{3m,ann}(X)_t = (X_t/X_{t-3})^{4} − 1. Publish as a separate field, not a replacement for YoY.
2.2 Robust standardisation (for the composite)
Convert each YoY series to a rolling robust z‑score (median/MAD) to reduce sensitivity to outliers and level shifts.
2.3 Target‑anchored level component (for interpretation)
In parallel to z‑scores, compute an interpretable distance‑to‑target in percentage points:
3. Composite & Regimes
The signal score remains the equal‑weight composite of robust z‑scores on YoY inflation.
3.1 Regime thresholds (target‑aware)
Base thresholds are expressed in z‑score units. If the policy objective \pi^{*} changes, keep the z‑score thresholds fixed (comparability), but update interpretation text and the target‑anchored level component accordingly.
4. Confidence band (recommended)
Publish an uncertainty band around C_t that reflects recent volatility and helps users treat “near‑threshold” readings as low‑confidence. This is not a formal statistical standard error; it is an operational confidence indicator.
LOW_CONFIDENCE if the band intersects a regime boundary (±h).- Store the latest observed value and compare against a prior vintage (e.g., ALFRED) when available; flag if the last 3 observations were revised beyond a tolerance.
- At minimum: publish the release date and a
REVISION_RISKboolean during annual updates/benchmark windows.
5. Interpretation
5.1 How to read the output
- Score (Ct): relative inflation pressure versus its own recent history (robustly standardised). Use for regime classification.
- Level (pp vs target): how far headline+core inflation is from \pi^{*}. Use for policy relevance and narrative.
- Momentum: whether inflation is accelerating/decelerating on a shorter horizon (e.g., 3‑month annualized). Use to judge trajectory inside a regime.
- Confidence band / flags: treat near‑threshold readings as transitional; do not over‑interpret flips when confidence is low.
5.2 Policy relevance (evidence base)
PCE inflation is widely treated as the Federal Reserve’s preferred inflation gauge for its longer‑run objective and communication, and “core” measures are commonly used to filter transitory volatility. Central‑tendency measures such as trimmed‑mean PCE are supported in the literature as improving signal quality and forecastability relative to headline measures in some settings.
- Fed longer‑run goals / 2% objective (policy anchor).
- Dallas Fed research comparing trimmed‑mean PCE vs ex‑food‑and‑energy measures (predictability / slack linkage).
- BEA documentation on PCE price index production and revisions (benchmark/annual update context).
6. 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))
def ann_change(x, m):
# annualized m-month change for an index level series
return (x / x.shift(m)) ** (12.0 / m) - 1
p = df_pce.copy()
# Required inputs: monthly index levels
p["PCE_YoY"] = p["PCEPI"].pct_change(12)
p["CorePCE_YoY"] = p["PCEPILFE"].pct_change(12)
# Momentum (optional, interpretation)
p["PCE_3m_ann"] = ann_change(p["PCEPI"], 3)
p["CorePCE_3m_ann"] = ann_change(p["PCEPILFE"], 3)
# Robust z-scores (for the regime score)
p["Z_PCE"] = robust_z(p["PCE_YoY"])
p["Z_cPCE"] = robust_z(p["CorePCE_YoY"])
p["Score_C"] = 0.5*p["Z_PCE"] + 0.5*p["Z_cPCE"]
# Target-anchored level (percentage points vs target)
pi_star = 0.02 # update if the policy objective changes
p["Level_pp"] = 0.5*((p["PCE_YoY"] - pi_star) * 100.0) + 0.5*((p["CorePCE_YoY"] - pi_star) * 100.0)
# Confidence band on score (operational)
win = 60
k = 1.0
medC = p["Score_C"].rolling(win, min_periods=24).median()
madC = (p["Score_C"] - medC).abs().rolling(win, min_periods=24).median()
sigC = 1.4826 * madC.replace(0, np.nan)
p["C_lo"] = p["Score_C"] - k*sigC
p["C_hi"] = p["Score_C"] + k*sigC
h = 0.75
p["LOW_CONFIDENCE"] = ((p["C_lo"] <= h) & (p["C_hi"] >= h)) | ((p["C_lo"] <= -h) & (p["C_hi"] >= -h))
def regime(c):
if pd.isna(c): return np.nan
return "Hot" if c > h else ("Cool" if c < -h else "Neutral")
p["Regime"] = p["Score_C"].apply(regime)
df_sig_pce = p
7. Limitations
- Revisions: BEA updates can revise recent history; annual updates/benchmark revisions can be material for the latest year of data. Treat near‑term readings as provisional.
- Equal weighting: 50/50 headline vs core is a design choice; document any changes and avoid tuning without validation.
- Z‑score comparability: z‑scores are sample‑dependent; structural breaks can shift what qualifies as “extreme”. Use the target‑anchored level component to retain policy interpretability.
- Trimmed mean: if added, it is a different estimator with its own revisions and construction updates; keep it as a robustness check unless the composite is explicitly redesigned.