Credit Risk Fundamentals › Expected Loss Calculation

Michael BrenndoerferDecember 21, 20256 min read
Quantitative FinanceAll chapters
Part 10 of 15Risk Management and Financial Risk Controls
Chapter 54Credit Risk Fundamentals › Expected Loss Calculation
Reading section 8 of 15 · Expected Loss Calculation · 6 minSection 8 of 15 · 6 min

Book contents

Section 8 of 15 · 6 min read

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:

EL=PD×LGD×EAD\text{EL} = \text{PD} \times \text{LGD} \times \text{EAD}

where:

  • EL\text{EL}: Expected Loss in currency units
  • PD\text{PD}: Probability of Default
  • LGD\text{LGD}: Loss Given Default (%)
  • EAD\text{EAD}: 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.

In[22]:
Code
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"] * 10000
Out[23]:
Console
Loan 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:

Credit Spread≥EL Rate+Unexpected Loss Premium+Operating Costs\text{Credit Spread} \geq \text{EL Rate} + \text{Unexpected Loss Premium} + \text{Operating Costs}

where:

  • Credit Spread\text{Credit Spread}: yield spread charged to the borrower
  • EL Rate\text{EL Rate}: Expected Loss expressed as an annualized percentage
  • Unexpected Loss Premium\text{Unexpected Loss Premium}: compensation for capital held against tail risk
  • Operating Costs\text{Operating Costs}: administrative expenses and overhead
In[24]:
Code
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)
Out[25]:
Console
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
Out[26]:
Visualization
Stacked bars for AAA, AA, A, BBB, BB, and B ratings split into expected loss, capital cost, and operating costs. Total spread rises from roughly 170 basis points for AAA to 380 for B; the expected-loss segment expands from near zero to about 210 basis points.
Minimum credit spread components across ratings from AAA to B. Capital and operating costs dominate investment-grade spreads, while expected loss grows rapidly as credit quality deteriorates and becomes the largest component for the B-rated borrower.

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.