diff options
| -rw-r--r-- | python/analytics/tranche_basket.py | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/python/analytics/tranche_basket.py b/python/analytics/tranche_basket.py index 07af20a1..fce6cfe6 100644 --- a/python/analytics/tranche_basket.py +++ b/python/analytics/tranche_basket.py @@ -936,7 +936,11 @@ class TrancheBasket(BasketIndex): def skew(self) -> Skew: return Skew(self.expected_loss(), self._skew) - def tranche_factors(self): + def tranche_factors(self, zero_recovery=False): + if zero_recovery: + K = adjust_attachments(self.K_orig, 1 - self.factor, self.factor) + else: + K = self.K return np.diff(self.K) / np.diff(self.K_orig) * self.factor def _get_quotes(self, spread=None): @@ -1057,15 +1061,19 @@ class TrancheBasket(BasketIndex): coupon leg is *dirty*. bond price is *clean*.""" - cl = np.zeros(self.rho.size) - pl = np.zeros(self.rho.size) + cl = np.zeros_like(self.rho) + pl = np.zeros_like(self.rho) i = 0 - for rho, k in zip(self.rho, self.K): + if zero_recovery: + K = adjust_attachments(self.K_orig, 1 - self.factor, self.factor) + else: + K = self.K + for rho, k in zip(self.rho, K): cl[i], pl[i] = self.tranche_legs( k, rho, complement, shortened, zero_recovery ) i += 1 - dK = np.diff(self.K) + dK = np.diff(K) pl = np.diff(pl) / dK cl = np.diff(cl) / dK * self.tranche_quotes.running.values if complement: @@ -1210,10 +1218,10 @@ class TrancheBasket(BasketIndex): indexbp = np.empty(len(index_list)) for i, index in enumerate(index_list): - indexbp[i] = index.index_pv(zero_recovery=zero_recovery).bond_price + indexbp[i] = index.index_pv(zero_recovery=False).bond_price bp[i] = index.tranche_pvs(zero_recovery=zero_recovery).bond_price - factor = self.tranche_factors() / self.factor + factor = self.tranche_factors(zero_recovery) / self.factor deltas = (bp[1] - bp[2]) / (indexbp[1] - indexbp[2]) * factor deltasplus = (bp[3] - bp[0]) / (indexbp[3] - indexbp[0]) * factor gammas = (deltasplus - deltas) / (indexbp[1] - indexbp[0]) / 100 |
