from .curve cimport YieldCurve from .date cimport JpmcdsMakeDateInterval, pydate_to_TDate, dcc cdef int SUCCESS = 0 def upfront_charge(date, value_date, benchmark_start_date, stepin_date, start_date, end_date, double coupon_rate, YieldCurve yc, double spread, double recovery_rate, TBoolean pay_accrued_at_start=True, TBoolean pay_accrued_on_default=True): """ Computes the fair upfront payment for a cds based on the fair spread. Parameters ---------- date : :class:`datetime.date` today's date value_date : :class:`datetime.date` the date when cash is assumed to change hands. benchmark_start_date : :class:`datetime.date` should be same as `start_date`, not sure why there are two parameters. stepin_date : :class:`datetime.date` effective start of protection, typically `date` + 1 start_date : :class:`datetime.date` beginning of cds, typically most recent IMM date before `date` end_date : :class:`datetime.date` last date of the cds coupon_rate : double cds fixed coupon. yc : :class:`~pyisda.cuve.YieldCurve` Yield curve spread : double cds running spread recovery_rate : double assumed recovery rate pay_accrued_at_start : bool, optional do we pay accrued from `start_date` to `date` (True means clean) pay_accrued_on_default : bool, optional in case of default do we pay current accrued on default or at maturity. """ cdef: TDate today = pydate_to_TDate(date) TDate value_date_c = pydate_to_TDate(value_date) TDate benchmark_start_date_c = pydate_to_TDate(benchmark_start_date) TDate stepin_date_c = pydate_to_TDate(stepin_date) TDate start_date_c = pydate_to_TDate(start_date) TDate end_date_c = pydate_to_TDate(end_date) double result TStubMethod stub TDateInterval ivl if JpmcdsStringToStubMethod(b"f/s", &stub) != SUCCESS: raise ValueError("can't convert stub") if JpmcdsMakeDateInterval(3, b"M", &ivl) != SUCCESS: raise ValueError("can't convert to date interval") if JpmcdsCdsoneUpfrontCharge(today, value_date_c, benchmark_start_date_c, stepin_date_c, start_date_c, end_date_c, coupon_rate, pay_accrued_on_default, &ivl, &stub, dcc("ACT/360"), b'F', b"None", yc.get_TCurve(), spread, recovery_rate, pay_accrued_at_start, &result) == SUCCESS: return result else: raise ValueError("computation failed") def spread_from_upfront(date, value_date, benchmark_start_date, stepin_date, start_date, end_date, double coupon_rate, YieldCurve yc, double upfront, double recovery_rate, TBoolean pay_accrued_at_start=True, TBoolean pay_accrued_on_default=True): """Computes the equivalent fair spread for a cds with upfront+running. Parameters ---------- date : :class:`datetime.date` today's date value_date : :class:`datetime.date` the date when cash is assumed to change hands. benchmark_start_date : :class:`datetime.date` should be same as `start_date`, not sure why there are two parameters. stepin_date : :class:`datetime.date` effective start of protection, typically `date` + 1 start_date : :class:`datetime.date` beginning of cds, typically most recent IMM date before `date` end_date : :class:`datetime.date` last date of the cds coupon_rate : double cds fixed coupon. yc : :class:`~pyisda.cuve.YieldCurve` Yield curve upfront : double cds upfront recovery_rate : double assumed recovery rate pay_accrued_at_start : bool, optional do we pay accrued from `start_date` to `date` pay_accrued_on_default : bool, optional in case of default do we pay current accrued on default or at maturity. """ cdef: TDate today = pydate_to_TDate(date) TDate value_date_c = pydate_to_TDate(value_date) TDate benchmark_start_date_c = pydate_to_TDate(benchmark_start_date) TDate stepin_date_c = pydate_to_TDate(stepin_date) TDate start_date_c = pydate_to_TDate(start_date) TDate end_date_c = pydate_to_TDate(end_date) double result TStubMethod stub TDateInterval ivl if JpmcdsStringToStubMethod(b"f/s", &stub) != SUCCESS: raise ValueError("can't convert stub") if JpmcdsMakeDateInterval(3, b"M", &ivl) != SUCCESS: raise ValueError("can't convert to date interval") if JpmcdsCdsoneSpread(today, value_date_c, benchmark_start_date_c, stepin_date_c, start_date_c, end_date_c, coupon_rate, pay_accrued_on_default, &ivl, &stub, dcc("ACT/360"), b'F', b"None", yc.get_TCurve(), upfront, recovery_rate, pay_accrued_at_start, &result) == SUCCESS: return result else: raise ValueError("computation failed")