diff options
Diffstat (limited to 'python/analytics/tranche_basket.py')
| -rw-r--r-- | python/analytics/tranche_basket.py | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/python/analytics/tranche_basket.py b/python/analytics/tranche_basket.py new file mode 100644 index 00000000..67327e00 --- /dev/null +++ b/python/analytics/tranche_basket.py @@ -0,0 +1,36 @@ +from .basket_index import BasketIndex +from .db import _engine +from .tranche_functions import credit_schedule +from index_data import get_singlenames_curves, get_tranche_quotes +from pyisda.cdsone import upfront_charge +from pandas.tseries.offsets import BDay + +import pandas as pd + +class TrancheBasket(BasketIndex): + def __init__(self, index_type: str, series: int, tenor: str, *args, + trade_date: pd.Timestamp=pd.Timestamp.today().normalize() - BDay()): + super().__init__(index_type, series, [tenor], *args, trade_date) + self.tranche_quotes = get_tranche_quotes(index_type, series, tenor, trade_date.date()) + index_desc = self.index_desc.reset_index('maturity').set_index('tenor') + self.maturity = index_desc.loc[tenor].maturity + self.start_date, self.cs = credit_schedule(trade_date, tenor[:-1], 1, self.yc) + self.K_orig = [0] + [q['detach'] for q in self.tranche_quotes] + #self.K = adjust_attachments(self.K_orig, self + + def _get_quotes(self): + refprice = self.tranche_quotes[0]['indexrefprice'] + refspread = self.tranche_quotes[0]['indexrefspread'] + if refprice is not None: + return {self.maturity: 1 - refprice / 100} + if refspread is not None: + return {self.maturity: + upfront_charge(self.trade_date, self.value_date, self.start_date, + self.step_in_date, self.start_date, self.maturity, + self.coupon(self.maturity), self.yc, + refspread * 1e-4, self.recovery)} + raise ValueError("ref is missing") + + @property + def survival_matrix(self): + return super().survival_matrix(self.cs.index.values.astype('M8[D]').view('int') + 134774) |
