diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/basket_index.py | 34 | ||||
| -rw-r--r-- | python/analytics/tranche_basket.py | 9 |
2 files changed, 32 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 diff --git a/python/analytics/tranche_basket.py b/python/analytics/tranche_basket.py index 06fa148b..b2bb2f61 100644 --- a/python/analytics/tranche_basket.py +++ b/python/analytics/tranche_basket.py @@ -107,6 +107,11 @@ class DualCorrTranche(): self._index.value_date = d self.cs = credit_schedule(d, None, 1., self._index.yc, self._index.maturities[0]) self._accrued = cds_accrued(d, self.tranche_running * 1e-4) + if self._index.index_type == "XO" and self._index.series == 22 \ + and self.value_date > datetime.date(2016, 4, 25): + self._index._factor += 0.013333333333333333 + + self.K = adjust_attachments(self.K_orig, self._index.cumloss, self._index.factor) @memoize(hasher=lambda args: (hash(args[0]._index), *args[1:])) def tranche_legs(self, K, rho, epsilon=0.): @@ -374,6 +379,10 @@ class TrancheBasket(BasketIndex): @value_date.setter def value_date(self, d: pd.Timestamp): BasketIndex.value_date.__set__(self, d) + # Norske Skogindustrier ASA didn't trigger for tranches + if self.index_type == "XO" and self.series == 22 \ + and self.value_date > datetime.date(2016, 4, 25): + self._factor += 0.013333333333333333 self.cs = credit_schedule(d, self.tenor[:-1], 1, self.yc, self.maturity) self.K = adjust_attachments(self.K_orig, self.cumloss, self.factor) |
