bond-issuer-screener
CDFI Bond Guarantee Program eligibility screener — quickly assess whether a CDFI meets the net asset, lending volume, portfolio quality, and governance thresholds required to participate in Treasury's BGP. Compute a composite capacity score, estimate maximum issuance size, quantify gaps, and generate Markdown screening reports.
Why
The CDFI Bond Guarantee Program allows certified CDFIs to issue bonds of $100M–$1B with a federal guarantee. Qualifying is non-trivial: CDFIs must meet minimum asset, volume, and quality thresholds, have at least three years of certification, and demonstrate governance strength. This library makes the screening process transparent, repeatable, and auditable.
Installation
pip install bond-issuer-screener
Quickstart
from bondscreener import (
CDFIProfile,
BondIssuance,
BGP_THRESHOLDS,
check_basic_eligibility,
check_portfolio_quality,
check_governance,
comprehensive_eligibility_check,
estimate_bond_capacity,
lending_capacity_score,
portfolio_quality_score,
governance_score,
issuance_feasibility,
gap_to_eligibility,
peer_comparison,
generate_screening_report,
eligibility_summary_table,
)
# Describe the CDFI
profile = CDFIProfile(
name="Heartland CDFI",
certification_date="2018-03-01",
total_assets=150_000_000,
net_assets=18_000_000,
total_lending_volume_5yr=320_000_000,
sectors_served=["small_business", "affordable_housing"],
geographic_areas=["IL", "IN", "WI"],
regulator="state",
audit_status="clean",
governance_structure="independent_board",
npl_rate=0.04,
charge_off_rate=0.012,
single_borrower_concentration=0.07,
)
# Describe the proposed bond
issuance = BondIssuance(
proposed_amount=150_000_000,
term_years=15,
intended_use="Small business and community facility lending",
expected_lending_pace=35_000_000,
projected_portfolio_composition={"small_business": 0.60, "community_facility": 0.40},
)
# Run individual threshold checks
basic = check_basic_eligibility(profile)
print(f"Basic eligibility: {'PASS' if basic['overall_passed'] else 'FAIL'}")
print(f"Net assets: ${profile.net_assets:,.0f} (min: ${BGP_THRESHOLDS['min_net_assets']:,.0f})")
quality = check_portfolio_quality(profile)
print(f"Portfolio quality: {'PASS' if quality['overall_passed'] else 'FAIL'}")
gov = check_governance(profile)
print(f"Governance: {'PASS' if gov['overall_passed'] else 'FAIL'}")
# Full eligibility check
result = comprehensive_eligibility_check(profile, issuance)
print(result.summary())
# Capacity scores
lc = lending_capacity_score(profile)
pq = portfolio_quality_score(profile)
gs = governance_score(profile)
print(f"Lending capacity: {lc:.1f} Portfolio quality: {pq:.1f} Governance: {gs:.1f}")
# Bond capacity estimate
cap = estimate_bond_capacity(profile)
print(f"Max bond size: ${cap['recommended_max']:,.0f} ({cap['rationale']})")
# Full feasibility analysis
feasibility = issuance_feasibility(profile, issuance)
print(f"Feasibility: {feasibility['overall_feasibility']}")
for note in feasibility["summary_notes"]:
print(f" - {note}")
# Gap analysis (what's needed to qualify)
gap = gap_to_eligibility(profile, issuance)
print(f"Already eligible: {gap['is_already_eligible']}")
# Peer comparison
peer = CDFIProfile(
"Peer Fund", "2016-01-01", 80_000_000, 10_000_000, 210_000_000,
["small_business"], ["OH"], "OCC", "clean", "independent_board",
npl_rate=0.07, charge_off_rate=0.02, single_borrower_concentration=0.09,
)
comp = peer_comparison(profile, [peer])
print(f"Peer standing: {comp['peer_standing']} (overall percentile: {comp['overall_percentile']:.0f})")
# Generate a full Markdown report
report = generate_screening_report(profile, issuance)
print(report[:500])
# Summary table for multiple CDFIs
table = eligibility_summary_table([profile, peer], [issuance, issuance])
for row in table:
print(f"{row['name']:25s} eligible={row['is_eligible']} tier={row['capacity_tier']}")
Key Features
- Threshold checking — net assets ($2M), 5-year lending volume ($200M), certification years (3+), leverage ratio, NPL rate (≤15%), charge-offs (≤5%), single-borrower concentration (≤10%)
- Governance assessment — audit status (clean required), board independence, federal vs. state regulation
- Capacity scoring — 0-100 composite score weighted across lending capacity (40%), portfolio quality (35%), and governance (25%)
- Bond capacity estimation — leverage-based and deployment-based caps; identifies binding constraint
- Feasibility analysis — combines eligibility, capacity, and deployment pace into a single verdict
- Gap analysis — quantifies exactly what a CDFI needs to close to qualify, with time estimates
- Peer comparison — percentile ranks across all key metrics vs. a peer group
- Markdown report generation — export-ready screening reports with threshold tables and recommendations
Use Cases
- CDFIs assessing their BGP readiness before investing in application preparation
- Consultants screening client portfolios for BGP suitability
- Intermediaries comparing multiple CDFIs for referral or co-issuance opportunities
- Researchers analyzing BGP participant characteristics at scale
License
MIT © Jay Patel
Metadata
Release files for bond-issuer-screener 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 |
|---|---|---|---|---|
| bond_issuer_screener-0.1.0.tar.gz | 16.6 kB | Without provenance | Details for bond_issuer_screener-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| bond_issuer_screener-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for bond_issuer_screener-0.1.0-py3-none-any.whl |
Total release size: 32.7 kB
Release files / bond_issuer_screener-0.1.0.tar.gz
| Download URL | bond_issuer_screener-0.1.0.tar.gz |
|---|---|
| Size | 16.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2cb725224aae7dfc3b3131405e99b2c6b66697c6d66837a92360df26e7b6ad4a
|
|
BLAKE2b-256 checksum How to use checksums |
40d535560bc2aaa842b43e94f8beaf104c3660f320d1ada4aecd80d38b93c883
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.12
|
Release files / bond_issuer_screener-0.1.0-py3-none-any.whl
| Download URL | bond_issuer_screener-0.1.0-py3-none-any.whl |
|---|---|
| Size | 16.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d63f6f43d9672c9ce6e6d0408059f631ed5d5a95476be75bc46b2d6e9eb011a7
|
|
BLAKE2b-256 checksum How to use checksums |
b6e502a049d20969b7e0f33c97b42336af41a9be4f26248ec67d3003f2768959
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.12
|
Security for bond-issuer-screener 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.