Methodology
We show our work.
Every number on SpreadVista traces to a specific SEC submission, is checked against that filer's own stated totals, and carries a quality tier. When a filing can't be corroborated, we withhold it rather than serve it. This page documents exactly how — including the parts that don't flatter us.
Every figure below was measured against the live SpreadVista dataset on September 6, 2026.
Read that denominator precisely: we serve 1,180 filing-periods. Of those, 1,110 carry a filer-stated grand total we can reconcile against, and the accuracy figures above describe exactly those. The rest are covered in section 2 — we'd rather show you the gap than average it away.
1. Extraction: the filer's own tags, not our guesses
Since August 2022, the SEC has required business development companies to tag every Schedule of Investments position in machine-readable iXBRL (the closed-end fund tagging rule). SpreadVista reads those tags directly — fair value, cost, principal, spread, rate floor, maturity — rather than scraping PDF tables or estimating. The credit funds — interval, closed-end, bank-loan mutual and ETF — are ingested from their structured N-PORT XML, which is filer-tagged at source.
Coverage is 88 BDCs (49 exchange-listed and 39 non-traded) plus 55 credit-focused funds — 26 interval funds, 10 closed-end funds, 15 bank-loan mutual funds and 4 ETFs — from August 2022 onward. BDC data currently runs through June 2026. Most funds run through April 2026; one wound-down fund's holdings end at June 2024 (its final N-PORT, September 2024, reported an empty portfolio). Fund fiscal quarter-ends are staggered across the calendar and N-PORT reaches us on a longer lag than BDC 10-Qs, so the fund side trails.
We deliberately do not serve pre-2022 BDC data. Before mandatory tagging there is no machine-verifiable, filer-attested source for position-level numbers, and we don't serve what we can't verify.
2. Cross-validation: every filing checked against itself
After extraction, filings pass through an attestation pipeline that reconciles our position-level extraction against the filer's own totals and subtotals from the same submission. The comparison target is never our opinion; it is what the filer itself stated. A filing whose iXBRL cannot be parsed at all never reaches attestation — it is quarantined on the spot. Everything that parses gets these eight checks (the re-attestation exception is described under PASS, below):
- ·
grand_total_fv_matches— our summed fair value equals the filer’s own stated total - ·
grand_total_cost_matches— our summed cost equals the filer’s own stated total - ·
by_instrument_type_sums_match— per-instrument-type subtotals reconcile to the filer’s - ·
pct_of_nav_sums_to_100— the filer’s own percent-of-NAV column sums as it should - ·
position_count_within_bounds— the position count is plausible for this filer and period - ·
no_leaked_subtotals— no filer subtotal row was mistaken for a position (double-count guard) - ·
issuer_completeness— positions carry an issuer identity - ·
instrument_type_completeness— positions carry an instrument type
A check is skipped when the filer didn't tag the fact it needs — we can't compare against a total the filer never published. Each filing then receives a tier:
- PASS — neither of the two critical total-reconciliation checks failed (722 filing-periods). The other checks are diagnostic and do not downgrade the tier, so PASS is a statement about totals, not a clean bill of health: 679 of those 722 filings have at least one non-critical check failing (most often instrument-type completeness), and only 43 have no failing check at all. PASS also does not mean everything was compared — 349 had at least one check skipped for want of a filer-tagged fact (41 of them published no grand total at all), leaving 373 where all eight checks ran and none was skipped. A separate 0 are the curated-rows re-attestations of August 2026: their served rows were re-verified directly against the filer's own stated total, so they carry that one critical check plus a provenance note rather than the full eight — recorded honestly as two checks, not as seven silent skips. For every other PASS, at least one check failed non-critically or was skipped for want of a filer-tagged fact.
- PARTIAL — served with a known, quantified residual, typically a section the filer didn't machine-tag (429 filing-periods, roughly 36% of what we serve). The tier travels with the data, so you see the confidence, not just the number.
- QUARANTINE — the extraction could not be corroborated, so the filing is withheld from every position, mark, and aggregate view. 73 filing-periods are currently withheld. Their rows do still feed the field-coverage percentages — the per-chart “coverage” badges and the data-quality view — which measure the raw extraction table on purpose, so a coverage collapse inside a withheld filing stays visible instead of disappearing with it. A blank is honest; a guess is not.
- No attestation — 29 served filing-periods carry no attestation record at all (~$50B of served fair value). Most sit at the coverage floor (19 of the 29 are Q3 2022), but not all: PSEC's September 2023 filing ($7.6B) is unattested while 65 other filings from that same quarter were attested. That is a coverage gap on our side, not a filer problem. They are served and they are not cross-validated — listed here rather than hidden inside a headline average.
Those four tiers account for every one of the 1,180 served filing-periods: 722 PASS, 429 PARTIAL, 29 unattested, and 0 whose governing attestation is a QUARANTINE we serve anyway. A period is tiered by the attestation of the filing that actually produced the rows we publish. Where a period has more than one submission, one we could not corroborate does not restate that tier — whether we got no positions out of it (most of the ones we set aside yielded none to our extractor) or it carried a schedule of its own that we quarantined. In most of these cases the submission we set aside is a later amendment, so for those periods the rows we publish are the original filing's. That is a limit of what we could corroborate, not a judgement that the amendment is empty — elsewhere we do serve amendments, where they extract and reconcile.
Across the 1,110 filings with a filer grand total to compare against, what we serve sums to $4.99T against $4.99T of filer-stated totals — a median absolute gap of 0.21% per filing. Don't read those two totals as a sub-1% aggregate error: they net offsetting differences. Summed without regard to sign, the per-filing gaps come to about $8B, or 0.2% of the filer total.
3. Entity resolution: one borrower, one identity
The same borrower is spelled differently by different managers — “Acme Holdings, LLC” in one filing, “ACME HOLDINGS INC” in another. SpreadVista's resolution table holds 93,599 recorded name variants; 54,358 of the credits they resolve to are referenced by a live position or fund holding. Matching uses LEI codes, CUSIP identifiers, and conservative name matching, so a mark comparison compares the same credit rather than a naming artifact.
The honest distribution: the median credit has just one spelling and the average has 1.49 (1.77 among the 45,814 referenced credits that carry any recorded variant), while our most-spelled issuer (MRI Software, LLC) appears under 49 variants. Most of the work is concentrated in a minority of heavily-syndicated borrowers — which is exactly where cross-manager comparison matters most.
Matching is deliberately conservative: we would rather leave two spellings unmerged than merge two genuinely different borrowers. That means some fragmentation remains, and the count above is credits referenced by a live position or fund holding.
Where you'll see this on charts: dashboard trend charts label their counting basis. Canonical-issuer basis (the all-BDCs view) counts each resolved credit once across the whole universe and excludes the trailing in-progress quarter until enough BDCs have filed. Issuer-name basis (any filtered view) counts names as each selected BDC reports them — the same borrower under different spellings can count more than once — and includes the in-progress quarter. The two views deliberately don't reconcile; the caption on each chart tells you which one you're reading.
4. Marks: computed, implied, and compared honestly
A BDC mark-to-par (filed FV ÷ par) is computed by SpreadVista from the fair value and principal the filer tagged — the filing states those two numbers, not the ratio. Fund holdings don't report a headline mark either, so we derive an implied mark — value divided by principal — with one consistent method across managers, and label it as implied wherever it appears.
Cross-manager comparison is seniority-aware: first lien is compared with first lien, so dispersion reflects genuine disagreement rather than tranche mix. Aggregate views exclude artifact endpoints — commitment-shaped rows, composition flips, and bucket migrations are gated out of mover and dispersion calculations so a data mechanic never masquerades as a market signal.
Every mark links to the SEC submission it came from. If you doubt a number, the primary source is one click away — that is the product working as intended.
Non-accrual status is harvested the same way: from the filer, per loan. BDCs footnote each non-accrual position in their iXBRL schedules; we follow those footnote links to the exact positions and compute non-accrual share bottom-up — at amortized cost and at fair value, with every flagged loan named. Where we validated against managers' own stated aggregates, the bottom-up figure matches to the tenth of a percent. Flags are tri-state honest: a loan is marked non-accrual only on the filer's positive evidence — absence of a footnote is never presented as “performing.”
5. What we don't do, and what we can't yet
- We don't impute missing filer-reported values. Missing is shown as missing. Derived figures — implied marks — are computed by a published rule and labeled as derived.
- We don't serve pre-2022 BDC data (no filer-attested source exists).
- We don't serve filings that fail cross-validation.
- We don't average away the weak spots: the unattested, skipped-check, and PARTIAL counts are published above rather than folded into a single accuracy number.
How a mark is denominated. A mark is fair value over the position's principal basis. Usually that is the filer's stated par. Three cases are not: a foreign-currency position states par in the face currency while fair value is in USD, so dividing one by the other returns an exchange rate rather than a price; a revolver or delayed-draw loan states the full facility commitment rather than the funded balance, which makes a healthy undrawn line look distressed; and some filers stop tagging the principal amount altogether. All three are measured against the position's USD amortized cost instead of its stated par. For foreign-currency positions that substitution is imperfect — it embeds currency movement since the loan was made — so where a period-end European Central Bank reference rate is available we convert the par to USD and measure against that directly. BDC filings state a position's currency but never the rate they applied, which is why that conversion needs an outside source at all.
Where we withhold a mark. BDC marks are published between 5% and 120% of that basis and left blank outside it. Below 5% the stated denominator is usually not a principal at all. The 120% ceiling is deliberately conservative rather than economic: where a filer did not tag a position's currency we cannot tell a genuine premium from an exchange rate, and those two look identical in the number alone. It is not a claim that marks above 120% are wrong — it is an admission that above 120% we cannot tell, and we would rather show a blank than a number we cannot stand behind. That ceiling rises as currency coverage improves.
Known limitations, stated plainly: categorical fields (industry, instrument type) are harvested from filer text and vary in coverage by filer; entity resolution is conservative but probabilistic and some borrower spellings remain unmerged; implied marks can differ mechanically from BDC-side marks (accrued interest, partial funding, currency); a foreign-currency position measured against amortized cost rather than a converted par embeds currency movement since the loan was made; and where a filing tags a position’s currency incorrectly or not at all, we represent what the filer tagged rather than overriding it on suspicion — so an occasional mark can carry the filer’s own tagging error; fund data lags BDC data. Verify anything decision-critical against the filings we link.
Judge the data yourself.
Free to research — pick any credit you know and check our numbers against the filings we link.
Create free account.