Project Record
Debt Note Bond Extraction
PDF debt-note extraction and Markit bond matching—linking ISIN-level disclosures in filings to issuer reference data and quarterly financials.
Executive Summary
Credit analysts working through quarterly and annual filings often need bond-level detail—ISINs, coupons, maturities, issue sizes—that does not always appear cleanly in market reference feeds. Debt-note sections in issuer PDFs carry that information, but the text is unstructured, inconsistently formatted, and hard to reconcile against vendor bond universes.
I built a pipeline that isolated debt-note disclosures from PDF filings, extracted bond-level fields with a mix of natural language processing and regex tuned to classical bond notation, and matched the results against Markit’s issuer and instrument coverage. The system surfaced cases where filings contained bonds Markit did not list, where vendor records were incomplete, and where reported financials could be tied back to specific ISINs. That gave the desk a richer debt picture than standard market data alone.
This demonstrates document extraction for fixed-income research, probabilistic entity matching against reference data, and end-to-end linkage from unstructured filings to structured bond and financial records.
Problem
Debt-note tables in PDF filings are semi-structured at best: ISINs may appear inline with issue names, coupon rates use mixed decimal conventions, and maturity dates are written in several formats. Markit provides strong bond and issuer reference coverage, but it is not always complete or current for every name in a credit book—especially private or thinly followed issuers.
We need a system that (1) locates and extracts the debt-note section from a filing PDF, (2) parses bond-level attributes from noisy text, (3) normalizes identifiers and notation to a common schema, (4) matches extracted records to Markit instruments and issuers, and (5) flags gaps where filings and vendor data disagree.
Extraction Pipeline
Let be the raw text extracted from a filing PDF. The pipeline first isolates the debt-note block using section-heading heuristics (e.g. “Notes to the financial statements”, “Borrowings”, “Debt securities”) and layout cues from the upstream PDF parser.
Within , each candidate bond mention is parsed into a tuple:
where is coupon, maturity, notional or face value, and is the issue label. Extraction combines:
- ISIN regex — strict 12-character alphanumeric pattern with check-digit validation where possible.
- Bond notation regex — coupon and maturity patterns common in fixed-income tables (e.g.
5.25% 2028,FRN 2031,€500m). - NLP span tagging — context windows around currency symbols, “senior”, “secured”, and issuer legal names to recover fields when table structure breaks across lines.
Normalized output records invalid or partial tuples for review rather than silently dropping them.
Matching Rule
Let be the Markit reference set of instruments indexed by ISIN, and the extracted bond set for a filing. Matching proceeds in stages:
Stage 1 — ISIN join. For each with valid , look up . A direct hit assigns confidence .
Stage 2 — Fuzzy attribute match. When ISIN is missing or unmatched, generate candidates blocked by issuer legal name and currency, then score:
where is string similarity (e.g. Jaro–Winkler) and , are tolerance bands on coupon and maturity. Assign to when the score exceeds threshold ; otherwise route to manual review.
Stage 3 — Coverage diff. Unmatched extracted bonds and unmatched Markit instruments for the same issuer form a symmetric diff—surfacing bonds disclosed in filings but absent from Markit, and Markit listings with no filing mention in the current period.
Implementation
- Inputs: PDF filings from the earnings capture pipeline (see Calendar of Earnings) or manual upload; Markit bond and issuer reference extracts.
- Text layer: upstream PDF-to-text normalization via the Research Document Data Pipeline.
- Section isolation: heading and keyword gates to extract debt-note spans; fallback to full-document scan when section boundaries are ambiguous.
- Field extraction: regex templates for ISIN, coupon, maturity, and notional; NLP for issuer name and security-type qualifiers.
- Reference join: ISIN-first match, then fuzzy attribute scoring within issuer blocks; confidence labels (
matched,provisional,unmatched). - Outputs: structured bond table per filing, Markit coverage diff, and linkage keys to quarterly/annual financial line items for the same reporting entity.
- Review queue: low-confidence matches and coverage gaps routed for analyst confirmation before downstream consumption.
Trade-offs
PDF layout variance is the main failure mode—multi-column tables, footnote breaks, and scanned pages degrade extraction accuracy. Regex handles classical bond notation well but breaks on non-standard labels or embedded footnotes. Markit coverage is strong for liquid names but incomplete for private issuers; the filing often becomes the authoritative source in those cases, not the vendor feed. Fuzzy matching improves recall but can conflate similar tranches from the same issuer if coupon and maturity are close; ISIN extraction quality is therefore the highest-leverage field. Human review on provisional matches is intentional—the goal is analyst-grade linkage, not fully unattended ingestion at any cost.