diff options
Diffstat (limited to 'python/analytics/basket_index.py')
| -rw-r--r-- | python/analytics/basket_index.py | 59 |
1 files changed, 20 insertions, 39 deletions
diff --git a/python/analytics/basket_index.py b/python/analytics/basket_index.py index 64f6efc5..8e9d6cfd 100644 --- a/python/analytics/basket_index.py +++ b/python/analytics/basket_index.py @@ -1,5 +1,4 @@ -from index_data import (get_index_quotes, get_singlenames_curves, - get_tranche_quotes) +from index_data import get_index_quotes, get_singlenames_curves from .db import _engine from dateutil.relativedelta import relativedelta from pyisda.credit_index import CreditIndex @@ -9,7 +8,6 @@ import pandas as pd import datetime from scipy.optimize import brentq from pandas.tseries.offsets import BDay -from pyisda.cdsone import upfront_charge class BasketIndex(CreditIndex): index_type: str @@ -35,14 +33,11 @@ class BasketIndex(CreditIndex): index_col='tenor', params=(index_type, series), parse_dates=['maturity', 'issue_date']) - self._index_version = pd.read_sql_query("SELECT lastdate, indexfactor, cumulativeloss " \ - "FROM index_version " \ - "WHERE index=%s AND series = %s" \ - "ORDER BY lastdate", - _engine, - index_col='lastdate', - params=(index_type, series), - parse_dates=['lastdate']) + r = _engine.execute("SELECT lastdate, indexfactor/100 AS factor, cumulativeloss, version " \ + "FROM index_version " \ + "WHERE index = %s AND series = %s" \ + "ORDER BY lastdate", (index_type, series)) + self._version = tuple(tuple(t) for t in r) self.issue_date = self.index_desc.issue_date[0] maturities = self.index_desc.maturity.sort_values().dt.to_pydatetime() self.index_desc = self.index_desc.reset_index().set_index('maturity') @@ -55,6 +50,20 @@ class BasketIndex(CreditIndex): self.tweaks = [] super().__init__(self.issue_date, maturities, curves) + def _query_version(self, i): + for lastdate, *data in self._version: + if lastdate >= self.trade_date: + return data[i] + + def factor(self): + return self._query_version(1) + + def cumloss(self): + return self._query_version(2) + + def version(self): + return self._query_version(3) + def _get_quotes(self): pass @@ -127,34 +136,6 @@ class MarkitBasketIndex(BasketIndex): def _get_quotes(self): return self.index_quotes.loc[self.trade_date] -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) - if __name__ == "__main__": ig28 = BasketIndex("IG", 28, ["3yr", "5yr", "7yr", "10yr"]) from quantlib.time.api import Schedule, Rule, Date, Period, WeekendsOnly |
