Credit Risk Fundamentals: PD, LGD, and EAD Framework

Michael BrenndoerferDecember 21, 202553 min read

Master credit risk measurement through Probability of Default, Loss Given Default, and Exposure at Default. Learn loan pricing and portfolio analysis.

Reading Level

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.

Credit Risk Fundamentals

Credit risk is the possibility of financial loss arising from a borrower's failure to repay a loan or meet contractual obligations. While market risk, which we examined in the previous chapter, stems from movements in prices, rates, and volatilities, credit risk arises from the potential deterioration or default of a counterparty's creditworthiness. For banks, insurance companies, and asset managers, credit risk often represents the largest source of potential losses. Understanding and quantifying this risk is essential for pricing loans, setting aside reserves, and making sound investment decisions.

The 2008 financial crisis showed the dangers of poorly understood and mispriced credit risk. Subprime mortgage defaults cascaded through structured credit products, amplified by interconnected counterparty exposures, ultimately threatening the global financial system. What began as localized losses in one segment of the housing market quickly spread into a systemic crisis, showing how deeply credit risk affects modern financial markets. This crisis showed why rigorous credit risk measurement is essential and led to reforms that still shape the industry today.

This chapter introduces the foundational framework for quantifying credit risk through three key components: the Probability of Default (PD), Loss Given Default (LGD), and Exposure at Default (EAD). Together, these parameters allow us to calculate expected losses and inform decisions about loan pricing, bond valuation, capital allocation, and loss provisioning. Building on our earlier discussion of credit default swaps and structured credit products in Part II, we now examine the quantitative mechanics underlying credit risk assessment. By the end of this chapter, you will understand not just the formulas themselves, but the intuition behind each component and how they work together to provide a complete picture of credit risk.

The Credit Risk Framework

Credit risk manifests in several forms, each requiring your careful attention. Default risk is the most severe form: a borrower fails to make required payments, triggering legal remedies and potential losses for creditors. This is the ultimate credit event that the entire framework is designed to assess. Credit migration risk occurs when a borrower's credit quality deteriorates, increasing the likelihood of future default and reducing the value of existing exposures. Even without an actual default, a downgrade from investment grade to speculative grade can cause significant mark-to-market losses for bondholders. Spread risk, which we touched on when discussing CDS pricing, reflects changes in credit spreads even without actual default or rating changes. These spread movements reflect the market's evolving assessment of creditworthiness and can create substantial gains or losses for holders of credit-sensitive instruments.

The fundamental equation of credit risk measurement combines three components into a single expression for expected credit losses:

Expected Loss=PD×LGD×EAD\text{Expected Loss} = \text{PD} \times \text{LGD} \times \text{EAD}

where:

  • Expected Loss\text{Expected Loss}: the average loss anticipated over the time horizon
  • PD\text{PD}: Probability of Default, the likelihood that the borrower will default within a given time horizon
  • LGD\text{LGD}: Loss Given Default, the fraction of exposure lost if default occurs
  • EAD\text{EAD}: Exposure at Default, the amount owed at the moment of default

This deceptively simple formula answers three core questions. First, how likely is it that this borrower will fail to meet their obligations? Second, if they do default, how much of our exposure will we actually lose after recovery efforts? Third, at the moment of default, how much will we have at stake? This framework is modular: each component can be analyzed, estimated, and modeled separately, yet they combine to produce a single, actionable measure of expected credit loss.

Each component requires careful estimation and carries its own sources of uncertainty. Probability of Default depends on the borrower's financial health, industry conditions, and macroeconomic factors. Loss Given Default varies with collateral quality, seniority in the capital structure, and the economic environment at the time of default. Exposure at Default can change over time as borrowers draw on credit lines or as derivative exposures fluctuate with market conditions. We'll examine each in depth before bringing them together to see how the complete framework operates in practice.

Probability of Default

Probability of Default (PD) is the chance a borrower fails to meet debt obligations, usually within a year. It is a widely studied part of credit risk because it predicts uncertain future events. Estimating PD uses historical data, fundamental analysis, and market signals. Different approaches offer different perspectives on creditworthiness, and you often use multiple methods to estimate default risk.

Credit Ratings and Rating Agency Methodologies

Credit rating agencies, such as Moody's, Standard & Poor's, and Fitch, provide independent assessments of creditworthiness that have become a cornerstone of global fixed income markets. These grades provide a common way to describe credit quality and compare borrowers. These ratings carry significant implications: they influence bond yields, determine eligibility for investment mandates, and trigger collateral requirements in derivative contracts. The letter grades translate into broad categories of default probability based on decades of observed default experience:

In[2]:
Code
import pandas as pd

# Historical one-year default rates by rating category (approximate averages)
# Based on Moody's long-term corporate default studies
rating_data = {
    "Rating": [
        "Aaa/AAA",
        "Aa/AA",
        "A/A",
        "Baa/BBB",
        "Ba/BB",
        "B/B",
        "Caa-C/CCC-C",
    ],
    "Category": [
        "Prime",
        "High Grade",
        "Upper Medium",
        "Lower Medium",
        "Speculative",
        "Highly Speculative",
        "Substantial Risk",
    ],
    "One_Year_PD": [0.0001, 0.0002, 0.0006, 0.0018, 0.0115, 0.0465, 0.1680],
    "Five_Year_PD": [0.0012, 0.0033, 0.0075, 0.0208, 0.0956, 0.2180, 0.4520],
}

ratings_df = pd.DataFrame(rating_data)
Out[3]:
Console
Historical Default Rates by Credit Rating
======================================================================
Aaa/AAA      (Prime               ): 1Y PD =   0.01%  5Y PD =   0.12%
Aa/AA        (High Grade          ): 1Y PD =   0.02%  5Y PD =   0.33%
A/A          (Upper Medium        ): 1Y PD =   0.06%  5Y PD =   0.75%
Baa/BBB      (Lower Medium        ): 1Y PD =   0.18%  5Y PD =   2.08%
Ba/BB        (Speculative         ): 1Y PD =   1.15%  5Y PD =   9.56%
B/B          (Highly Speculative  ): 1Y PD =   4.65%  5Y PD =  21.80%
Caa-C/CCC-C  (Substantial Risk    ): 1Y PD =  16.80%  5Y PD =  45.20%
Out[4]:
Visualization
Historical annual default rates across credit rating categories. Default probabilities increase exponentially as ratings decline, with speculative grade (BB and below) showing significantly higher risk than investment grade tiers.
Historical annual default rates across credit rating categories. Default probabilities increase exponentially as ratings decline, with speculative grade (BB and below) showing significantly higher risk than investment grade tiers.

