merton.extensions.climate

ClimateOverlay — climate stress wrapper around any structural model.

The overlay composes a ClimateScenario with a base StructuralModel (Merton, Black-Cox, CreditGrades, Leland-Toft, etc.). It applies the scenario’s asset writedown to the firm’s equity before calibration, then scales the resulting PD by the scenario’s sectoral PD multiplier.

Mathematics

Given a scenario s and a base structural fit returning (A, σ_A, PD_base), the overlay produces

\[PD_{climate}(s) = \min\!\bigl(1,\ m_s \cdot PD(s.\text{apply}(firm))\bigr),\]

where m_s is the sectoral PD multiplier and the apply transformation writes down equity by the scenario’s transition + physical writedown.

The DD reported by the overlay is -Φ⁻¹(PD_climate) for comparability with the underlying Merton/extension DDs.

Examples

>>> from merton import Firm
>>> from merton.extensions import LelandToftModel
>>> from merton.extensions.climate import ClimateOverlay
>>> from merton.scenarios.climate import Sector
>>> from merton.scenarios.predefined.ngfs import delayed_transition
>>> firm = Firm(equity=100, debt_short=10, debt_long=30, equity_vol=0.25)
>>> base = LelandToftModel()
>>> overlay = ClimateOverlay(base, scenario=delayed_transition(), sector=Sector.ENERGY)
>>> stressed = overlay.fit(firm)
>>> stressed.pd >= base.fit(firm).pd  # climate scenarios should not reduce PD
True

Classes

ClimateOverlay

Wrap a base structural model with a ClimateScenario.

Module Contents

class merton.extensions.climate.ClimateOverlay[source]

Bases: merton.extensions.base.StructuralModel

Wrap a base structural model with a ClimateScenario.

Parameters:
  • base – Any StructuralModel (or MertonModel — anything with a fit(firm) -> StructuralResult- compatible interface).

  • scenario – Climate scenario to apply.

  • sector – Sector tag for the firm (drives intensity & PD-multiplier lookup).

  • intensity – Override the default sector emission intensity (tCO₂e per $M EV).

base: Any[source]
scenario: merton.scenarios.climate.ClimateScenario[source]
sector: merton.scenarios.climate.Sector | str[source]
intensity: float | None = None[source]
method: str = 'climate_overlay'[source]
fit(firm: merton.core.firm.Firm) merton.extensions.base.StructuralResult[source]

Return a StructuralResult for firm.