FinObservatory

SEC filings / methodology

Methodology

Everything on these pages comes from the SEC Financial Statement Data Sets, published quarterly by the SEC’s Division of Economic and Risk Analysis from the XBRL exhibits of 10-K and 10-Q filings. The copy here holds 51,057,403 facts across 102,023 submissions from 4,982 companies, the last filed Mar 31, 2026 (quarterly dataset 2026q1). The values are extracted from the filers’ own XBRL exhibits. Nothing on these pages has been audited, restated or corrected by FinObservatory.

The universe

The measured universe is US depository holding companies: submissions with form = '10-K', an SEC-assigned SIC code between 6020 and 6036, and prevrpt = '0' (not superseded by a later amendment). That yields 6,696 filer-years from 900 companies. Where a company has more than one surviving 10-K for the same fiscal year, the one with the latest filing date is kept, so every row in the module is one company in one fiscal year.

The charts start at FY2011 because XBRL was being phased in before that: FY2009 carries 18 bank 10-Ks and FY2010 carries 69, against 597 in FY2011. Per-company pages exist for the 650 companies with at least one 10-K from FY2015 onward.

FY2025 is partial and is labelled so everywhere it appears. It holds 334 filer-years against 358 in FY2024, 24 fewer, because the dataset’s filing window closes Mar 31, 2026 and 10-Ks filed after that date are not in this copy. The latest fiscal year, and the year before it that the coverage tables sit on, are both derived from the data at build time, never typed. Where a page names a year in text it is a fixed historical reference whose filings are long complete (FY2022, or the phase-in years FY2009 and FY2010); the moving vintage is always computed.

The fact cut

Every measured value on these pages is a fact from fsds_num satisfying all five of the following. Each condition is there because dropping it produces a wrong number, not an empty one.

  1. segments and coreg both empty. The consolidated total and every dimension member of it are separate rows in the same table. Of the 51,057,403 facts in the estate, 24,992,393 are consolidated, 24,188,766 carry a segment axis and no co-registrant, and 1,876,244 carry a co-registrant. Summing without this condition counts the same dollar twice.
  2. ddateequal to the submission’s period. A 10-K carries the prior year’s balance sheet under the same accession and the same tag. SVB’s FY2022 10-K carries both a 2021-12-31 and a 2022-12-31 value for each of the two held-to-maturity tags. Without this condition, one filing yields two different answers and no error.
  3. qtrs = 0. Zero means an instant, which is what a balance-sheet item is. A value of 1 to 4 is a flow over that many quarters, and a 10-K carries both the quarterly and the annual duration for many income-statement lines. Nothing in this module is a flow.
  4. uom = 'USD'. The unit column is not always dollars. The estate also holds facts denominated in CAD, GBP, EUR, JPY and CNY, plus share counts and pure ratios. A Canadian-dollar figure entering a US-dollar column would be a silent fabrication.
  5. A curated tag list. Never a pattern match on version. See below.

Why a us-gaap filter is a bug

In these datasets, a fact whose version equals its own accession number is a company extension: an element the filer defined in its own namespace because it judged the taxonomy inadequate. Estate-wide, 5,072,514 of 51,057,403 facts are extensions, 9.9% of the total. A screen written WHERE version LIKE 'us-gaap%' does not fail on those rows. It silently omits them, and the filer vanishes from the result with no error and no empty cell to notice.

The tag lists below are therefore curated by name, and deliberately include extension names. Each list was built by enumerating every tag matching the concept across bank 10-Ks, ranking by the number of filings using it, and keeping the ones that name the consolidated balance-sheet line rather than a maturity bucket, a sub-portfolio or an allowance.

HTM carrying amount, after allowance

The balance-sheet carrying value. Three us-gaap elements and seven extension names. This is the list SVB’s carrying amount is caught by.

  • HeldToMaturitySecurities
  • DebtSecuritiesHeldToMaturityExcludingAccruedInterestAfterAllowanceForCreditLoss
  • DebtSecuritiesHeldToMaturityAmortizedCostAfterAllowanceForCreditLoss
  • DebtSecuritiesHeldToMaturityNetOfAllowanceForCreditLosses
  • HeldToMaturitySecuritiesNet
  • HeldToMaturitySecuritiesNetOfAllowanceForCreditLosses
  • SecuritiesHeldToMaturityNetOfAllowanceForCreditLosses
  • HeldToMaturitySecuritiesNetOfAllowanceForCreditLoss
  • DebtSecuritiesHeldtomaturityNetofAllowanceforCreditLosses
  • DebtSecuritiesHeldToMaturityNetOfAllowanceForCreditLoss

