diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/basket_index.py | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/python/analytics/basket_index.py b/python/analytics/basket_index.py index 0b2c7f46..bbdec164 100644 --- a/python/analytics/basket_index.py +++ b/python/analytics/basket_index.py @@ -177,21 +177,29 @@ class BasketIndex(CreditIndex): def dispersion(self, use_gini: bool = False, use_log: bool = True): if use_gini: w = self.weights - spreads = self.spreads().ravel() + spreads = self.spreads() if use_log: spreads = np.log(spreads) - mask = spreads.isnan() + mask = np.isnan(spreads[:, 0]) if mask.any(): - spreads = spreads[~mask] + spreads = spreads[~mask, :] w = w[~mask] w /= w.sum() - index = np.argsort(spreads) - spreads = spreads[index] - w = w[index] - S = np.cumsum(w * spreads) - return 1 - (np.inner(w[1:], (S[:-1] + S[1:])) + w[0] * S[0]) / S[-1] + 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] + curr_w = w[index] + S = np.cumsum(curr_w * curr_spreads) + r[offset + i] = ( + 1 - (np.inner(curr_w[1:], (S[:-1] + S[1:])) + w[0] * S[0]) / S[-1] + ) else: - return super().dispersion(self.yc, use_log=use_log) + r = super().dispersion(self.yc, use_log=use_log) + return pd.Series( + r, index=self.index_desc.tenor, name="gini" if use_gini else "dispersion" + ) def pv(self, maturity=None, epsilon=0.0, coupon=None): if maturity is None: |
