Capex Intent
Abstract
The Capex Intent signal infers forward business investment trends from durable goods order data. It combines year‑over‑year and short‑term (3‑month annualised) growth rates for total and ex‑transport durable orders. When the ex‑transport series (ADXTNO) is present, it is prioritised. The composite detects Expansion, Neutral, or Contraction phases in capital expenditure cycles.
1. Data
- DGORDER — Manufacturers’ New Orders: Durable Goods (FRED).
- ADXTNO — Manufacturers’ New Orders: Durable Goods Ex‑Transportation (FRED, preferred).
- DGEXORD — Legacy alternate ex‑transport series (fallback).
Monthly nominal series from the U.S. Census Bureau’s M3 report (via FRED). Level data in USD millions.
2. Transformations
- YoY Growth: g_{12} = X_t / X_{t−12} − 1
- 3‑Month Annualised Growth: g_{3mAnn} = (X_t / X_{t−3})^4 − 1
The 3‑month annualised rate accelerates detection of inflection points in investment cycles.
3. Normalisation
4. Composite Construction
Weights adjust automatically depending on data availability:
# If ADXTNO (ex‑transport) is available:
Capex_Intent = 0.4·z(ADXTNO_YoY) + 0.4·z(ADXTNO_3mAnn) + 0.2·z(DGORDER_YoY)
# Otherwise:
Capex_Intent = 0.5·z(DGORDER_YoY) + 0.5·z(DGORDER_3mAnn)
This adaptive weighting ensures emphasis on core durable orders when possible, while retaining comparability across datasets.
5. Regime Classification
6. Implementation (Python)
import pandas as pd
import numpy as np
def robust_z(s, win=48, min_win=18):
x = pd.to_numeric(s, errors="coerce").astype(float)
w = max(min_win, min(win, x.dropna().size))
med = x.rolling(w, min_periods=min_win).median()
mad = (x - med).abs().rolling(w, min_periods=min_win).median()
return (x - med) / (1.4826 * mad.replace(0, np.nan))
d = df_durables.copy()
ex_col = None
if "ADXTNO" in d.columns:
ex_col = "ADXTNO"
elif "DGEXORD" in d.columns:
ex_col = "DGEXORD"
def ann3(series):
return (series / series.shift(3))**4 - 1.0
target_cols = ["DGORDER"] + ([ex_col] if ex_col else [])
for col in target_cols:
d[f"{col}_YoY"] = d[col].pct_change(12)
d[f"{col}_3mAnn"] = ann3(d[col])
if ex_col:
d["Z_EX_YoY"] = robust_z(d[f"{ex_col}_YoY"])
d["Z_EX_3mAnn"] = robust_z(d[f"{ex_col}_3mAnn"])
d["Z_ALL_YoY"] = robust_z(d["DGORDER_YoY"])
d["Capex_Intent"] = (0.4*d["Z_EX_YoY"] + 0.4*d["Z_EX_3mAnn"] + 0.2*d["Z_ALL_YoY"])
d["Capex_Sources"] = f"DGORDER + {ex_col}"
else:
d["Z_ALL_YoY"] = robust_z(d["DGORDER_YoY"])
d["Z_ALL_3mAnn"] = robust_z(d["DGORDER_3mAnn"])
d["Capex_Intent"] = 0.5*d["Z_ALL_YoY"] + 0.5*d["Z_ALL_3mAnn"]
d["Capex_Sources"] = "DGORDER only"
hi, lo = 0.75, -0.75
def _regime(v):
if pd.isna(v): return np.nan
return "Expansion" if v > hi else ("Contraction" if v < lo else "Neutral")
d["Capex_Regime"] = d["Capex_Intent"].apply(_regime)
df_sig_capex = d
print(f"✅ Capex Intent built using: {d['Capex_Sources'].iloc[-1]}")
display(df_sig_capex.tail())
7. Interpretation
This signal is designed to read like a capex leading indicator based on durable goods order momentum. It is best interpreted as a directional signal (improving vs deteriorating investment intent), not as a direct measure of realised business fixed investment.
7.1 Model Interpretation (how to read the signal)
What the levels mean
- Capex_Intent (composite robust z-score): positive values indicate orders growth is above its recent typical range (stronger capex intent); negative values indicate below typical (weakening intent).
- Expansion (C > 0.75): durable orders momentum is unusually strong vs history; consistent with a rising pipeline of equipment/structures spending, subject to confirmation by other activity indicators.
- Neutral (|C| ≤ 0.75): momentum is within the normal/noisy range; avoid over-interpreting a single month.
- Contraction (C < −0.75): momentum is unusually weak vs history; often aligns with softening business investment and higher growth-downside risk.
What the robust z-score means (extremeness, not causality)
The robust z-score compares the current growth rate to a rolling median and MAD window (48 months, minimum 18). It measures unusualness relative to recent history and is less sensitive to outliers than mean/standard-deviation z-scores.
- z > +0.5: stronger-than-normal capex intent momentum.
- −0.5 ≤ z ≤ +0.5: typical/noisy range; interpret only with corroboration.
- z < −0.5: weaker-than-normal capex intent momentum.
How to read YoY vs 3‑month annualised growth
- YoY (g12): higher signal-to-noise, slower turning; good for confirming regime shifts.
- 3‑month annualised (g3mAnn): faster turning; useful for early inflection detection but more volatile and more sensitive to one-off bookings.
- Best practice: treat a regime change as higher confidence when both components move in the same direction for multiple months.
How to interpret ex‑transport vs headline
- Ex‑transport (ADXTNO preferred): reduces distortions from aircraft/defence/large transportation orders; typically a cleaner read on broad-based equipment demand.
- Headline (DGORDER): can swing with large transportation bookings; treat large divergences between headline and ex‑transport as a composition warning, not a pure capex swing.
7.2 How to use it inside a macro model
- As an investment-cycle early warning: Contraction regimes can precede weakness in business fixed investment and cyclical earnings sensitivity (industrials, semis, capital goods).
- Cross-confirmation: Validate with other investment-related series (e.g., industrial production, PMIs/new orders, credit conditions) and with realised fixed investment in national accounts.
- Real vs nominal check: Durable goods orders are nominal; if inflation/price effects are changing rapidly, confirm with real activity indicators to avoid misreading price-driven moves as volume.
- Timing discipline: Durable goods are noisy and revised; prefer multi-month confirmation and avoid reacting to a single print.
7.3 Academic anchors (why these variables matter)
- Investment dynamics and adjustment costs: Business investment tends to respond with lags to shocks and financial conditions; orders and shipments are commonly used as near-term leading indicators of equipment spending.
- Accelerator-style intuition: Investment demand co-moves with expected output and demand conditions; new orders can proxy shifts in expected sales that drive capex planning.
- Measurement link: Durable goods orders originate from the Census Bureau M3 survey; they are directly used in tracking equipment-related activity and are monitored by policymakers and forecasters as high-frequency signals.
7.4 Selected references (starter list)
- Census Bureau. “Manufacturers’ Shipments, Inventories, and Orders (M3) – Technical Documentation and Revision Policy.”
- Caballero, R. J. (1999). “Aggregate Investment.” Handbook of Macroeconomics. (investment dynamics and adjustment costs)
- Chirinko, R. S. (1993). “Business Fixed Investment Spending: Modeling Strategies, Empirical Results, and Policy Implications.” Journal of Economic Literature.
- Bernanke, B. S., Gertler, M., & Gilchrist, S. (1999). “The Financial Accelerator in a Quantitative Business Cycle Framework.” Handbook of Macroeconomics. (credit conditions and investment)
- FRED series documentation for
DGORDER,ADXTNO, andDGEXORD(definitions, units, vintage/revision notes).
8. Future Enhancements (Out of Scope)
- Volatility-aware thresholds: adapt ±0.75 bands based on rolling dispersion of the composite to reduce false signals in high-vol regimes.
- Real (price-adjusted) capex intent: deflate orders using appropriate producer-price indices to better approximate volume dynamics.
- Bayesian / state-space smoothing: combine headline and ex-transport in a latent-factor model to reduce noise and handle revisions.
- Sectoral decomposition: separate defense/aircraft/IT equipment to isolate cyclically sensitive components.
9. Limitations
- Durable goods data are volatile and subject to large revisions; smoothing windows mitigate but do not remove noise.
- Transportation equipment orders can distort headline DGORDER; hence preference for ADXTNO when available.
- Fixed thresholds (±0.75) are heuristic; dynamic scaling by volatility regime may improve detection.