diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/tranche_basket.py | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/python/analytics/tranche_basket.py b/python/analytics/tranche_basket.py index fafc2d70..795eab4d 100644 --- a/python/analytics/tranche_basket.py +++ b/python/analytics/tranche_basket.py @@ -21,7 +21,7 @@ class TrancheBasket(BasketIndex): super().__init__(index_type, series, [tenor], value_date=value_date) self.tenor = tenor index_desc = self.index_desc.reset_index('maturity').set_index('tenor') - self.maturity = index_desc.loc[tenor].maturity + self.maturity = index_desc.loc[tenor].maturity.date() self._get_tranche_quotes(value_date) self.K_orig = np.hstack((0., self.tranche_quotes.detach)) / 100 self.K = adjust_attachments(self.K_orig, self.cumloss, self.factor) @@ -35,10 +35,12 @@ class TrancheBasket(BasketIndex): 1, self.yc, self.maturity) if isinstance(value_date, datetime.datetime): value_date = value_date.date() - self.tranche_quotes = get_tranche_quotes(self.index_type, self.series, - self.tenor, value_date) - if self.tranche_quotes.empty: - raise ValueError(f"no tranche quotes for day {value_date}") + df = get_tranche_quotes(self.index_type, self.series, + self.tenor, value_date) + if df.empty: + raise ValueError + else: + self.tranche_quotes = df if self.index_type == "HY": self.tranche_quotes['quotes'] = 1 - self.tranche_quotes.trancheupfrontmid / 100 else: @@ -77,7 +79,13 @@ class TrancheBasket(BasketIndex): @value_date.setter def value_date(self, d: pd.Timestamp): BasketIndex.value_date.__set__(self, d) - self._get_tranche_quotes(d) + try: + self._get_tranche_quotes(d) + except ValueError as e: + self._accrued = np.array([cds_accrued(self.value_date, r) + for r in self.tranche_quotes.running]) + raise ValueError(f"no tranche quotes availabe for date {d}") from e + def tranche_factors(self): return np.diff(self.K) / np.diff(self.K_orig) * self.factor @@ -105,6 +113,8 @@ class TrancheBasket(BasketIndex): return 0., 0. elif ((K == 1. and not complement) or (K == 0. and complement)): return self.index_pv()[:-1] + elif np.isnan(rho): + raise ValueError("rho needs to be a real number between 0. and 1.") else: if shortened > 0: default_prob = self.default_prob.values[:,:-shortened] |
