FinObservatory

Bank health / Methodology

The FinWeave Composite: a public bank-health score

Version 1.0, computed 2026-07-10 by scripts/build_bank_scores.py. Input: data/parquet/fdic_financials.parquet (FDIC BankFind Suite call-report financials, 2015Q1-2026Q1, provenance in docs/data_provenance.md). Output: data/parquet/bank_scores.parquet.

What this is (and what it is NOT)

The FinWeave Composite is a transparent, reproducible bank-health score computed entirely from public FDIC call-report data. For every FDIC-insured institution in every quarter it produces five component scores and one composite, each on a 0-100 scale where higher = financially stronger, expressed as a peer-percentile rank within an asset-size peer group.

It is NOT a CAMELS rating. CAMELS is the confidential supervisory rating assigned by US bank examiners (FDIC, OCC, Federal Reserve) using on-site examination and non-public information. CAMELS ratings are never disclosed. The FinWeave Composite borrows the five public analytical dimensions that the CAMELS letters name (Capital, Asset quality, Earnings, Liquidity, and a Sensitivity proxy) because those are the standard lenses for reading a call report, but it is a model-derived proxy built only from data any member of the public can download. Do not present it, cite it, or label it as CAMELS.

This is not investment advice and not deposit advice. A high score is not a solvency guarantee and a low score is not a prediction of failure. See the mandatory caveats at the end, and read the honest backtest note first: in the 2023 US bank failures, public call-report ratios rated the failing banks as strong on four of five components until the quarter they failed.

Design principles

  1. Public data only. Every input traces to a named FDIC field documented in data/raw/fdic_financials/SOURCE.md. No proprietary, modeled, or market-implied inputs enter the composite.
  2. Peer-relative, not absolute. A ratio is only informative against comparable institutions. Every metric is a percentile rank within an asset-size peer group in the same quarter (UBPR peer-group spirit), so a $80M rural bank is judged against other small banks and a $200B regional against its own tier.
  3. Higher = stronger, always. Metrics where a lower raw value is healthier (noncurrent loans, efficiency ratio, loans-to-deposits, brokered dependence, growth extremity) are oriented so that the 0-100 output still reads "higher = stronger" after inversion. There is exactly one reading direction.
  4. Honest missingness. A missing input yields a null metric and a reweighted component; a bank missing too many components gets a null composite rather than a fabricated one (rule below).
  5. No hidden numbers. Every ratio is either a native FDIC field (named) or computed from named FDIC dollar fields by a formula printed below.

Peer groups

Assigned per bank per quarter from that quarter's own total assets (ASSET_THOUSANDS_USD), so a bank moves tiers as it grows. Five tiers, cut on round-dollar thresholds in the UBPR tradition:

TierTotal assetsCount, 2022Q4
1< $100M796
2$100M - $1B2,978
3$1B - $10B837
4$10B - $250B149
5>= $250B13

Boundaries are half-open [lower, upper): exactly $100M falls in tier 2, exactly $1B in tier 3, etc. (thresholds in thousands: 100000, 1000000, 10000000, 250000000). Percentiles are computed within (tier, quarter). The >= $250B tier is small (13 banks in 2022Q4), so its percentiles are coarse by construction; this is disclosed on any bank page in that tier rather than hidden.

Components and metrics

Each component score is the equal-weighted mean of its available metric percentiles. Each metric is percentile-ranked within (peer group, quarter): raw values are oriented so higher = stronger (inverted metrics negated first), then ranked with pandas.rank(pct=True, method='average') * 100, giving a roughly uniform 0-100 within each peer-quarter. Fields are the FDIC codes in data/raw/fdic_financials/SOURCE.md.

Capital (weight 0.25)

MetricFDIC field / formulaDirection
Tier-1 leverage ratioRBC1AAJ_PCT (Leverage Ratio - PCA)higher = stronger
Total risk-based capital ratioRBCRWAJ_PCT (Total RBC Ratio - PCA)higher = stronger

Both fields are populated for 100% of the 236,016 bank-quarters. The CET1 ratio (RBCT1CER_PCT) and Tier-1 risk-based ratio (RBC1RWAJ_PCT) are deliberately excluded from the primary composite: both are null for 18.8% of bank-quarters because banks that elected the Community Bank Leverage Ratio (CBLR) framework from 2020Q1 stop reporting risk-based ratios entirely (documented in data/raw/fdic_financials/SOURCE.md). Including a metric that is structurally absent for a fifth of small banks would make the capital component silently non-comparable across the CBLR cutover, so the two universally-reported capital ratios carry the component.

Asset quality (weight 0.25)

MetricFDIC field / formulaDirection
Noncurrent loan ratioNCLNLSR_PCT (noncurrent loans / gross loans)lower = stronger (inverted)
Nonperforming assets ratioNPERFV_PCT (nonperforming assets / total assets)lower = stronger (inverted)
Reserve coverage of noncurrent loansLNATRES_THOUSANDS_USD / NCLNLS_THOUSANDS_USD * 100higher = stronger

