Live site: smkwray.github.io/bankalm
The bankALM static site provides an interactive atlas of bank fragility scores, league tables, and bank detail pages — all generated from the pipeline's enriched panel.
- Homepage — hero metrics, risk index cards, backtest comparison
- League Table — sortable, filterable, paginated rankings for each index (Run Risk, ALM Mismatch, Deposit Competition, Composite Fragility)
- Bank Detail — per-bank score breakdown, profile metadata, methodology notes
Deposit Competition now participates in the same quarter-aligned failure backtest as the other published indices. It remains a transparent public-data pressure screen for exploratory comparison, not a full funding diagnosis or a decision-grade model.
To run locally:
cd site && python3 -m http.server 8000bankALM is an independent research project that screens U.S. bank fragility using only free public regulatory data.
It is not affiliated with or endorsed by the FDIC, FFIEC, Federal Reserve, or any financial institution. Scores are computed from public filings and should not be interpreted as supervisory ratings or investment advice.
A reproducible pipeline using only free public data to estimate, at the U.S. bank-quarter level:
- Deposit stickiness / run risk — transparent score + experimental supervised overlay
- Effective maturity scenarios — baseline, adverse, severe deposit-life scenario proxies
- Asset-liability mismatch — 13 structural ratios (pre-hedge proxy)
- FFIEC repricing buckets — loan/deposit/borrowing maturity + repricing gaps + duration-gap-lite
- Treasury buffer extensions — shock scenarios, encumbrance-adjusted coverage
- Deposit competition pressure — outside-option premium, pass-through gap, and rate-sensitive funding exposure
- Interpretable indices — peer-group normalized, per-row versioned
python3 -m venv ~/venvs/bankalm
source ~/venvs/bankalm/bin/activate
pip install -e .
pip install pytest
source ./.env
make universe # download all data + build pipeline + generate reports
make test # run the test suite
make status # check data freshness, coverage, integrityCounts depend on the current processed build. The default universe spans quarterly FDIC bank filings from 2007 forward and persists intermediates in Parquet.
The validation layer now uses quarter-aligned bank-quarter cohorts rather than one-row-per-bank comparisons. For each report quarter, the pipeline labels whether a bank fails within 1Q, 2Q, or 4Q, tracks whether that horizon is observable, and produces reproducible metrics tables by horizon and episode slice.
| Source | What it provides |
|---|---|
| FDIC BankFind financials | Deposits, assets, capital, securities, borrowings |
| FDIC BankFind institutions | Identifiers, charter, location (current snapshot metadata) |
| FDIC Summary of Deposits | Branch geography, deposit concentration |
| FDIC failures list | Historical bank failure dates and institutions |
| FFIEC CDR Call Reports | Loan/deposit/borrowing maturity buckets, repricing data |
| FFIEC NIC | Holding-company structure and parent chains |
| SEC EDGAR | Company tickers, 10-Q/10-K filing parser for uninsured deposits |
The repo ships:
- quarter-aligned failure cohort labels and metrics
- consistency checks on the bank-quarter panel
- historical stress validation scripts and reporting outputs
These artifacts support exploratory public-data screening, not a claim that bankALM is a decision-grade failure predictor.
src/bankfragility/
downloads/ FDIC API, Treasury yields
staging/ Bank panel (5-way join), FFIEC repricing extraction
features/ Deposit stickiness, ALM mismatch, Treasury extensions, deposit competition
models/ Index construction, supervised stickiness overlay
validation/ Failure backtest, 11 consistency checks
entity/ SEC CIK mapping, 10-Q/10-K parser, NIC structure
reporting/ League tables, drill-downs, peer-group summaries
| Target | Description |
|---|---|
make universe |
Full download + build + reports |
make smoke |
Quick rebuild from existing data (no downloads) |
make test |
Run the test suite |
make status |
Check data freshness, coverage, integrity |
make validate |
Run 2023 SVB stress validation |
make download-all |
Download default raw data |
make download-treasury |
Download Treasury yield history |
make download-market-rates |
Optional FRED short-rate history (IORB / ON RRP) |
make build-all |
Build panel through indices + supervised |
make build-deposit-competition |
Build the post-Treasury deposit-competition feature stage |
make backtest-failures |
Run quarter-aligned failure cohort validation |
make reports |
Generate league tables and reports |
make clean |
Remove processed outputs (keeps raw) |
The pipeline produces per bank-quarter:
- Raw features: deposit composition, ALM ratios, Treasury coverage, deposit-competition pressure features, FFIEC repricing buckets
- Scenario estimates: deposit WAL under baseline/adverse/severe, stable-equivalent amounts
- Indices:
run_risk_index,deposit_stickiness_index,alm_mismatch_index,treasury_buffer_index,deposit_competition_pressure_index,deposit_competition_resilience_index,funding_fragility_index - Deposit Competition: quarter-aligned failure backtest included; still surfaced as an exploratory public-data screening lens
- Supervised overlay: experimental
SUPERVISED_OUTFLOW_SCOREplus next-quarter observability and label fields - Failure backtest:
FAIL_WITHIN_1Q,FAIL_WITHIN_2Q,FAIL_WITHIN_4Qlabels plus cohort metrics tables - Split publishable panels:
data/processed/universe_core_panel.parquetfor the historically consistent full-history core outputdata/processed/universe_enriched_panel.parquetfor the recent-history advanced-module output - Mart + site exports: integrated
data/processed/universe_publishable_mart.parquetplus generatedsite/data/manifest.json,site/data/banks/latest.json, andsite/data/banks/<cert>.json - Reports: bank drill-downs, quarter league tables, peer-group summaries, scenario comparisons
- Macro context report:
data/reports/universe/treasury_regime_summary.parquetwith one row per quarter of the observed Treasury backdrop
| File | Purpose |
|---|---|
config/peer_groups.yaml |
Asset-size peer group thresholds (in FDIC thousands) |
config/index_weights.yaml |
Component weights for composite indices |
config/deposit_competition.yaml |
Outside-option benchmarks and transparent pressure-score weights |
config/stickiness_scenarios.yaml |
Deposit life parameters by scenario |
config/ffiec_repricing_map.yaml |
MDRM code → standard horizon mapping |
config/sec_overrides.yaml |
Manual CERT → SEC CIK/ticker overrides |
config/field_definitions.yaml |
Field definitions and known changes |
- No internal deposit behavior or management assumptions
- Annual SOD geography, not daily funding flows
- ALM model is pre-hedge (derivative overlay available via FFIEC RC-L)
- Deposit-life outputs are scenario assumptions, not empirical decay estimates
- ALM outputs are structural public-data proxies, not a bank's internal hedge-adjusted model
- Holding-company disclosures and institutions metadata are not historical as-of mappings
- Supervised overlay is backward-looking and experimental
- Deposit Competition is backtested, but it remains a transparent public-data pressure screen rather than a complete funding diagnostic
- Treasury yield history is integrated into the recent-history enriched panel, not the full-history core panel
- Deposit-competition features and indices are part of the recent-history enriched surface unless optional market-rate history is supplied more broadly
The transparent score is the primary product. The supervised overlay is secondary. bankALM is a transparent public-data fragility screen and scenario engine, not a decision-grade probability model.
Use the split outputs intentionally:
universe_core_panel.parquet: full-history panel for historically consistent use. Excludes reliance on the recent-only advanced-module surface.universe_enriched_panel.parquet: recent-history panel beginning when FFIEC/derivative/Treasury enrichment is available, including deposit-competition fields.universe_publishable_mart.parquet: integrated internal mart used to derive the split panels and site exports.universe_failure_backtest_metrics.csv: quarter-aligned validation metrics by score, horizon, and episode slice.
The static site is generated from the recent-history enriched panel and includes manifest metadata describing both published panel variants, including the deposit-competition index where available.