merton.extensions.leland_toft

Leland-Toft (1996) endogenous-default model.

Leland & Toft extend Merton with coupon-paying perpetual debt, taxes, bankruptcy costs, and — crucially — an endogenous default boundary: equity holders choose V_B, the asset-value level at which they walk away, to maximise their own equity claim.

Setup

Assets V_t follow geometric Brownian motion under the risk-neutral measure with a continuous payout rate δ (dividends + coupon-from-assets):

\[dV/V = (r - \delta)\,dt + \sigma_A\,dW.\]

Debt pays a continuous coupon C per unit time and is perpetual. The tax shield on coupons is \tau C (corporate tax rate). Default triggers a bankruptcy cost \alpha so debt holders recover (1 - \alpha) V_B.

Closed forms

Define

\[x = -\frac{(r - \delta - \sigma_A^2/2) + \sqrt{(r - \delta - \sigma_A^2/2)^2 + 2 r \sigma_A^2}}{\sigma_A^2}.\]

Then (V / V_B)^{x} is the risk-neutral probability of eventually defaulting (i.e. of first passage from V down to V_B).

Equity value:

\[E(V) = V - (1 - \tau)\,\frac{C}{r}\left(1 - (V_B/V)^x\right) - V_B (V_B/V)^x.\]

(Equity gives up the full V_B at default — the bankruptcy cost \alpha V_B is destroyed, not transferred to equity, so it does not appear here. It reduces the debt value instead.)

Equity-holders’ first-order condition (the smooth-pasting condition) yields the optimal default boundary

\[V_B^* = \frac{(1 - \tau)\,C\,x}{r\,(1 + x)}.\]

This module exposes optimal_default_boundary, leland_toft_pd, leland_toft_equity_value, leland_toft_debt_value, and LelandToftModel.

References

Leland, H. E. (1994). Corporate Debt Value, Bond Covenants, and Optimal Capital Structure. Journal of Finance 49 (4), 1213-1252.

Leland, H. E., Toft, K. B. (1996). Optimal Capital Structure, Endogenous Bankruptcy, and the Term Structure of Credit Spreads. Journal of Finance 51 (3), 987-1019.

Classes

LelandToftModel

Calibrate Leland-Toft on a single firm with coupon-paying debt.

Functions

optimal_default_boundary(→ merton._typing.FloatArray)

Smooth-pasting optimal default boundary V_B^*.

leland_toft_pd(→ merton._typing.FloatArray)

Risk-neutral probability of eventually defaulting under Leland-Toft.

leland_toft_equity_value(→ merton._typing.FloatArray)

Equity value E(V) per Leland-Toft.

leland_toft_debt_value(→ merton._typing.FloatArray)

Debt value: present value of coupon stream + recovery at default.

Module Contents

merton.extensions.leland_toft.optimal_default_boundary(*, coupon: merton._typing.ArrayLike, rf: merton._typing.ArrayLike, sigma_asset: merton._typing.ArrayLike, tax_rate: merton._typing.ArrayLike = 0.0, dividend_yield: merton._typing.ArrayLike = 0.0) merton._typing.FloatArray[source]

Smooth-pasting optimal default boundary V_B^*.

merton.extensions.leland_toft.leland_toft_pd(*, asset_value: merton._typing.ArrayLike, asset_vol: merton._typing.ArrayLike, coupon: merton._typing.ArrayLike, rf: merton._typing.ArrayLike, tax_rate: merton._typing.ArrayLike = 0.0, dividend_yield: merton._typing.ArrayLike = 0.0, default_boundary: merton._typing.ArrayLike | None = None) merton._typing.FloatArray[source]

Risk-neutral probability of eventually defaulting under Leland-Toft.

PD = (V_B / V)^x for V > V_B and 1 otherwise. Pass default_boundary to override the smooth-pasting optimum (useful for sensitivity analysis around a different barrier choice).

merton.extensions.leland_toft.leland_toft_equity_value(*, asset_value: merton._typing.ArrayLike, asset_vol: merton._typing.ArrayLike, coupon: merton._typing.ArrayLike, rf: merton._typing.ArrayLike, tax_rate: merton._typing.ArrayLike = 0.0, dividend_yield: merton._typing.ArrayLike = 0.0, bankruptcy_cost: merton._typing.ArrayLike = 0.0, default_boundary: merton._typing.ArrayLike | None = None) merton._typing.FloatArray[source]

Equity value E(V) per Leland-Toft.

merton.extensions.leland_toft.leland_toft_debt_value(*, asset_value: merton._typing.ArrayLike, asset_vol: merton._typing.ArrayLike, coupon: merton._typing.ArrayLike, rf: merton._typing.ArrayLike, tax_rate: merton._typing.ArrayLike = 0.0, dividend_yield: merton._typing.ArrayLike = 0.0, bankruptcy_cost: merton._typing.ArrayLike = 0.0, default_boundary: merton._typing.ArrayLike | None = None) merton._typing.FloatArray[source]

Debt value: present value of coupon stream + recovery at default.

class merton.extensions.leland_toft.LelandToftModel(*, coupon: float, tax_rate: float = 0.0, bankruptcy_cost: float = 0.0, tol: float = 1e-08, max_iter: int = 200)[source]

Bases: merton.extensions.base.StructuralModel

Calibrate Leland-Toft on a single firm with coupon-paying debt.

Inputs

coupon

Continuous coupon payment (per year, in currency units). Required.

tax_rate

Corporate tax rate (defaults to 0).

bankruptcy_cost

Fraction of assets lost in bankruptcy (defaults to 0).

method = 'leland_toft'[source]
coupon[source]
tax_rate[source]
bankruptcy_cost[source]
tol = 1e-08[source]
max_iter = 200[source]
fit(firm: merton.core.firm.Firm) merton.extensions.base.StructuralResult[source]

Return a StructuralResult for firm.