The table reveals the dramatic increase in default probability as ratings decline, a pattern that demonstrates the informational content embedded in credit ratings. An investment-grade BBB-rated company has roughly a 0.18% annual default probability, while a B-rated speculative company faces a 4.65% chance of defaulting within a year, which is about 26 times higher. This exponential increase in default risk as ratings deteriorate explains why the boundary between investment grade (BBB and above) and speculative grade (BB and below) carries such significance in financial markets. Many institutional investors face restrictions on holding speculative-grade debt, and the crossing of this threshold can trigger forced selling that further depresses bond prices.

Rating agencies develop their assessments through qualitative and quantitative analysis of business risk (industry dynamics, competitive position, management quality) and financial risk (leverage, interest coverage, cash flow stability). Analysts examine a company's strategic positioning, its ability to generate consistent cash flows, and its capacity to service debt obligations under adverse conditions. While ratings provide useful benchmarks, they have limitations: they're typically "through-the-cycle" assessments designed to be stable over time, which means they may not capture rapidly changing credit conditions. This stability is intentional, as it prevents excessive rating volatility that could disrupt markets, but it also means ratings can lag behind deteriorating fundamentals until the problems become severe.

Market-Implied Probability of Default

As we discussed in our coverage of credit default swaps, market prices embed information about perceived default risk that updates continuously with market conditions. The CDS spread reflects the premium investors demand for bearing default risk, allowing us to extract an implied probability of default directly from observable market prices. This market-based approach provides a valuable complement to rating agency assessments, offering a real-time view of how the market perceives creditworthiness.

For a simplified calculation, we can approximate the risk-neutral PD from CDS spreads. The intuition is that the CDS spread (insurance premium) must compensate the seller for the expected loss, which is the product of the default probability and the loss severity (1Recovery Rate1 - \text{Recovery Rate}). Think of it this way: if you are selling insurance against default, you need to charge a premium that at least covers the expected payout. The expected payout equals the probability of having to pay out multiplied by the amount you would lose. We can derive the implied PD by equating the CDS spread to the expected loss rate and solving for the unknown default probability:

CDS SpreadPD×LGD(premium equals expected loss)CDS SpreadPD×(1Recovery Rate)(substitute LGD definition)PDimpliedCDS Spread1Recovery Rate(solve for PD)\begin{aligned} \text{CDS Spread} &\approx \text{PD} \times \text{LGD} && \text{(premium equals expected loss)} \\ \text{CDS Spread} &\approx \text{PD} \times (1 - \text{Recovery Rate}) && \text{(substitute LGD definition)} \\ \text{PD}_{\text{implied}} &\approx \frac{\text{CDS Spread}}{1 - \text{Recovery Rate}} && \text{(solve for PD)} \end{aligned}

where:

  • PDimplied\text{PD}_{\text{implied}}: implied probability of default derived from market prices
  • CDS Spread\text{CDS Spread}: cost of credit protection (expressed as a decimal)
  • Recovery Rate\text{Recovery Rate}: expected fraction of exposure recovered in default
In[5]:
Code
def implied_pd_from_cds(cds_spread_bps, recovery_rate=0.40, years=1):
    """
    Calculate implied probability of default from CDS spread.

    Parameters:
    -----------
    cds_spread_bps : float
        CDS spread in basis points
    recovery_rate : float
        Expected recovery rate (typically 40% for senior unsecured)
    years : float
        Time horizon

    Returns:
    --------
    float : Annualized implied probability of default
    """
    cds_spread = cds_spread_bps / 10000  # Convert to decimal

    # Simplified approximation
    annual_pd = cds_spread / (1 - recovery_rate)

    # For multi-year, convert to cumulative
    cumulative_pd = 1 - (1 - annual_pd) ** years

    return annual_pd, cumulative_pd


# Example: Company with 200 bps CDS spread
cds_spread = 200
recovery = 0.40

annual, cumulative_5y = implied_pd_from_cds(cds_spread, recovery, years=5)
Out[6]:
Console
CDS Spread: 200 basis points
Assumed Recovery Rate: 40%

Implied Default Probabilities:
  One-year PD:  3.33%
  Five-year cumulative PD: 15.59%
Out[7]:
Visualization
Implied default probabilities derived from CDS spreads under different recovery rate assumptions. Lower recovery rates imply lower default probabilities for a given spread, as the higher loss severity per default requires fewer defaults to justify the premium.
Implied default probabilities derived from CDS spreads under different recovery rate assumptions. Lower recovery rates imply lower default probabilities for a given spread, as the higher loss severity per default requires fewer defaults to justify the premium.

Key Parameters

The key parameters for the market-implied PD calculation are:

  • CDS Spread: The annual cost of credit protection in basis points. Higher spreads imply higher default risk.
  • Recovery Rate: The fraction of exposure expected to be recovered in default. Lower recovery rates imply lower default probabilities for a given spread.
  • Time Horizon: The period over which the default probability is estimated.

Through-the-Cycle versus Point-in-Time PD

A crucial distinction in PD estimation is between through-the-cycle (TTC) and point-in-time (PIT) approaches, which represent fundamentally different philosophies about how to assess credit risk. Understanding this distinction is essential for interpreting PD estimates correctly and choosing the right approach for each application.

Through-the-Cycle PD

Estimates default probability based on an average of economic conditions over a full credit cycle, producing relatively stable PD values. Used primarily by rating agencies for long-term assessments.

Point-in-Time PD

Reflects current economic conditions and the borrower's present financial state, resulting in more volatile but timely PD estimates. Required for many regulatory and accounting purposes under frameworks like IFRS 9.

The difference between these approaches has profound practical implications. A TTC assessment asks: "What is the average default probability for this type of borrower across good times and bad?" A PIT assessment asks: "Given what we know about current economic conditions and this specific borrower's current situation, what is the default probability right now?" Both questions are valid, but they serve different purposes.

In[8]:
Code
# Simulating TTC vs PIT PD over an economic cycle
np.random.seed(42)

# Economic cycle indicator (-1 = recession, +1 = expansion)
quarters = np.arange(40)
economic_cycle = np.sin(2 * np.pi * quarters / 20)  # ~5 year cycle

# Base PD for a BBB-rated company
base_pd = 0.02

# TTC remains relatively stable
ttc_pd = np.ones(40) * base_pd * (1 + 0.05 * np.random.randn(40))

# PIT varies with economic conditions
pit_pd = base_pd * (1 - 0.5 * economic_cycle) * (1 + 0.1 * np.random.randn(40))
pit_pd = np.clip(pit_pd, 0.005, 0.10)  # Keep in reasonable bounds
Out[9]:
Visualization
Line chart comparing stable TTC PD against volatile PIT PD over economic cycle.
Comparison of Through-the-Cycle and Point-in-Time PD estimates for a BBB-rated company over a simulated 10-year period containing two economic cycles. TTC estimates remain stable while PIT estimates fluctuate with economic conditions.

The choice between TTC and PIT depends on the application. For pricing loans at origination, TTC PD provides stability and ensures consistent treatment of similar borrowers regardless of where we are in the economic cycle. This prevents the procyclical lending behavior where banks extend too much credit during booms (when PIT PDs are low) and restrict credit excessively during downturns (when PIT PDs spike). For calculating accounting provisions or short-term risk management, PIT PD better reflects current conditions and provides a more accurate estimate of near-term expected losses. Basel regulatory frameworks have moved toward PIT estimates for expected credit loss calculations, recognizing that provisions should reflect the best current estimate of losses rather than long-term averages.

Structural Models of Default

Beyond statistical approaches based on historical default rates or market prices, structural models derived from option pricing theory provide a theoretically grounded framework for PD estimation. These models start from first principles about what causes default and derive default probabilities from observable financial variables. The Merton model, which we'll explore more fully in the next chapter, treats equity as a call option on the firm's assets. Default occurs when asset value falls below the debt's face value at maturity, triggering bankruptcy.

The key insight is that a firm's equity holders have limited liability: if assets fall below debt obligations, they can "put" the firm to creditors and walk away. From the shareholders' perspective, they have the right, but not the obligation, to pay off the debt and keep any residual value. This is precisely the payoff structure of a call option, where the asset value is the underlying and the debt face value is the strike price. This optionality allows us to use option pricing techniques to estimate default probability. Assuming the firm's asset value follows a log-normal distribution (as in the Black-Scholes framework), the probability of default is the probability that the asset value VV falls below the debt face value DD at maturity TT:

PD=N(d2)\text{PD} = N(-d_2)

where:

  • PD\text{PD}: probability of default
  • d2=ln(V/D)+(μ12σV2)TσVTd_2 = \frac{\ln(V/D) + (\mu - \frac{1}{2}\sigma_V^2)T}{\sigma_V\sqrt{T}}: distance to default, measuring how many standard deviations the asset value is from the debt face value
  • VV: current asset value
  • DD: face value of debt
  • μ\mu: expected asset return
  • σV\sigma_V: asset volatility
  • TT: time to maturity
  • N()N(\cdot): cumulative standard normal distribution function

The d2d_2 term, often called the "distance to default," provides an intuitive measure of credit quality. It represents, in standardized units, how far the firm's assets must fall before default becomes inevitable. A higher distance to default indicates a safer credit, while a lower or negative distance to default signals imminent distress. This structural approach has the advantage of linking default probability directly to observable firm characteristics like leverage and asset volatility, providing economic intuition for why certain firms are riskier than others.

Loss Given Default

When default occurs, creditors rarely lose their entire exposure. Recovery comes through liquidation of assets, restructuring agreements, or bankruptcy proceedings. Bankruptcy processes aim to maximize creditor value, often through reorganization or liquidation. Loss Given Default (LGD) is the percentage of exposure not recovered after default:

LGD=1Recovery Rate\text{LGD} = 1 - \text{Recovery Rate}

where:

  • LGD\text{LGD}: Loss Given Default, representing the percentage of exposure lost
  • Recovery Rate\text{Recovery Rate}: percentage of exposure recovered through liquidation or restructuring

Estimating LGD is equivalent to estimating recovery rates. Both perspectives are useful. When thinking about what drives losses, the LGD framing is natural. When analyzing bankruptcy outcomes and workout processes, the recovery rate perspective may be more intuitive. The challenge lies in predicting, at the time of loan origination, what recovery rate will ultimately be realized years later under uncertain circumstances.

Factors Affecting Recovery Rates

Recovery rates vary significantly based on several factors, and understanding these drivers is essential for accurate LGD estimation. Let's look at the main factors.

Seniority in the capital structure determines the priority of claims in bankruptcy. The capital structure is essentially a queue: when assets are liquidated, senior secured debt holders are paid first, followed by senior unsecured, subordinated, and finally equity holders. This priority ordering is legally enforced through bankruptcy proceedings and significantly affects expected recoveries. A senior secured lender may recover most or all of their claim, while junior creditors may receive only pennies on the dollar.

In[10]:
Code
# Historical average recovery rates by seniority
# Based on Moody's default and recovery studies
seniority_data = {
    "Instrument": [
        "Senior Secured Bank Loans",
        "Senior Secured Bonds",
        "Senior Unsecured Bonds",
        "Senior Subordinated Bonds",
        "Junior Subordinated Bonds",
    ],
    "Average_Recovery": [0.72, 0.54, 0.40, 0.31, 0.24],
    "Std_Dev": [0.25, 0.26, 0.26, 0.24, 0.22],
}

seniority_df = pd.DataFrame(seniority_data)
seniority_df["LGD"] = 1 - seniority_df["Average_Recovery"]
Out[11]:
Console
Recovery Rates and LGD by Seniority
=================================================================
Senior Secured Bank Loans      | Recovery:  72.0% | LGD:  28.0%
Senior Secured Bonds           | Recovery:  54.0% | LGD:  46.0%
Senior Unsecured Bonds         | Recovery:  40.0% | LGD:  60.0%
Senior Subordinated Bonds      | Recovery:  31.0% | LGD:  69.0%
Junior Subordinated Bonds      | Recovery:  24.0% | LGD:  76.0%
Out[12]:
Visualization
Average recovery rates by debt seniority showing the clear hierarchy of claims. Senior secured bank loans recover approximately 72% of exposure, while junior subordinated bonds recover only 24%. The error bars represent one standard deviation of historical recovery outcomes.
Average recovery rates by debt seniority showing the clear hierarchy of claims. Senior secured bank loans recover approximately 72% of exposure, while junior subordinated bonds recover only 24%. The error bars represent one standard deviation of historical recovery outcomes.

The data shows a clear hierarchy of claims that reflects the legal priority structure: senior secured loans recover roughly 72% of their value, while junior subordinated bonds recover only 24%. This spread illustrates how capital structure priority directly impacts credit losses. The difference of nearly 50 percentage points in recovery rates translates directly into LGD estimates and, consequently, into dramatically different expected losses for lenders at different positions in the capital structure. This is why seniority is one of the most important factors in loan pricing and why senior secured lending commands lower spreads than unsecured or subordinated lending.

Collateral and security significantly affect recovery. Secured loans backed by specific assets (equipment, real estate, receivables) typically achieve higher recoveries than unsecured obligations because the lender has a direct claim on identifiable assets that can be seized and sold. The quality and liquidity of collateral matters enormously: marketable securities or prime real estate can be sold quickly at near-market prices, while specialized industrial equipment may fetch lower prices in distress as potential buyers are limited. You must carefully evaluate not just the current value of collateral, but its likely liquidation value under stressed conditions.

Industry and economic conditions at the time of default influence recovery rates in ways that create unfortunate correlations. During systemic crises, when many firms default simultaneously, asset values are depressed and recoveries tend to be lower. If numerous steel companies default at once, the market for used steel equipment becomes glutted, driving down liquidation values. Industries with tangible assets (utilities, telecommunications) generally see better recoveries than those with primarily intangible assets (technology, services), where the value resides in intellectual property, brand names, and human capital that may evaporate in bankruptcy.

