diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/basket_index.py | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/python/analytics/basket_index.py b/python/analytics/basket_index.py index 58b7366f..ece47cb7 100644 --- a/python/analytics/basket_index.py +++ b/python/analytics/basket_index.py @@ -55,7 +55,7 @@ class BasketIndex(CreditIndex): "FROM index_maturity " "WHERE index=%s AND series=%s AND tenor IN %s " "ORDER BY maturity", - (index_type, series, tuple(tenors)) + (index_type, series, tuple(tenors)), ) self.index_desc = list(tuple(r) for r in c) if not self.index_desc: @@ -173,24 +173,28 @@ class BasketIndex(CreditIndex): def spreads(self): return super().spreads(self.yc) - def dispersion(self, use_gini: bool = False, use_log: bool = True): + def dispersion(self, use_gini: bool = False, use_log: bool = True, exp_loss=False): if use_gini: + if exp_loss: + surv_prob, _ = self.survival_matrix() + disp = (1 - surv_prob) * np.vstack(1 - self.recovery_rates) + else: + disp = self.spreads() w = self.weights - spreads = self.spreads() if use_log: - spreads = np.log(spreads) - mask = np.isnan(spreads[:, 0]) + disp = np.log(disp) + mask = np.isnan(disp[:, 0]) if mask.any(): - spreads = spreads[~mask, :] + disp = disp[~mask, :] w = w[~mask] w /= w.sum() r = np.full(len(self.maturities), np.nan) - offset = len(self.maturities) - spreads.shape[1] - for i in range(spreads.shape[1]): - index = np.argsort(spreads[:, i]) - curr_spreads = spreads[index, i] + offset = len(self.maturities) - disp.shape[1] + for i in range(disp.shape[1]): + index = np.argsort(disp[:, i]) + curr_disp = disp[index, i] curr_w = w[index] - S = np.cumsum(curr_w * curr_spreads) + S = np.cumsum(curr_w * curr_disp) r[offset + i] = ( 1 - (np.inner(curr_w[1:], (S[:-1] + S[1:])) + w[0] * S[0]) / S[-1] ) |
