Credit Risk Fundamentals: PD, LGD, and EAD Framework

Michael BrenndoerferDecember 21, 202552 min read

Part of Quantitative Finance

Covers credit risk measurement through Probability of Default, Loss Given Default, and Exposure at Default. Topics include loan pricing and portfolio analysis.

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

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 the formulas, 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 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 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 give a common way to describe credit quality and compare borrowers. These ratings carry large 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
Grouped bars showing one-year and hatched five-year default probabilities for ratings AAA through CCC. Both measures remain below 2.1% through BBB, then rise sharply; a dashed divider separates investment grade from speculative grade.
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; this allows us to extract an implied probability of default directly from observable market prices. This market-based approach gives a useful complement to rating agency assessments; it has 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 (1−Recovery 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 Spread≈PD×LGD(premium equals expected loss)CDS Spread≈PD×(1−Recovery Rate)(substitute LGD definition)PDimplied≈CDS Spread1−Recovery 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
Line chart showing implied annual default probability vs CDS spread in basis points for three recovery rate scenarios: 20%, 40%, and 60%. Higher recovery rates produce higher implied PDs for the same spread.
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

PD estimation distinguishes 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.

These approaches serve different purposes. 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 over ten years with a near-flat Through-the-Cycle PD around 2% and a more variable Point-in-Time PD ranging from roughly 1% to 3.3%; two shaded recession intervals align with PIT increases.
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," gives 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, and gives 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=1−Recovery 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
Horizontal bars with bounded error bars for five debt instruments, rising from 24% for junior subordinated bonds to 72% for senior secured bank loans. A dashed vertical line marks the 40% standard assumption.
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%. Error bars represent one historical standard deviation, bounded at feasible recovery rates of 0%-100%.

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 the current value of collateral and 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 of 1,000 simulated recovery rates with a low mode near 5%-10%, a high mode near 80%-90%, a dashed mean line near 53%, and a dotted reference line at the 40% standard assumption.
Simulated bimodal recovery rates for senior unsecured bonds. Outcomes cluster near low single-digit recoveries and around 80%-90%, while the simulated mean of roughly 53% differs materially from the conventional 40% assumption.

The distribution of recovery rates is 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 from 2000 to 2023 with annual default rates as bars on the left axis and recovery rates as a marked line on the right axis. Default rates peak around 4.5% in 2009 as recoveries fall toward the mid-40% range; shaded bands mark 2008-2010 and 2020-2021 stress windows.
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 hit for creditors during downturns. More borrowers default, and 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
Line chart of EAD against the drawn amount for a $10M revolving facility under 50%, 75%, and 100% CCF scenarios. All three converge to $10M at full utilization, while a dotted diagonal shows the current drawn amount without conversion.
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 the potential positive value the contract could have at default, not the notional amount. 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 materially higher than the current $1.20 million mark-to-market value, which reflects 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 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.

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, and gives a measure of how much actual losses might deviate from the average:

UL=Var(Loss)=EAD×PD×(1−PD)×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×(1−PD)×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, which reflects 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+∑i≠jρ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 bars for Companies A through E comparing expected loss with unexpected loss in thousands of dollars. Company D is highest at about $56 thousand expected and $274 thousand unexpected loss, followed by Company B at about $8 thousand and $218 thousand.
Expected and unexpected loss contributions across five borrowers. Company D has the largest value for both measures because its high PD and LGD outweigh its smaller exposure; Company B's $10M exposure produces the second-largest unexpected loss.

The comparison highlights how PD, LGD, and exposure jointly drive both credit risk measures. Company D contributes the most expected and unexpected loss because its high probability of default and 60% LGD outweigh its relatively small exposure. Company B's $10M exposure still produces the second-largest unexpected loss despite its better rating. This distinction matters 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, showing 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
Histogram of simulated portfolio losses on a logarithmic density scale. Most simulations cluster near zero, while sparse losses extend beyond $40M; vertical reference lines mark expected loss near $1.0M and 99% VaR near $13.6M.
Portfolio credit loss distribution from 10,000 Monte Carlo simulations. A logarithmic density axis makes the long right tail visible; the 99th-percentile loss lies far beyond expected loss because correlated defaults create rare but severe outcomes.
Out[37]:
Visualization
Marked line with shaded area showing 99% Credit VaR increasing from about $8.8M at 5% default correlation to $15.8M at 45%; the curve rises throughout but gradually flattens.
Sensitivity of Credit VaR to default correlation assumptions. In this portfolio model, 99% VaR rises steadily from about $8.8M at 5% correlation to $15.8M at 45%, with smaller marginal increases at higher correlations.

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. In this sensitivity analysis, doubling the correlation assumption from 10% to 20% increases VaR from about $10M to $12M, or roughly 20%. VaR continues to rise as correlation increases, although each additional five-percentage-point step has a smaller marginal effect. Because capital estimates remain materially sensitive to correlation, correlation assumptions and their model risk require close monitoring.

Out[38]:
Visualization
Bar chart showing 50 borrowers sorted by exposure size from largest to smallest, illustrating the log-normal distribution of loan sizes in the simulated portfolio.
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 beginning at zero and remaining below the perfect-equality diagonal as borrowers are accumulated from smallest to largest exposure; the shaded gap widens through the middle of the distribution before closing at 100%.
Lorenz curve of portfolio exposure, computed by accumulating borrowers from smallest to largest exposure. Its position below the equality diagonal and the shaded gap quantify concentration in a small number of large loans.

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 gives a disciplined structure for credit risk assessment. It forces explicit consideration of the main drivers of credit losses and allows consistent comparison across exposures. The next chapter extends this base 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. 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, sets up 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.

Credit Risk Fundamentals

Question 1 of 80 of 8 completed
A loan has PD = 2%, LGD = 45%, and EAD = $5 million. What is the expected loss?

Comments

No comments yet. Be the first to share your thoughts!

Reference

Citation details

Cite or share this article.

BIBTEXAcademic
@misc{brenndoerfer2025creditrisk, 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: 2026-09-30} }
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. September 30, 2026. <https://mbrenndoerfer.com/writing/credit-risk-fundamentals-pd-lgd-ead-expected-loss>.
CHICAGOAcademic
Michael Brenndoerfer. "Credit Risk Fundamentals: PD, LGD, and EAD Framework." Accessed September 30, 2026. 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: September 30, 2026).
SimpleBasic
Michael Brenndoerfer (2025). Credit Risk Fundamentals: PD, LGD, and EAD Framework. https://mbrenndoerfer.com/writing/credit-risk-fundamentals-pd-lgd-ead-expected-loss

About the author

Continue with the full handbook

This chapter is part of Quantitative Finance. Use the handbook page to browse the complete table of contents and continue reading in sequence.

Explore Quantitative Finance
Newsletter

Stay up to date

Get articles, book updates, and news delivered to your inbox.

No spam, unsubscribe anytime.

or

Join the community

Sign in to remove popups, track your reading progress, and join the discussion.