Reserve coverage is the classic allowance-to-noncurrent-loans coverage ratio. It is undefined when a bank has zero noncurrent loans (NCLNLS = 0, 817 of 4,773 banks in 2022Q4). For those banks the coverage metric is null and the asset-quality component is the mean of the remaining two metrics; this does not penalize them, because a bank with zero noncurrent loans already sits at the top of the noncurrent-ratio percentile. Net charge-off rate, a fourth natural asset-quality metric, is not in this dataset's field set (the FDIC NTLNLSR net-charge-off series was not fetched) and is therefore omitted, not approximated.

Earnings (weight 0.20)

MetricFDIC field / formulaDirection
Return on assetsROA_PCThigher = stronger
Net interest marginNIMY_PCThigher = stronger
Efficiency ratioEEFFR_PCT (noninterest expense / revenue)lower = stronger (inverted)

All three are populated for 100% of bank-quarters.

Liquidity (weight 0.15)

MetricFDIC field / formulaDirection
Liquid-asset ratio(SC_THOUSANDS_USD + CHBAL_THOUSANDS_USD) / ASSET_THOUSANDS_USD * 100higher = stronger
Loans-to-depositsLNLSDEPR_PCT (net loans / deposits)lower = stronger (inverted)
Brokered-deposit dependenceBRO_THOUSANDS_USD / DEP_THOUSANDS_USD * 100lower = stronger (inverted)

Liquid assets are proxied by securities plus cash and balances due from depository institutions, a standard public-data liquidity proxy; the true liquidity-coverage-ratio inputs (high-quality-liquid-asset haircuts, 30-day net outflows) are not in call-report summary data. Brokered-deposit dependence is null for the 765 bank-quarters (17 foreign-branch / trust CERTs) that do not report BRO; those banks' liquidity component uses the other two metrics.

Growth / Sensitivity proxy (weight 0.15)

MetricFormulaDirection
Asset-growth stability-abs(asset_growth_yoy - peer_median_growth)higher (nearer peer median) = stronger

where asset_growth_yoy = (ASSET_t - ASSET_{t-4q}) / ASSET_{t-4q} * 100 and peer_median_growth is the median YoY asset growth within the same (peer group, quarter). Both unusually fast growth and unusually fast shrinkage land in the weak tail; a bank growing near its peer median is scored stable.

Why this is a proxy and true rate-sensitivity is not computable here. The "S" in CAMELS is sensitivity to market risk, principally interest-rate risk: the duration gap between assets and liabilities, and unrealized losses on available-for-sale and held-to-maturity securities relative to capital. That is precisely what public FDIC summary fields in this dataset cannot see. The call-report field for net unrealized gains/losses on securities that argus's collector referenced (IDTRCK) does not exist in the current BankFind financials dictionary and returns nothing (verified 2026-07-10, documented in data/raw/fdic_financials/SOURCE.md). Absent that field, a duration gap or an AFS/HTM unrealized-loss-to-capital ratio cannot be built from this dataset. Rapid balance-sheet growth is the one interest-rate-risk-adjacent signal that public data does expose (fast growth is frequently funded by rate-sensitive liabilities and invested in longer-duration assets), so the Sensitivity slot is filled by an asset-growth-extremity proxy and labeled honestly as such. A future version that ingests the securities-detail call-report schedule (RC-B) could replace this proxy with a real unrealized-loss ratio; until then, the S component measures growth extremity, not market-risk sensitivity.

Composite

composite = ( 0.25*Capital + 0.25*AssetQuality + 0.20*Earnings
            + 0.15*Liquidity + 0.15*Sensitivity ) / (sum of weights present)

All five components are on the same 0-100 higher-is-stronger scale, so the composite is too. The weights follow the standard supervisory emphasis (solvency = Capital + Asset quality = 50%; operating performance and risk position the rest); they mirror the weights argus's internal proxy uses and are stated here so they can be contested. They are a modeling choice, not a regulatory constant.

Missing-component rule (documented and enforced): a component is "present" if at least one of its metrics is non-null (for Sensitivity, if the year-ago quarter exists so growth is computable). If >= 4 of 5 components are present, the composite is the weighted mean over the present components with weights renormalized to sum to 1. If fewer than 4 components are present, the composite is null (no score is invented from too little data). The count of present components is stored alongside every row (n_components).

Historical ratio trends (1992+) and why the composite starts 2015

