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, 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]
)