diff options
| -rw-r--r-- | python/analytics/basket_index.py | 28 |
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) |
