Employment Composition (CPS)
Monthly composite of labor market health from CPS: Participation, Employment–Population Ratio, and Unemployment Rate. Robust z‑scores, momentum diagnostics, 0–100 scaling, and categorical regimes.
Why: Higher participation and employment with lower unemployment indicate a tighter, healthier labor market; the inverse signals rising slack.
Abstract
We construct a monthly index from three CPS (household survey) series: Participation, Employment–Population, and Unemployment. Each is standardized with a robust rolling z‑score. We then build a weighted composite (participation 0.4, emp‑pop 0.4, unemployment −0.2), apply smoothing, scale it to 0–100, and classify regimes.
1. Data (BLS CPS Identifiers)
- LNS11300000 — Labor force participation rate (%)
- LNS12300000 — Employment–population ratio (%)
- LNS14000000 — Unemployment rate (%)
Inputs are monthly. If any required ID is missing from the initial subset, the pipeline augments from long_df (or many) before pivoting.
2. Data Handling & Validation
- Types & dates: Coerce
valueto numeric; parsedateto month‑start timestamps. - Pivot & grid: Wide pivot by
series_id→ monthly start grid viaasfreq('MS'). - Gaps: Bounded forward‑fill
ffill(limit=2); larger gaps remain NaN. - Fail‑fast: raise if any of the three core series is entirely missing after pivot.
3. Feature Engineering
Momentum diagnostics: 3‑month differences for each core rate (diff(3)).
4. Standardisation (Robust Rolling z‑scores)
Each series is scaled with a median/MAD z‑score using an adaptive window.
Unemployment enters negatively via unemp_z_neg = −z(unemployment).
5. Weighting & Composite Construction
Weights reflect economic intuition: participation and employment carry equal weight; unemployment detracts.
{
"part_z": 0.40,
"empr_z": 0.40,
"unemp_z_neg": 0.20
}
6. Smoothing, Scaling & Regimes
- Headline smoothing: 3‑period EMA on the composite z‑score.
- Score (0–100): min–max scaling over observed history; returns NaN if flat.
- Regimes: thresholds on the unsmoothed composite z‑score.
- HOT (healthy/tight): > +0.75
- NEUTRAL: −0.75 to +0.75
- COOL (slack rising): < −0.75
7. Output Panel
[
"participation_rate","emp_pop_ratio","unemployment_rate",
"Participation_vs_EmpRatio","Labor_Slack_Index",
"part_mom_3m","empr_mom_3m","unemp_mom_3m",
"part_z","empr_z","unemp_z_neg",
"Employment_Composition_z","Employment_Composition_0_100",
"Employment_Composition_Smoothed","Employment_Regime"
]
8. Implementation Notes (Python)
# Expect columns: date, series_id, value
REQ = ["LNS11300000","LNS12300000","LNS14000000"]
# Merge in any missing IDs from long_df/many prior to pivot; align to MS grid; ffill(limit=2)
# Apply robust_z(), momentum, composite, EMA smoothing, regime, and 0–100 scale as specified above.
9. Interpretation & Use
A HOT employment composition reading aligns with historically tight labor conditions and potential wage pressure; a COOL reading indicates rising slack. Use alongside wage, inflation, and liquidity signals for cross‑validation.