Credit Risk II: Loan Portfolio and Concentration Risk
Introduction
In Week 6, we discussed alternative ways by which FI managers can measure the default (credit) risk on individual loans.
FIs typically hold a portfolio of loans and hence credit risk should also be measured and managed in a portfolio context.
This week, we discuss several models used by FI managers to assess the risk of the overall loan portfolio.
We will also discuss the use of derivatives to manage credit risk.
Simple models of loan concentration risk
Simple models
Caution
A large credit risk exposure to a single borrower or group of related borrowers poses a potential threat to a bank’s safety and soundness.
Regulations are in place to limit such exposure.
As a result, individual loans rarely cause material losses or bank failures.
Primary cause of credit-related distress is that pools of individual loans sharing similar characteristics perform similarly, especially during extreme conditions.
An important lesson learned is that products exposed to the same types of risks can have different names and under different business units.
Two simple models widely employed to measure credit risk concentration in the loan portfolio:
Migration analysis
Concentration limits
Simple model: migration analysis
Track credit ratings of certain types of loans or certain sectors, either externally from credit rating agencies or internally.
If actual rating deteriorates faster than historical experience, limit lending to that loan class or sector.
Table 1, for example, shows the transition probabilities of loans that began the year with a certain credit rating being upgraded/downgraded to a certain rating, or default.
The probability of AAA-rated loan at the start of a year being downgraded to BBB to B by the year’s end is 0.10.
The probability of AAA-rated loan at the start of a year being downgraded to CCC to C by the year’s end is 0.04.
The probability of AAA-rated loan at the start of a year defaults by the year’s end is 0.01.
Simple model: migration analysis (cont’d)
In practice, FIs use migration matrices with many more rating classes.
Migration analysis is used not only to evaluate commercial loan portfolios, but also to analyze credit card portfolios and consumer loans.
However, potential problems with migration analysis include, for example:
Use of historical data.
Rating agencies usually downgrade only after the firm has experienced a downturn.
Simple model: concentration limits
Limits set on the maximum loan size to an individual borrower/sector or geographical area.
Used to reduce exposures to certain industries and to increase exposure to others.
Use of aggregate limits for industries in which performance is highly correlated.
Bank regulators also limit loan concentrations to individual borrowers to a maximum of 15% of a bank’s capital.
\[
\text{Concentration limit} = \text{Maximum loss as a percentage of capital} \times \frac{1}{\text{Loss rate}}
\]
Example
If an FI’s manager is unwilling to permit losses exceeding 15% of the FI’s capital, with an estimated loss rate in a particular industry of 40 per cent, then the manager should set a concentration limit on the exposure to that industry as \(15\%\times \frac{1}{0.4}=37.5\%\).
Simple model: concentration limits (cont’d)
Below is an industry breakdown of Bank of Queensland’s (BOQ) credit exposure as reported in FY2023’s annual report.
Table 2: Proportionate credit exposures of lending activities of BOQ FY23
Sector
$m
% of Total Exposure
Residential mortgages
62,738
77.8
Property and construction
6,887
8.5
Healthcare
2,763
3.4
Professional services
2,431
3.0
Agriculture
1,232
1.5
Transportation
606
0.8
Manufacturing and mining
682
0.8
Hospitality and accommodation
841
1.0
Other
2,453
3.0
Total
80,633
100.0
Loan portfolio diversification and Modern Portfolio Theory (MPT)
Loan portfolio diversification and MPT
MPT can be used to measure and control an FI’s aggregate credit risk exposure.
Any model that seeks to estimate an efficient frontier for loans needs to determine and measure three things:
The expected return on individual loans
The risk of individual loans
The correlation of default risks between loans
Expected return \(R_p\) of a portfolio of \(N\) assets:
\[
R_p = \sum_{i=1}^N X_i R_i
\]
where
\(R_i\) is the expected return on the \(i\)th asset
\(X_i\) is the proportion of the asset portfolio invested in the \(i\)th asset (the desired concentration amount)
Loan portfolio diversification and MPT (cont’d)
Variance of returns (or risk) of the portfolio \(\sigma_p^2\) can be calculated as
\(\rho_{ij}\) is the correlation between the returns on the \(i\)th asset \(j\)th asset
\(\sigma_i^2\) is the variance of returns on the \(i\)th asset
\(\sigma_{ij}^2\) is the covariance of returns between the \(i\)th asset and \(j\)th asset
Loan portfolio diversification and MPT (cont’d)
The fundamental lesson of MPT is that by taking advantage of its size, an FI can diversify considerable amounts of credit risk as long as the returns on different assets are imperfectly correlated with respect to their default risk adjusted returns.
Code
import numpy as npimport matplotlib.pyplot as plt# Define annualized returns and covariance matrix for two assetsmean_returns = np.array([0.04, 0.1]) # Expected annual returns for two assetscov_matrix = np.array([[0.06, 0.02], [0.02, 0.10]]) # Covariance matrix of returnsindividual_volatility = np.sqrt(np.diag(cov_matrix)) # Volatility of individual assets# Define the number of portfolios to simulatenum_portfolios =10000# Initialize empty lists to store portfolio returns, volatilities, and weightsresults = np.zeros((3, num_portfolios))# Simulate random portfoliosfor i inrange(num_portfolios):# Generate random weights for the two assets weights = np.random.random(2) weights /= np.sum(weights) # Ensure weights sum to 1# Calculate portfolio return and volatility (risk) portfolio_return = np.dot(weights, mean_returns) portfolio_volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))# Store the results results[0, i] = portfolio_volatility results[1, i] = portfolio_return results[2, i] = portfolio_return / portfolio_volatility # Sharpe ratio# Calculate the Global Minimum Variance Portfolio (GMVP)inv_cov_matrix = np.linalg.inv(cov_matrix)ones = np.ones(len(mean_returns))weights_gmvp = inv_cov_matrix.dot(ones) / ones.T.dot(inv_cov_matrix).dot(ones)gmvp_return = weights_gmvp.dot(mean_returns)gmvp_volatility = np.sqrt(weights_gmvp.T.dot(cov_matrix).dot(weights_gmvp))# Plot the efficient frontierplt.figure(figsize=(10, 6))plt.scatter( results[0, :], results[1, :], c=results[2, :], cmap="Blues", marker="o", alpha=1)plt.colorbar(label="Sharpe Ratio")# Plot individual assets as red dotsplt.scatter( individual_volatility[0], mean_returns[0],# color="red", marker="o", s=100, label="Asset 1",)plt.scatter( individual_volatility[1], mean_returns[1],# color="blue", marker="o", s=100, label="Asset 2",)# Plot GMVPplt.scatter(gmvp_volatility, gmvp_return, color="red", marker="X", s=100, label="GMVP")# Set axis limits to start from 0plt.xlim(0, np.max(results[0, :]) +0.02) # Add a small margin on the rightplt.ylim(0, np.max(results[1, :]) +0.02) # Add a small margin on the top# Annotate the plotplt.title("Efficient Frontier with Two Assets")plt.xlabel("Volatility (Risk)")plt.ylabel("Expected Return")plt.legend(loc="upper left")plt.show()
Combination of assets that reduces the variance of portfolio returns on the lowest feasible level.
Moody’s Analytics RiskFrontier Model
Moody’s Analytics RiskFrontier model (previously Portfolio Manager model) estimates the return, risk and correlations between loans in an FI’s loan portfolio (with its own proprietary methods), which are then incorporated into the standard MPT equations to get an estimate of the risk and return of the FI’s loan portfolio.
Moody’s Analytics Credit Monitor model estimates EDF (Expected Default Frequency) to examine the default risk of individual loans.
Moody’s Analytics RiskFrontier model then uses EDF to identify the overall risk of the loan portfolio.
Does not require loan returns to be normally distributed
Applies MPT to the loan portfolio, although many loans have non-traded aspects
Moody’s Analytics RiskFrontier Model (cont’d)
In Moody’s Analytics RiskFrontier model, portfolio return and risk are a function of:
the extent to which loan (exposure) values can change over a one-year horizon, and
based on EDF and the loss given default (LGD)
how these value changes move together across different loans in the loan portfolio (correlations).
based on the joint impact of close to 1,000 different systematic factors, which reflect the global economy, region, industry, and country
Moody’s Analytics RiskFrontier Model (cont’d)
Required input variables:
\(R_i\): Expected return on a loan to a borrower \(i\) is the loan’s all-in-drawn spread (\(AIS\)) minus expected loss (expected default frequency times loss given default (LGD)).1\[
R_i = AIS_i - E(L_i) = AIS_i - (EDF_i\times LGD_i)
\]
The Basel Committee assessed a fixed 45% LGD on secured loans if fully secured by physical, non–real estate collateral and 40% if fully secured by receivables.
\(\sigma_i\): Risk of a loan to borrower \(i\), “unexpected loss”, is the volatility of the loan’s default rate \(\sigma_{D_i}\) times the amount lost given default (LGD).2\[
\sigma_i = UL_i = \sigma_{D_i} \times LGD_i = \sqrt{EDF_i(1-EDF_i)} \times LGD_i
\]
Assume defaults are binomially distributed (default or not), the standard deviation of default rate (\(\sigma_{D_i}\)) is \(\sqrt{EDF_i(1-EDF_i)}\).
\(\rho_{ij}\): Correlation of default risks between borrowers \(i\) and \(j\) is the correlation between the systematic return components of the asset returns of \(i\) and \(j\).
Moody’s Analytics RiskFrontier Model (cont’d)
To measure the unobservable default risk correlation between any two borrowers, the Moody’s Analytics Global Correlation Model (GCORR) uses the systematic asset return components of the two borrowers and calculates a correlation that is based on a factor model rather than direct historical observations.
Figure 2: GCorr Corporate Factor Structure
Figure 2 provides a visual representation of the Moody’s Analytics GCorr Corporate factor structure.
Moody’s Analytics RiskFrontier Model (example)
Suppose that an FI holds two loans with the following characteristics. Assume that the correlation \(\rho_{12}=-0.25\), what are the return and risk of the portfolio?
Partial application of portfolio theory: Loan volume-based models
Direct application of MPT is often difficult for FIs lacking information on market prices because many of the loans are not always able to be bought and sold in established markets.
Data can be gathered from:
Reports to the central bank
Data on shared national credit
Commercial databases
Data provides market benchmarks against which FIs can compare their loan portfolios.
Table 3: Allocation of the Loan Portfolio to Different Sectors (in percentages)
(1) National
(2) Bank A
(3) Bank B
Real estate
45%
65%
10%
C&I
30
20
25
Individual
15
10
55
Others
10
5
10
Total
100
100
100
Partial application of portfolio theory: Loan volume-based models (cont’d)
Deviations from the market portfolio benchmark indicate the relative degree of loan concentration.
Partial application of portfolio theory: Loan loss ratio-based models
Estimates systematic loan loss risk of a particular sector or industry to the loan loss risk of an FI’s total loan portfolio
Use of time-series regression of quarterly losses:
\[
\frac{\text{Sectoral losses in the } i\text{th sector}}{\text{Loans to the } i\text{th sector}} = \alpha + \beta \frac{\text{Total loan losses}}{\text{Total loans}}
\]
where
\(\alpha\) measures the loan loss rate for a sector that has no sensitivity to losses on the aggregate loan portfolio
\(\beta\) measures the systematic loss sensitivity of the \(i\)th sector loans to total loan losses
The implication of this model is that sectors with lower \(\beta\)s could have higher concentration limits than high \(\beta\) sectors—since low \(\beta\) loan sector risks (loan losses) are less systematic (that is, are more diversifiable in a portfolio sense).
Regulatory models
Federal Reserve’s 1994 Ruling on Credit Concentration Risk:
Adopted a subjective approach based on examiner discretion.
Rejected technical models due to insufficient data and undeveloped methods at the time.
2006 Regulatory Changes:
Bank for International Settlements (BIS): Released guidance on credit risk assessment and valuation for loans, structured around 10 principles on risk assessment and supervisory evaluation.
Office of the Comptroller of the Currency (OCC): Released guidance on sound risk management practices for commercial real estate lending.
OCC/Fed Joint Study on 2006 CRE Concentration Guidance (April 2013):
13% of banks with construction loans exceeding 100% of capital failed.
23% of banks exceeding both construction and total CRE lending criteria failed, compared to only 0.5% of banks that did not exceed either criterion.
Regulators encouraged financial institutions to review their policies and practices related to CRE lending.
Use of derivatives to manage credit risk
Credit derivatives
Diversification of loan portfolio helps FIs to manage their credit risk exposure.
New types of derivative instruments are now available to better allow FIs to hedge their credit risk both on individual loans or on loan portfolios.
Credit forwards, options, and swaps.
These credit derivatives allow FIs to separate the credit risk exposure from the lending process itself.
Credit forward contracts and credit risk hedging
A credit forward is a forward agreement that hedges against an increase in default risk on a loan (a decline in credit quality of borrower) after the loan rate is determined and the loan is issued.
Common buyers are insurance companies who bears the risk of an increase in default risk on the benchmark bond of the borrower
Common sellers are banks
Specifies a credit spread on a benchmark bond issued by a borrower
Example: BBB bond at time of origination may have 2 per cent spread over US Treasury of same maturity
Credit forward contracts and credit risk hedging (cont’d)
Table 4: Payment pattern on a credit forward contract
Credit Spread at End of Forward Agreement
Credit Spread Seller (bank)
Credit Spread Buyer (counterparty)
\(\phi_T>\phi_F\)
Receives \((\phi_T - \phi_F) \times MD \times A\)
Pays \((\phi_T - \phi_F) \times MD \times A\)
\(\phi_T<\phi_F\)
Pays \((\phi_F - \phi_T) \times MD \times A\)
Receives \((\phi_F - \phi_T) \times MD \times A\)
where
\(\phi_F\) is the credit spread on which the credit forward contract is written
\(\phi_T\) is the actual credit spread on the bond when the credit forward matures
\(MD\) is the modified duration on the benchmark bond
\(A\) is the principal amount of the forward agreement
Payout by the bank is capped since \(\phi_T\geq 0\) (credit spread is non-negative).
When a bank gives a loan, it is similar to writing a put option
When a bank sells a credit forward, the payoff is similar to buying a put option
Credit options
Use of options to hedge credit risk is a relatively new phenomenon. In September 2021, commercial bank holdings of credit options totaled $233 billion, which represented 6.05% of all credit derivatives outstanding.
A credit spread call option is a call option whose payoff increases as the (default) risk premium or yield spread on a specified benchmark bond of the borrower increases above some exercise spread.
A digital default option is an option that pays a stated amount in the event of a loan default (the extreme case of increased credit risk).
Credit (default) swaps (CDS)
Fastest-growing types of swaps. Most important type of credit derivatives.
In 2000, commercial banks’ total notional principal for outstanding credit derivatives was $426 billion.
By March 2008, this amount had risen to $16.44 trillion, before falling to $13.44 trillion in 2009.
By September 2011, the amount increased to $15.66 trillion, of which $15.31 trillion was CDSs.
Due to post-GFC regulations, the notional value of credit derivatives held by banks dropped to $3.9 trillion in September 2021, with $3.4 trillion of this amount being CDS contracts.
Why CDS?
Credit risk is still more likely to cause an FI to fail than is either interest rate risk or FX risk.
CDSs allow FIs to maintain long-term customer lending relationships without bearing the full credit risk exposure from those relationships.
Basics of CDS
CDS Payments: The buyer makes periodic payments to the seller (quarterly, semi-annually, or annually) until the end of the swap or a credit event (e.g., default) occurs.
Settlement: Upon default, settlement involves either physical delivery of bonds (loans) or a cash payment.
The protection buyer receives a payment upon the occurrence of a credit event trigger, but the swap “expires worthless” if no trigger occurs.
Cheapest-to-Deliver Option: The CDS buyer has the option to deliver the cheapest qualifying bond or loan when a default happens.
No requirement that the CDS buyer actually owns the underlying reference securities.
The CDS buyer hedges its exposure to default risk, but there is still counterparty credit risk in the event that the seller fails to perform their obligations under the terms of the contract.1
We examine two types of credit swaps:
total return swap
pure credit swap
Credit swaps: total return swaps
A total return swap involves swapping an obligation to pay interest at a specified fixed or floating rate for payments representing the total return on a loan or a bond (interest and principal value changes) of a specified amount.
The figure below illustrates a total return swap.1
The FI lender pays a fixed annual rate \(f\) plus changes in the market value of the loan and receives a variable rate payment (e.g., 1-year LIBOR).
Interest rate risk remains
Credit swaps: total return swaps (cont’d)
Code
import numpy as npimport matplotlib.pyplot as pltnp.random.seed(8003)# Parameters for the TRSnotional =1_000_000# Notional amount (1 million)fixed_rate =0.03# Fixed annual rate paid by the TRS receiver (3%)asset_volatility =0.1# Volatility of the asset's return (10%)years =5# Time period of the TRS (5 years)periods_per_year =4# Payments per year (quarterly)# Generate the timeline for TRS paymentsdef generate_trs_timeline( notional, fixed_rate, asset_volatility, years, periods_per_year=4):# Set up the timeline with quarterly periods total_periods = periods_per_year * years time_points = np.arange(1, total_periods +1) / periods_per_year# Calculate the periodic fixed payment amount (quarterly) periodic_fixed_payment = (-notional * fixed_rate / periods_per_year ) # Fixed payment made by TRS receiver# Simulate random returns on the asset asset_returns = np.random.normal(loc=0, scale=asset_volatility, size=total_periods)# Initialize lists to store the results total_returns = np.zeros(total_periods) payments = np.zeros(total_periods)for period inrange(total_periods):# Total return on the asset (positive or negative) total_return = notional * asset_returns[period] total_returns[period] = total_return# Net payment for the TRS receiver (positive if receiving total return, minus fixed payment) payments[period] = total_return + periodic_fixed_paymentreturn time_points, payments, total_returns# Simulate TRS payments with different asset volatilitiesvolatilities = [0.05] # Different volatilities to simulatesimulations = {}for vol in volatilities: timeline, payments, total_returns = generate_trs_timeline( notional, fixed_rate, vol, years, periods_per_year ) simulations[vol] = payments# Plot the timelines as bar chartsplt.figure(figsize=(12, 8))bar_width =0.2# Width of each bar# Generate bar charts for each volatilityfor idx, (vol, payments) inenumerate(simulations.items()): plt.bar( timeline + idx * bar_width *0.1, payments, width=bar_width, color="#A6192E", label=f"Volatility: {vol*100:.0f}%", )# Customize the plotplt.title(f"{years}-Year Total Return Swap Payments Example")plt.xlabel("Time (Years)")plt.ylabel("Net Payment Amount ($)")plt.axhline(0, color="black", linewidth=1)plt.grid(True)plt.legend()# Show the plotplt.show()
Credit swaps: pure credit swaps
Interest-rate sensitive element stripped out leaving only the credit risk.
Similar to buying an insurance:
If default, the counterparty makes the default payment
If not default, the FI receives nothing from the counterparty.
Credit swaps: pure credit swaps (cont’d)
Code
import numpy as npimport matplotlib.pyplot as pltnp.random.seed(8003)# Parameters for the CDSnotional =1_000_000# Notional amount (1 million)cds_spread =0.02# Annual CDS spread (2%)recovery_rate =0.9# Recovery rate in case of default (10%)years =5# Time period of the CDS (5 years)periods_per_year =4# Payments per year (quarterly)# Generate the timeline for CDS paymentsdef generate_cds_timeline( notional, cds_spread, default_probability, recovery_rate, years, periods_per_year=4):# Set up the timeline with quarterly periods total_periods = periods_per_year * years time_points = np.arange(1, total_periods +1) / periods_per_year# Calculate the periodic payment amount (quarterly) periodic_payment = (-notional * cds_spread / periods_per_year ) # Negative for payments# Initialize lists to store the results payments = np.zeros(total_periods)# Simulate payments and default eventsfor period inrange(total_periods):if np.random.rand() < default_probability / periods_per_year:# Default occurs at this period default_loss = notional * (1- recovery_rate ) # Positive for the payment received on default payments[period] = default_loss payments[period +1 :] =0# No more payments after defaultbreakelse:# Regular payment payments[period] = periodic_paymentreturn time_points, payments# Simulate multiple series with different default probabilitiesdefault_probabilities = [0.02, 0.1] # Different default probabilitiescolors = ["#D6D2C4", "#A6192E"]simulations = {}# Generate timelines for each default probabilityfor prob in default_probabilities: timeline, payments = generate_cds_timeline( notional, cds_spread, prob, recovery_rate, years, periods_per_year ) simulations[prob] = payments# Plot the timelines as bar chartsplt.figure(figsize=(12, 8))bar_width =0.2# Width of each bar# Generate bar charts for each probabilityfor idx, (prob, payments) inenumerate(simulations.items()): plt.bar( timeline + idx * bar_width *0.1, payments, width=bar_width, color=colors[idx], label=f"Default Probability: {prob*100:.0f}%", )plt.title(f"{years}-Year Pure CDS Payments Example")plt.xlabel("Time (Years)")plt.ylabel("Payment Amount ($)")plt.axhline(0, color="black", linewidth=1)plt.grid(True)plt.legend()plt.show()