aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/analytics/__init__.py3
-rw-r--r--python/analytics/basket_index.py59
-rw-r--r--python/analytics/index.py4
-rw-r--r--python/analytics/tranche_basket.py36
4 files changed, 60 insertions, 42 deletions
diff --git a/python/analytics/__init__.py b/python/analytics/__init__.py
index 4e2c2c39..da3b5ae7 100644
--- a/python/analytics/__init__.py
+++ b/python/analytics/__init__.py
@@ -1,4 +1,5 @@
from .index import Index, ForwardIndex
from .option import BlackSwaption, Swaption, VolatilitySurface, ATMstrike, ProbSurface, QuoteSurface, VolSurface
from .portfolio import Portfolio
-from .basket_index import BasketIndex
+from .basket_index import MarkitBasketIndex
+from .tranche_basket import TrancheBasket
diff --git a/python/analytics/basket_index.py b/python/analytics/basket_index.py
index 64f6efc5..8e9d6cfd 100644
--- a/python/analytics/basket_index.py
+++ b/python/analytics/basket_index.py
@@ -1,5 +1,4 @@
-from index_data import (get_index_quotes, get_singlenames_curves,
- get_tranche_quotes)
+from index_data import get_index_quotes, get_singlenames_curves
from .db import _engine
from dateutil.relativedelta import relativedelta
from pyisda.credit_index import CreditIndex
@@ -9,7 +8,6 @@ import pandas as pd
import datetime
from scipy.optimize import brentq
from pandas.tseries.offsets import BDay
-from pyisda.cdsone import upfront_charge
class BasketIndex(CreditIndex):
index_type: str
@@ -35,14 +33,11 @@ class BasketIndex(CreditIndex):
index_col='tenor',
params=(index_type, series),
parse_dates=['maturity', 'issue_date'])
- self._index_version = pd.read_sql_query("SELECT lastdate, indexfactor, cumulativeloss " \
- "FROM index_version " \
- "WHERE index=%s AND series = %s" \
- "ORDER BY lastdate",
- _engine,
- index_col='lastdate',
- params=(index_type, series),
- parse_dates=['lastdate'])
+ r = _engine.execute("SELECT lastdate, indexfactor/100 AS factor, cumulativeloss, 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)
self.issue_date = self.index_desc.issue_date[0]
maturities = self.index_desc.maturity.sort_values().dt.to_pydatetime()
self.index_desc = self.index_desc.reset_index().set_index('maturity')
@@ -55,6 +50,20 @@ class BasketIndex(CreditIndex):
self.tweaks = []
super().__init__(self.issue_date, maturities, curves)
+ def _query_version(self, i):
+ for lastdate, *data in self._version:
+ if lastdate >= self.trade_date:
+ return data[i]
+
+ def factor(self):
+ return self._query_version(1)
+
+ def cumloss(self):
+ return self._query_version(2)
+
+ def version(self):
+ return self._query_version(3)
+
def _get_quotes(self):
pass
@@ -127,34 +136,6 @@ class MarkitBasketIndex(BasketIndex):
def _get_quotes(self):
return self.index_quotes.loc[self.trade_date]
-class TrancheBasket(BasketIndex):
- def __init__(self, index_type: str, series: int, tenor: str, *args,
- trade_date: pd.Timestamp=pd.Timestamp.today().normalize() - BDay()):
- super().__init__(index_type, series, [tenor], *args, trade_date)
- self.tranche_quotes = get_tranche_quotes(index_type, series, tenor, trade_date.date())
- index_desc = self.index_desc.reset_index('maturity').set_index('tenor')
- self.maturity = index_desc.loc[tenor].maturity
- self.start_date, self.cs = credit_schedule(trade_date, tenor[:-1], 1, self.yc)
- self.K_orig = [0] + [q['detach'] for q in self.tranche_quotes]
- #self.K = adjust_attachments(self.K_orig, self
-
- def _get_quotes(self):
- refprice = self.tranche_quotes[0]['indexrefprice']
- refspread = self.tranche_quotes[0]['indexrefspread']
- if refprice is not None:
- return {self.maturity: 1 - refprice / 100}
- if refspread is not None:
- return {self.maturity:
- upfront_charge(self.trade_date, self.value_date, self.start_date,
- self.step_in_date, self.start_date, self.maturity,
- self.coupon(self.maturity), self.yc,
- refspread * 1e-4, self.recovery)}
- raise ValueError("ref is missing")
-
- @property
- def survival_matrix(self):
- return super().survival_matrix(self.cs.index.values.astype('M8[D]').view('int') + 134774)
-
if __name__ == "__main__":
ig28 = BasketIndex("IG", 28, ["3yr", "5yr", "7yr", "10yr"])
from quantlib.time.api import Schedule, Rule, Date, Period, WeekendsOnly
diff --git a/python/analytics/index.py b/python/analytics/index.py
index d2c98822..2b77862c 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -353,7 +353,7 @@ class Index(object):
@property
def factor(self):
- for lastdate, factor, _ in getattr(self, '_version'):
+ for lastdate, factor, _ in self._version:
if lastdate >= self.trade_date:
return factor
else:
@@ -361,7 +361,7 @@ class Index(object):
@property
def version(self):
- for lastdate, _, version in getattr(self, '_factor'):
+ for lastdate, _, version in self._version:
if lastdate >= self.trade_date:
return version
else:
diff --git a/python/analytics/tranche_basket.py b/python/analytics/tranche_basket.py
new file mode 100644
index 00000000..67327e00
--- /dev/null
+++ b/python/analytics/tranche_basket.py
@@ -0,0 +1,36 @@
+from .basket_index import BasketIndex
+from .db import _engine
+from .tranche_functions import credit_schedule
+from index_data import get_singlenames_curves, get_tranche_quotes
+from pyisda.cdsone import upfront_charge
+from pandas.tseries.offsets import BDay
+
+import pandas as pd
+
+class TrancheBasket(BasketIndex):
+ def __init__(self, index_type: str, series: int, tenor: str, *args,
+ trade_date: pd.Timestamp=pd.Timestamp.today().normalize() - BDay()):
+ super().__init__(index_type, series, [tenor], *args, trade_date)
+ self.tranche_quotes = get_tranche_quotes(index_type, series, tenor, trade_date.date())
+ index_desc = self.index_desc.reset_index('maturity').set_index('tenor')
+ self.maturity = index_desc.loc[tenor].maturity
+ self.start_date, self.cs = credit_schedule(trade_date, tenor[:-1], 1, self.yc)
+ self.K_orig = [0] + [q['detach'] for q in self.tranche_quotes]
+ #self.K = adjust_attachments(self.K_orig, self
+
+ def _get_quotes(self):
+ refprice = self.tranche_quotes[0]['indexrefprice']
+ refspread = self.tranche_quotes[0]['indexrefspread']
+ if refprice is not None:
+ return {self.maturity: 1 - refprice / 100}
+ if refspread is not None:
+ return {self.maturity:
+ upfront_charge(self.trade_date, self.value_date, self.start_date,
+ self.step_in_date, self.start_date, self.maturity,
+ self.coupon(self.maturity), self.yc,
+ refspread * 1e-4, self.recovery)}
+ raise ValueError("ref is missing")
+
+ @property
+ def survival_matrix(self):
+ return super().survival_matrix(self.cs.index.values.astype('M8[D]').view('int') + 134774)