diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2020-07-08 22:02:03 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2020-07-09 18:45:19 -0400 |
| commit | 4991a8dcd67eb8c65332a9a0f8558e8e46c22b7c (patch) | |
| tree | de49d8895f3368a5162fc31e47b042f54cf5b685 | |
| parent | 03d2c41f8dec4ebc99ab44d28719e276d41694e4 (diff) | |
| download | pyisda-4991a8dcd67eb8c65332a9a0f8558e8e46c22b7c.tar.gz | |
allow to compute dispersion for expected loss
| -rw-r--r-- | pyisda/credit_index.pyx | 46 |
1 files 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: |
