Project Description

Marked ranked Silicon Valley Bank #1 of 4,713 US banks for run risk five months before it collapsed — using only public FDIC filings. The regulatory capital ratio, the number banks report as "well capitalized," ranked it #3,500.

The problem

When interest rates rise, bonds a bank bought earlier lose market value. Banks are allowed to book some of those bonds as "held to maturity," which lets them carry them at original cost — the loss never appears in the bank's official capital ratio unless the bank is forced to sell. Deposits above $250,000 aren't FDIC-insured. If enough uninsured depositors get nervous and withdraw at once, the bank can be forced to sell those bonds, crystallizing the hidden loss exactly when it can least afford it.

That's what happened to Silicon Valley Bank. Roku had roughly $487M there. Circle had $3.3B of USDC reserves at SVB, which briefly broke the stablecoin's dollar peg. $42B left SVB in a single day; the FDIC closed it the next morning.

What it does

Marked computes two numbers from every US bank's public quarterly filings: what the bank's equity looks like marked to market (accounting for the hidden bond loss), and what share of its deposits are uninsured and could run. It combines them into one score, backtests that score against every US bank failure since 2019 and against the 2008 financial crisis, and models the exact dollar amount of withdrawal each bank could survive before being forced into insolvency.

How it works under the hood

The scoring formula (pipeline/score.py) was frozen in its own git commit before any historical backtest was run — two plain accounting ratios, no fitted weights, no machine learning tuned to the outcome. That's checkable in the repo's git history, not just claimed.

It was then backtested against:

  • Every US bank failure since 2019 (13 banks), using only data that would have been publicly filed at each point in time (a strict look-ahead guard, tested in CI).
  • The 2008 financial crisis, applying the exact same formula unchanged to a completely different era, to check this isn't just curve-fit to SVB. Honest result: it's a real but weaker signal there (top 4-6% instead of top 1%), because 2008 was a credit crisis, not the specific accounting-gap mechanism this project targets.
  • An independent ML baseline trained the standard way (CAMELS ratios, logistic regression, no uninsured-deposit or mark-to-market features) — which ranks SVB as a completely average bank (#2,678 of 4,813), proving this isn't something any reasonable model would have caught.
  • A statistical significance check: the odds that four random banks land in the top 33 of ~4,700 by chance are 2×10⁻⁹.
  • A dollar run-threshold model: for SVB at the end of 2022, the model says $38.49B of withdrawals could be absorbed before forced bond sales — $42B actually left on March 9, 2023.

Two real bugs were found and fixed while building this (a null-handling bug that manufactured phantom 100% bond losses, and a pandas NaN-comparison bug that silently merged two test populations). Both are documented in the README rather than scrubbed from history.

Limits, published honestly

Fraud-driven failures (like Heartland Tri-State Bank) are invisible to this model by design — it's not a general bankruptcy predictor. Banks under ~$1B in assets don't report uninsured deposits to the FDIC, so they're shown as "not reported," never as "safe." First Republic's losses were mostly in low-rate mortgages, which this model doesn't capture (checked whether the free FDIC API exposes the needed loan-maturity data — it doesn't, beyond aggregate figures). Full limits section in the README and on the site's "How it works & limits" tab.

Try it

Search any of ~4,700 US banks at the live site. Silicon Valley Bank, Signature Bank, First Republic, and Republic Bank all have full quarterly history with the interactive run-threshold slider.

Research prototype. Not financial advice, not a regulatory tool, and not an assertion that any currently operating bank will fail.

Built With

Share this project:

Updates

Submission history