In[13]:
Code
# Simulate recovery rate distribution (bimodal, as observed empirically)
np.random.seed(123)
n_defaults = 1000

# Recovery rates tend to be bimodality, either very low or relatively high
low_recovery = np.random.beta(2, 8, size=int(n_defaults * 0.4)) * 0.5
high_recovery = 0.5 + np.random.beta(5, 3, size=int(n_defaults * 0.6)) * 0.5
recovery_rates = np.concatenate([low_recovery, high_recovery])
Out[14]:
Visualization
Histogram showing bimodal recovery rate distribution with peaks near 20% and 80%.
Distribution of recovery rates for senior unsecured bonds showing substantial variation around the 40% mean. The wide dispersion highlights uncertainty in LGD estimation.

The distribution of recovery rates is notably non-normal, often exhibiting bimodality; defaults either result in near-total loss or substantial recovery, with fewer outcomes in between. This pattern emerges because some defaults involve fundamentally unviable businesses where asset values collapse, while others represent temporary liquidity problems in otherwise sound enterprises that can be successfully restructured. This characteristic makes LGD estimation challenging and suggests that using a single point estimate like 40% oversimplifies the true risk. The wide standard deviation around mean recovery rates implies substantial uncertainty in any individual LGD estimate, which must be accounted for in risk management.

Downturn LGD

Regulators require banks to consider "downturn LGD" (recovery rates during stressed economic conditions) for capital calculations. Historical evidence shows that recoveries decline precisely when default rates spike, creating an unfortunate correlation that amplifies credit losses during crises. This phenomenon represents one of the most challenging aspects of credit risk: the parameters that determine losses are not independent but move together in adverse ways during stressed periods.

In[15]:
Code
# Illustrate correlation between default rates and recovery rates
years = np.arange(2000, 2024)

# Simulated annual default rates (elevated during recessions)
default_rates = np.array(
    [
        0.012,
        0.015,
        0.025,
        0.018,
        0.010,
        0.008,
        0.007,
        0.008,
        0.015,
        0.045,
        0.032,
        0.022,
        0.015,
        0.012,
        0.010,
        0.012,
        0.015,
        0.012,
        0.010,
        0.025,
        0.018,
        0.015,
        0.020,
        0.018,
    ]
)

# Recovery rates inversely correlated with default rates
recovery_rates_ts = (
    0.50
    - 1.5 * (default_rates - default_rates.mean())
    + 0.02 * np.random.randn(len(years))
)
recovery_rates_ts = np.clip(recovery_rates_ts, 0.25, 0.65)
Out[16]:
Visualization
Dual axis chart showing default rates and recovery rates moving inversely over time.
Inverse relationship between aggregate default rates and recovery rates from 2000-2023. During the 2008-2009 crisis, high default rates coincided with depressed recoveries, amplifying credit losses.

The inverse relationship between default rates and recovery rates creates a double whammy for creditors during downturns. Not only do more borrowers default, but each default results in larger losses. This correlation arises from common underlying factors: economic recessions depress both corporate profitability (increasing defaults) and asset values (reducing recoveries). Understanding and modeling this correlation is essential for stress testing and capital planning, as it means that average-cycle estimates of LGD may significantly understate losses during the periods that matter most.

Exposure at Default

Exposure at Default (EAD) is the amount a borrower owes when they default. It determines the scale of potential loss; even with zero recovery, losses are limited to the exposure. For a standard term loan, EAD might seem straightforward: simply the outstanding principal plus accrued interest. However, EAD becomes more complex for revolving facilities, commitments, and derivative exposures, where the amount at risk can change significantly between now and the time of default.

EAD for Loans and Commitments

For drawn loans, EAD equals the current outstanding balance, a simple and observable quantity:

EADdrawn=Outstanding Principal+Accrued Interest\text{EAD}_{\text{drawn}} = \text{Outstanding Principal} + \text{Accrued Interest}

where:

  • EADdrawn\text{EAD}_{\text{drawn}}: Exposure at Default for fully funded loans
  • Outstanding Principal\text{Outstanding Principal}: current unpaid principal balance
  • Accrued Interest\text{Accrued Interest}: interest earned but not yet paid

For undrawn commitments (credit lines), you must estimate how much the borrower will draw before defaulting. This introduces behavioral uncertainty: will a distressed borrower tap their available credit lines? Historically, borrowers in distress tend to draw down available credit lines aggressively, using every available source of liquidity in an attempt to survive. This means assuming zero utilization would significantly underestimate EAD. The Credit Conversion Factor (CCF) captures this behavior by estimating what portion of unused credit lines will typically be drawn before default occurs:

EADcommitment=Drawn Amount+CCF×Undrawn Amount\text{EAD}_{\text{commitment}} = \text{Drawn Amount} + \text{CCF} \times \text{Undrawn Amount}

where:

  • EADcommitment\text{EAD}_{\text{commitment}}: Exposure at Default for a facility with undrawn capacity
  • Drawn Amount\text{Drawn Amount}: currently utilized portion of the credit line
  • CCF\text{CCF}: Credit Conversion Factor, estimating the percentage of undrawn line that will be drawn before default
  • Undrawn Amount\text{Undrawn Amount}: available but unutilized credit limit
In[17]:
Code
def calculate_loan_ead(drawn_amount, commitment_size, ccf=0.75):
    """
    Calculate EAD for a revolving credit facility.

    Parameters:
    -----------
    drawn_amount : float
        Currently utilized amount
    commitment_size : float
        Total committed credit line
    ccf : float
        Credit conversion factor for undrawn portion

    Returns:
    --------
    float : Estimated Exposure at Default
    """
    undrawn = commitment_size - drawn_amount
    ead = drawn_amount + ccf * undrawn
    return ead


# Example: \$10M commitment with \$3M currently drawn
commitment = 10_000_000
drawn = 3_000_000
ccf_val = 0.75
ead_loan = calculate_loan_ead(drawn, commitment, ccf=ccf_val)
Out[18]:
Console
Credit Facility Details:
  Total Commitment: $10,000,000
  Currently Drawn:  $3,000,000
  Undrawn Amount:   $7,000,000

Using CCF of 75%:
  EAD = $3,000,000 + 0.75 × $7,000,000
  EAD = $8,250,000
Out[19]:
Visualization
Exposure at Default as a function of current utilization for a $10M credit facility. At low utilization, EAD is dominated by the CCF-adjusted undrawn amount. The gap between current drawn amount and EAD narrows as utilization increases.
Exposure at Default as a function of current utilization for a $10M credit facility. At low utilization, EAD is dominated by the CCF-adjusted undrawn amount. The gap between current drawn amount and EAD narrows as utilization increases.

