diff options
Diffstat (limited to 'python/analytics')
| -rw-r--r-- | python/analytics/tranche_basket.py | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/python/analytics/tranche_basket.py b/python/analytics/tranche_basket.py index e093ecc3..fccede63 100644 --- a/python/analytics/tranche_basket.py +++ b/python/analytics/tranche_basket.py @@ -1235,33 +1235,36 @@ class TrancheBasket(BasketIndex): return pd.Series(thetas, index=self._row_names, name="theta") def tranche_fwd_deltas(self, complement=False, shortened=4, method="ATM"): - index_short = deepcopy(self) + orig_cs = self.cs if shortened > 0: - index_short.cs = self.cs[:-shortened] - else: - index_short.cs = self.cs - if index_short.cs.empty: + self.cs = self.cs[:-shortened] + if self.cs.empty: + self.cs = orig_cs return pd.DataFrame( {"fwd_delta": np.nan, "fwd_gamma": np.nan}, index=self._row_names ) - index_short.rho = self.map_skew(index_short, method) - df = index_short.tranche_deltas() + orig_rho = self.rho + self.rho = self.map_skew(self, method) + df = self.tranche_deltas() df.columns = ["fwd_delta", "fwd_gamma"] + self.cs = orig_cs + self.rho = orig_rho return df def tranche_deltas(self, complement=False, zero_recovery=False): eps = 1e-4 - index_list = [self] + curves = deepcopy(self.curves) + bp = np.empty((4, self.K.size - 1)) + indexbp = np.empty(4) + i = 0 + indexbp[i] = self.index_pv(zero_recovery=False).bond_price + bp[i] = self.tranche_pvs(zero_recovery=zero_recovery).bond_price for tweak in [eps, -eps, 2 * eps]: - tb = deepcopy(self) - tb.tweak_portfolio(tweak, self.maturity) - index_list.append(tb) - bp = np.empty((len(index_list), self.K.size - 1)) - indexbp = np.empty(len(index_list)) - - for i, index in enumerate(index_list): - indexbp[i] = index.index_pv(zero_recovery=False).bond_price - bp[i] = index.tranche_pvs(zero_recovery=zero_recovery).bond_price + i += 1 + self.tweak_portfolio(tweak, self.maturity, False) + indexbp[i] = self.index_pv(zero_recovery=False).bond_price + bp[i] = self.tranche_pvs(zero_recovery=zero_recovery).bond_price + self.curves = curves factor = self.tranche_factors(zero_recovery) / self.factor deltas = (bp[1] - bp[2]) / (indexbp[1] - indexbp[2]) * factor |
