Quant Memo
Core

Structured Extraction From Filings With LLMs

Turning a 10-K or transcript into clean numeric fields is a search-and-verify problem, not a generation problem — treat the model as a fast, fallible reader and check its work.

Prerequisites: Large Language Models

A 10-K buries the number you want — say, guided operating margin for next quarter — inside a paragraph of hedged, lawyer-reviewed prose, on page 40 of 120, phrased differently every filing season. Regex and keyword search break the moment the wording shifts. A large language model reads the sentence like a person would and pulls the number out regardless of phrasing. That's the win. The risk is that it reads the wrong sentence just as fluently, and returns a confident, well-formatted number that is not the one you asked for.

The pattern: narrow the question before you ask it

The reliable approach is not "summarise this filing" but "find this specific field, quote the sentence it came from, and return it in this exact schema." Give the model a JSON schema with named fields — guided_operating_margin_pct, source_quote, fiscal_period — and require every field to be either a value plus the verbatim sentence it was read from, or explicitly null if the filing doesn't state it. Forcing a quote alongside every field turns an unverifiable claim into a checkable one: a human reviewer, or a second automated pass, can confirm the quote actually says what the field claims.

An extraction pipeline is only as trustworthy as its worst silent failure mode. The model returning a wrong number that looks plausible is far more dangerous than it returning nothing, because a missing field gets checked and a wrong field usually doesn't.

Worked example: guidance extraction

Task: pull forward revenue guidance from an earnings call transcript. The relevant sentence reads: "We expect fiscal year revenue to be in the range of $4.2 billion to $4.4 billion, representing growth of roughly 9 to 14 percent."

A well-specified schema asks for revenue_guidance_low, revenue_guidance_high, currency, fiscal_period, and source_quote. A correctly extracted result: {low: 4200000000, high: 4400000000, currency: "USD", fiscal_period: "FY2026", source_quote: "We expect fiscal year revenue to be in the range of \$4.2 billion to \$4.4 billion..."}. Because the quote is present, a reviewer can check in five seconds that the numbers match the source text — versus re-reading the whole transcript to find where a bare number came from.

The failure mode this guards against: an earlier paragraph in the same call mentions a prior-year comparable figure of $3.9 billion. Without a required quote, a model under time or context pressure occasionally attaches the wrong number to the field — extracting the comparable instead of the guidance. The quote requirement doesn't stop the model from making that mistake, but it makes the mistake visible on inspection instead of invisible in a downstream number.

Building the pipeline

  1. Chunk the document by section, not by fixed token count — splitting a guidance sentence across two chunks loses it entirely.
  2. Retrieve the relevant chunk rather than feeding the whole filing; see Retrieval-Augmented Generation. This also keeps cost and latency bounded on long documents.
  3. Extract with a strict schema and require source quotes for every field.
  4. Validate mechanically: does the quote appear verbatim in the source chunk? Does the number parse as the right type? Does the fiscal period match the filing's own metadata?
  5. Sample and hand-check a fixed percentage of extractions every run, the same discipline you'd apply to any new data vendor.

Filing text through step 4 is not evidence of correctness. Mechanical validation checks that the model didn't hallucinate a quote — it does not check that the model chose the right quote out of several plausible candidates in the document. Only a human-labelled sample, checked periodically against fresh filings, tells you the real extraction accuracy.

Log the model version, prompt template and raw response for every extraction. A guidance number pulled today and the same call re-extracted after a model upgrade should match — if it doesn't, that's a silent behaviour change worth catching before it reaches a signal.

Related concepts

Practice in interviews

Further reading

  • Loukas et al., Making LLMs Worth Their Weight in Gold for Financial Extraction (2023)
ShareTwitterLinkedIn