FINRA TRACE bond prints → cleaning & de-duplication → z-spread per bond against a SOFR discount curve → piecewise-flat hazard-rate bootstrap on the 1–10Y tenor grid → ISDA-standard par CDS spreads → three-state quality gate → static JSON publication.
Why bond-implied? Single-name traded CDS quotes live behind institutional terminals and data-vendor
licences. Corporate bond prints in FINRA TRACE are public. Deriving CDS spreads from the bond market — a
bond-implied CDS curve — answers the same question (what default risk does the market price into this
issuer?) from data anyone can observe, at a price point individuals, small desks, students and builders can
actually pay. The sections below are the full method; /v1/index.json is the free JSON plane it
feeds.
Input is public fixed-income market data only:
Daily prints are cleaned before anything is fitted: duplicate prints are de-duplicated, low-volume prints
are floored out, and outliers are guarded. The number of bonds surviving cleaning per issuer per day is
published in every curve payload (n_bonds_priced, n_prints_day) so thin coverage is
always visible.
When the bootstrap cannot match a bond-implied z-spread at a tenor knot — negative or unreachable z-spread,
non-finite or unbracketable solution — the hazard is carried forward flat from the previous knot and the
tenor is flagged. The published spread at such a tenor is a placeholder, not a fit; the flag lists
(unsolved_knots and friends) are the way to see this. These are coverage diagnostics, never signals.
From 2026-09-30 the discount curve is the SR3 futures strip (provenance string in every payload, e.g.
SR3 futures strip to 2.2y via Yahoo/CME). Rows before that date were computed with flat-SOFR
discounting at each historical date (legacy_flat regime). The two regimes are not comparable
level-for level — every history series carries a regime_note marking the boundary, and
within-regime comparison is the only like-for-like comparison.
A piecewise-flat hazard (default-intensity) curve is bootstrapped on the 1, 2, 3, 5, 7, 10-year tenor grid so that model-implied par CDS spreads reproduce the bond-implied z-spreads at each knot. Par spreads are priced under ISDA standard conventions: quarterly payments on IMM dates, ACT/360 day count, accrued interest paid at default (half-spread accrued). The credit curve is published as par spreads per tenor plus the fitted hazard rates and z-spreads behind them.
Par spreads on this bootstrap are recovery-invariant to first order — the hazard level re-absorbs the
recovery assumption — so an honest recovery sensitivity is a grid of upfront values at fixed running
coupons, not a grid of par spreads. That is exactly what the Pro recovery_grid publishes.
Fixed at 40% in v1 — single assumption, not user-selectable, and stated in every payload
(recovery_assumption: 0.4).
Every curve passes a no-arbitrage and smoothness gate before publication. It is a three-state
classification, and the state is always exposed as status:
| status | condition | payload |
|---|---|---|
| published | normalised curvature ≤ 20 bp/yr², no violations, no unsolved knots | full spreads |
| published_volatile | curvature ≤ 60 bp/yr², or one unsolved knot short of the withhold rule | full spreads + volatility_flag |
| withheld | curvature > 60 bp/yr², or any hard invariant broken, or the 5Y knot unsolved / half the knots unsolved | spreads stripped; violation list instead |
Curvature is the second derivative of the quadratic through each consecutive tenor triple, normalised on the non-uniform tenor grid (bp per year²). Hard invariants — all of which withhold regardless of thresholds — are plain no-arbitrage checks: discount factors positive, strictly decreasing and ≤ 1; hazards non-negative; survival curve non-increasing; risky annuity positive.
Design intent. published_volatile exists so that genuine market repricings are not
suppressed — the repricing is the signal. Withholding is reserved for curves that are not trustworthy as a
credit measure: a missing curve is a deliberate outcome, never a silently smoothed or backfilled one. Clients
must handle all three states explicitly.
as_of is the prior
trading day, so data may lag the live session by 1–2 days.published, published_volatile (flagged), or withheld. Curves that
fail the gate are flagged or withheld — never silently smoothed or backfilled.