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:

  1. Default point: L = ST + 0.5 · LT rather 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 reuses merton.core.compute_default_point() with kind="kmv".

  2. 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

KMVCalibrator

OO wrapper around kmv_iterative().

Functions

kmv_iterative(→ merton.calibration.base.CalibrationResult)

Calibrate via the Crosbie-Bohn KMV procedure.

Module Contents

merton.calibration.kmv_iterative.EDFMap[source]
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 that debt already encodes the KMV default point and that edf_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.Calibrator

OO wrapper around kmv_iterative().

Set edf_map to a callable DD -> EDF to use a custom empirical mapping. By default the risk-neutral mapping Φ(-DD) is reported.

method = 'kmv_iterative'[source]
edf_map = None[source]
tol = 1e-08[source]
max_iter = 200[source]
fit(firm: merton.core.firm.Firm) merton.calibration.base.CalibrationResult[source]

Infer asset value & volatility for firm.