From 4991a8dcd67eb8c65332a9a0f8558e8e46c22b7c Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Wed, 8 Jul 2020 22:02:03 -0400 Subject: allow to compute dispersion for expected loss --- pyisda/credit_index.pyx | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx index f06d27b..28bf0c1 100644 --- a/pyisda/credit_index.pyx +++ b/pyisda/credit_index.pyx @@ -596,8 +596,6 @@ cdef class CreditIndex(CurveList): tweak_curve(sc_orig, sc_copy, epsilon, mask) self._curves[i].reset(sc_copy, JpmcdsFreeTCurve) - - def survival_matrix(self, const TDate[::1] schedule=None, double epsilon=0.): cdef: shared_ptr[TCurve] sc @@ -684,7 +682,7 @@ cdef class CreditIndex(CurveList): j += 1 return spreads - def dispersion(self, YieldCurve yc not None, const TDate[::1] schedule=None, const bint use_log=True): + def dispersion(self, YieldCurve yc not None, const TDate[::1] schedule=None, const bint use_log=True, const bint exp_loss=False): cdef: shared_ptr[TCurve] sc pair[CurveName, size_t] p @@ -716,26 +714,34 @@ cdef class CreditIndex(CurveList): with nogil: for j in range(self._curves.size()): - if self.defaulted[j] != -1: + if self.defaulted[j] != -1 and not exp_loss: continue sc = self._curves[j] w = self._weights[j] - JpmcdsCdsParSpreads( - self.base_date, - self.base_date + 1, - self._start_date, - n, - schedule_ptr, - True, - NULL, - &stub_type, - ACT_360, - MODIFIED, - b'NONE', - get_TCurve(yc), - sc.get(), - self.recovery_rates[j].get(), - spreads) + if exp_loss: + if self.defaulted[j] != -1: + for i in range(n): + spreads[i] = (1 - survival_prob(sc.get(), self.base_date, schedule_ptr[i], 0.)) * (1 - self.recovery_rates[j].get()[i]) + else: + for i in range(n): + spreads[i] = 1 - self.recovery_rates[j].get()[i] + else: + JpmcdsCdsParSpreads( + self.base_date, + self.base_date + 1, + self._start_date, + n, + schedule_ptr, + True, + NULL, + &stub_type, + ACT_360, + MODIFIED, + b'NONE', + get_TCurve(yc), + sc.get(), + self.recovery_rates[j].get(), + spreads) if first_time: if use_log: -- cgit v1.2.3-70-g09d2