The per-bank scorecard (/banks/[cert]) charts the raw call-report ratios back to 1992Q1 where FDIC reports them, and the FinWeave Composite from 2015Q1 only. The two panels share one quarterly x-axis, so the composite panel shows a gap over 1992-2014 rather than a fabricated pre-2015 score.

  • Ratio history source. The ratios union two FDIC parquet files: fdic_financials_hist (1992Q1-2014Q4) and fdic_financials (2015Q1-latest), in src/lib/banks.ts (bankTrend). Both carry the identical 38-column BankFind-Suite schema; all six charted ratio fields (RBC1AAJ_PCT tier-1 leverage, RBCRWAJ_PCT total risk-based capital, NCLNLSR_PCT noncurrent loans, ROA_PCT, NIMY_PCT, LNLSDEPR_PCT loans-to-deposits) are DOUBLE in each file, so the union needs no cast.
  • Seam continuity. The seam is continuous and non-overlapping: the historical file ends exactly 2014-12-31, the current file starts exactly 2015-03-31, and there are zero shared (CERT, REPDTE) keys across the two files (verified globally, not just for large banks; the seam proof and the JPMorgan crossing are in docs/data_expansion_2026_07.md, deep-estate manifest).
  • Per-field, first-available honesty. Every ratio is passed through as-is. A field FDIC does not report for a given bank-quarter is rendered as a line-break gap, never a zero, and never carried forward. (For these six ratios FDIC in fact populates the full 1992+ window, so no pre-start gap arises within it; the no-coalesce rule still governs any future field or any bank-quarter FDIC leaves blank.)
  • Why scores stay 2015+ (a deliberate limit, not a data gap). The FinWeave Composite is a peer-percentile score: each bank is ranked against its contemporaneous asset-size peer group each quarter. Extending it before 2015 is not a matter of re-running the formula on older rows: it requires rebuilding the peer-group percentile panel over 1992-2014 and confirming the peer cuts, the CBLR-era capital-field discontinuity, and the metric definitions are comparable across a period spanning Basel I, Basel II and Basel III. That peer-percentile comparability work is a future slot, not done here. Back-filling an incomparable score would be worse than an honest gap, so the composite is left null before 2015Q1 and the panel shows the gap.
  • X-axis readability. With a 1992-2026 union the small-multiple panels span ~35 candidate year labels; RatioTrendChart thins the year ticks by x-position (keep a year only when it clears the previous kept label by a fixed viewBox gap), the same approach as SystemicTimeChart, so labels never collide at any span.

Distribution note (expected shape, verified)

By construction each metric percentile is uniform on 0-100 within its peer-quarter (it is a rank). A component score is the mean of two or three such metrics, so it is already mildly central, not perfectly flat; the composite is a weighted mean of up to five components (up to twelve metrics), so by the central-limit effect it is not uniform: it is bell-shaped and concentrated toward the middle, because a bank rarely sits in the same tail on all dimensions at once. Verified on 2022Q4 (4,773 banks): the composite deciles run [0, 11, 149, 709, 1417, 1533, 737, 189, 28, 0] (a clear central hump), with composite standard deviation 11.4 against a single-component standard deviation of 20.2. Every peer group's median composite sits at ~50 in every quarter (the 10B-250B tier median is 49.8-50.9 across 2021Q1-2023Q1), the expected fixed point of a percentile construction. This central shape is a mathematical consequence of averaging, not a defect.

Honest backtest: the 2023 US bank failures

The sternest test of a public-data health score is whether it saw the 2023 failures coming. It largely did not, and saying so plainly is the point.

Three banks failed in spring 2023: Silicon Valley Bank (CERT 24735, failed 2023-03-10), Signature Bank (CERT 57053, failed 2023-03-12), and First Republic Bank (CERT 59017, failed 2023-05-01). Their last call reports before failure were 2022Q4 (SVB, Signature) and 2023Q1 (First Republic).

Every FinWeave Composite below is computed by scripts/build_bank_scores.py; the peer-tier (10B-250B) median composite is ~50 in every quarter, so a score above 50 means the model rated the bank above average for its size. The result differs sharply by bank, and the differences are the honest lesson.

Silicon Valley Bank (the failure the composite missed). SVB's composite did not fall into failure, it rose: 47.7 (2021Q1) to 63.5 (2022Q4, its last report), ending well above its peer-tier median of 50.0. Its public solvency ratios looked strong and improving throughout: Tier-1 leverage rose 6.4% -> 8.0%, total risk-based capital 11.5% -> 16.1%, noncurrent loans a pristine 0.19%, ROA ~0.96%, efficiency improving 55 -> 46, and loans-to-deposits a deposit-rich 42% that scores as highly liquid (its liquidity component ran 86-95 out of 100). The one component that flagged SVB was the growth proxy: it grew assets +90% YoY through 2021 against a peer median near 10%, driving its Sensitivity score to 1-7 (deep weak tail) in 2021. But that signal faded exactly when the danger peaked: as growth decelerated to ~0% by late 2022, the Sensitivity score recovered to 57-74, and the composite climbed. On the eve of failure the public composite rated SVB an above-average bank for its tier. This is the central cautionary result: the growth flag fired a year early and then went quiet, while the actual killer (unrealized HTM-securities losses against an uninsured, concentrated deposit base) was never visible in these fields.

First Republic (the failure the composite did flag). First Republic's composite sat below its peer median in every quarter from 2021Q1 and deteriorated into failure: 42.1 -> 46.9 -> 42.3 (2022Q4) -> 36.7 (2023Q1). It was dragged down by a persistently weak liquidity component (28-38 out of 100: high loans-to-deposits, thin liquid assets) and weak earnings (11-34), and the 2023Q1 report shows the run in progress, loans-to-deposits exploding to 165% and brokered dependence to 6.8% as stable deposits were replaced by borrowing. Here public data did rate the bank a persistent laggard.

