summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyisda/credit_index.pyx46
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: