diff options
Diffstat (limited to 'python/analytics/basket_index.py')
| -rw-r--r-- | python/analytics/basket_index.py | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/python/analytics/basket_index.py b/python/analytics/basket_index.py index c84748f2..d3cc035e 100644 --- a/python/analytics/basket_index.py +++ b/python/analytics/basket_index.py @@ -6,6 +6,7 @@ from pyisda.credit_index import CreditIndex from pyisda.date import previous_twentieth from typing import List from yieldcurve import get_curve +import datetime import numpy as np import pandas as pd from math import exp @@ -47,11 +48,15 @@ class BasketIndex(CreditIndex): parse_dates=['maturity', 'issue_date']) if self.index_desc.empty: raise ValueError(f"Index {index_type} {series} doesn't exist") - r = _engine.execute("SELECT lastdate, indexfactor/100 AS factor, cumulativeloss/100, version " \ + self._index_version = list( + _engine.execute("SELECT lastdate," + " indexfactor/100 AS factor," + " cumulativeloss/100 AS cum_loss," + " 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) + "ORDER BY lastdate", (index_type, series))) + self._update_factor(value_date) self.issue_date = self.index_desc.issue_date[0] self.index_desc = self.index_desc.loc[tenors] self.index_desc = self.index_desc.sort_values('maturity') @@ -89,22 +94,25 @@ class BasketIndex(CreditIndex): return hash((CreditIndex.__hash__(self),) + tuple(aux(v) for k, v in vars(self).items() if k not in self._ignore_hash)) - def _query_version(self, i): - for lastdate, *data in self._version: - if lastdate >= self.value_date: - return data[i] + def _update_factor(self, d): + if isinstance(d, datetime.datetime): + d = d.date() + for lastdate, *data in self._index_version: + if lastdate >= d: + self._factor, self._cumloss, self._version = data + break @property def factor(self): - return self._query_version(0) + return self._factor @property def cumloss(self): - return self._query_version(1) + return self._cumloss @property def version(self): - return self._query_version(2) + return self._version def _get_quotes(self, *args): """ allow to tweak based on manually inputed quotes""" @@ -115,11 +123,15 @@ class BasketIndex(CreditIndex): @value_date.setter def value_date(self, d: pd.Timestamp): - self.curves = get_singlenames_curves(self.index_type, self.series, d, self._curve_tenors) + self.curves = get_singlenames_curves(self.index_type, + self.series, + d, + self._curve_tenors) self.yc = get_curve(d, self.currency) self.step_in_date = d + Day() self.cash_settle_date = d + 3 * BDay() self.start_date = previous_twentieth(d) # or d + 1? + self._update_factor(d) CreditIndex.value_date.__set__(self, d) @property |
