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