diff options
Diffstat (limited to 'python/analytics/tranche_basket.py')
| -rw-r--r-- | python/analytics/tranche_basket.py | 26 |
1 files changed, 21 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): |
