# Which bank in America is actually the best to bank with? — dataset & methodology

*83 US retail banks · two keyless federal sources · six measured dimensions, all
weighted equally · and 100,000 random weightings run afterwards to show how much
the answer depends on that choice.*

**`best-bank-ruler-2026.csv`** — 83 rows, one per bank, sorted best to worst.

| column | meaning |
|---|---|
| `rank` | 1 = best. Derived from the score, never re-sorted separately |
| `bank`, `fdic_cert`, `hq` | the institution, its FDIC certificate number, and its head office |
| `branches`, `states` | domestic offices, and how many states it has a branch in |
| `deposits_usd_thousands` | domestic deposits. **⚠️ THOUSANDS** — 2,167,793,000 here is $2.17 trillion |
| `score` | the composite, 0–100 |
| `interest_paid_pct_of_deposits` | interest expense on domestic deposits ÷ domestic deposits, FY2025. **Higher is better** |
| `cfpb_complaints_per_10b_per_year` | deposit-account complaints per $10B of deposits per year, 2023–2025. **Lower is better** |
| `complaints_closed_with_relief_pct` | % of that bank's complaints closed with monetary or non-monetary relief. **Higher is better** |
| `states_with_a_branch` | reach. **Higher is better** |
| `branches_per_10b_deposits` | branch density per $10B of deposits. **Higher is better** |
| `cet1_capital_ratio_pct` | common equity tier 1 ratio, FY2025. **Higher is better** |
| `*_percentile` | that bank's midrank percentile within the 83, ×100 |
| `complaints_3y`, `complaints_with_relief` | the raw counts the two complaint metrics are built from |
| `cfpb_company` | the CFPB company name this bank was joined to — see "the join" |

Every percentile is a **midrank**: tied banks share the average of the ranks they
span. Ties are common on a rounded ratio, and a positional percentile would let
file order decide who wins.

---

## The question

"Best bank" lists are written by people paid per signup. The rankings are
opinions, the weights are invisible, and the winner is usually whoever has an
affiliate programme. So: pick the dimensions first, publish the weights, apply
them identically to every bank, and let the answer be whatever it turns out to
be.

## The ruler

Six dimensions. **All six weighted equally, at 16.67% each**, because any other
split is an opinion about what banking is for.

| dimension | weight | source | direction |
|---|---|---|---|
| Interest paid | 16.67% | FDIC call report, FY2025 (`EDEPDOM` ÷ `DEPDOM`) | higher better |
| Complaints | 16.67% | CFPB Consumer Complaint Database, 2023–2025 | lower better |
| Redress | 16.67% | CFPB Consumer Complaint Database, 2023–2025 | higher better |
| Reach | 16.67% | FDIC branch locations, distinct states | higher better |
| Branch density | 16.67% | FDIC branch locations ÷ call report deposits | higher better |
| Safety | 16.67% | FDIC call report, FY2025 (`IDT1CER`) | higher better |

Normalisation is **percentile rank within the 83**, not z-score. Deposits and
complaint rates are both heavily skewed by the largest banks; a z-score would let
JPMorgan Chase's size compress the entire rest of the field toward the mean.

The composite is the weighted sum of the six percentiles, ×100.

**The six were chosen by a correlation cut over fourteen candidates.** Any pair
correlating above roughly 0.5 measures the same thing twice and double-weights
it. In the final six the largest absolute pairwise correlation is **0.444**
(complaints × reach), so no dimension is a proxy for another.

## The sources — both keyless

- **FDIC BankFind Suite** — `api.fdic.gov/banks/{institutions,financials,locations,sod}`.
  No key, no registration.
- **CFPB Consumer Complaint Database** — the public search API. Products
  "Checking or savings account" and "Bank account or service", 2023-01-01 to
  2026-01-01. **121,191** deposit-account complaints.

Flows come from **FY2025** (`REPDTE = 20251231`) and stocks from the *same* row.
Call-report income is year-to-date, not quarterly: reading interest expense off
the March row and dividing by a December deposit base understates every rate by
roughly four times — uniformly, so it ranks almost correctly and is wrong
everywhere.

## The field, and the floor it does not meet

**158** US banks have 50 or more domestic offices. Only **83** of them appear in
the CFPB's deposit-complaint data, and only those 83 are ranked.