The calculated EAD of $8.25 million reflects the likelihood that a distressed borrower will utilize remaining liquidity. This is significantly higher than the current $3 million balance, showing why credit line exposures require careful EAD estimation.

Basel regulations specify minimum CCF values depending on facility type and commitment characteristics. Unconditionally cancellable commitments (like credit cards where the issuer can reduce the limit at any time) may have lower CCFs than committed facilities where you cannot withdraw the credit line. The rationale is that if you can cancel the commitment when you detect deterioration, the borrower has less opportunity to draw before default.

EAD for Derivatives

For derivative contracts, exposure is not simply the notional amount but rather the potential positive value the contract could have at default. As we discussed when covering forwards and swaps, a derivative has both a current mark-to-market value and future uncertainty about how that value might evolve. This makes derivative EAD more complex than loan EAD, as it depends on market movements between now and the potential default date.

The Basel framework defines two components for derivative EAD that together capture both the current exposure and the potential for that exposure to increase:

EADderivative=Current Exposure+Add-on for Potential Future Exposure\text{EAD}_{\text{derivative}} = \text{Current Exposure} + \text{Add-on for Potential Future Exposure}

where:

  • EADderivative\text{EAD}_{\text{derivative}}: Exposure at Default for a derivative contract
  • Current Exposure\text{Current Exposure}: replacement cost today (max of 0 or mark-to-market value)
  • Add-on for Potential Future Exposure\text{Add-on for Potential Future Exposure}: estimate of potential increase in value over the risk horizon

The current exposure equals the positive mark-to-market value (if the counterparty owes us money). If the derivative is out of the money from our perspective, meaning we owe the counterparty, the current exposure is zero since their default would not cause us a loss on this position. The add-on captures how much that exposure could grow before we could close out the position after default. This add-on depends on the volatility of the underlying risk factor and the time remaining until the position could be replaced.

In[20]:
Code
def derivative_ead(mark_to_market, notional, asset_class, maturity_years):
    """
    Simplified derivative EAD calculation.

    Uses standardized add-on percentages similar to SA-CCR methodology.
    """
    # Current exposure (only positive values create credit risk)
    current_exposure = max(0, mark_to_market)

    # Add-on factors by asset class and maturity (simplified)
    add_on_factors = {
        "interest_rate": {1: 0.005, 5: 0.01, 10: 0.015},
        "fx": {1: 0.01, 5: 0.05, 10: 0.075},
        "equity": {1: 0.06, 5: 0.08, 10: 0.10},
        "commodity": {1: 0.10, 5: 0.12, 10: 0.15},
    }

    # Find appropriate factor (use closest maturity bucket)
    factors = add_on_factors.get(asset_class, add_on_factors["interest_rate"])
    if maturity_years <= 1:
        factor = factors[1]
    elif maturity_years <= 5:
        factor = factors[5]
    else:
        factor = factors[10]

    potential_future_exposure = notional * factor
    ead = current_exposure + potential_future_exposure

    return ead, current_exposure, potential_future_exposure


# Example: 5-year interest rate swap with \$50M notional
notional_swap = 50_000_000
mtm_swap = 1_200_000  # Currently in our favor
ead_swap, ce, pfe = derivative_ead(mtm_swap, notional_swap, "interest_rate", 5)
Out[21]:
Console
Interest Rate Swap EAD Calculation:
  Notional: $50M
  Current MTM: $1.20M (in our favor)
  Maturity: 5 years

EAD Components:
  Current Exposure:            $1.20M
  Potential Future Exposure:   $0.50M
  Total EAD:                   $1.70M

The EAD of $1.70 million is significantly higher than the current $1.20 million mark-to-market value, reflecting the risk that interest rates could move further in your favor before a default occurs. This conservatism is intentional: if our counterparty defaults when they owe us the most, that's precisely when our exposure matters.

Netting agreements and collateral arrangements significantly reduce derivative EAD. When parties have multiple trades under an ISDA master agreement with netting provisions, exposure is calculated on a net basis rather than summing gross positive values. If we have ten swaps with a counterparty, some in our favor and some against us, netting allows us to offset these positions, dramatically reducing credit exposure. We'll explore counterparty credit risk and these mitigation techniques more deeply in an upcoming chapter.

Key Parameters

The key parameters for Exposure at Default calculations are:

  • Commitment Size: The total credit limit available to the borrower.
  • Drawn Amount: The portion of the credit line currently utilized.
  • CCF (Credit Conversion Factor): The percentage of the undrawn commitment expected to be drawn before default.
  • Mark-to-Market: The current replacement cost of a derivative contract.
  • Notional Amount: The reference amount used to calculate payments, driving potential future exposure.
  • Maturity: Time remaining in the contract. Longer maturities typically attract higher add-on factors for potential future exposure.

Expected Loss Calculation

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 powerful formula serves as 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 SpreadEL 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
Components of the minimum credit spread for a BBB-rated borrower. The capital cost (compensation for unexpected loss risk) dominates the spread, with expected loss contributing only a small fraction of the total required spread.
Components of the minimum credit spread for a BBB-rated borrower. The capital cost (compensation for unexpected loss risk) dominates the spread, with expected loss contributing only a small fraction of the total required spread.

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.

Unexpected Loss and Credit VaR

While expected loss represents the mean outcome, credit risk management also requires understanding the potential for losses exceeding expectations. Expected loss tells us the average, but risk management is fundamentally concerned with tail outcomes. Unexpected loss captures the volatility around expected loss, providing a measure of how much actual losses might deviate from the average:

UL=Var(Loss)=EAD×PD×(1PD)×LGD2+PD×Var(LGD)\text{UL} = \sqrt{\text{Var}(\text{Loss})} = \text{EAD} \times \sqrt{\text{PD} \times (1-\text{PD}) \times \text{LGD}^2 + \text{PD} \times \text{Var}(\text{LGD})}

where:

  • UL\text{UL}: Unexpected Loss (one standard deviation of the loss distribution)
  • Var(Loss)\text{Var}(\text{Loss}): variance of the credit loss
  • EAD\text{EAD}: Exposure at Default
  • PD\text{PD}: Probability of Default
  • LGD\text{LGD}: Expected Loss Given Default
  • Var(LGD)\text{Var}(\text{LGD}): variance of the Loss Given Default parameter
  • PD×(1PD)×LGD2\text{PD} \times (1-\text{PD}) \times \text{LGD}^2: component of variance due to uncertainty in the default event itself
  • PD×Var(LGD)\text{PD} \times \text{Var}(\text{LGD}): component of variance due to uncertainty in the recovery rate given default occurs

The formula decomposes variance into two sources. The first term captures uncertainty about whether default will occur: this is the variance of a Bernoulli random variable with probability PD, multiplied by the squared loss severity. The second term captures uncertainty about the severity of loss given that default does occur, reflecting the variability in recovery outcomes. Both sources of uncertainty contribute to unexpected loss and must be managed.

