Methodology: OL Private-Credit Stress Index
This page is the methodology specification for an index that is being built, not yet a live figure. It documents exactly how the OL Private-Credit Stress Index will be computed so the method can be reviewed before any number is published. When the index goes live, this banner is removed and the page becomes its permanent methodology of record. See all methodology pages.
What this index is
The OL Private-Credit Stress Index is a single number that summarizes how much of the private-credit book has stopped paying, computed entirely from public filings. Business Development Companies (BDCs) disclose their loan books — every position, its fair value, and whether it is on non-accrual — in a Schedule of Investments filed with the SEC each quarter. Oxford Ledge parses those schedules across its tracked BDC universe and reports the fair-value share of the book flagged non-accrual.
It is the companion stress figure to the OL BDC Credit Spread Index: the spread index measures what lenders are charging; this measures where the losses are landing. It answers a plain question: of every dollar of loan value these lenders hold, how much sits on borrowers that have stopped paying interest?
It is an Oxford Ledge Signal — our own aggregation of public SEC data, not a licensed third-party feed.
Read the rate as a floor, not a census. Non-accrual is disclosed inconsistently across filings, so most parsed positions carry no non-accrual determination at all. The index counts only the positions positively flagged on non-accrual and treats undetermined positions as not-flagged — so the published rate is a lower bound on true stress, bounded by how much of the book actually carries a determination. Every value ships with a detection-coverage figure and a detection-limited flag that say exactly how complete that determination is. This is the single most important honesty caveat on the page.
1. What it is NOT
This index is not a licensed vendor credit-stress or default index, and it is not a live or tradeable series. It is a book-marked, filing-lagged read of one segment of the credit market:
- Private, not public. It describes direct/middle-market loans held by BDCs, not the broad corporate default rate or any traded high-yield index.
- Book, not market. Non-accrual is the manager’s own reported status on a fair-value-marked position, filed quarterly — not a market-priced default probability.
- Lagged, not live. It moves on filing season, not intraday.
Because it is a distinct construct, we always name it “OL Private-Credit Stress Index” and never present it as a licensed default/stress index.
2. The universe
The index is computed over Oxford Ledge’s tracked BDC universe — the Business Development Companies whose Schedule of Investments we parse. Each BDC’s most recent parsed filing contributes its loan-level rows. The Private Credit Directory lists the universe and each issuer’s filing date.
Every position with a positive reported fair value enters the denominator. Positions with no resolvable fair value are excluded — an honest omission, never a filled-in guess.
Recency floor. A BDC’s “most recent filing” can be a stale final book from a filer that has since wound down. To keep the index a read of current conditions, only positions whose filing period falls within the last 15 months are included; a wound-down filer’s two-year-old final book is dropped rather than averaged in.
3. Construction
For the most recent filing per BDC, let fv_i be a position’s reported fair value and let a position be non-accrual when the tri-state bdc_holdings.non_accrual column (schema v156) is TRUE. The headline rate is the fair-value share on non-accrual:
non_accrual_rate = Σ(fv_i : non_accrual) / Σ(fv_i)
The non_accrual column is a nullable tri-state: TRUE = positively on non-accrual; FALSE = positively not; NULL = undetermined. Only TRUE positions count toward the numerator; everything with a positive fair value counts toward the denominator.
Detection coverage (the floor caveat, quantified). Because NULL (undetermined) is by far the most common value in practice, the numerator can only ever catch positions positively flagged — so the rate is a floor. Every value therefore carries a detection block: coverage is the fair-value share of the book that carries an affirmative determination (TRUE or FALSE, i.e. not NULL), and detection_limited is set when that coverage is below half the book. A low coverage with a low rate means “little detected stress and little detection” — not “a clean book”. A real book with zero confirmed non-accruals reports a 0.0% floor with detection_limited set, never a fake-clean absence.
The rate is also published split by lien seniority — a Senior Secured non-accrual rate and a Subordinated non-accrual rate — using the same buckets as the spread index. These track the actual lien_position vocabulary the filings encode (Senior Secured / Subordinated, with other/unlabeled positions counting toward the headline but neither sub-bucket); we deliberately do not label them “first lien / junior”, which would overstate the source’s granularity. A subordinated rate rising faster than the senior rate is a subordinated-book stress signal.
The count and total fair value of non-accrual positions are reported alongside the rate, so the reader sees the raw magnitude, not only the ratio.
4. Cadence, as-of, and coverage
BDCs file quarterly, and a Schedule of Investments is disclosed weeks after the quarter it describes. The index is therefore a filing-season series, not a daily one. Every published value carries:
- an as-of range — the filing periods the underlying rows describe;
- a coverage count — how many BDCs and positions contributed;
- a provenance stamp — “OL-derived from SEC EDGAR (public)”.
5. Limitations (read before relying on it)
- Detection-limited — the rate is a floor. Most positions carry no non-accrual determination, so the rate understates true stress by construction. Always read it next to the
detection.coveragefigure and thedetection_limitedflag; a low rate under low detection coverage is not evidence of a clean book. - Manager-reported status. Where a non-accrual determination exists it is the manager’s determination as filed, not an independent adjudication.
- Mix effects. The book changes as loans are added, repaid, and restructured; a moving rate partly reflects a changing portfolio, not only fresh stress.
- Universe-bounded. It describes the tracked BDC universe, a large representative sample of private credit, not a census.
- Lagged. It is a quarterly, filing-lagged read, unsuitable for any use that needs a current-day number.
6. Provenance and reproducibility
Every input is a public SEC filing. The parse, non-accrual detection (v156 / data/bdc_non_accrual.py), and the stress aggregation (pg_db/queries/bdc_stress_index.py, Phase-1) are Oxford Ledge’s own code. Because it is a substantial first-party aggregation over thousands of parsed positions — not a copy of any source series — the resulting index is an Oxford Ledge Signal we own and may publish and cite freely.
Changelog
| Date | Change |
|---|---|
| 2026-07-21 | Methodology drafted (Phase-1 specification). Index not yet live. |
| 2026-07-21 | Hardened for the CHAOS+DATA_CZAR real-PG sparsity finding: rate labeled a detection-limited floor with a published detection.coverage / detection_limited disclosure; lien split relabeled Senior Secured vs Subordinated (tracks the actual filing vocabulary); 15-month recency floor added to drop wound-down filers. |