Credit Risk & Banking Regulation
Vasicek ASRF Basel Conditional Default & Capital Formula
Compute Vasicek’s (2002) Asymptotic Single-Risk-Factor stressed default rate CPD = Phi((Phi^-1(PD) + SQRT(rho)*z_q) / SQRT(1 - rho)) and Basel unexpected-loss capital K_UL.
Evaluate the exact Gaussian copula core inside Basel IRB regulatory capital
Oldrich Vasicek’s (2002) Asymptotic Single-Risk-Factor (ASRF) loan-portfolio formula powers Basel II/III Internal Ratings-Based (IRB) regulatory capital worldwide: in an infinitely granular portfolio where borrower asset returns share systemic factor loading SQRT(rho) (0 <= rho < 1) and unconditional 1-year default probability is PD in (0, 1), conditional default rate in a 99.9% tail recession (z_conf = 3.0902) is CPD = Phi((Phi^-1(PD) + SQRT(rho) * z_conf) / SQRT(1 - rho))! Subtracting provisioned Expected Loss LGD * PD leaves Unexpected-Loss Regulatory Capital K_UL = LGD * (CPD - PD)!
Verify on a corporate loan pool with unconditional PD = 0.0200 (B2, 2.00%), asset correlation rho = 0.19 (B3 -> SQRT(1 - 0.19) = 0.90), Loss Given Default LGD = 0.45 (B4, 45%), and 99.9% systemic quantile z_conf = 3.0902 (B5): unconditional threshold z_PD = -2.0542 shifts under systemic stress to (-2.0542 + SQRT(0.19) * 3.0902) / 0.90 = -0.7858, raising Conditional Default Probability 10.8x to CPD = 0.2160 (21.60%!) and setting Unexpected-Loss Capital K_UL = 0.45 * (0.2160 - 0.0200) = 0.0882 (8.82% of EAD!). Set rho = 0 to verify CPD = PD = 0.0200 and K_UL = 0.0000!
| Vasicek ASRF Metric (PD=2%, LGD=45%, z=3.0902) | rho = 0.19 (Correlated) | rho = 0.00 (Idiosyncratic) |
|---|---|---|
| Unconditional Default Threshold z_PD | -2.0542 | -2.0542 |
| 99.9% Conditional Default Rate (CPD) | 0.2160 (21.60%) | 0.0200 (= PD) |
| Expected Loss Provision (LGD * PD) | 0.0090 (0.90%) | 0.0090 (0.90%) |
| Unexpected-Loss Capital K_UL | 0.0882 (8.82% of EAD) | 0.0000 (Fully Diversified!) |
Vasicek Stressed Conditional Probability of Default (CPD) Formula
Combine Hastings rational inverse normal Phi^-1(PD) and Abramowitz-Stegun 7.1.26 normal CDF Phi(z_stress) so the formula runs in every spreadsheet engine without add-ins.
=LET(pd_u, B2, rho_a, B3, z_cf, B5, IF(OR(pd_u <= 0, pd_u >= 1, rho_a < 0, rho_a >= 1, z_cf <= 0), "Invalid ASRF Input", LET(p_tl, MIN(pd_u, 1 - pd_u), t_in, SQRT(-2 * LN(p_tl)), z_mg, t_in - (2.515517 + 0.802853 * t_in + 0.010328 * (t_in^2)) / (1 + 1.432788 * t_in + 0.189269 * (t_in^2) + 0.001308 * (t_in^3)), z_pd, IF(pd_u >= 0.5, z_mg, -z_mg), z_st, (z_pd + SQRT(rho_a) * z_cf) / SQRT(1 - rho_a), az_r, ABS(z_st) / SQRT(2), t_er, 1 / (1 + 0.3275911 * az_r), erf_m, 1 - (((((1.061405429 * t_er - 1.453152027) * t_er + 1.421413741) * t_er - 0.284496736) * t_er + 0.254829592) * t_er) * EXP(-(az_r^2)), cpd_v, 0.5 * (1 + IF(z_st >= 0, erf_m, -erf_m)), ROUND(cpd_v, 4))))Basel Unexpected-Loss Capital Requirement K_UL = LGD * (CPD - PD) Formula
Evaluate LGD * MAX(0, CPD - PD) using exact unrounded CPD inside LET.
=LET(pd_u, B2, rho_a, B3, lgd_v, B4, z_cf, B5, IF(OR(pd_u <= 0, pd_u >= 1, rho_a < 0, rho_a >= 1, lgd_v <= 0, lgd_v > 1, z_cf <= 0), "Invalid ASRF Input", IF(rho_a = 0, 0, LET(p_tl, MIN(pd_u, 1 - pd_u), t_in, SQRT(-2 * LN(p_tl)), z_mg, t_in - (2.515517 + 0.802853 * t_in + 0.010328 * (t_in^2)) / (1 + 1.432788 * t_in + 0.189269 * (t_in^2) + 0.001308 * (t_in^3)), z_pd, IF(pd_u >= 0.5, z_mg, -z_mg), z_st, (z_pd + SQRT(rho_a) * z_cf) / SQRT(1 - rho_a), az_r, ABS(z_st) / SQRT(2), t_er, 1 / (1 + 0.3275911 * az_r), erf_m, 1 - (((((1.061405429 * t_er - 1.453152027) * t_er + 1.421413741) * t_er - 0.284496736) * t_er + 0.254829592) * t_er) * EXP(-(az_r^2)), cpd_v, 0.5 * (1 + IF(z_st >= 0, erf_m, -erf_m)), ROUND(lgd_v * (cpd_v - pd_u), 4)))))Try the example
Use the original values or change them to test your understanding.