Credit Risk Fundamentals › Expected Loss Calculation
Quantitative FinanceAll chapters Credit Risk Fundamentals › Expected Loss CalculationOne section · Sections in this chapter8 / 15 ↓
Reading tools Definitions & inline links
Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.
Article links
Make inline references clickable
With all three components defined, we can calculate expected loss by multiplying them together:
where:
- : Expected Loss in currency units
- : Probability of Default
- : Loss Given Default (%)
- : Exposure at Default (currency units)
This formula represents the average loss we expect over the time horizon, considering the probability-weighted outcome. To understand why this multiplication makes sense, think of it as a weighted average. With probability PD, default occurs and we lose LGD percent of our EAD exposure. With probability (1 - PD), no default occurs and we lose nothing. The expected value calculation yields EL = PD × LGD × EAD + (1 - PD) × 0 = PD × LGD × EAD. This simple yet useful formula is the foundation for loan pricing, provisioning, and understanding the credit risk contribution of individual exposures.
def calculate_expected_loss(pd, lgd, ead):
"""
Calculate expected loss for a credit exposure.
Parameters:
-----------
pd : float
Probability of default (annual)
lgd : float
Loss given default (as decimal)
ead : float
Exposure at default
Returns:
--------
float : Expected loss in currency units
"""
return pd * lgd * ead
# Portfolio of corporate loans
portfolio = pd.DataFrame(
{
"Borrower": [
"Company A",
"Company B",
"Company C",
"Company D",
"Company E",
],
"Rating": ["A", "BBB", "BB", "B", "A"],
"EAD": [5_000_000, 10_000_000, 3_000_000, 2_000_000, 8_000_000],
"PD": [0.0006, 0.0018, 0.0115, 0.0465, 0.0006], # From rating PD table
"LGD": [
0.45,
0.45,
0.55,
0.60,
0.40,
], # Varying by collateral/seniority
}
)
portfolio["Expected_Loss"] = portfolio.apply(
lambda row: calculate_expected_loss(row["PD"], row["LGD"], row["EAD"]),
axis=1,
)
portfolio["EL_bps"] = portfolio["Expected_Loss"] / portfolio["EAD"] * 10000Loan Portfolio Expected Loss Analysis ===================================================================================== Borrower Rating EAD ($M) PD LGD EL ($) EL (bps) ------------------------------------------------------------------------------------- Company A A 5.0 0.0006 0.45 1,350 2.7 Company B BBB 10.0 0.0018 0.45 8,100 8.1 Company C BB 3.0 0.0115 0.55 18,975 63.3 Company D B 2.0 0.0465 0.60 55,800 279.0 Company E A 8.0 0.0006 0.40 1,920 2.4 ------------------------------------------------------------------------------------- Total Portfolio 28.0 86,145
The expected loss calculation reveals that the B-rated Company D, despite having the smallest exposure, contributes disproportionately to portfolio expected loss due to its high PD. At 4.65% annual default probability and 60% LGD, Company D's $2 million exposure generates $55,800 in expected loss, more than twice the expected loss from Company B's exposure that is five times larger. This insight informs risk-based pricing: higher-risk borrowers should pay higher spreads to compensate for expected losses. Without this differentiated pricing, the portfolio would effectively subsidize risky borrowers at the expense of safer ones.
From Expected Loss to Loan Pricing
Expected loss directly informs credit spread requirements. You must charge enough to cover expected losses plus a return for unexpected losses and administrative costs. If spreads are set below this minimum, the lending business destroys value; if set above, you earn economic profit:
where:
- : yield spread charged to the borrower
- : Expected Loss expressed as an annualized percentage
- : compensation for capital held against tail risk
- : administrative expenses and overhead
def minimum_credit_spread(
pd, lgd, capital_charge=0.08, target_roe=0.15, operating_cost_bps=50
):
"""
Calculate minimum credit spread for loan pricing.
Parameters:
-----------
pd : float
Probability of default
lgd : float
Loss given default
capital_charge : float
Required capital as fraction of exposure (regulatory + buffer)
target_roe : float
Target return on allocated equity capital
operating_cost_bps : float
Operating costs in basis points
Returns:
--------
dict : Spread components and total
"""
# Expected loss rate
el_rate = pd * lgd
# Capital cost = capital charge × target return
capital_cost = capital_charge * target_roe
# Operating costs
operating = operating_cost_bps / 10000
total_spread = el_rate + capital_cost + operating
return {
"expected_loss_bps": el_rate * 10000,
"capital_cost_bps": capital_cost * 10000,
"operating_cost_bps": operating_cost_bps,
"minimum_spread_bps": total_spread * 10000,
}
# Pricing a BBB loan
pd_pricing = 0.0018
lgd_pricing = 0.45
pricing = minimum_credit_spread(pd=pd_pricing, lgd=lgd_pricing)Loan Pricing Analysis for BBB-rated Borrower ================================================== Probability of Default: 0.18% Loss Given Default: 45% Spread Components: Expected Loss: 8.1 bps Capital Cost: 120.0 bps Operating Costs: 50.0 bps --------------------------- Minimum Credit Spread: 178.1 bps

This framework explains why credit spreads exceed simple expected loss rates by a substantial margin. The expected loss for a BBB borrower is only about 8 basis points, yet the minimum viable spread is approximately 178 basis points. The capital cost component, which ensures shareholders earn an adequate return on the capital held against potential unexpected losses, dominates the pricing. This capital must be held to absorb losses that exceed expectations, and shareholders require compensation for putting that capital at risk.