For a portfolio, we must also consider default correlation, which is the tendency for defaults to cluster during economic downturns. When the economy weakens, many borrowers experience stress simultaneously, leading to higher-than-expected default rates precisely when the portfolio is most vulnerable. The unexpected loss of a portfolio is determined by the covariance between individual exposures:

ULportfolio=iULi2+ijρijULiULj\text{UL}_{\text{portfolio}} = \sqrt{\sum_{i} \text{UL}_i^2 + \sum_{i \neq j} \rho_{ij} \text{UL}_i \text{UL}_j}

where:

  • ULportfolio\text{UL}_{\text{portfolio}}: Unexpected Loss of the portfolio
  • ULi\text{UL}_i: Unexpected Loss of individual loan ii
  • ρij\rho_{ij}: correlation of losses (or defaults) between loan ii and loan jj

The second term captures the correlation effect, and its importance cannot be overstated. If correlations are zero, the portfolio UL is simply the square root of the sum of squared individual ULs, meaning diversification works perfectly and portfolio risk is much lower than the sum of individual risks. If correlations are positive, portfolio risk increases substantially because losses tend to occur together. In the extreme case of perfect correlation, there is no diversification benefit at all, and portfolio UL equals the sum of individual ULs.

In[27]:
Code
def unexpected_loss(pd, lgd, lgd_volatility, ead):
    """
    Calculate unexpected loss for a single exposure.

    Parameters:
    -----------
    pd : float
        Probability of default
    lgd : float
        Expected loss given default
    lgd_volatility : float
        Standard deviation of LGD
    ead : float
        Exposure at default

    Returns:
    --------
    float : Unexpected loss (standard deviation of loss)
    """
    variance_loss = (pd * (1 - pd) * lgd**2) + (pd * lgd_volatility**2)
    ul = ead * np.sqrt(variance_loss)
    return ul


# Calculate UL for each loan
portfolio["UL"] = portfolio.apply(
    lambda row: unexpected_loss(row["PD"], row["LGD"], 0.25, row["EAD"]), axis=1
)
Out[28]:
Console
Expected vs Unexpected Loss by Borrower
=================================================================
Company A    | EL: $     1,350 | UL: $      63,033 | UL/EL:   46.7x
Company B    | EL: $     8,100 | UL: $     218,253 | UL/EL:   26.9x
Company C    | EL: $    18,975 | UL: $     193,436 | UL/EL:   10.2x
Company D    | EL: $    55,800 | UL: $     274,721 | UL/EL:    4.9x
Company E    | EL: $     1,920 | UL: $      92,414 | UL/EL:   48.1x

The ratio of unexpected to expected loss is typically much higher for investment-grade exposures because, while their expected losses are small, there's still meaningful probability of default. For a very safe borrower with low PD, expected loss is tiny, but unexpected loss remains significant because if that borrower does default (even though unlikely), the loss would be substantial. This characteristic drives the need for economic capital well beyond expected loss provisions. Banks must hold capital against unexpected losses because expected losses are covered by pricing and provisions, while unexpected losses threaten solvency.

Portfolio Credit Risk

Individual loan metrics tell only part of the story. Portfolio effects, such as diversification and concentration, significantly affect total credit risk. A well-diversified portfolio of many small exposures to borrowers in different industries and regions will have much lower risk than a concentrated portfolio with large exposures to a few correlated borrowers. Understanding these portfolio dynamics is essential for managing credit risk at the enterprise level.

In[29]:
Code
def portfolio_expected_loss(portfolio_df):
    """Calculate total portfolio expected loss (additive)."""
    return portfolio_df["Expected_Loss"].sum()


def portfolio_unexpected_loss_independent(portfolio_df):
    """
    Calculate portfolio UL assuming independence.
    Under independence, variances add, so UL = sqrt(sum of squared ULs).
    """
    return np.sqrt((portfolio_df["UL"] ** 2).sum())


def portfolio_unexpected_loss_correlated(portfolio_df, default_correlation):
    """
    Calculate portfolio UL with default correlation.
    Uses simplified one-factor model approach.
    """
    n = len(portfolio_df)
    uls = portfolio_df["UL"].values

    # Correlation adds covariance terms
    # Var(sum) = sum(var) + 2*sum(cov)
    variance_sum = (uls**2).sum()

    # Add correlation effect
    covariance_sum = 0
    for i in range(n):
        for j in range(i + 1, n):
            covariance_sum += 2 * default_correlation * uls[i] * uls[j]

    return np.sqrt(variance_sum + covariance_sum)


# Calculate portfolio metrics
port_el = portfolio_expected_loss(portfolio)
port_ul_ind = portfolio_unexpected_loss_independent(portfolio)
port_ul_corr = portfolio_unexpected_loss_correlated(
    portfolio, default_correlation=0.20
)
Out[30]:
Console
Portfolio Credit Risk Summary
=======================================================
Total Exposure:                    $28.0M
Portfolio Expected Loss:           $86,145
Portfolio UL (independent):        $415,977
Portfolio UL (20% correlation):    $529,314

Diversification Effect (independent): 50.6%
Correlation Impact:                    +27.2%

Default correlation substantially increases portfolio unexpected loss, and the magnitude of this effect is often surprising. During systemic crises, many borrowers deteriorate simultaneously, causing correlated defaults that overwhelm diversification benefits. When correlations spike, the portfolio that appeared well-diversified under normal conditions can experience concentrated losses. This phenomenon was tragically demonstrated in the structured credit market during 2008, when assumed correlations proved far too low. CDO tranches rated AAA based on historical correlation assumptions suffered unexpected losses because the underlying mortgage borrowers defaulted together at rates that the models had deemed virtually impossible.

Out[31]:
Visualization
Grouped bar chart comparing expected and unexpected loss by borrower.
Comparison of expected loss and unexpected loss contributions across the loan portfolio. Company D dominates expected loss due to high PD, while Company B's large exposure drives unexpected loss.

The comparison highlights the distinct drivers of credit risk components. Company D, with its high probability of default, contributes most to Expected Loss (blue bar). However, Company B generates the highest Unexpected Loss (coral bar) despite a better rating, driven by its large exposure size ($10M). This distinction is crucial for capital allocation, which focuses on buffering against unexpected rather than expected losses. Expected losses are a cost of doing business that should be covered by loan pricing and provisions; unexpected losses are the tail risks that require capital buffers to ensure institutional solvency.

Practical Implementation: Portfolio Credit Analysis

Let's build a more complete credit risk analysis tool that incorporates the concepts we've covered. This implementation brings together PD, LGD, and EAD estimation with portfolio-level risk aggregation, demonstrating how the theoretical framework translates into practical applications:

In[32]:
Code
from scipy import stats


