diff options
Diffstat (limited to 'python/analytics')
| -rw-r--r-- | python/analytics/tranche_basket.py | 26 | ||||
| -rw-r--r-- | python/analytics/utils.py | 7 |
2 files changed, 28 insertions, 5 deletions
diff --git a/python/analytics/tranche_basket.py b/python/analytics/tranche_basket.py index de1ba315..5a2289e5 100644 --- a/python/analytics/tranche_basket.py +++ b/python/analytics/tranche_basket.py @@ -4,7 +4,7 @@ from .tranche_functions import ( BCloss_recov_trunc, tranche_cl, tranche_pl, tranche_pl_trunc, tranche_cl_trunc) from .index_data import get_tranche_quotes -from .utils import memoize, build_table +from .utils import memoize, build_table, bus_day from collections import namedtuple from .db import dawn_engine, serenitas_engine, serenitas_pool from copy import deepcopy @@ -16,10 +16,12 @@ from scipy.interpolate import CubicSpline, PchipInterpolator from scipy.special import logit, expit import datetime +import logging import pandas as pd import numpy as np import analytics +logger = logging.getLogger(__name__) class Skew(): _cache = LRU(64) @@ -379,7 +381,7 @@ class DualCorrTranche(): try: ref, = c.fetchone() except TypeError: - raise ValueError("No quote for that date") + raise ValueError(f"No quote for date {self.value_date}") try: self._index.tweak([ref]) except NameError: @@ -388,9 +390,23 @@ class DualCorrTranche(): if 'skew' in args: self._skew = el, skew_fun = args['skew'] else: - self._skew = el, skew_fun = Skew.from_desc(self.index_type, self.series, self.tenor, - value_date=self.value_date) - K_index_eq = np.clip(el/self.expected_loss() * self.K, None, .999) + d = self.value_date + i = 0 + while i < 5: + try: + self._skew = el, skew_fun = (Skew. + from_desc(self.index_type, + self.series, + self.tenor, + value_date=d)) + except ValueError as e: + logger.error(str(e)) + d -= bus_day + logger.info(f"trying {d}") + i += 1 + else: + break + K_index_eq = self.K / self.expected_loss() self.rho = self._skew(K_index_eq) def jump_to_default(self, skew): diff --git a/python/analytics/utils.py b/python/analytics/utils.py index c75a0018..8a738a2b 100644 --- a/python/analytics/utils.py +++ b/python/analytics/utils.py @@ -6,6 +6,13 @@ from dateutil.relativedelta import relativedelta, WE from functools import partial, wraps from pyisda.date import pydate_to_TDate from pandas.api.types import CategoricalDtype +from pandas.tseries.offsets import CustomBusinessDay, Day, QuarterBegin +from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFriday + +fed_cal = get_calendar('USFederalHolidayCalendar') +bond_cal = HolidayCalendarFactory('BondCalendar', fed_cal, GoodFriday) +bus_day = CustomBusinessDay(calendar=bond_cal()) + from quantlib.time.date import nth_weekday, Wednesday, Date tenor_t = CategoricalDtype(['1m', '3m', '6m', '1yr', '2yr', '3yr', '4yr', |
