32 — Fundamental Credit Analysis, Indices, and Leveraged Loans¶
Learning objectives¶
Compute the standard leverage and coverage ratios credit analysts and loan covenants actually use; compute a CDS index's intrinsic value and basis versus its constituents; understand why a leveraged loan and a high-yield bond from the same issuer carry genuinely different risk. This extends Day 8 (credit) with the fundamental/practitioner layer underneath the spread and default-probability math already covered.
Free learning pack¶
reference/fixed_income/fundamental_credit_analysis.mdreference/fixed_income/credit_indices.mdreference/fixed_income/leveraged_loans.md- Financial Ratios for Credit Analysis — AnalystPrep (CFA Level 1) https://analystprep.com/cfa-level-1-exam/fixed-income/financial-ratios-credit-analysis/
Do not search for more material until these are insufficient.
PREDICT¶
Two issuers both have $100 of EBITDA. Issuer A has $200 of debt and $10 of interest expense; Issuer B has $400 of debt and $30 of interest expense. Without calculating: which issuer is more leveraged, and which has weaker interest coverage? Are those necessarily the same issuer?
Formula¶
leverage_ratio = total_debt / EBITDA (lower is safer)
interest_coverage_ratio = EBITDA / interest_expense (higher is safer)
fixed_charge_coverage_ratio = EBITDA / (interest_expense + mandatory_principal_payments)
# MANUAL FIRST:
issuer_a_leverage = None # total_debt=200, ebitda=100
issuer_a_coverage = None # ebitda=100, interest_expense=10
issuer_b_leverage = None # total_debt=400, ebitda=100
issuer_b_coverage = None # ebitda=100, interest_expense=30
print("A:", issuer_a_leverage, issuer_a_coverage)
print("B:", issuer_b_leverage, issuer_b_coverage)
# CHECK (uncomment after your attempt):
# import numpy as np
# assert np.isclose(issuer_a_leverage, 2.0) and np.isclose(issuer_a_coverage, 10.0)
# assert np.isclose(issuer_b_leverage, 4.0) and np.isclose(issuer_b_coverage, 100/30)
# assert issuer_b_leverage > issuer_a_leverage and issuer_b_coverage < issuer_a_coverage
Now add mandatory amortization¶
Issuer A also has $15 of mandatory principal payments due this year (a term loan amortization schedule, say). How much does that change its coverage picture versus interest coverage alone?
# MANUAL FIRST:
issuer_a_fixed_charge_coverage = None # ebitda=100, interest_expense=10, mandatory_principal_payments=15
print(issuer_a_fixed_charge_coverage)
# CHECK (uncomment after your attempt):
# assert issuer_a_fixed_charge_coverage < issuer_a_coverage, (
# "fixed-charge coverage must be stricter (lower) than interest coverage alone "
# "once mandatory amortization is added to the denominator"
# )
PREDICT (covenants)¶
Issuer A's bond has an incurrence covenant capping leverage at 3.0x; Issuer A's term loan has a maintenance covenant capping leverage at 3.0x too. Issuer A's leverage drifts up to 3.5x over two quarters purely from EBITDA declining, with no new debt issued. Does the bond covenant get breached? Does the loan covenant?
PREDICT (credit indices)¶
Five single-name CDS spreads (bp): 80, 90, 100, 70, 110. The index itself trades at 95bp. Is the index cheap or rich relative to its (equal-weighted) intrinsic value — and by how much?
Formula (credit index)¶
index_intrinsic_spread = weighted_average(constituent_spreads)
index_basis = index_spread - intrinsic_spread
from pm.fixed_income.credit import index_basis, index_intrinsic_spread
constituent_spreads = [80, 90, 100, 70, 110]
index_spread = 95
# MANUAL FIRST:
intrinsic = None
basis = None
print("intrinsic:", intrinsic, " basis:", basis)
# CHECK (uncomment after your attempt):
# import numpy as np
# assert np.isclose(intrinsic, 90.0)
# assert np.isclose(basis, 5.0)
PREDICT (leveraged loans)¶
A company has both a floating-rate term loan and a fixed-rate high-yield bond outstanding. The central bank raises rates sharply. Whose interest bill goes up because of that alone - the loan's, the bond's, or both? And whose coverage ratio (from the formula above) is directly affected as a result?
Reference¶
reference/fixed_income/fundamental_credit_analysis.md
reference/fixed_income/credit_indices.md
reference/fixed_income/leveraged_loans.md
Promote¶
Use src/pm/fixed_income/credit.py (leverage_ratio,
interest_coverage_ratio, fixed_charge_coverage_ratio,
index_intrinsic_spread, index_basis) only after your own
implementation.
Test¶
pytest tests/test_fixed_income.py
ORAL CHECK¶
Explain to a PM why "more leveraged" and "worse interest coverage" aren't automatically the same fact about an issuer - use your Issuer A vs. B numbers. Then explain why a rising-rate environment is a fundamentally different event for a floating-rate loan holder than for a fixed-rate bond holder of the exact same issuer.
Try /tutor fundamental credit analysis or /tutor credit indices for
an adaptive walkthrough.