HTM amortised cost, before allowance

Used as the carrying amount only where a filing tags no after-allowance figure on the consolidated face, and flagged “pre-ACL” wherever it is used.

  • DebtSecuritiesHeldToMaturityExcludingAccruedInterestBeforeAllowanceForCreditLoss
  • HeldToMaturitySecuritiesAmortizedCostBeforeOtherThanTemporaryImpairment
  • DebtSecuritiesHeldToMaturityAmortizedCostBeforeAllowanceForCreditLoss

HTM fair value

The note-level fair value of the same book, on the consolidated face. The first name below is a us-gaap element and the other six are extension names.

  • HeldToMaturitySecuritiesFairValue
  • HeldToMaturitySecuritiesExcludingAccruedInterestFairValue
  • DebtSecuritiesHeldtomaturityFairValueNet
  • HeldToMaturityFairValue
  • HeldToMaturitySecuritiesAtAmortizedCostFairValue
  • SecuritiesHeldToMaturityAtAmortizedCostInAllowanceForCreditLossFairValue
  • DebtSecuritiesHeldToMaturityFairValueBeforeAllowanceForCreditLoss

Denominators and context

Parent-only equity is preferred; the including-noncontrolling-interests element is used only where a filing tags no parent-only figure, and flagged where used.

  • StockholdersEquity
  • StockholdersEquityIncludingPortionAttributableToNoncontrollingInterest
  • AccumulatedOtherComprehensiveIncomeLossNetOfTax
  • Deposits
  • Assets

Where a filing tags more than one element from the same list at the same period end, the largest absolute value is taken, on the ground that the consolidated total is the largest of the amounts a filer tags for a concept. Any list curated by hand can miss a name. If a filer tagged its held-to-maturity book with a name not on these lists, this module shows that filer as n/a, and n/a here means unknown.

The gap

For a filer-year with all three legs tagged and positive reported stockholders’ equity, the gap is the fair value minus the carrying amount, and the ratio is that gap divided by the same filing’s equity, in percent. Negative means the market values the book below its balance-sheet carrying value. The aggregate for a fiscal year is the sum of the gaps divided by the sum of the equity, across only the filers with all three legs. It is not an average of ratios.

Accumulated other comprehensive income is shown alongside it because it sits inside equity. The two are different measurements on different filer samples and are never added on any page.

What the module refuses to claim

  • Absence is not zero. An untagged fact is rendered n/a and never zero-filled. No page says a filer “holds no held-to-maturity securities” or “does not disclose” them: these datasets cannot distinguish a filer with no such book from one that did not tag the line on the consolidated face, and the SEC’s own detail flag marks the filings that carry no note-level facts at all.
  • A holding company is not a bank. A CIK is an SEC registrant. The FDIC call reports behind /banks, /deposits and /systemic are insured-subsidiary entities on a different consolidation with different identifiers. This module never joins the two, and no total on these pages should be compared with a total on those.
  • No comparison to non-financial filers. Every submission in this copy of the data carries an SIC code in 6000-6999. There is no manufacturer, retailer or technology filer here, so any claim about how banks tag relative to filers at large is not computable and is not made.
  • A gap is not a loss, and not a prediction. Held to maturity, the securities pay par. The gap measures the distance between reported equity and a mark-to-market equity. Turning that into a solvency claim requires a funding model, which this module does not have and does not pretend to.
  • Values are as filed, not audited. No restatement, no sign or scale correction, no outlier removal. An extreme reading in these tables can be a filer’s own tagging error. Check any figure against the filer’s 10-K on EDGAR before relying on it.

Reproduction

Every aggregate on these pages is precomputed by scripts/build_filings.py into data/parquet/filings_*.parquet. The pages never touch the 51,057,403-row fact table at render time. The script carries the construction rules above in its docstring and the tag lists in its source, so a reader can rerun it and get these exact numbers, or change a tag list and see exactly what moves.