merton.calibration.kmv_iterative¶
Crosbie-Bohn / Moody’s KMV iterative calibration.
Operationally identical to the Jones-Mason-Rosenfeld two-equation solver
once the default point is the KMV convention ST + 0.5·LT. The KMV
methodology adds two practical refinements that we expose via diagnostics:
Default point:
L = ST + 0.5 · LTrather than the full nominal debt. This is the dominant industry convention because real firms with long-dated maturity profiles default well before their full obligation comes due. The implementation reusesmerton.core.compute_default_point()withkind="kmv".Empirical DD→EDF mapping: KMV’s commercial product converts the Merton distance-to-default into an expected default frequency (EDF) using a non-parametric look-up built from ~11,700 historical defaults. The mapping table is proprietary; we expose the hook so users can plug their own empirical mapping in via
KMVCalibrator.edf_map. Without one,EDF = Φ(-DD)(the standard normal CDF) is reported as a placeholder.
References
Crosbie, P. and Bohn, J. (2003). Modeling Default Risk. Moody’s KMV.
Examples
>>> from merton import Firm
>>> from merton.calibration import kmv_iterative
>>> firm = Firm(equity=100, debt_short=20, debt_long=30, equity_vol=0.30)
>>> res = kmv_iterative(
... equity=float(firm.equity),
... equity_vol=float(firm.equity_vol),
... debt=float(firm.default_point_value()),
... rf=float(firm.rf),
... T=float(firm.horizon),
... )
>>> res.method
'kmv_iterative'
Attributes¶
Classes¶
OO wrapper around |
Functions¶
|
Calibrate via the Crosbie-Bohn KMV procedure. |
Module Contents¶
- merton.calibration.kmv_iterative.kmv_iterative(*, equity: float, equity_vol: float, debt: float, rf: float, T: float, dividend_yield: float = 0.0, edf_map: EDFMap | None = None, tol: float = 1e-08, max_iter: int = 200) merton.calibration.base.CalibrationResult[source]¶
Calibrate via the Crosbie-Bohn KMV procedure.
The numerics are identical to
jmr_iterative(); the difference is semantic: the caller is asserting thatdebtalready encodes the KMV default point and thatedf_map(when supplied) provides the empirical DD→EDF translation.
- class merton.calibration.kmv_iterative.KMVCalibrator(*, edf_map: EDFMap | None = None, tol: float = 1e-08, max_iter: int = 200)[source]¶
Bases:
merton.calibration.base.CalibratorOO wrapper around
kmv_iterative().Set
edf_mapto a callableDD -> EDFto use a custom empirical mapping. By default the risk-neutral mappingΦ(-DD)is reported.- fit(firm: merton.core.firm.Firm) merton.calibration.base.CalibrationResult[source]¶
Infer asset value & volatility for
firm.