Industrial Production Signal
Abstract
This document formalises a rules‑based industrial cycle signal built around (i) industrial activity and momentum via INDPRO and (ii) slow‑moving mining intensity context via VAPGDPM (mining value‑added share of GDP). Optional cyclic confirmers (e.g., new orders / capex proxies) can be layered to improve turning‑point sensitivity. Regimes—Bullish, Neutral, and Bearish—are assigned with transparent thresholds, and the mining share is used only as a slow regime modifier (confidence/strength), not as an equal trigger.
1. Data
- INDPRO — US Industrial Production Index (Federal Reserve G.17 via FRED). Monthly, SA, index (2017=100).
- VAPGDPM — Mining value added as a share of GDP (BEA GDP by Industry via FRED). Quarterly, percent (slow-moving structural context).
Optional cyclic confirmers (recommended): ISM New Orders (NAPMNOI), and equipment / manufacturing orders such as NEWORDER (core capital goods new orders) and DGORDER (durable goods new orders).
Revision behaviour. INDPRO is revised, including annual benchmark revisions. Treat recent releases and benchmark windows as revision‑prone; for backtests, prefer vintage snapshots (e.g., ALFRED) or stored series snapshots.
2. Alignment & Transformations
2.1 Frequency alignment (avoid false precision)
- Monthly series (INDPRO and optional confirmers) are aligned to month-start (MS) without forward-filling across extended gaps.
- Quarterly mining share (VAPGDPM) is mapped to its three constituent months as a step series for context only. It must be treated as a slow modifier, not a monthly trigger.
2.2 Transformations
- INDPRO YoY:
100 * (INDPRO / INDPRO.shift(12) - 1) - INDPRO momentum overlay (use at least one): 3‑month annualised change
400 * (INDPRO / INDPRO.shift(3) - 1)and/or YoY accelerationYoY - YoY.shift(3). - Orders / capex proxies: YoY and/or rolling z-scores; optionally include a 3‑month momentum measure analogous to INDPRO.
- Mining share: 4‑quarter change and/or rolling z-score; optionally smooth with a 4‑quarter moving average.
2.3 Revision controls (required for robust reporting)
- Persist retrieval timestamp, last observation date, and a snapshot/vintage identifier where possible.
- Flag benchmark revision windows in the narrative; de‑emphasise small changes around those dates.
3. Signal Classification
Version 1.1 adopts a hierarchical specification: cyclical production dynamics drive the regime; forward indicators confirm; mining share acts as a slow structural modifier (confidence/strength), not an equal trigger.
3.1 Step 1 — Cyclical state (INDPRO)
- Expansionary production: INDPRO YoY > +2%.
- Contractionary production: INDPRO YoY < 0%.
- Momentum overlay: positive if 3m annualised > 0 (and/or YoY acceleration > 0); negative if < 0.
3.2 Step 2 — Cyclical confirmers (recommended)
Construct a simple confirmers score from 2–3 proxies (timely and transparent):
- +1 if ISM New Orders > 50; −1 if < 50.
- +1 if NEWORDER YoY > 0; −1 if < 0.
- +1 if DGORDER YoY > 0; −1 if < 0.
3.3 Step 3 — Structural modifier (mining share)
- Use VAPGDPM as a slow‑moving context variable (level, 4q change, or z‑score).
- Constraint: the modifier cannot flip Bullish↔Bearish; it only adjusts strength/confidence (e.g., “Bullish — tempered”).
3.4 Regime mapping (example)
- Bullish: Expansionary + positive momentum, confirmers score ≥ +1.
- Bearish: Contractionary + negative momentum, confirmers score ≤ −1.
- Neutral/Transition: otherwise.
4. Implementation Notes (Python)
Implementation is intentionally lightweight: fetch series from FRED, align frequencies, compute transforms, then apply transparent rule logic. The mining share (VAPGDPM) should be treated as a slow modifier rather than a high-frequency trigger.
import pandas as pd
IND = fetch_fred_series_df('INDPRO') # monthly
MIN = fetch_fred_series_df('VAPGDPM') # quarterly (structural)
# Optional confirmers (choose 1–3)
NO = fetch_fred_series_df('NAPMNOI') # ISM new orders (survey)
KGO = fetch_fred_series_df('NEWORDER') # core capital goods new orders
DGO = fetch_fred_series_df('DGORDER') # durable goods new orders
# Align
IND = align_month_start(IND) # MS
NO = align_month_start(NO)
KGO = align_month_start(KGO)
DGO = align_month_start(DGO)
MIN = align_quarter_to_month_step(MIN) # repeat quarter value to its three months
df = merge_monthly([IND, MIN, NO, KGO, DGO])
# Transforms
df['INDPRO_YoY'] = df['INDPRO'].pct_change(12) * 100
df['INDPRO_3mAnn'] = (df['INDPRO'] / df['INDPRO'].shift(3) - 1) * 400
df['INDPRO_YoY_Acc'] = df['INDPRO_YoY'] - df['INDPRO_YoY'].shift(3)
df['NEWORDER_YoY'] = df['NEWORDER'].pct_change(12) * 100
df['DGORDER_YoY'] = df['DGORDER'].pct_change(12) * 100
# Simple confirmers score (example)
df['CONF'] = 0
df.loc[df['NAPMNOI'] > 50, 'CONF'] += 1
df.loc[df['NEWORDER_YoY'] > 0, 'CONF'] += 1
df.loc[df['DGORDER_YoY'] > 0, 'CONF'] += 1
# Regime rules (example)
def classify(row):
if pd.isna(row['INDPRO_YoY']) or pd.isna(row['INDPRO_3mAnn']):
return 'Neutral'
cyc_exp = row['INDPRO_YoY'] > 2
cyc_con = row['INDPRO_YoY'] < 0
mom_pos = row['INDPRO_3mAnn'] > 0
mom_neg = row['INDPRO_3mAnn'] < 0
if cyc_exp and mom_pos and row.get('CONF', 0) >= 1:
return 'Bullish'
if cyc_con and mom_neg and row.get('CONF', 0) <= -1:
return 'Bearish'
return 'Neutral'
df['Industrial_Production_Regime'] = df.apply(classify, axis=1)
# Structural modifier (do NOT flip regime)
# Example: adjust confidence/strength based on MIN (VAPGDPM) level or z-score.
Note: align_* and fetch_fred_series_df are placeholders for your existing utility functions.
5. Assumptions & Limitations
- Frequency integrity. Quarterly structural series mapped to monthly must not be interpreted as month‑to‑month information. Treat as a regime modifier only.
- Benchmark revisions. INDPRO is revised (including annual benchmark revisions). Treat recent releases and benchmark windows as revision‑prone; avoid over‑interpreting small moves.
- Vintage bias. Historical evaluation should be vintage-aware (ALFRED or stored snapshots) to reduce look‑ahead bias.
- Survey vs hard data. Survey confirmers are timelier but noisier; orders series are slower but objective—use both where possible.
6. Reproducibility
- Persist series IDs (INDPRO, VAPGDPM, and any confirmers), retrieval timestamps, and library versions.
- Record resampling policy explicitly (monthly MS alignment; quarterly-to-month step mapping for VAPGDPM).
- Store the final panel with INDPRO growth, momentum overlays, confirmers, and the final regime label for audit.
- If you backtest, prefer vintage snapshots (ALFRED) or stored snapshots to reduce look‑ahead bias.
7. Applications
Useful as a demand‑supply overlay for metals (e.g., silver) and cyclicals, and as an explanatory variable in macro factor models. Naturally complements liquidity and real‑yield signals for regime triangulation.
8. Interpretation Guide (Model Reading)
8.1 What the regimes mean
- Bullish. Industrial activity is expanding and momentum is positive, corroborated by forward orders/capex. Typically aligns with pro‑cyclical risk and stronger industrial demand backdrops.
- Bearish. Industrial activity is contracting and momentum is negative, corroborated by weakening forward orders/capex—consistent with downturn dynamics and higher macro tail risk.
- Neutral/Transition. Mixed state signals (e.g., YoY positive but momentum rolling). Outcome dispersion widens; prefer confirmation before taking strong directional exposure.
8.2 How to interpret conflicts
- Hard data up, orders down: topping risk / late‑expansion warning (confirmers tend to lead).
- Hard data down, orders up: early‑turn candidate; watch for INDPRO momentum to confirm.
- Mining share high/rising: treat as a structural modifier that can temper conviction, not as a turning-point trigger.
8.3 Evidence base (selected)
This model structure follows common macro practice: combining coincident real-activity measures with forward-looking survey/orders indicators, and using composite/diffusion-style synthesis for turning-point detection.
- Stock & Watson (2002) on diffusion indexes for forecasting: paper.
- Conference Board overview of leading indicators (orders as leading inputs): reference.
- Hamilton (2009) and related work on regime/turning-point approaches in macro time series: reference.
Note: references are provided to anchor interpretation conventions; they do not imply a unique or “correct” specification.