Source code for finpricing.instrument.cds

from typing import Union, List
import datetime

from ..utils import (
    Literal,
    Date,
    CDSStyle,
    DateGenerator,
    DayCountTypes,
    ClassUtil
)

from .fixed_coupon_leg import FixedCouponLegBase

[docs] class CDSFixedCouponLeg(ClassUtil, FixedCouponLegBase): def __init__(self, effective_date: Union[Date, datetime.date], maturity_date: Union[Date, datetime.date], spread: float, notional: float = Literal.UNIT.value, cds_style: CDSStyle = CDSStyle.CORP_NA(), pay_day_delay: int = 0,): """ TODO: add pay_day_delay to generate_cds_adjust """ self.save_attributes(ignore=["effective_date", "maturity_date"]) effective_date = Date.convert_from_datetime(effective_date) maturity_date = Date.convert_from_datetime(maturity_date) # generate CDS schedule with business and calendar day adjustment accrual_start, accrual_end, payment_dates = \ DateGenerator.generate_cds_adjust( start_date=effective_date, maturity_date=maturity_date, cds_style=cds_style, stub_at_end=False, ) super().__init__( coupon_rate=spread, payment_dates=payment_dates, accrual_start=accrual_start, accrual_end=accrual_end, notional=notional, day_count_type=cds_style.day_count_type, )
[docs] class CDSContingentLeg(ClassUtil): def __init__(self, protection_start_date: Union[Date, datetime.date], protection_end_date: Union[Date, datetime.date], notional: float, fixed_recovery: bool, recovery_rate: float, pay_at_end: bool, payment_date: Union[Date, datetime.date],): self.save_attributes()
[docs] @classmethod def make_simple(cls, protection_start_date: Union[Date, datetime.date], protection_end_date: Union[Date, datetime.date], notional: float = Literal.UNIT.value,): return cls( protection_start_date=protection_start_date, protection_end_date=protection_end_date, notional=notional, fixed_recovery=False, recovery_rate=Literal.ZERO.value, pay_at_end=False, payment_date=None, )
[docs] class CreditDefaultSwap: def __init__(self, fixed_coupon_leg: CDSFixedCouponLeg, contingent_leg: CDSContingentLeg) -> None: self.fixed_coupon_leg = fixed_coupon_leg self.contingent_leg = contingent_leg
[docs] @classmethod def make_standard(cls, effective_date: Union[Date, datetime.date], maturity_date: Union[Date, datetime.date], spread: float, notional: float = Literal.UNIT.value, cds_style: Union[CDSStyle, str] = "CORP_NA", pay_day_delay: int = 0,): fixed_coupon_leg = CDSFixedCouponLeg( effective_date=effective_date, maturity_date=maturity_date, spread=spread, notional=notional, cds_style=CDSStyle(cds_style), pay_day_delay=pay_day_delay, ) contingent_leg = CDSContingentLeg.make_simple( protection_start_date=effective_date, protection_end_date=maturity_date, notional=-notional, ) return cls( fixed_coupon_leg=fixed_coupon_leg, contingent_leg=contingent_leg, )