Signature (mixed). Signature's composite ran below to around its peer median (36.7-52.8), held down by a weak capital percentile (45.7 in 2021Q1, then 12-28 in every later quarter). The growth proxy caught both its 2021 expansion (+60-69% YoY) and its 2022Q4 contraction (-6.8% as deposits fled), and its brokered-deposit dependence climbed 1.2% -> 4.3% over 2022; its composite ended at 42.7, below the ~50 median.

The honest conclusion. The record is split, and honestly so: the composite flagged First Republic as a persistent below-median laggard, gave a mixed reading on Signature, and missed SVB entirely, rating it above average right up to failure. What sank all three, large unrealized losses on long-duration securities against a concentrated, uninsured, rate-sensitive deposit base, is exactly what public FDIC summary call-report fields in this dataset cannot see (the unrealized-securities-loss field is absent from the API; deposit-insurance concentration is not a summary field). The one public tell for SVB, explosive growth, is a leading signal that normalizes before the run, not a distress signal at the point of failure. The FinWeave Composite is therefore useful for peer-relative screening and for spotting growth and funding extremities, but it is not an early-warning system for duration-driven runs and must never be presented as one. That a transparent public score rates the most famous bank failure of the decade as above-average the quarter before it failed is the strongest possible argument for the "not CAMELS, not advice" framing this document insists on.

Mandatory caveats

  • Not CAMELS. Computed from public FDIC data; it is not the confidential supervisory CAMELS rating and has no supervisory standing.
  • Not investment or deposit advice. Not a solvency guarantee, not a failure prediction, not a recommendation to place or withdraw deposits or to buy, sell, or hold any security.
  • What public data cannot see (and this score therefore omits): management quality and governance; examination findings and enforcement actions; interest-rate duration gaps and unrealized AFS/HTM securities losses relative to capital (the proximate cause of the 2023 failures); uninsured- and concentrated-deposit exposure beyond published totals; funding concentrations and contingent liquidity lines beyond the brokered-deposit total; off-balance- sheet and derivative risk detail; intra-quarter dynamics (all data is quarter-end snapshots); and fraud.
  • Peer-relative, so composition-dependent. A bank's percentile can move because its peers changed, not because it did. The >= $250B tier is small, so its percentiles are coarse.
  • Proxy components are labeled. The Sensitivity component measures asset- growth extremity, not market-risk sensitivity; the liquidity component uses public proxies, not the regulatory Liquidity Coverage Ratio.
  • Reproducible. Every number is recomputable from fdic_financials.parquet by scripts/build_bank_scores.py; every input field is named in data/raw/fdic_financials/SOURCE.md.

EU banks: the EBA EU-wide Transparency Exercise (no FinWeave score)

The /banks/eu page is a separate, non-scored view. It reproduces bank-level figures that the European Banking Authority (EBA) already publishes for market-discipline purposes, exactly as published. It does not apply the FinWeave Composite, or any other FinWeave-modelled score, to EU banks. Read the two halves of this document accordingly: everything above is the US composite; this section is a published-disclosure passthrough.

Exercise lineage

The source is the 2025 EU-wide Transparency Exercise, published by the EBA on 2025-12-04. It is the most recent full bank-level publication: the EBA runs its EU-wide stress test biennially in odd years, so there is no separate 2026 exercise, and no newer Transparency Exercise vintage had been published at build time. The exercise carries four quarterly reference dates (2024-09-30, 2024-12-31, 2025-03-31, 2025-06-30); /banks/eu shows the latest, 2025-06-30, discovered from the data rather than hardcoded. The universe is 119 banks across 25 EU and EEA countries. FinWeave's own country tally (25) and bank count (119) were computed from the parquet first and then found to match the EBA's own summary text, not copied from it. Full retrieval provenance, item and dimension code tables, and the four-bank verification evidence live in data/raw/eba/SOURCE.md and in docs/data_provenance.md.

What each displayed figure is (EBA dictionary definitions)

Every value resolves to an EBA data-dictionary item, looked up by its label text against the exercise's SDD.xlsx item dictionary at build time (item codes are never hardcoded as trusted numbers):

  • CET1 ratio (transitional): "Common Equity Tier 1 capital ratio (transitional period)": CET1 capital over the total risk exposure amount, on the transitional basis.
  • Leverage ratio (transitional): Tier 1 capital over the total leverage exposure, transitional basis.
  • Total assets: FINREP total assets, EUR millions.
  • Gross loans and advances, and the nonperforming subset: the FINREP NPE-template figures used to derive the NPL ratio.
  • NPL ratio: nonperforming gross loans and advances over total gross loans and advances. This is a mechanical ratio of two EBA-published components, recomputed in the parquet build and re-verified against the EBA's own per-bank PDF (for Deutsche Bank: gross loans 749,836.12, nonperforming 15,923.31, ratio reproduced from scratch). It is not a FinWeave-modelled score.
  • Total risk exposure amount (RWA): used only as the weight for the aggregate CET1 figures; not displayed per bank.

