diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/tranche_basket.py | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/python/analytics/tranche_basket.py b/python/analytics/tranche_basket.py index b2faecea..46161e0f 100644 --- a/python/analytics/tranche_basket.py +++ b/python/analytics/tranche_basket.py @@ -843,11 +843,12 @@ class TrancheBasket(BasketIndex): index_desc = self.index_desc.reset_index("maturity").set_index("tenor") self.maturity = index_desc.loc[tenor].maturity.date() try: - self._get_tranche_quotes(value_date) + self._set_tranche_quotes(value_date) except ValueError as e: raise ValueError( f"no tranche quotes available for date {value_date}" ) from e + self._update_tranche_quotes() self.K_orig = np.hstack((0.0, self.tranche_quotes.detach)) / 100 self.K = adjust_attachments(self.K_orig, self.cumloss, self.factor) self._Ngh = 250 @@ -856,7 +857,7 @@ class TrancheBasket(BasketIndex): self.rho = np.full(self.K.size, np.nan) self.cs = credit_schedule(value_date, 1.0, self.yc, self.maturity) - def _get_tranche_quotes(self, value_date): + def _set_tranche_quotes(self, value_date): if isinstance(value_date, datetime.datetime): value_date = value_date.date() df = get_tranche_quotes(self.index_type, self.series, self.tenor, value_date) @@ -864,6 +865,8 @@ class TrancheBasket(BasketIndex): raise ValueError else: self.tranche_quotes = df + + def _update_tranche_quotes(self): if self.index_type == "HY": self.tranche_quotes["quotes"] = ( 1 - self.tranche_quotes.trancheupfrontmid / 100 @@ -910,12 +913,10 @@ class TrancheBasket(BasketIndex): self.cs = credit_schedule(d, 1.0, self.yc, self.maturity) self.K = adjust_attachments(self.K_orig, self.cumloss, self.factor) try: - self._get_tranche_quotes(d) - self._accrued = np.array( - [cds_accrued(self.value_date, r) for r in self.tranche_quotes.running] - ) + self._set_tranche_quotes(d) except ValueError as e: raise ValueError(f"no tranche quotes available for date {d}") from e + self._update_tranche_quotes() @property def skew(self) -> Skew: @@ -1330,3 +1331,24 @@ class TrancheBasket(BasketIndex): ) ) return np.hstack([np.nan, self.skew(moneyness1_eq), np.nan]) + + +class MarkitTrancheBasket(TrancheBasket): + def _set_tranche_quotes(self, value_date): + if isinstance(value_date, datetime.datetime): + value_date = value_date.date() + df = get_tranche_quotes( + self.index_type, self.series, self.tenor, value_date, "Markit" + ) + if df.empty: + raise ValueError + else: + self.tranche_quotes = df + + def _update_tranche_quotes(self): + self.tranche_quotes["running"] = self.tranche_quotes.trancherunningmid * 1e-4 + self.tranche_quotes["quotes"] = self.tranche_quotes.trancheupfrontmid + self._accrued = np.array( + [cds_accrued(self.value_date, r) for r in self.tranche_quotes.running] + ) + self.tranche_quotes.quotes -= self._accrued |
