First fit in five minutes

The simplest call is merton.fit(firm). Let’s walk through what each piece means.

1. Build a Firm

from merton import Firm

firm = Firm(
    equity=100_000_000,        # $100M market cap
    debt_short=20_000_000,     # short-term debt
    debt_long=30_000_000,      # long-term debt
    equity_vol=0.30,           # annualised equity volatility (decimal)
    rf=0.045,                  # risk-free rate
    horizon=1.0,               # T in years
)

Firm is a frozen dataclass. The default-point formula is KMV (short + 0.5 * long), giving a default threshold of $35M here.

2. Fit the model

from merton import fit

result = fit(firm, method="vassalou_xing")  # the default

The fit returns a MertonResult with calibrated asset value, asset volatility, distance-to-default, and probability of default.

3. Inspect the output

print(result.summary())
# MertonResult (<firm>, method=vassalou_xing)
#   Distance-to-default     : 3.142
#   Probability of default  : 0.000839
#   Implied spread (LGD=.6) : 5.04 bps
#   Asset value             : 148,599,392.40
#   Asset volatility (σ_A)  : 0.207
#   Default point           : 35,000,000.00
#   Horizon (years)         : 1.0
#   Solver converged        : True (12 iters)

4. Derived outputs

# PD term structure
result.pd_term_structure(horizons=[1/12, 6/12, 1, 3, 5])

# Implied credit spread
result.implied_spread(lgd=0.6)

# Greeks
greeks = result.greeks()
greeks.equity_delta, greeks.pd_dvol

# Physical-measure PD given a Sharpe ratio
result.physical_pd(sharpe_ratio=0.5)

# Export
result.to_pandas()
result.to_excel("merton_results.xlsx")

5. Calibration alternatives

fit(firm, method="naive")           # Bharath-Shumway closed form (fastest)
fit(firm, method="jmr_iterative")   # Jones-Mason-Rosenfeld 2-eq system
fit(firm, method="vassalou_xing")   # iterative MLE (default)

When you supply an equity time series via Firm(equity=array_of_prices, ...) the Vassalou-Xing calibrator runs in full series mode, iterating until σ_A converges.