Industrial Production Signal

A reproducible specification combining INDPRO (US Industrial Production) with a slow-moving mining intensity context (VAPGDPM) and optional cyclical confirmers (orders/capex) into a monthly, rules‑based regime signal for cyclical and metals exposures.

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

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)

2.2 Transformations

2.3 Revision controls (required for robust reporting)

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)

3.2 Step 2 — Cyclical confirmers (recommended)

Construct a simple confirmers score from 2–3 proxies (timely and transparent):

3.3 Step 3 — Structural modifier (mining share)

3.4 Regime mapping (example)

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

6. Reproducibility

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

8.2 How to interpret conflicts

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.

Note: references are provided to anchor interpretation conventions; they do not imply a unique or “correct” specification.