Credit Conditions

v1.1 • updated February 9, 2026
Composite signal of credit conditions using high‑yield and BBB option‑adjusted spreads plus equity‑volatility (VIX). Outputs a smoothed index and discrete regime labels: Tightening, Neutral, Easing.

Abstract

We proxy credit conditions by combining spread‑level stress from corporate bond markets with equity‑implied volatility. Each input is robust‑normalised over a rolling window, averaged, and then exponentially smoothed to reduce transient spikes. Thresholds of ±0.75 on the final index map to tightening/easing regimes relevant for risk appetite and funding conditions.

1. Data

Inputs are sourced from FRED (St. Louis Fed) as a distribution layer, with underlying providers listed below. Each series is resampled to a common month‑end calendar before normalisation.

HY_OAS — ICE BofA US High Yield Option‑Adjusted Spread (FRED: BAMLH0A0HYM2)

  • What it measures: the option‑adjusted spread of US high‑yield corporate bonds over a matched Treasury curve (credit risk + liquidity/risk premia).
  • Typical frequency: daily or weekly (provider calendar + holidays can create gaps).
  • Why it matters: a fast‑moving barometer of risk pricing in below‑investment‑grade credit; tends to widen materially in stress.
  • Interpretation nuance: observed spreads embed expected default losses and a residual risk premium that can move with intermediary risk‑bearing capacity (often called an “excess bond premium”).

Reference: Gilchrist & Zakrajšek (2012), “Credit Spreads and Business Cycle Fluctuations” (AER). Link

FRED series page: Link

BBB_OAS — ICE BofA BBB US Corporate Option‑Adjusted Spread (FRED: BAMLC0A4CBBB)

  • What it measures: the option‑adjusted spread for BBB‑rated US investment‑grade corporates (lowest IG tier).
  • Typical frequency: daily or weekly.
  • Why it matters: captures broad corporate funding conditions and “edge‑of‑IG” stress (rating‑migration / fallen‑angel risk can matter in downturns).
  • Interpretation nuance: like HY, movements reflect both fundamentals (default/migration expectations) and time‑varying risk premia.

FRED series page: Link

VIXCLS — CBOE Volatility Index (FRED: VIXCLS)

  • What it measures: market‑implied expected near‑term volatility for the S&P 500 derived from option prices.
  • Typical frequency: daily close.
  • Why it matters: a high‑frequency proxy for risk appetite and uncertainty that can lead credit in sudden risk‑off episodes.
  • Interpretation nuance: VIX mixes expected variance (“uncertainty”) and the variance risk premium (risk compensation), so spikes can reflect pricing of tail risk rather than fundamentals alone.

Reference: Bekaert, Hoerova & Lo Duca (2013), decomposition of VIX into uncertainty vs risk aversion components. Link

FRED series page: Link

FRED (distribution layer)

  • What it provides: stable identifiers, metadata, and retrieval for the above series.
  • Practical nuance: series can exhibit holidays/gaps, provider backfills, and occasional revisions; resampling to month‑end helps align mixed frequencies before normalisation.

2. Normalisation

z\_{rob}(X)_t = \dfrac{X_t − \mathrm{median}(X)_{t,w}}{1.4826 · \mathrm{MAD}(X)_{t,w}}
with rolling window w = 36 months (minimum 18). Robust scaling reduces the impact of crisis outliers and level shifts.

3. Composite Construction

  1. Inputs: Z\_{HY}, Z\_{BBB}, Z\_{VIX}.
  2. Raw index: arithmetic mean of the three z‑scores.
  3. Smoothing: exponential moving average with span = 3 months.
Credit\_{Conditions,t} = \mathrm{EMA}_3\big(\tfrac{Z\_{HY,t} + Z\_{BBB,t} + Z\_{VIX,t}}{3}\big)

4. Regime Classification

C_t > 0.75 \Rightarrow \textit{Tightening};\quad |C_t| \le 0.75 \Rightarrow \textit{Neutral};\quad C_t < -0.75 \Rightarrow \textit{Easing}

5. Implementation (Python)

import pandas as pd
import numpy as np

def robust_z(s, win=36, 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))

def ema(s, span=3):
    return s.ewm(span=span, min_periods=1, adjust=False).mean()

c = df_credit_cond.copy()
c["Z_HY"]  = robust_z(c["HY_OAS"])
c["Z_BBB"] = robust_z(c["BBB_OAS"])
c["Z_VIX"] = robust_z(c["VIXCLS"])

c["Credit_Conditions_Raw"] = c[["Z_HY","Z_BBB","Z_VIX"]].mean(axis=1)
c["Credit_Conditions"] = ema(c["Credit_Conditions_Raw"], span=3)

hi, lo = 0.75, -0.75

def _regime(v):
    if pd.isna(v): return np.nan
    return "Tightening" if v > hi else ("Easing" if v < lo else "Neutral")

c["Credit_Regime"] = c["Credit_Conditions"].apply(_regime)

df_sig_credit = c

6. Interpretation

7. Assumptions & Limitations

8. Model interpretation guide (with academic anchors)

8.1 Read the index as “stress vs typical”, not levels

The composite is an average of robust z‑scores (median/MAD) across HY_OAS, BBB_OAS, and VIX, then smoothed with an EMA(3). Interpreting the value as a standardised deviation from its recent distribution avoids treating any raw spread/vol level as universally “good” or “bad”.

  • > +0.75: conditions are tighter than typical (risk premia elevated).
  • between −0.75 and +0.75: broadly normal / range‑bound.
  • < −0.75: unusually easy / supportive conditions.

8.2 Diagnose which channel is driving the regime

Always read the regime alongside component z‑scores. A tightening reading driven by spreads is typically a funding‑cost / credit‑risk tightening; a tightening reading driven by VIX is often a risk‑aversion / uncertainty tightening that can be faster‑moving.

  • Spread‑led tightening: more directly linked to corporate financing conditions and credit supply.
  • VIX‑led tightening: may reflect event risk and variance risk premia; confirm persistence using the smoothed index and recent history.

Academic anchor: “excess bond premium” helps separate pure default expectations from time‑varying risk premia that tighten financial conditions. Gilchrist & Zakrajšek (2012). Link

8.3 Treat boundary flips as “transition”, not a hard cliff

Because classification thresholds are heuristic, readings near ±0.75 should be treated as transitional. Where possible, interpret “signal strength” using the magnitude of the index (e.g., modest vs acute tightening), and confirm that more than one component is aligned before raising confidence.

8.4 Practical mapping to macro narratives

  • Tightening: elevated risk premia and/or volatility; historically consistent with slower risk‑taking, tighter credit supply, and higher required returns.
  • Neutral: no strong abnormal stress signal; use other macro blocks for directional conviction.
  • Easing: compressed premia; typically supportive for risk assets but can precede “late‑cycle complacency” if extremes persist.

Academic anchor: VIX can be decomposed into uncertainty and risk aversion components; spikes are not always equivalent in macro implication. Bekaert, Hoerova & Lo Duca (2013). Link