Skip to main content

CDFI Bond Guarantee Program eligibility screener — net asset, lending volume, portfolio quality thresholds, and bond issuance feasibility analysis

Project description

bond-issuer-screener

PyPI Python License

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bond_issuer_screener-0.1.0.tar.gz (16.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bond_issuer_screener-0.1.0-py3-none-any.whl (16.0 kB view details)

Uploaded Python 3

File details

Details for the file bond_issuer_screener-0.1.0.tar.gz.

File metadata

  • Download URL: bond_issuer_screener-0.1.0.tar.gz
  • Upload date:
  • Size: 16.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.12

File hashes

Hashes for bond_issuer_screener-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2cb725224aae7dfc3b3131405e99b2c6b66697c6d66837a92360df26e7b6ad4a
MD5 07a7b0da57d95219b813e7ad59349c63
BLAKE2b-256 40d535560bc2aaa842b43e94f8beaf104c3660f320d1ada4aecd80d38b93c883

See more details on using hashes here.

File details

Details for the file bond_issuer_screener-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for bond_issuer_screener-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d63f6f43d9672c9ce6e6d0408059f631ed5d5a95476be75bc46b2d6e9eb011a7
MD5 52584aa4b929c8f39a686403f22028a6
BLAKE2b-256 b6e502a049d20969b7e0f33c97b42336af41a9be4f26248ec67d3003f2768959

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page