aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics')
-rw-r--r--python/analytics/tranche_basket.py26
-rw-r--r--python/analytics/utils.py7
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',