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)

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 value to numeric; parse date to month‑start timestamps.
  • Pivot & grid: Wide pivot by series_id → monthly start grid via asfreq('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

Participation_vs_EmpRatio = Participation / EmpPop
Labor_Slack_Index = (1 − Unemployment/10) × Participation

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.

zt(x) = (xt − medianW(x)) / (1.4826·MADW(x)),\ W = min(36, max(8, ⌊0.8·Nvalid⌋))

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
}
Employment_Compositionz = 0.40·partz + 0.40·emprz + 0.20·unempz_neg

6. Smoothing, Scaling & Regimes

  • 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.