Source code for finpricing.model.cds_analytics

import datetime
from typing import Union, List
from ..utils import Date, CDSStyle, DateGenerator, datetimeToDates
from ..market import CDSCurve, RecoveryCurve
from .cds_pricer import CDSPricer
from ..instrument.cds import CreditDefaultSwap


[docs] @datetimeToDates def cds_market_spread( discount_curve, survival_curve, recovery_rate: float, expiry: Union[datetime.date, Date], cds_style: Union[CDSStyle, str]="CORP_NA", granularity: int = 14, ): """Calculate CDS market spread NOTE this returns the par spread of a temporary CDS contract and priced by the given discount curve \ and survival curve """ _cds_style = CDSStyle(cds_style) cdsEffectiveDate = DateGenerator.generate_cds_effective_date(discount_curve.anchor_date, expiry, _cds_style) cdsMaturityDate = DateGenerator.generate_cds_maturity_date(discount_curve.anchor_date, expiry, _cds_style.cds_term_style) cds = CreditDefaultSwap.make_standard( effective_date=cdsEffectiveDate, maturity_date=cdsMaturityDate, spread=1.0, notional=1.0, cds_style=_cds_style, ) pricer = CDSPricer.from_cds( cds=cds, discount_curve=discount_curve, survival_curve=survival_curve, recovery_rate=recovery_rate, granularity=granularity, ) upfront_payment_date = pricer.generate_upfront_payment_date() upfront_df = discount_curve.discount(upfront_payment_date) accrued_interest = pricer.coupon_leg_accrued_interest() pv_annuity = pricer.pv_annuity() pv_annuity -= accrued_interest * upfront_df spread = -1 * pricer.pv_contingent_leg() / pv_annuity return spread
[docs] def cds_market_spreads(discount_curve, survival_curve, recovery_rate: float, expiries: List[Union[datetime.date, Date]], **kwargs): """Calculate CDS market spreads for a list of expiries""" return [cds_market_spread(discount_curve, survival_curve, recovery_rate, expiry, **kwargs) for expiry in expiries]