diff options
| -rw-r--r-- | pyisda/credit_index.pyx | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx index d87a198..d8187dd 100644 --- a/pyisda/credit_index.pyx +++ b/pyisda/credit_index.pyx @@ -453,6 +453,48 @@ cdef class CreditIndex(CurveList): JpmcdsFeeLegFree(legs.second) return r + def protection_leg(self, step_in_date, cash_settle_date, maturity, YieldCurve yc not None): + cdef: + TDate step_in_date_c = pydate_to_TDate(step_in_date) + TDate cash_settle_date_c = pydate_to_TDate(cash_settle_date) + TDate maturity_c = pydate_to_TDate(maturity) + TContingentLeg* cl + size_t i + int found + + found = get_maturity_index(maturity_c, self._maturities) + if found == -1: + cl = JpmcdsCdsContingentLegMake(self.start_date, + maturity_c, + 1., + True) + else: + cl = self.contingent_legs[found] + cdef: + double cl_pv, r = 0 + TCurve* sc + double* recovery_rate + with nogil: + with parallel(): + for i in prange(self._curves.size()): + sc = self._curves[i].get() + recovery_rate = self.recovery_rates[i].get() + # FIXME: do something better + if isnan(deref(recovery_rate)): + preinc(recovery_rate) + JpmcdsContingentLegPV(cl, + self.base_date, + cash_settle_date_c, + step_in_date_c, + yc._thisptr.get(), + sc, + deref(recovery_rate), + &cl_pv) + r += self._weights[i] * cl_pv + if found == -1: + free(cl) + return r + def duration(self, step_in_date, cash_settle_date, maturity, YieldCurve yc not None): cdef: |
