merton.portfolio.vasicek_factor

Vasicek (1987, 2002) single-factor portfolio model.

Used by Basel II/III IRB regulations to set capital requirements without running a Monte Carlo. Each obligor’s default indicator is generated from a latent variable

\[Y_i = \sqrt{\rho}\, M + \sqrt{1 - \rho}\, \varepsilon_i,\]

with M, ε_i ~ N(0, 1) independent. Obligor i defaults when Y_i < \Phi^{-1}(\mathrm{PD}_i).

In the homogeneous limit (a portfolio of infinitely many infinitesimally small loans with identical PD, LGD, ρ), the loss fraction has the closed-form CDF

\[F_L(x) = \Phi\!\left(\frac{\sqrt{1-\rho}\, \Phi^{-1}(x) - \Phi^{-1}(\mathrm{PD})}{\sqrt{\rho}}\right),\]

and the α-quantile (Basel IRB confidence level: α = 0.999) is

\[L_\alpha = \Phi\!\left(\frac{\Phi^{-1}(\mathrm{PD}) + \sqrt{\rho}\, \Phi^{-1}(\alpha)}{\sqrt{1-\rho}}\right).\]

References

Vasicek, O. (2002). Loan Portfolio Value. Risk 15 (12), 160-162.

Basel Committee on Banking Supervision (2005). An Explanatory Note on the Basel II IRB Risk Weight Functions.

Classes

VasicekFactor

Holder for a Vasicek single-factor parametrisation.

Functions

vasicek_loss_cdf(→ merton._typing.FloatArray)

F_L(x) = Φ((√(1-ρ) Φ⁻¹(x) - Φ⁻¹(PD)) / √ρ).

vasicek_var(→ merton._typing.FloatArray)

α-quantile of the asymptotic loss distribution.

basel_irb_capital(→ merton._typing.FloatArray)

Basel III IRB unexpected-loss capital requirement.

basel_irb_correlation(→ merton._typing.FloatArray)

Basel III asset correlation as a function of PD and asset class.

Module Contents

merton.portfolio.vasicek_factor.vasicek_loss_cdf(x: merton._typing.ArrayLike, pd: merton._typing.ArrayLike, rho: merton._typing.ArrayLike) merton._typing.FloatArray[source]

F_L(x) = Φ((√(1-ρ) Φ⁻¹(x) - Φ⁻¹(PD)) / √ρ).

merton.portfolio.vasicek_factor.vasicek_var(pd: merton._typing.ArrayLike, rho: merton._typing.ArrayLike, alpha: float = 0.999) merton._typing.FloatArray[source]

α-quantile of the asymptotic loss distribution.

merton.portfolio.vasicek_factor.basel_irb_capital(pd: merton._typing.ArrayLike, lgd: merton._typing.ArrayLike = 0.45, rho: merton._typing.ArrayLike | None = None, maturity: float = 1.0, *, alpha: float = 0.999, apply_maturity_adjustment: bool = True, asset_class: str = 'corporate') merton._typing.FloatArray[source]

Basel III IRB unexpected-loss capital requirement.

For corporate exposures, the BCBS prescribes

\[\rho(\mathrm{PD}) = 0.12\,\frac{1 - e^{-50\,\mathrm{PD}}}{1 - e^{-50}} + 0.24\,\left(1 - \frac{1 - e^{-50\,\mathrm{PD}}}{1 - e^{-50}}\right),\]

with a maturity adjustment

\[b(\mathrm{PD}) = (0.11852 - 0.05478\,\ln(\mathrm{PD}))^2,\quad \mathrm{MA}(M) = \frac{1 + (M - 2.5)\,b(\mathrm{PD})}{1 - 1.5\,b(\mathrm{PD})}.\]

The capital requirement per unit of exposure is

\[K = \mathrm{LGD}\,\left(L_\alpha(\mathrm{PD}, \rho) - \mathrm{PD}\right)\,\mathrm{MA}(M).\]
merton.portfolio.vasicek_factor.basel_irb_correlation(pd: merton._typing.ArrayLike, *, asset_class: str = 'corporate') merton._typing.FloatArray[source]

Basel III asset correlation as a function of PD and asset class.

class merton.portfolio.vasicek_factor.VasicekFactor[source]

Holder for a Vasicek single-factor parametrisation.

Use either an explicit rho or a Basel-IRB-derived one (rho=None triggers basel_irb_correlation()).

pd: float[source]
lgd: float = 0.45[source]
rho: float | None = None[source]
maturity: float = 1.0[source]
asset_class: str = 'corporate'[source]
effective_rho() float[source]
loss_cdf(x: merton._typing.ArrayLike) merton._typing.FloatArray[source]
var(alpha: float = 0.999) float[source]
capital(*, alpha: float = 0.999, apply_maturity_adjustment: bool = True) float[source]