aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics')
-rw-r--r--python/analytics/basket_index.py26
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: