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