The other 75 were **dropped, not carried at zero**. This is the single most
important decision in the file. A bank with no CFPB match is not a bank with no
complaints — the Bureau files against the *holding company* ("JPMORGAN CHASE &
CO.") while the FDIC certifies the *bank* ("JPMorgan Chase Bank, National
Association"). An unmatched bank scored as zero complaints would take the 100th
percentile on that dimension and could win the whole thing: a fabricated
champion produced entirely by a failed string compare.

So the honest description of this field is **"US retail banks with a federal
complaint record"**, not "all US retail banks", and that is what the video says
on screen. It costs the series' usual n ≥ 100 floor, and that is the right price.

### The join

Three routes, in descending order of how much the match is worth trusting:
an explicit alias, then the FDIC's own `NAMEHCR` holding-company field, then the
bank's own name. **There is no fuzzy stage.** One existed and was deleted: it
recovered four banks and paired U.S. Bank with a single San Francisco branch
record at zero complaints. A false positive here moves one institution's
complaint record onto another's deposit base and is undetectable downstream.

Where two chartered banks share one CFPB company, only the **largest** is kept —
otherwise both carry the group's complaints against their own smaller deposit
base and both look far worse than they are.

## What is deliberately NOT in it

- **Fees.** There is no federal database of retail account fees. Every "average
  overdraft fee" figure in circulation traces back to a survey of a few hundred
  institutions, and no source publishes a fee schedule per FDIC certificate.
  This is the biggest known hole in the ruler and it is a hole, not an omission
  covered by something else.
- **App quality, branch experience, customer service ratings.** Measurable only
  as somebody's index of somebody else's index.
- **Interest paid on *savings* specifically.** The call report gives interest
  expense on all domestic deposits, not by product. A bank with many checking
  accounts paying nothing looks worse than its savings rate alone would suggest.

Five measured dimensions with a sixth invented would be worse than six measured.
Nothing was substituted into the fee gap.

## The result

Winner: **WaFd Bank**, Seattle, **69.0 / 100**, **+2.24σ**, **1.42** clear of
Busey Bank. 211 branches in 9 states.

The four largest branch networks in America finish **41st (JPMorgan Chase),
48th (Bank of America), 60th (PNC) and 71st (Wells Fargo)** of 83.

They are not bad, they are **spiky**. Chase is the **100th percentile on reach**
and the **9th on branch density**; Wells Fargo is the **1st percentile on
complaints**. A weighted sum of six capped percentiles punishes a hole far more
than it rewards a peak.

WaFd wins by not having one: it is **above the field median on 5 of 6**
dimensions, and its worst measure is the **48th percentile** — no other bank in
the 83 has a worst measure that clears the 44th.

## The part that argues against the result

**The winner is not dominant and the file says so.**

The equal weighting is a judgement. To find out how much it matters, the scoring
is re-run **100,000 times with weights drawn uniformly from the simplex**:

- WaFd is #1 in **13.7%** of them — the highest share in the field, and nowhere
  near a majority. Next best: BMO Bank **10.6%**, Lake City Bank **9.9%**.
- **35 of the 83 banks finish first under some defensible weighting.**
- Under the four named weightings WaFd wins two: **Equal** and **Money-first**.
  It loses **Size-first** (First Interstate Bank wins; WaFd 2nd) and
  **Service-first** (BankUnited wins; WaFd 9th).

So the claim this dataset supports is that WaFd **wins more random weightings
than any other bank** — not that it is settled. Both the named-weighting ranks
and the Monte Carlo shares are in the file so you can check.

## Reproducing it

```
node scripts/fetch_bank_data.mjs --print   # both APIs → public/bank/raw.json
node scripts/bank_score.mjs                # the scoring → this CSV
```

The scoring lives in exactly one place, `scripts/bank_score.mjs`, so a rank on
screen cannot drift from a rank in this file.

## Two things that produced correct-looking output and were wrong

**1 · FDIC dollars are thousands.** `deposits` for JPMorgan Chase is
2,167,793,000, and that is $2.17 *trillion*. An early draft printed it with a
plain thousands separator and a dollar sign, understating every bank in the
episode by a factor of a thousand. Nothing errors; the chart looks fine.

**2 · A logo matcher that agreed too easily.** When the mark fetch was widened
past the scored field for the map, "Bank of Hawaii" resolved to
`File:Hawaii National Bank logo.svg` — a different, real bank in the same state.
Both names are plausible, both institutions exist, and the wrong mark would have
sat on Hawaii looking entirely normal. Now pinned by hand.

## The map in the video

The opening shot is a separate calculation and is **not** part of the ranking.
Each state is filled with the mark of the bank that state banks with, from the
**FDIC Summary of Deposits 2025** (76,097 branch records), and extrudes to that
bank's national branch count.

⚠️ **The leader must hold 5+ branches in the state.** Raw deposit share answers a
different question than the one the map asks, because several charters *book*
deposits in a state they do not retail in: unfiltered, 2025 gives Massachusetts
to State Street (a custody bank, 34.5%), South Dakota to Citibank (a credit-card
charter), Utah to Morgan Stanley and Iowa to Principal Bank on a 6.6% share.
None of those is the bank those states bank with. The filter fixes all of them
and is stable at thresholds of 5 and 10. Both sides of the share ratio are
filtered — filtering only the numerator gives Utah a nonsensical 2.3% "leader".

That leaves **21 distinct banks** leading the 50 states + DC. Bank of America
leads 12, JPMorgan Chase 8, U.S. Bank 6.

---

*Sources: FDIC BankFind Suite (call reports FY2025, branch locations, Summary of
Deposits 2025) and the CFPB Consumer Complaint Database, 2023–2025. Both public
and keyless. reelgorithm.py*