class CreditPortfolio:
    """
    A class for analyzing credit risk in a loan portfolio.
    """

    def __init__(self, loans_df):
        """
        Initialize with a DataFrame containing:
        - 'name': Borrower identifier
        - 'ead': Exposure at default
        - 'pd': Probability of default
        - 'lgd': Loss given default
        """
        self.loans = loans_df.copy()
        self._calculate_metrics()

    def _calculate_metrics(self):
        """Calculate EL and UL for each loan."""
        self.loans["el"] = (
            self.loans["pd"] * self.loans["lgd"] * self.loans["ead"]
        )

        # Assume 25% LGD volatility for UL calculation
        lgd_vol = 0.25
        self.loans["ul"] = self.loans.apply(
            lambda row: row["ead"]
            * np.sqrt(
                row["pd"] * (1 - row["pd"]) * row["lgd"] ** 2
                + row["pd"] * lgd_vol**2
            ),
            axis=1,
        )

    def total_expected_loss(self):
        """Return total portfolio expected loss."""
        return self.loans["el"].sum()

    def total_unexpected_loss(self, correlation=0.20):
        """Return total portfolio unexpected loss with given default correlation."""
        uls = self.loans["ul"].values
        n = len(uls)

        variance = (uls**2).sum()
        for i in range(n):
            for j in range(i + 1, n):
                variance += 2 * correlation * uls[i] * uls[j]

        return np.sqrt(variance)

    def credit_var(self, confidence=0.99, correlation=0.20):
        """
        Estimate Credit VaR at given confidence level.
        Uses normal approximation: VaR ≈ EL + z × UL
        """
        z = stats.norm.ppf(confidence)
        el = self.total_expected_loss()
        ul = self.total_unexpected_loss(correlation)
        return el + z * ul

    def concentration_analysis(self):
        """Analyze portfolio concentration by exposure."""
        total_ead = self.loans["ead"].sum()
        self.loans["ead_share"] = self.loans["ead"] / total_ead

        # Herfindahl-Hirschman Index
        hhi = (self.loans["ead_share"] ** 2).sum()
        effective_n = 1 / hhi  # Effective number of equally-sized loans

        return {
            "hhi": hhi,
            "effective_n": effective_n,
            "largest_exposure_share": self.loans["ead_share"].max(),
        }

    def summary_report(self):
        """Generate comprehensive portfolio summary."""
        return {
            "total_ead": self.loans["ead"].sum(),
            "total_el": self.total_expected_loss(),
            "total_ul_20pct_corr": self.total_unexpected_loss(0.20),
            "credit_var_99": self.credit_var(0.99, 0.20),
            "el_rate_bps": self.total_expected_loss()
            / self.loans["ead"].sum()
            * 10000,
            "concentration": self.concentration_analysis(),
        }
In[33]:
Code
# Create a larger, more realistic portfolio
np.random.seed(42)

n_loans = 50
loan_data = {
    "name": [f"Borrower_{i:02d}" for i in range(n_loans)],
    "ead": np.random.lognormal(
        mean=15, sigma=1.2, size=n_loans
    ),  # Log-normal exposures
    "pd": np.random.choice(
        [0.0006, 0.0018, 0.0115, 0.0465],
        size=n_loans,
        p=[0.20, 0.40, 0.30, 0.10],
    ),  # Rating-based PDs
    "lgd": np.random.uniform(0.35, 0.55, size=n_loans),  # LGD variation
}

loan_portfolio = pd.DataFrame(loan_data)
credit_model = CreditPortfolio(loan_portfolio)
report = credit_model.summary_report()
Out[34]:
Console
Portfolio Credit Risk Summary Report
=======================================================

Exposure Profile:
  Number of Loans:           50
  Total EAD:                 $230.6M
  Largest Exposure Share:    13.1%
  Effective # of Loans:      18.4

Credit Risk Metrics:
  Expected Loss:             $0.95M
  EL Rate:                   41.4 bps
  Unexpected Loss (ρ=20%):   $4.73M
  99% Credit VaR:            $11.95M

The summary report provides a snapshot of the portfolio's risk profile. While the Expected Loss represents the average cost of credit (approximately 23 basis points), the Unexpected Loss and Credit VaR figures reveal the potential tail risk. The 99% Credit VaR indicates that in a 1-in-100 year adverse scenario, losses could exceed the expected level by a significant margin, driven by the correlation between borrowers. This VaR figure informs capital requirements: you need sufficient capital to absorb losses up to this level while remaining solvent.

In[35]:
Code
# Monte Carlo simulation of portfolio losses
def simulate_portfolio_losses(portfolio_model, n_sims=10000, correlation=0.20):
    """Simulate portfolio losses using a simple one-factor model."""
    np.random.seed(123)

    loans = portfolio_model.loans
    n_loans = len(loans)

    # Factor model: each borrower's default depends on:
    # - Common factor (systematic risk)
    # - Idiosyncratic factor

    losses = np.zeros(n_sims)

    for sim in range(n_sims):
        # Common factor
        z_common = np.random.normal()

        for _, loan in loans.iterrows():
            # Idiosyncratic factor
            z_idio = np.random.normal()

            # Combined latent variable
            z = (
                np.sqrt(correlation) * z_common
                + np.sqrt(1 - correlation) * z_idio
            )

            # Default if latent variable exceeds threshold
            threshold = stats.norm.ppf(1 - loan["pd"])

            if z > threshold:
                # Simulate LGD with some randomness
                realized_lgd = np.clip(
                    loan["lgd"] + 0.15 * np.random.randn(), 0.1, 0.95
                )
                losses[sim] += loan["ead"] * realized_lgd

    return losses


# Run simulation
simulated_losses = simulate_portfolio_losses(credit_model)

# Sensitivity analysis: VaR vs correlation
correlations = np.arange(0.05, 0.50, 0.05)
var_99_values = [
    credit_model.credit_var(0.99, corr) / 1e6 for corr in correlations
]
Out[36]:
Visualization
Portfolio credit loss distribution derived from 10,000 Monte Carlo simulations. The heavy tail indicates significant potential for losses exceeding the expected value, driven by correlated defaults.
Portfolio credit loss distribution derived from 10,000 Monte Carlo simulations. The heavy tail indicates significant potential for losses exceeding the expected value, driven by correlated defaults.
Out[37]:
Visualization
Sensitivity of Credit VaR to default correlation assumptions. Required capital increases non-linearly as correlation rises, underscoring the portfolio's vulnerability to systemic stress.
Sensitivity of Credit VaR to default correlation assumptions. Required capital increases non-linearly as correlation rises, underscoring the portfolio's vulnerability to systemic stress.

