cdfi-val 🏦
Institutional-grade valuation toolkit for CDFIs and Minority Depository Institutions.
Built for investment analysts, IC teams, and impact finance practitioners who need reproducible, auditable valuation outputs — without starting from scratch in Excel.
Why cdfi-val?
Community banks, CDFIs, and MDIs are consistently underserved by open-source finance tooling. Existing Python libraries target derivatives, public equities, and trading — not mission-driven depositories where valuation requires:
- Tangible Book Value multiples calibrated to peer community banks
- P/E analysis on thin or volatile earnings bases
- DCF models with WACC and terminal growth inputs
- Comparable transaction analysis across precedent MDI/CDFI deals
- Portfolio-level aggregation across 10–12 institutions
cdfi-val fills that gap.
Installation
cat > README.md << 'EOF'
# cdfi-val 🏦
**Institutional-grade valuation toolkit for CDFIs and Minority Depository Institutions.**
Built for investment analysts, IC teams, and impact finance practitioners who need
reproducible, auditable valuation outputs — without starting from scratch in Excel.
---
## Why cdfi-val?
Community banks, CDFIs, and MDIs are consistently underserved by open-source finance
tooling. Existing Python libraries target derivatives, public equities, and trading —
not mission-driven depositories where valuation requires:
- Tangible Book Value multiples calibrated to peer community banks
- P/E analysis on thin or volatile earnings bases
- DCF models with WACC and terminal growth inputs
- Comparable transaction analysis across precedent MDI/CDFI deals
- Portfolio-level aggregation across 10–12 institutions
`cdfi-val` fills that gap.
---
## Installation
```bash
pip install cdfi-val
Or clone and install locally:
git clone https://github.com/Jaypatel1511/cdfi-val.git
cd cdfi-val
pip install -e .
Quickstart
from cdfival import BankProfile, tbv, pe, dcf
# Define your institution
bank = BankProfile(
name="Carver Federal Savings Bank",
ticker="CARV",
total_assets=700_000_000,
tangible_common_equity=45_000_000,
shares_outstanding=179_600_000,
net_income_ltm=2_100_000,
eps_ltm=0.012,
cet1_ratio=0.118,
institution_type="MDI",
)
# TBV valuation
result = tbv.value(bank, multiple_range=(0.5, 0.9))
result.summary()
# P/E valuation
result = pe.value(bank, multiple_range=(8.0, 15.0))
result.summary()
# DCF valuation
result = dcf.value(bank, wacc=0.10, terminal_growth=0.025, projection_years=5)
result.summary()
Portfolio Mode
Aggregate valuations across a portfolio of institutions:
from cdfival import BankProfile, ValuationTracker
tracker = ValuationTracker()
tracker.add(bank1)
tracker.add(bank2)
tracker.add(bank3)
# Single method summary table
df = tracker.summary_table(method="tbv", multiple_range=(0.5, 1.0))
print(df)
# All three methods at once
results = tracker.all_methods(
tbv_range=(0.5, 1.0),
pe_range=(8.0, 15.0),
wacc=0.10,
terminal_growth=0.025,
)
print(results["tbv"])
print(results["dcf"])
Comparable Transactions
from cdfival.models.comps import ComparableTransaction, value
transactions = [
ComparableTransaction(
acquiree_name="Unity Bank",
deal_date="2021-04-01",
deal_value=36_000_000,
acquiree_tce=45_000_000,
acquiree_net_income=2_000_000,
acquiree_total_assets=500_000_000,
institution_type="MDI",
),
ComparableTransaction(
acquiree_name="Harbor Community Bank",
deal_date="2022-08-15",
deal_value=56_000_000,
acquiree_tce=70_000_000,
acquiree_net_income=3_500_000,
acquiree_total_assets=650_000_000,
institution_type="CDFI",
),
]
result = value(bank, transactions, metric="tbv")
result.summary()
Valuation Methodologies
| Method | Module | Key Inputs |
|---|---|---|
| Tangible Book Value | models.tbv |
TCE, shares outstanding, P/TBV range |
| Price / Earnings | models.pe |
Net income, EPS, P/E range |
| Discounted Cash Flow | models.dcf |
WACC, terminal growth, projection years |
| Comparable Transactions | models.comps |
Precedent deal multiples, TBV or P/E metric |
Who This Is For
- CDFI Fund staff reviewing investment proposals
- Impact investors conducting IC-level diligence on MDIs
- Analysts at CDFIs building valuation models for equity transactions
- Researchers studying community bank valuations at scale
Running Tests
PYTHONPATH=. pytest tests/ -v
46 tests across all modules.
Contributing
Pull requests are welcome. Please open an issue first to discuss what you'd like to change.
Issues tagged good first issue are a great starting point.
License
MIT © 2025 cdfi-val contributors
Metadata
Release files for cdfi-val 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| cdfi_val-0.1.0.tar.gz | 11.3 kB | Without provenance | Details for cdfi_val-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| cdfi_val-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for cdfi_val-0.1.0-py3-none-any.whl |
Total release size: 24.0 kB
Release files / cdfi_val-0.1.0.tar.gz
| Download URL | cdfi_val-0.1.0.tar.gz |
|---|---|
| Size | 11.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8e869c76a1782d0beebe469dfb9bde93bbe80e0845920cbe0b4e666d70aff345
|
|
BLAKE2b-256 checksum How to use checksums |
89860414ea2340facb1546f9e2807d11cb04a919d60839b01f3e665e289c08b6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.12
|
Release files / cdfi_val-0.1.0-py3-none-any.whl
| Download URL | cdfi_val-0.1.0-py3-none-any.whl |
|---|---|
| Size | 12.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
445a1606b230e80c07d4fb18c85ed66668a6c617e85926825464ecec714a1b88
|
|
BLAKE2b-256 checksum How to use checksums |
03eb60b6c76f9ab0fe770471076984c854965486b15a9e72500e9806a634bd13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.12
|
Security for cdfi-val 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.