Apply Granularity Adjustment to Credit Portfolios
This example shows how to apply a granularity adjustment when estimating capital requirements using an asymptotic single risk factor (ASRF) model. The example demonstrates this technique on both a small homogeneous credit portfolio and a larger nonhomogeneous portfolio. Consider applying a granularity adjustment in your credit risk assessments when:
Using a comprehensive credit simulation is too time intensive.
Using a model based on closed-form capital requirement formulas imposes overly restrictive assumptions about the size and composition of the portfolios.
Two common approaches to estimate capital requirements are credit portfolio simulations and closed-form formulas such as Vasicek's model, which is also known as the ASRF model. This example uses the ASRF model approach. For an example of a credit portfolio simulation, see Simulate Default Credit Risk. For more information about the ASRF model, see Asymptotic Single Risk Factor Model Capital.
Apply Granularity Adjustment to Small Homogeneous Portfolio
Set the following parameters for the models in this portfolio:
Probability of default (PD)
Loss given default (LGD)
Exposure at default (EAD)
Asset correlation
Value-at-Risk (VaR) level
For this example, you set the EAD value to a reference level of 100 monetary units. In a real portfolio, the units could be thousands or millions of dollars, euros, or other currency.
PD = 0.02; LGD = 0.35; EAD = 100; AssetCorrelation = 0.25; VaRLevel = 0.99;
Set a small value for the number of issuers for a homogeneous portfolio.
NumIssuers = 10;
Repeat the EAD value for all issuers. Although all issuers have the exact same parameters, at least one of the inputs to the asrf
function needs to be a vector to represent a portfolio rather than a single issuer.
EADVector = repmat(EAD,NumIssuers,1); CapitalByASRF = asrf(PD,LGD,AssetCorrelation,EAD=EADVector,VaRLevel=VaRLevel);
Display the estimated capital for each issuer and the estimated capital for the entire portfolio by using the ASRF model.
CapitalByASRF(1)
ans = 4.6163
TotalCapitalByASRF = sum(CapitalByASRF)
TotalCapitalByASRF = 46.1626
These values have the same monetary units as the EAD value. For example, if you have a portfolio of 10 loans each with an EAD of 100, the total portfolio value is 1000, and the capital requirements in percent would be 4.6% of the portfolio value. For the visualizations that follow, the $ sign indicates the results are in monetary units, which match the units of the EAD values.
Apply the granularity adjustment technique Vasicek proposed [1] that adjusts the correlation parameter to incorporate a measure of concentration in the portfolio. The concentration measure that this technique uses is the Herfindahl-Hirshman index, . If the asset correlation is , then the adjusted correlation parameter is defined as . The Herfindahl-Hirschman index is one of the concentration measures supported in concentrationIndices
.
ci = concentrationIndices(EADVector); HHIndex = ci.HH; AssetCorrelationAdj = AssetCorrelation + HHIndex*(1-AssetCorrelation); CapitalByASRFAdj = asrf(PD,LGD,AssetCorrelationAdj,EAD=EADVector,VaRLevel=VaRLevel);
Display the issuer-level capital and the total portfolio capital from the ASRF model with granularity adjustment.
CapitalByASRFAdj(1)
ans = 5.8779
TotalCapitalByASRFAdj = sum(CapitalByASRFAdj)
TotalCapitalByASRFAdj = 58.7786
Next, compare the results obtained with a full credit simulation by using the creditDefaultCopula
object. The inputs are the same, except that the creditDefaultCopula
object takes the parameters of a factor model, rather than directly accepting the asset correlation. This example assumes a 1-factor model, where the sensitivity to the single factor is the square root of the asset correlation, and the sensitivity to the idiosyncratic factor is 1 minus the factor sensitivity.
OneFactorWeight = sqrt(AssetCorrelation); IdiosyncraticWeight = 1 - OneFactorWeight; Weights = [OneFactorWeight IdiosyncraticWeight]; cdc = creditDefaultCopula(EADVector,PD,LGD,Weights,VaRLevel=VaRLevel);
The simulate
object function of creditDefaultCopula
supports Gaussian (default choice) and t copulas for credit simulation. In this example, compare the Gaussian copula with the results from the asrf
function, which uses normal distributions. Set the number of scenarios to one million and reset the random seed to reproduce the results of the entire example. You can also comment out the line that contains the rng
function if you want to run the simulation multiple times in order to explore the stability of the simulation results for the given number of scenarios.
NumScenarios = 1e6; rng("default"); % for reproducibility cdc = simulate(cdc,NumScenarios); rc = riskContribution(cdc); CapitalBySimulation = rc.VaR-rc.EL;
The riskContribution
object function returns the issuer-level expected loss (EL), unexpected loss (UL), value-at-risk (VaR), and conditional value-at-risk (CVaR), which is also known as expected shortfall. The capital is the VaR minus the EL. Since simulation error causes the results to show different values for each issuer, use the average estimated capital to compare with the issuer-level capital estimate.
mean(CapitalBySimulation)
ans = 6.3020
You can then compare the total capital by simulation directly with the total capital values from the AFRS model and adjusted AFRS model.
TotalCapitalBySimulation = sum(CapitalBySimulation)
TotalCapitalBySimulation = 63.0199
For reference, use the portfolioRisk
object function to compute the total portfolio capital, which returns a table with the portfolio EL, UL, VaR, and CVaR.
portRisk = portfolioRisk(cdc); Capital = portRisk.VaR-portRisk.EL
Capital = 63.0200
Visualize the results at the issuer and portfolio level by using bar plots, where blue represents the simulation, red represents the granularity adjusted ASRF model, and yellow represents the ASRF model.
figure; t = tiledlayout(2,1); nexttile bar([CapitalBySimulation(1:10) CapitalByASRFAdj(1:10) CapitalByASRF(1:10)]) grid on xlabel("Loans") ylabel("$") nexttile bar("Total",[TotalCapitalBySimulation TotalCapitalByASRFAdj TotalCapitalByASRF]) ylabel("$") grid on title(t,"Capital Requirements") leg = legend(["Simulation","ASRF Adjusted","ASRF"],Orientation="horizontal"); leg.Layout.Tile = 'south';
The granularity adjustment helps bring the capital estimates closer to the simulated capital values. The size of this gap is sensitive to the parameter choices for PD and asset correlation.
To explore the effect of the small number of issuers, keep the risk parameters constant, and increase the number of issuers. This example evaluates only a few portfolio sizes, but you can investigate larger sizes by updating this code.
NumIssuersVector = [10 30 50 70 100]; NumPortSizes = length(NumIssuersVector); CapitalByASRFSizes = zeros(1,NumPortSizes); CapitalByASRFAdjSizes = zeros(1,NumPortSizes); CapitalBySimulationSizes = zeros(1,NumPortSizes); CapitalByASRFSizes(1) = CapitalByASRF(1); CapitalByASRFAdjSizes(1) = CapitalByASRFAdj(1); CapitalBySimulationSizes(1) = TotalCapitalBySimulation/NumIssuersVector(1); for ii=2:NumPortSizes EADVector = repmat(EAD,NumIssuersVector(ii),1); CapitalByASRF = asrf(PD,LGD,AssetCorrelation,EAD=EADVector,VaRLevel=VaRLevel); CapitalByASRFSizes(ii) = CapitalByASRF(1); ci = concentrationIndices(EADVector); HHIndex = ci.HH; AssetCorrelationAdj = AssetCorrelation + HHIndex*(1-AssetCorrelation); CapitalByASRFAdj = asrf(PD,LGD,AssetCorrelationAdj,EAD=EADVector,VaRLevel=VaRLevel); CapitalByASRFAdjSizes(ii) = CapitalByASRFAdj(1); cdc = creditDefaultCopula(EADVector,PD,LGD,Weights,VaRLevel=VaRLevel); cdc = simulate(cdc,NumScenarios); portRisk = portfolioRisk(cdc); CapitalBySimulationSizes(ii) = (portRisk.VaR-portRisk.EL)./NumIssuersVector(ii); end figure; plot(NumIssuersVector,CapitalBySimulationSizes) hold on plot(NumIssuersVector,CapitalByASRFAdjSizes) plot(NumIssuersVector,CapitalByASRFSizes) xlabel("Number of Issuers") ylabel("$") title("Capital (per Issuer) vs. Portfolio Size") legend("Simulation","ASRF Adjusted","ASRF") hold off grid on
The gap between the different approaches narrows as the number of issuers increases. For the parameters selected in this example, a portfolio of 100 issuers already shows a much smaller gap in the capital estimates, compared to a small portfolio of 10 issuers.
Apply Granularity Adjustment to Larger Portfolio with Uneven Exposures
Now consider a larger portfolio and relax the homogeneity assumption. Randomly increase a few exposures to simulate the name concentration effect in the portfolio so that you have a few issuers with larger exposures.
NumIssuersLarge = 100; EADVectorLarge = repmat(EAD,NumIssuersLarge,1); EADVectorLarge(1:10) = randi([500 5000],10,1);
Calculate the estimated capital by using the asrf
function.
CapitalByASRFLarge = asrf(PD,LGD,AssetCorrelation,EAD=EADVectorLarge,VaRLevel=VaRLevel); TotalCapitalByASRFLarge = sum(CapitalByASRFLarge);
Apply the granularity adjustment to the portfolio.
ciLarge = concentrationIndices(EADVectorLarge); HHIndexLarge = ciLarge.HH; AssetCorrelationLargeAdj = AssetCorrelation + HHIndexLarge*(1-AssetCorrelation); CapitalByASRFLargeAdj = asrf(PD,LGD,AssetCorrelationLargeAdj,EAD=EADVectorLarge,VaRLevel=VaRLevel); TotalCapitalByASRFLargeAdj = sum(CapitalByASRFLargeAdj);
Compute the capital by using a simulation.
cdcLarge = creditDefaultCopula(EADVectorLarge,PD,LGD,Weights,VaRLevel=VaRLevel); cdcLarge = simulate(cdcLarge,NumScenarios); rcLarge = riskContribution(cdcLarge); CapitalBySimulationLarge = rcLarge.VaR-rcLarge.EL; TotalCapitalBySimulationLarge = sum(CapitalBySimulationLarge);
Visualize the results by using bar plots, where blue represents the simulation, red represents the granularity adjusted ASRF model, and yellow represents the ASRF model.
figure; t = tiledlayout(3,1); nexttile bar([CapitalBySimulationLarge(1:10) CapitalByASRFLargeAdj(1:10) CapitalByASRFLarge(1:10)]) grid on xlabel("Large Uneven Loans") ylabel("$") nexttile bar(11:15,[CapitalBySimulationLarge(11:15) CapitalByASRFLargeAdj(11:15) CapitalByASRFLarge(11:15)]) grid on xlabel("Small Homogeneous Loans") ylabel("$") nexttile bar("Total",[TotalCapitalBySimulationLarge TotalCapitalByASRFLargeAdj TotalCapitalByASRFLarge]) grid on ylabel("$") title(t,"Capital Requirements") leg = legend(["Simulation","ASRF Adjusted","ASRF"],Orientation="horizontal"); leg.Layout.Tile = 'south';
The effect of name concentration leads to more complex gaps between the simulation and the approximation results. For larger exposures, there is a bigger gap between the simulation and the ASRF results, and the granularity adjustment does not help close the gap much. However, for the smaller exposures, the simulation yields smaller capital estimates than the ASRF model. At the portfolio level, the extra capital for the smaller exposures somewhat compensates the low capital estimates for higher exposures. Overall, the granularity adjustment does bring the portfolio capital estimates closer to the simulation estimates, although an important gap still remains. These results are sensitive to the choice of parameters, such as PD or asset correlation, as well as to the distribution of exposures in the portfolio.
More About
Tradeoffs Between Credit Portfolio Simulations and ASRF Models
Credit portfolio simulations can be slow to converge. However, they allow you to capture the characteristics of the individual loans, use multiple underlying risk factors, and test different distribution assumptions. The ASRF model achieves a fast capital estimate for each individual loan, but it makes important assumptions about the portfolio composition and underlying distributions. For example, it assumes that the portfolio has a large number of homogeneous issuers.
Granularity Adjustment Technique
You can use a granularity adjustment technique to adjust the capital estimate by using closed-form formulas. This example demonstrates how to adjust the ASRF model by using Vasicek's granularity adjustment technique [1]. In the first part of this example, you apply the granularity adjustment on a homogeneous portfolio with a small number of issuers, while in the second part, you apply it on a larger heterogeneous portfolio that includes a few issuers that represent a significant concentration of exposure. In each part, you can compare the capital estimates from using the granularity adjustment technique to both the direct ASRF model and a full credit portfolio simulation.
The workflow includes MATLAB® code that allows you to compare these approaches for different parameter values. For example, you can try a different PD or asset correlation to examine parameter sensitivity. The granularity adjustment technique brings the total capital closer to the total capital estimated by simulation, but the gap varies with the parameter choices. The total portfolio capital reported by the simulation is consistently higher than the total capital from the approximation methods, and the gap is very sensitive to the parameter choices. At the issuer level, the simulated capital is frequently underestimated by the closed-form capital, but it can sometimes be overestimated, especially for smaller exposures.
This example makes assumptions about the portfolio composition, such as the number and the size of the loans. To make comparisons with the ASRF model, this workflow assumes Gaussian distributions for the underlying randomness. The credit simulation tools in Risk Management Toolbox™ readily support other distributional assumptions, such as t distributions for the underlying factors and the simulation of random LGD values. For more information, see Credit Simulation Using Copulas. For more information about other granularity adjustment techniques that you can use to adjust closed-form formulas, see [2] and [3].
References
[1] Vasicek, O. A., "The Distribution of Loan Portfolio Value." Risk, 15, No. 12, December, 2002.
[2] Grippa, P. and L. Gornicka, "Measuring Concentration Risk - A Partial Portfolio Approach." International Monetary Fund (IMF) Working Paper, WP/16/158, August, 2016.
[3] Lütkebohmert, E. "Concentration Risk in Credit Portfolios." Springer, 2009.
See Also
asrf
| creditDefaultCopula
| simulate
| portfolioRisk
| riskContribution
| concentrationIndices