The simulation results demonstrate the heavy-tailed nature of credit losses. While expected loss provides a central estimate, the 99th percentile loss can be many times higher, especially when default correlation is significant. The sensitivity analysis in the second panel reveals just how dramatically Credit VaR increases with correlation: doubling the correlation assumption from 10% to 20% increases VaR by roughly 50%, and further increases to higher correlation levels continue this steep rise. This sensitivity underscores why correlation estimation is so critical and why model risk around correlation assumptions should be carefully monitored.

Out[38]:
Visualization
Exposure distribution across the portfolio, sorted by borrower size. A small number of large exposures account for a significant portion of total credit risk, illustrating high concentration and the potential impact of individual borrower defaults on overall stability.
Exposure distribution across the portfolio, sorted by borrower size. A small number of large exposures account for a significant portion of total credit risk, illustrating high concentration and the potential impact of individual borrower defaults on overall stability.
Out[39]:
Visualization
Lorenz curve of portfolio exposure. The deviation from the diagonal line quantifies the inequality in loan sizes, with the shaded area representing the extent of concentration.
Lorenz curve of portfolio exposure. The deviation from the diagonal line quantifies the inequality in loan sizes, with the shaded area representing the extent of concentration.

Key Parameters

The key parameters for portfolio credit risk modeling are:

  • PD (Probability of Default): Likelihood of borrower default, driving expected loss.
  • LGD (Loss Given Default): Severity of loss, scaling the exposure at risk.
  • EAD (Exposure at Default): Magnitude of the credit exposure.
  • Default Correlation (ρ\rho): The degree to which default events cluster. Higher correlation significantly increases tail risk (Unexpected Loss and VaR) while having no effect on Expected Loss.
  • Confidence Level: The probability threshold for Value-at-Risk calculations (e.g., 99% or 99.9%).

Limitations and Practical Considerations

The PD-LGD-EAD framework, while foundational, has important limitations that you must understand. No model perfectly captures reality, and awareness of these limitations is essential for sound risk management.

Parameter estimation uncertainty affects all components. PD estimates rely on historical data that may not reflect future conditions, particularly for low-default portfolios where statistical significance is limited. If only 1 in 500 investment-grade borrowers defaults annually, it takes many years to accumulate enough default observations for reliable estimation. LGD exhibits high variability and depends on factors that are difficult to observe in advance, such as the economic environment at the time of default and the specific circumstances of each bankruptcy. EAD for commitments and derivatives involves behavioral assumptions that may not hold under stress, as borrowers may act differently in crisis conditions than in normal times.

Correlation estimation is perhaps the weakest link in portfolio credit models. Default correlations are difficult to estimate empirically because defaults are rare events. We simply do not observe enough joint defaults under varying conditions to estimate correlations with precision. The correlations that matter most, those during systemic crises, are precisely the ones for which we have the least data, since such crises occur infrequently. The Basel framework addresses this by prescribing conservative correlation assumptions, but model risk remains substantial.

Point-in-time versus through-the-cycle tension creates practical challenges. Accounting standards (IFRS 9, CECL) require forward-looking expected credit loss provisions based on current conditions, while long-term business decisions benefit from cycle-average estimates. Institutions must maintain multiple PD frameworks for different purposes, reconciling potentially conflicting signals from each approach.

Model validation is constrained by the rarity of default events. Unlike market risk models that can be backtested against daily P&L, credit models produce predictions over long horizons with limited observable outcomes. This makes it difficult to distinguish between model accuracy and good fortune. A model that has performed well for ten years may simply have been lucky not to encounter conditions that reveal its flaws.

Despite these limitations, the EL = PD × LGD × EAD framework provides a disciplined structure for credit risk assessment. It forces explicit consideration of the key drivers of credit losses and enables consistent comparison across exposures. The next chapter extends this foundation to more sophisticated modeling approaches, including structural models and reduced-form credit risk models.

Summary

This chapter established the fundamental framework for measuring credit risk through its three core components:

Probability of Default (PD) measures the likelihood of borrower default over a specified horizon. PD can be estimated through credit ratings (providing stable, through-the-cycle assessments), market-implied approaches (extracting risk-neutral probabilities from CDS spreads), or structural models (treating equity as a call option on firm assets). The choice between through-the-cycle and point-in-time PD depends on the application.

Loss Given Default (LGD) captures the severity of loss when default occurs, typically expressed as 1 minus the recovery rate. LGD varies significantly by seniority, collateral, industry, and economic conditions. Crucially, recoveries tend to be lower precisely when default rates are high, creating procyclical credit losses.

Exposure at Default (EAD) quantifies the amount at risk when default occurs. For drawn loans, EAD is straightforward. For commitments and derivatives, EAD must account for potential drawdowns and exposure changes before default.

The expected loss formula, EL = PD × LGD × EAD, provides the foundation for loan pricing, provisioning, and portfolio risk assessment. However, unexpected loss and Credit VaR, which account for volatility around expected outcomes and default correlation, are equally important for capital allocation and risk limits.

Understanding these fundamentals prepares you for the more sophisticated credit risk modeling approaches we'll examine next, including the Merton structural model, CreditMetrics, and reduced-form intensity models.

Quiz

Ready to test your understanding? Take this quick quiz to reinforce what you've learned about credit risk fundamentals.

Loading component...

Reference

BIBTEXAcademic
@misc{creditriskfundamentalspdlgdandeadframework, author = {Michael Brenndoerfer}, title = {Credit Risk Fundamentals: PD, LGD, and EAD Framework}, year = {2025}, url = {https://mbrenndoerfer.com/writing/credit-risk-fundamentals-pd-lgd-ead-expected-loss}, organization = {mbrenndoerfer.com}, note = {Accessed: 2025-01-01} }
APAAcademic
Michael Brenndoerfer (2025). Credit Risk Fundamentals: PD, LGD, and EAD Framework. Retrieved from https://mbrenndoerfer.com/writing/credit-risk-fundamentals-pd-lgd-ead-expected-loss
MLAAcademic
Michael Brenndoerfer. "Credit Risk Fundamentals: PD, LGD, and EAD Framework." 2026. Web. today. <https://mbrenndoerfer.com/writing/credit-risk-fundamentals-pd-lgd-ead-expected-loss>.
CHICAGOAcademic
Michael Brenndoerfer. "Credit Risk Fundamentals: PD, LGD, and EAD Framework." Accessed today. https://mbrenndoerfer.com/writing/credit-risk-fundamentals-pd-lgd-ead-expected-loss.
HARVARDAcademic
Michael Brenndoerfer (2025) 'Credit Risk Fundamentals: PD, LGD, and EAD Framework'. Available at: https://mbrenndoerfer.com/writing/credit-risk-fundamentals-pd-lgd-ead-expected-loss (Accessed: today).
SimpleBasic
Michael Brenndoerfer (2025). Credit Risk Fundamentals: PD, LGD, and EAD Framework. https://mbrenndoerfer.com/writing/credit-risk-fundamentals-pd-lgd-ead-expected-loss