From 1e133bba557c2a0f34d9e2f93a84a28cb3dc3b54 Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Wed, 6 Dec 2023 15:22:25 -0500 Subject: handle defaulted curves properly --- pyisda/credit_index.pyx | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx index ea1a809..b442be2 100644 --- a/pyisda/credit_index.pyx +++ b/pyisda/credit_index.pyx @@ -658,23 +658,24 @@ cdef class CreditIndex(CurveList): TDate maturity_c = pydate_to_TDate(maturity) TContingentLeg* cl size_t i - double cl_pv, r = 0 + double cl_pv, r = 0.0 TCurve* sc double* recovery_rate + TDate defaulted with nogil: cl = JpmcdsCdsContingentLegMake(self._start_date, maturity_c, 1., True) - with parallel(): - cl_pv = 0.0 - for i in prange(self._curves.size()): - sc = self._curves[i].get() - recovery_rate = (sc + self.offset_recovery_rates[i]) - # FIXME: do something better - if isnan(deref(recovery_rate)): - preinc(recovery_rate) + for i in prange(self._curves.size()): + sc = self._curves[i].get() + recovery_rate = (sc + self.offset_recovery_rates[i]) + defaulted = deref(recovery_rate + sc.fNumItems) + # FIXME: do something better + if isnan(deref(recovery_rate)): + preinc(recovery_rate) + if defaulted == -1: JpmcdsContingentLegPV(cl, self.base_date, cash_settle_date_c, @@ -698,7 +699,8 @@ cdef class CreditIndex(CurveList): TCurve* sc size_t i int found - double fl_pv, r + double fl_pv, r = 0.0 + TDate defaulted with nogil: found = get_maturity_index(maturity_c, self._maturities) @@ -719,18 +721,20 @@ cdef class CreditIndex(CurveList): fl = self.fee_legs[found] with parallel(): - fl_pv = 0 + fl_pv = 0.0 for i in prange(self._curves.size()): sc = self._curves[i].get() - JpmcdsFeeLegPV(fl, - self.base_date, - step_in_date_c, - cash_settle_date_c, - yc.get_TCurve(), - sc, - True, - &fl_pv) - r += self._weights[i] * fl_pv + defaulted = deref((sc + self.offset_recovery_rates[i] + sc.fNumItems * sizeof(double))) + if defaulted == -1: + JpmcdsFeeLegPV(fl, + self.base_date, + step_in_date_c, + cash_settle_date_c, + yc.get_TCurve(), + sc, + True, + &fl_pv) + r += self._weights[i] * fl_pv if found == -1: JpmcdsFeeLegFree(fl) -- cgit v1.2.3-70-g09d2