The EU-wide and per-country weighted CET1 shown on the page is the RWA-weighted average of the banks' published transitional CET1 ratios, sum(ratio * RWA) / sum(RWA), which is algebraically the aggregate of published CET1 capital over aggregate RWA. The aggregate NPL is sum(nonperforming loans) / sum(gross loans). Both are transparent aggregations of published components, disclosed as such, not composites.

Why the latest quarter is on the transitional basis

The EBA reports no fully-loaded CET1 or leverage ratio for the 2025 reference dates in this vintage. Fully-loaded ratios are populated for 116-119 of the 119 banks through 2024-12-31 and then absent (0 of 119) for both 2025-03-31 and 2025-06-30, consistent with the Basel III / CRR2 transitional arrangements having expired industry-wide by 2025 (confirmed against Deutsche Bank's own factsheet, where the fully-phased-in column is greyed out for those quarters). /banks/eu therefore shows the transitional ratio for 2025-06-30 and labels it as such rather than presenting a fully-loaded figure the EBA did not publish. At the last date where both bases exist (2024-12-31) they had largely converged: across the 119 banks the transitional and fully-loaded CET1 ratios differ by 0.08 percentage points on average and 2.74 points at most, with 31 banks differing at all.

Coverage caveats

  • 12 of the 119 banks file capital and leverage only. Broker-dealer subsidiaries and specialised institutions without a conventional loan book (for example Goldman Sachs Bank Europe SE, J.P. Morgan SE, and several covered-bond, building-society and promotional banks) carry no total-assets or NPL figure; verified genuine by inspecting the raw CSV templates directly, not a filter artefact. They are counted in the bank universe but excluded from the total-assets and NPL columns, so those aggregates cover the 107 reporting banks.
  • Some small holding entities show very high capital ratios against a tiny risk-weighted-asset base. These are reproduced exactly as the EBA reports them.
  • Sovereign-exposure totals are FinWeave's own per-bank sum across the country-by-country sovereign template (the EBA publishes no grand-total row); they are documented in the provenance file and are not shown on /banks/eu.

Why no composite score for EU banks (v1)

The US FinWeave Composite is a peer-percentile blend of five call-report dimensions computed from a long quarterly time series of standardised FDIC fields. The EBA Transparency Exercise provides point-in-time regulatory disclosures on a different template, and the call-report-style time-series inputs the composite needs are not yet ingested for these banks. Rather than invent a partial or non-comparable score, this version shows published figures only. A future version may add a comparable European score once the underlying time series is ingested; until then, /banks/eu is deliberately score-free.

Official supervisory aggregates (ECB Supervisory Banking Statistics)

Alongside the EBA point-in-time bank-by-bank table, /banks/eu shows the ECB’s own quarterly euro-area aggregate as a trend (2015-2026). This is a different lens from the EBA sample:

  • What it is. The euro-area SSM aggregate (REF_AREA = B01, "significant institutions", changing composition) from the ECB Data Portal dataflow SUP (Supervisory Banking Statistics), compiled by ECB Banking Supervision from statutory prudential reporting (COREP/FINREP) under the SSM Regulation. Four metrics: CET1 ratio (I4008), non-performing-loans ratio (I7000), return on equity (I2003), cost-to-income ratio (I2100). All are ECB-published percentages, reproduced as released, no FinWeave transformation.
  • Why the numbers do not match the EBA table one-to-one. The universe (all SSM significant institutions, changing composition) and the reference dates differ from the fixed EBA transparency sample, so the headline ratios are the supervisor’s system-wide read, not the same banks aggregated. This is stated on the page.
  • Honest absence. A metric the ECB does not disclose for a quarter is a gap, never a zero. Bulgaria, Croatia and Slovakia carry no disclosed significant-institution aggregate in this dataflow (confidentiality suppression, or the aggregate does not exist), documented in data/raw/ecb_sup/SOURCE.md; the euro-area B01 aggregate itself is complete through the latest quarter.
  • Source and license. ECB Data Portal, dataset SUP, retrieved 2026-07-11; free to use with attribution ("Source: ECB"), same terms as the CISS source already in this repo. Every value is recomputable from data/parquet/ecb_sup.parquet by src/lib/ecbSup.ts; retrieval and the DSD code resolution are in data/raw/ecb_sup/SOURCE.md.

Mandatory caveats (EU view)

  • Published figures, not a FinWeave rating. Nothing on /banks/eu is a FinWeave score, a solvency judgement, or a failure prediction. This applies to both the EBA transparency figures and the ECB supervisory aggregates.
  • Not investment or deposit advice.
  • Point-in-time (EBA) vs quarterly aggregate (ECB). Each EBA figure is a quarter-end regulatory disclosure for the reference date shown; the ECB aggregate is a quarterly system-wide series. Neither speaks to risks outside the template (interest-rate duration, unrealised securities losses, deposit concentration, governance).
  • Reproducible. Every displayed number is recomputable from data/parquet/eba_banks.parquet and eba_banks_meta.parquet (via src/lib/ebaBanks.ts) or data/parquet/ecb_sup.parquet (via src/lib/ecbSup.ts); every input item is named in data/raw/eba/SOURCE.md and data/raw/ecb_sup/SOURCE.md.

US bank stress tests: the Federal Reserve DFAST results (no FinWeave score)

The /banks/stress page reproduces the Board of Governors' Dodd-Frank Act Stress Test (DFAST) supervisory results exactly as published. It applies no FinWeave-modelled score. Everything shown is the Federal Reserve's own supervisory projection, read from a single cumulative results file.

What DFAST is

DFAST is the Federal Reserve's annual supervisory stress test, run under section 165(i) of the Dodd-Frank Act and the Board's Regulation YY (12 CFR part 252). For each covered bank the Fed projects capital, losses, revenue and the resulting capital ratios over a nine-quarter planning horizon under a common, Fed-specified hypothetical scenario, starting from the firm's actual balance sheet at the exercise's as-of date. The results are the supervisor's own projections, not the banks' own numbers and not a forecast of what will happen.

Source and coverage

  • Publisher and file. Board of Governors of the Federal Reserve System. The Fed publishes one cumulative machine-readable results file per year; the latest (public_results_DFAST_2026.csv, released 2026-06-24) is a superset carrying every exercise from DFAST 2013 through the 2026 Stress Test in one tidy table, one row per firm-year-scenario plus one aggregate row per exercise-scenario.
  • Coverage. 15 supervisory cycles, 665 rows (643 named firm-scenario rows and 22 aggregates), 65 columns. Named firms per cycle range from 18 (DFAST 2013, DFAST 2019) to 35 (DFAST 2018).
  • Scenarios in the file. scenario_id 2 = Supervisory Adverse (present 2014-2019 only), 3 = Supervisory Severely Adverse (every cycle), 30 = Supervisory Alternative Severe (the second scenario of the mid-cycle December 2020 test only). /banks/stress shows the severely adverse scenario throughout, the one scenario common to all 15 cycles.
  • Units. Capital ratios are in percent; every *_amt loss, revenue and income line is in USD billion cumulative over the nine-quarter horizon.
  • License. Public domain (Board of Governors disclaimer), attribution requested. Full retrieval, the file MD5, and the field dictionary are in data/raw/dfast/SOURCE.md; the batch acceptance audit is in docs/data_provenance.md.

Scenario design (one-paragraph summary)

The severely adverse scenario is a hypothetical, not a forecast and not the Fed's most-likely outlook: it is deliberately constructed to be severe so the test probes resilience rather than predicting a recession. The Fed publishes a full paths document each year (for example "2026 Supervisory Scenarios") specifying about 28 domestic and international macro-financial variables, GDP, the unemployment rate, house and commercial-real-estate prices, equity prices, market volatility, and a term structure of interest rates and spreads. The severity is governed by the Board's standing Policy Statement on the Scenario Design Framework for Stress Testing (12 CFR part 252, appendix A): under it the severely adverse scenario is anchored to a recession in which the unemployment rate rises by between 3 and 5 percentage points to a level of at least 10 percent (a smaller increase is used when the starting unemployment rate is already high), with correspondingly severe declines in activity and asset prices. Firms with large trading operations are additionally subjected to a global market shock (an instantaneous repricing of trading positions) and, for the largest, a counterparty default component. Because the scenario is a fixed hypothetical, a deeper projected capital decline in one cycle reflects a harsher or differently-shaped scenario as much as any change in bank risk; cross-cycle comparisons are read with that in mind.

What each /banks/stress figure is

  • Projected CET1 path by firm (severely adverse, latest cycle). For every firm in the latest exercise: common_equity_tier1_actual_rat (the starting, actual CET1 ratio at the as-of date), common_equity_tier1_min_rat (the low point of the projected CET1 path over the nine quarters), and the peak-to-trough decline in percentage points, sorted largest-decline first. A large decline is not a "fail": the supervisory pass condition is whether the projected minimum stays above the firm's regulatory minimum. The Basel III common equity tier 1 minimum is 4.5 percent of risk-weighted assets (12 CFR part 217, Regulation Q); every firm in the latest cycle's severely-adverse projection stays above it (the lowest projected minimum in the 2026 cycle is 6.7 percent). Firm-specific buffer requirements (the stress capital buffer, the G-SIB surcharge) sit above that floor and are not reproduced here.
  • Aggregate minimum capital across cycles. The aggregate projected-minimum capital ratio for the tested group under the severely adverse scenario, one point per cycle. Honest regime break: the headline capital measure changed definition mid-series. DFAST 2013-2015 reported the Basel I tier 1 common ratio (tier1_common_min_rat); DFAST 2016 onward reports the Basel III common equity tier 1 (CET1) ratio (common_equity_tier1_min_rat). These are different ratios, so the chart draws the two eras as separate lines with a break at the 2015 -> 2016 seam and labels each regime; they are never spliced into one continuous line. The tested group also changes composition across cycles (the number of participants and the participation thresholds have changed), so the aggregate is a moving-membership series, stated as such.
  • Projected loss composition (latest cycle). The four top-level projected-loss categories the Fed reports, in USD billion over the horizon: loan losses (loss_total_loan_amt), securities losses (loss_securities_amt, AFS/HTM), trading and counterparty losses (loss_trading_counterparty_amt), and other losses (loss_other_amt). The four sum to the Fed's total projected loss. Pre-provision net revenue (revenue_preprovision_net_amt) is shown alongside as the income the losses are absorbed against, not netted into the loss figure.

Verification anchors (recomputed raw-vs-parquet)

DFAST 2013 aggregate minimum tier 1 common ratio 7.4 percent (matches the Fed's DFAST 2013 disclosure). 2026 aggregate CET1 declines 12.8 -> 11.2 percent, a 1.6 percentage-point drop (the 2026-06-24 press release states the aggregate CET1 ratio "declined by 1.6 percentage points"). 2026 aggregate total projected losses $708 billion (the press release cites "more than $708 billion in total losses"). Full spot-check log in data/raw/dfast/SOURCE.md.

Mandatory caveats (stress-test view)

  • Supervisory results, not a FinWeave rating. Nothing on /banks/stress is a FinWeave score, a solvency judgement, or a failure prediction.
  • Hypothetical, not a forecast. The severely adverse scenario is a designed stress, not the Fed's expected path; projected minimums are conditional on that hypothetical.
  • Not investment or deposit advice.
  • Cross-cycle and cross-firm comparability is limited. The scenario changes each year, the capital-ratio definition changed at 2015-2016, the participating group changes composition, and firm-level pass conditions depend on firm-specific buffer requirements not reproduced here.
  • Reproducible. Every displayed number is recomputable from data/parquet/dfast_results.parquet by src/lib/stress.ts; every input field is named in data/raw/dfast/SOURCE.md.

Deposit market structure: FDIC Summary of Deposits (no FinWeave score)

The "Deposit market structure" section on /banks reproduces concentration statistics computed directly from the FDIC's annual Summary of Deposits (SOD) survey. It applies no FinWeave-modelled score; the figures are transparent aggregations of a published branch-level deposit census.

Source and coverage

  • Publisher and survey. Federal Deposit Insurance Corporation, Summary of Deposits: the annual survey of branch-office deposits for every FDIC-insured institution (commercial banks, savings institutions, and US branches of foreign banks), reported as of June 30 each year. Retrieved via the BankFind Suite sod API, 2018-2025 (2025 is the latest published survey).
  • Aggregation. scripts/build_fdic_sod.py rolls the branch-level census up to the institution level (summing each institution's deposits within each state and nationally) and then to per-state-year and national-year rows: data/parquet/sod_market_structure.parquet (478 rows). Fields: total deposits (thousands USD), branch count, institution (bank) count, the institution-share HHI, and the top-5 institution deposit share.
  • License. FDIC public data. Retrieval, the year-by-year branch counts, and the raw-vs-parquet audit are in data/raw/fdic_sod/SOURCE.md; the batch acceptance audit is in docs/data_provenance.md.

HHI formula and what it measures here

The Herfindahl-Hirschman Index is the sum of the squared market shares of the competitors in a market:

HHI = sum_i (s_i)^2

where s_i is institution i's deposit share expressed in percentage points (0-100), so the index runs from near 0 (perfectly fragmented) to 10,000 (a single institution holds 100 percent). On /banks the shares are each institution's share of total deposits within the geography (a state, or the nation): the national HHI squares each institution's share of all US deposits, and each state HHI squares each institution's share of that state's deposits. The top-5 share is the summed deposit share of the five largest institutions in the geography.

Market-definition caveat (important)

This is a state-level (and national) institution-share HHI, not the HHI used in bank-merger review. In competitive analysis of bank mergers the Federal Reserve and the Department of Justice define local geographic banking markets (roughly county- or metropolitan-area-based Federal Reserve banking markets), compute HHI on deposit shares within those local markets, and screen against the thresholds in the DOJ/FTC framework (broadly, concern above an HHI of about 1,800 with a change of at least 200 points, with banking-specific latitude). A state-level or national HHI is a far coarser lens: it treats an entire state as one market, so it understates the concentration a customer actually faces in a given town and is not the number merger screening turns on. The /banks figures are a descriptive read of how deposits are distributed across institutions at the state and national level, disclosed as such, and are not a merger-review market-concentration measure.

Concentration extremes: the 50-state restriction

The "most/least concentrated states" tables rank the 50 states by institution-share HHI in the latest survey year. DC and the US territories and freely-associated states (Guam, Puerto Rico, the US Virgin Islands, the Northern Mariana Islands, and the Pacific freely-associated states Palau, the Marshall Islands and the Federated States of Micronesia) are excluded from the ranking: several hold only one to three FDIC-insured institutions, which pins their HHI at or near the 10,000 single-institution ceiling and would crowd the "most concentrated" list with jurisdictions that are not comparable to a US state. They remain in the underlying parquet; only the extremes ranking excludes them, so the comparison is like-for-like across the 50 states. Delaware and South Dakota top the ranking, consistent with their role as national credit-card and trust charter homes.

Verification anchors (recomputed raw-vs-parquet)

South Dakota 2025 HHI 4,654.13 (recomputed end-to-end from the raw branch census by the acceptance auditor, exact). National 2025 HHI 390.72, top-5 share 37.67 percent across 4,431 institutions and 76,120 branch offices; the live FDIC API confirms the 2024 national branch total (76,727). Full log in data/raw/fdic_sod/SOURCE.md.

Mandatory caveats (deposit-structure view)

  • Descriptive statistics, not a FinWeave rating. Nothing in this section is a FinWeave score or a judgement about any institution.
  • State/national HHI is not a merger-review HHI. See the market-definition caveat above; do not read these figures as the concentration measure used in bank-merger competitive analysis.
  • Annual, June-30 snapshots. Each figure is a point-in-time census as of June 30; intra-year branch and deposit changes are not captured.
  • Reproducible. Every displayed number is recomputable from data/parquet/sod_market_structure.parquet by src/lib/sodStructure.ts; the survey retrieval is documented in data/raw/fdic_sod/SOURCE.md.

Euro-area credit conditions: the ECB Bank Lending Survey (no FinWeave score)

The "Bank lending survey" section on /banks/eu reproduces the euro area Bank Lending Survey (BLS), the ECB's quarterly survey of bank loan officers and the euro-area analog of the Federal Reserve's SLOOS (shown on /conditions). Everything displayed is an ECB-published survey aggregate, reproduced as released; no FinWeave transformation and no FinWeave score.

Survey design

The BLS has been conducted quarterly since the January 2003 round by the ECB together with the euro-area national central banks. It asks senior loan officers at a sample of euro-area banks (161 banks in the April 2026 round, with a 100 percent response rate, per the ECB's April 2026 press release) whether, over the past three months, the bank tightened or eased credit standards (its internal loan-approval criteria) and whether loan demand increased or decreased, separately for loans and credit lines to enterprises, loans to households for house purchase, and consumer credit and other lending to households, plus the same questions as expectations for the next three months. Each country joins the survey with euro adoption, so country series start at different rounds (Bulgaria appears for the first time in the 2026-Q2 round); the page shows only the euro-area aggregate. Survey homepage: ECB Bank Lending Survey; data: ECB Data Portal, dataset BLS, retrieved 2026-07-10.

Net percentage (what every displayed value is)

Every figure in the section is a net percentage on a -100..100 scale: for credit standards, the percentage of banks reporting a tightening minus the percentage reporting an easing; for demand, the percentage reporting an increase minus the percentage reporting a decrease. The sign convention is the ECB's own and is not flipped: positive = net tightening of standards and positive = net increase in demand. These are balances of survey answers (counts of banks), not loan volumes or interest rates. The dataflow also publishes a diffusion index that half-weights "somewhat" answers; the page does not use it.

Euro-area aggregation (U2, WFNET)

The euro-area aggregate (REF_AREA = U2) is the country results weighted by each country's share of the outstanding loan stock in the relevant category (ECB aggregation method code WFNET), so larger banking systems move the aggregate more than a simple average of countries would. Per-country series carry the unweighted FNET net percentage instead (with a bank-loan-share-weighted BFNET variant for the three countries that publish only that form); the page uses U2/WFNET exclusively. The code resolution against the ECB's own datastructure codelists is documented in data/raw/ecb_bls/SOURCE.md.

Survey round vs reference quarter

The ECB labels each observation with the survey-round quarter, not the quarter the answers describe: the April 2026 round is 2026-Q2, and its backward-looking answers describe 2026 Q1. The parquet carries both labels (quarter = round, ref_quarter = the quarter described, round minus one for realized answers), and the page states the distinction wherever a round is named. The convention was verified against the ECB press release "April 2026 euro area bank lending survey" (published 2026-04-28): the release's realized Q1 2026 enterprise net tightening of 10 percent matches the parquet value 10.09 at round 2026-Q2, and all six realized April-round net percentages match the release after rounding. The magnitude anchor for the full history is the global-financial-crisis record: a 65.06 net percentage of banks tightening enterprise credit standards in the October 2008 round (2008-Q4, describing 2008 Q3), consistent with the widely cited peak of about 65 percent.

Mandatory caveats (BLS view)

  • Survey balances, not volumes. A net percentage counts (weighted) banks, not euros of credit; a +10 says more banks tightened than eased, nothing about how much.
  • Published aggregates, not a FinWeave rating. Nothing in the section scores, ranks, or judges any bank.
  • Realized answers only. The page shows the backward-looking (B3) questions. The expectations (F3) series are in the parquet but not displayed; the SME/maturity breakdowns and the factor sub-questions are not ingested (documented as out of scope in data/raw/ecb_bls/SOURCE.md).
  • Reproducible. Every displayed number is recomputable from data/parquet/ecb_bls.parquet by src/lib/bls.ts; retrieval, series-key decoding, and the raw-vs-parquet and press-release verification tables are in data/raw/ecb_bls/SOURCE.md. License: ECB data, free use with attribution ("Source: European Central Bank").