aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics/tranche_basket.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics/tranche_basket.py')
-rw-r--r--python/analytics/tranche_basket.py34
1 files changed, 28 insertions, 6 deletions
diff --git a/python/analytics/tranche_basket.py b/python/analytics/tranche_basket.py
index b2faecea..46161e0f 100644
--- a/python/analytics/tranche_basket.py
+++ b/python/analytics/tranche_basket.py
@@ -843,11 +843,12 @@ class TrancheBasket(BasketIndex):
index_desc = self.index_desc.reset_index("maturity").set_index("tenor")
self.maturity = index_desc.loc[tenor].maturity.date()
try:
- self._get_tranche_quotes(value_date)
+ self._set_tranche_quotes(value_date)
except ValueError as e:
raise ValueError(
f"no tranche quotes available for date {value_date}"
) from e
+ self._update_tranche_quotes()
self.K_orig = np.hstack((0.0, self.tranche_quotes.detach)) / 100
self.K = adjust_attachments(self.K_orig, self.cumloss, self.factor)
self._Ngh = 250
@@ -856,7 +857,7 @@ class TrancheBasket(BasketIndex):
self.rho = np.full(self.K.size, np.nan)
self.cs = credit_schedule(value_date, 1.0, self.yc, self.maturity)
- def _get_tranche_quotes(self, value_date):
+ def _set_tranche_quotes(self, value_date):
if isinstance(value_date, datetime.datetime):
value_date = value_date.date()
df = get_tranche_quotes(self.index_type, self.series, self.tenor, value_date)
@@ -864,6 +865,8 @@ class TrancheBasket(BasketIndex):
raise ValueError
else:
self.tranche_quotes = df
+
+ def _update_tranche_quotes(self):
if self.index_type == "HY":
self.tranche_quotes["quotes"] = (
1 - self.tranche_quotes.trancheupfrontmid / 100
@@ -910,12 +913,10 @@ class TrancheBasket(BasketIndex):
self.cs = credit_schedule(d, 1.0, self.yc, self.maturity)
self.K = adjust_attachments(self.K_orig, self.cumloss, self.factor)
try:
- self._get_tranche_quotes(d)
- self._accrued = np.array(
- [cds_accrued(self.value_date, r) for r in self.tranche_quotes.running]
- )
+ self._set_tranche_quotes(d)
except ValueError as e:
raise ValueError(f"no tranche quotes available for date {d}") from e
+ self._update_tranche_quotes()
@property
def skew(self) -> Skew:
@@ -1330,3 +1331,24 @@ class TrancheBasket(BasketIndex):
)
)
return np.hstack([np.nan, self.skew(moneyness1_eq), np.nan])
+
+
+class MarkitTrancheBasket(TrancheBasket):
+ def _set_tranche_quotes(self, value_date):
+ if isinstance(value_date, datetime.datetime):
+ value_date = value_date.date()
+ df = get_tranche_quotes(
+ self.index_type, self.series, self.tenor, value_date, "Markit"
+ )
+ if df.empty:
+ raise ValueError
+ else:
+ self.tranche_quotes = df
+
+ def _update_tranche_quotes(self):
+ self.tranche_quotes["running"] = self.tranche_quotes.trancherunningmid * 1e-4
+ self.tranche_quotes["quotes"] = self.tranche_quotes.trancheupfrontmid
+ self._accrued = np.array(
+ [cds_accrued(self.value_date, r) for r in self.tranche_quotes.running]
+ )
+ self.tranche_quotes.quotes -= self._accrued