Detecting Inflationary Regimes via Producer–Consumer Price Divergence
Abstract
This paper formalises a rule-based indicator of inflationary pressure that exploits divergence between the Producer Price Index (PPI) and the Consumer Price Index (CPI). Year-on-year rates are transformed into a differential series and standardised using a rolling median and median absolute deviation (MAD) to obtain a robust z-score. Thresholds applied to the robustised differential, conditional on the absolute level of CPI, yield categorical regimes—HOT, NEUTRAL, and COOL. The specification is designed for operational use in macro monitoring and portfolio overlays.
1. Data
This model uses monthly US price indices published by the Bureau of Labor Statistics (BLS) and distributed via FRED. Unless explicitly stated, use not seasonally adjusted (NSA) series for the core signal to reduce sensitivity to annual seasonal-factor revisions.
1.1 CPI (consumer prices)
- Series: CPI for All Urban Consumers (
CPIAUCSL), monthly. - Concept: average price change paid by urban consumers for a basket of goods and services.
- Release cadence: typically mid‑month for the prior month (BLS CPI news release).
- Revision behaviour: the not seasonally adjusted CPI index is generally not revised; seasonally adjusted CPI is revised when seasonal factors are updated (BLS revises up to the most recent ~5 years of seasonally adjusted data when new factors are introduced).
1.2 PPI (producer prices)
- Series: PPI for All Commodities (
PPIACO), monthly. - Concept: price changes received by domestic producers; more upstream and often more volatile than CPI.
- Release cadence: typically mid‑month for the prior month (BLS PPI news release).
- Revision behaviour: PPI indexes are subject to revisions for several months after first publication to incorporate late reports and corrections; seasonally adjusted PPIs can also change for multiple years as seasonal factors are recalculated.
1.3 Optional context overlays
- USREC: NBER Recession Indicator (
USREC), monthly binary series for contextual shading (not used in classification).
1.4 Recommended robustness choices
- Core measures: consider core CPI (excluding food & energy) and/or a “core” PPI measure to reduce energy-driven noise when interpreting divergences.
- Vintage control: record the data pull date and (if possible) store vintages to understand whether a signal move was driven by revisions vs. new data.
Observations are merged on Date using an outer join, restricted to 2005‑01‑01 onwards to focus on the modern inflation regime. Where higher-frequency irregularities occur, the series are conformed to month-end by last observation carried forward within the month.
2. Methodology
- Convert
Dateto timezone-naïve monthly timestamps; sort ascending. - Compute year-on-year inflation rates:
CPIYoY,t = 100 × (CPIt − CPIt−12)/CPIt−12PPIYoY,t = 100 × (PPIt − PPIt−12)/PPIt−12
- Calculate divergence and robust z‑score:
Dt = PPIYoY,t − CPIYoY,tzt = (Dt − Median(Dt−w+1:t)) / (1.4826 × MAD(Dt−w+1:t))
- Apply classification rules:
- HOT: zt ≥ 1.0 or (zt ≥ 0.75 and CPIYoY,t ≥ 3.0%)
- COOL: zt ≤ −1.0 or (zt ≤ −0.5 and CPIYoY,t ≤ 1.5%)
- SMALL DIVERGENCE (band): if |zt| < zband, treat as NEUTRAL (recommended zband = 0.35) to reduce regime “flip‑flopping” in noisy months.
- NEUTRAL: otherwise
The robust standardisation uses a 60‑month rolling window to balance responsiveness and stability. Version 1.1 adds a z-band around zero (zband) to avoid frequent flips due to PPI volatility and revision noise. Prefer NSA inputs for the core signal; if SA series are used, expect annual factor-driven revisions. Windows with MAD = 0 are excluded from classification.
3. Sensitivity and Limitations
- Thresholds (±1.0, ±0.75, ±0.5) approximate 75th/25th percentile cut‑offs; these can be recalibrated to adjust signal frequency.
- Energy and food price shocks may distort short‑term readings; the robust approach mitigates but does not eliminate this effect.
- Pass‑through from producer to consumer prices is not instantaneous; interpret signals as directional indicators.
- Revisions and seasonal-factor updates: PPI is subject to revisions for several months, and seasonally adjusted series (CPI/PPI) can be revised over multi‑year windows when seasonal factors are recalculated; interpret single‑month regime changes cautiously.
4. Implementation Notes
def _robust_zscore(s, window=60):
s = s.astype(float)
med = s.rolling(window, min_periods=1).median()
mad = (s - med).abs().rolling(window, min_periods=1).median()
z = (s - med) / (mad.replace(0, float('nan')) * 1.4826)
return z
monthly['CPI_YoY'] = monthly['CPIAUCSL_Value'].pct_change(12) * 100
monthly['PPI_YoY'] = monthly['PPIACO_Value'].pct_change(12) * 100
monthly['PPI_minus_CPI_YoY'] = monthly['PPI_YoY'] - monthly['CPI_YoY']
monthly['divergence_z'] = _robust_zscore(monthly['PPI_minus_CPI_YoY'], window=60)
# Classification
def map_inflation_signal(row, z_band=0.35):
if pd.isna(row['CPI_YoY']) or pd.isna(row['PPI_YoY']) or pd.isna(row['divergence_z']):
return 'NEUTRAL'
# Small divergence band (reduces flip-flopping around zero)
if abs(row['divergence_z']) < z_band:
return 'NEUTRAL'
if (row['CPI_YoY'] >= 3.0 and row['divergence_z'] >= 0.75) or row['divergence_z'] >= 1.0:
return 'HOT'
if (row['CPI_YoY'] <= 1.5 and row['divergence_z'] <= -0.5) or row['divergence_z'] <= -1.0:
return 'COOL'
return 'NEUTRAL'
5. Reproducibility
- Record data provenance (
CPIAUCSL,PPIACO,USREC) and revision dates. - Fix window size, threshold, and software environment for deterministic results.
- Persist panel output and categorical signals with timestamps for traceability.
6. Applications
This indicator can be integrated into macroeconomic dashboards, inflation‑linked asset overlays, and multi‑factor allocation models. Combining it with recession overlays and survey price expectations enhances signal validation.
7. Model Interpretation (with literature cues)
7.1 What the divergence is capturing
- Positive divergence (PPI > CPI): upstream/input prices rising faster than consumer prices. In standard “production chain” / cost‑push framing, this often signals pipeline inflation pressure that may pass through with a lag, depending on margins and pricing power.
- Negative divergence (PPI < CPI): producer prices cooling relative to consumer prices. This can reflect easing input costs, margin compression, or demand‑side dynamics where retail prices are stickier than upstream prices.
7.2 Why use a rolling z‑score
- Scale‑free signal: standardising the gap makes the indicator comparable across inflation regimes (e.g., 2008–2011 vs. 2021–2023).
- Robustness: median/MAD reduces sensitivity to outliers from energy shocks or one‑off supply chain events.
- “Small divergence” band: treat near‑zero readings as noise to avoid classification churn when data are volatile or subject to revisions.
7.3 Practical reading of regimes
HOT means the PPI–CPI gap is unusually high versus its recent history (and/or CPI is already elevated). Interpret as pipeline pressure and a higher probability of upside inflation surprises or delayed disinflation.
COOL means the gap is unusually low/negative, especially when CPI is already low. Interpret as pipeline relief and a higher probability of continued disinflation or downside surprises.
NEUTRAL means divergence is not statistically unusual (or within the small-band). Treat as “no strong information” rather than “inflation is stable.”
7.4 Evidence and cautions from the literature
- Pass‑through is incomplete and lagged: empirical work commonly finds producer‑to‑consumer pass‑through exists but is not one‑for‑one and can vary by sector and period; interpret the signal as a directional risk indicator, not a mechanical forecast.
- Asymmetry is possible: large input spikes may pass through faster than input declines (menu costs, contracts, strategic pricing).
- Core vs headline: using core measures can improve interpretability during energy shocks, where headline PPI often overshoots CPI.
7.5 Suggested validation checks
- Compare the signal to inflation expectations (e.g., breakevens), survey prices‑paid, and unit labor cost trends.
- Track “time to CPI response” by computing cross‑correlations or lag regressions (PPI leads CPI) and re‑estimate periodically.
- When the regime flips on a single month, verify whether that month is still within the revision window for PPI (and whether SA factors were updated).
Keep the interpretation anchored in the model’s design: it is intended to flag unusual divergence and the associated risk of inflation persistence/surprise, not to estimate the level of future CPI.