aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/basket_index.py28
1 files changed, 15 insertions, 13 deletions
diff --git a/python/analytics/basket_index.py b/python/analytics/basket_index.py
index 3295c018..d9f243ea 100644
--- a/python/analytics/basket_index.py
+++ b/python/analytics/basket_index.py
@@ -1,9 +1,7 @@
from .index_data import get_index_quotes, get_singlenames_curves
from .db import _engine
from .utils import tenor_t
-from dateutil.relativedelta import relativedelta
from functools import partial
-from pickle import dumps, loads
from pandas.util import hash_pandas_object
from pyisda.credit_index import CreditIndex
from typing import List
@@ -11,17 +9,18 @@ from yieldcurve import get_curve
import numpy as np
import pandas as pd
from math import exp
-import datetime
from scipy.optimize import brentq
from pandas.tseries.offsets import Day, BDay
from pyisda.cdsone import upfront_charge
+
def make_index(t, d, args):
instance = t.__new__(t)
CreditIndex.__init__(instance, *args)
instance.__dict__.update(d)
return instance
+
class BasketIndex(CreditIndex):
index_type: str
series: int
@@ -137,7 +136,6 @@ class BasketIndex(CreditIndex):
self.yc, self.recovery, coupon,
epsilon)
-
def coupon_leg(self, maturity=None):
return self.index_desc.coupon.values * self.duration()
@@ -146,9 +144,11 @@ class BasketIndex(CreditIndex):
def spread(self, maturity=None, coupon=None):
if maturity is None:
- return (self.index_desc.coupon.values + self.pv() / self.duration()) * 1e4
+ return (self.index_desc.coupon.values + self.pv() /
+ self.duration()) * 1e4
else:
- return (coupon + self.pv(maturity, coupon=coupon) / self.duration(maturity)) * 1e4
+ return (coupon + self.pv(maturity, coupon=coupon) /
+ self.duration(maturity)) * 1e4
def duration(self, maturity=None):
if maturity is None:
@@ -205,11 +205,11 @@ class BasketIndex(CreditIndex):
self.tweaks = []
for m, index_quote in quotes.items():
lo, hi = -0.3, 0.3
- hi_tilde = exp(hi) -1
+ hi_tilde = exp(hi) - 1
while hi_tilde < 5:
# map range to (-1, +inf)
- lo_tilde = exp(lo) -1
- hi_tilde = exp(hi) -1
+ lo_tilde = exp(lo) - 1
+ hi_tilde = exp(hi) - 1
try:
eps = brentq(lambda epsilon: self.pv(m, epsilon) -
index_quote, lo_tilde, hi_tilde)
@@ -219,8 +219,7 @@ class BasketIndex(CreditIndex):
else:
break
else:
- print("couldn't calibrate for date: {} and maturity: {}".
- format(self.value_date.date(), m.date()))
+ print(f"couldn't calibrate for date: {self.value_date} and maturity: {m}")
self.tweaks.append(np.NaN)
continue
self.tweaks.append(eps)
@@ -249,12 +248,15 @@ class MarkitBasketIndex(BasketIndex):
def _get_quotes(self):
return self.index_quotes.loc[self.value_date]
+
if __name__ == "__main__":
ig28 = BasketIndex("IG", 28, ["3yr", "5yr", "7yr", "10yr"])
from quantlib.time.api import Schedule, Rule, Date, Period, WeekendsOnly
from quantlib.settings import Settings
settings = Settings()
- cds_schedule = Schedule.from_rule(settings.evaluation_date, Date.from_datetime(ig28.maturities[-1]),
- Period('3M'), WeekendsOnly(), date_generation_rule=Rule.CDS2015)
+ cds_schedule = Schedule.from_rule(settings.evaluation_date,
+ Date.from_datetime(ig28.maturities[-1]),
+ Period('3M'), WeekendsOnly(),
+ date_generation_rule=Rule.CDS2015)
sp = ig28.survival_matrix(cds_schedule.to_npdates().view('int') + 134774)