from pyisda.utils import build_yc from quantlib.settings import Settings from quantlib.time.api import ( Date, today, Period, Years, WeekendsOnly, Quarterly, CDS, Actual360, ModifiedFollowing, Actual365Fixed, Months) from quantlib.quotes import SimpleQuote from quantlib.termstructures.credit.api import ( SpreadCdsHelper, Interpolator, ProbabilityTrait, PiecewiseDefaultCurve ) from quantlib.termstructures.yields.api import YieldTermStructure, DepositRateHelper from quantlib.pricingengines.credit.isda_cds_engine import IsdaCdsEngine import datetime import math import numpy as np import pandas as pd from pandas.tseries.offsets import BusinessDay as BDay from db import dbengine from yieldcurve import YC from swaption import Index def get_spread(index, series): engine = dbengine("serenitasdb") df = pd.read_sql("SELECT date, tenor, closespread FROM index_quotes WHERE " \ "index = %(index)s and series = %(series)s", engine, params = {"index": index, "series": series}, parse_dates=['date'], index_col = ['date', 'tenor']) df = df.unstack('tenor') df.columns = ['spread_' + c for c in df.columns.levels[1]] return df[['spread_3yr', 'spread_5yr', 'spread_7yr', 'spread_10yr']] def test_sc(df): settings = Settings() settings.evaluation_date = today() tenors = [Period(3, Years), Period(5, Years), Period(7, Years), Period(10, Years)] quotes = [] for i in range(4): quotes.append(SimpleQuote()) yts = YieldTermStructure() helpers = [SpreadCdsHelper(q, t, 1, WeekendsOnly(), Quarterly, ModifiedFollowing, CDS, Actual360(), 0.4, discount_curve = yts, lastperiod = Actual360(True)) for q, t in zip(quotes, tenors)] pdc = PiecewiseDefaultCurve(ProbabilityTrait.SurvivalProbability, Interpolator.LogLinear, 0, WeekendsOnly(), helpers, Actual365Fixed()) ts = YC() yts.link_to(ts) for r in df.itertuples(index=True, name = None): settings.evaluation_date = Date.from_datetime(r[0]) ts = YC() yts.link_to(ts) for i in range(4): quotes[i].value = r[i+1] *1e-4 print(pdc.dates) print(pdc.data) if __name__ == "__main__": settings = Settings() trade_date = datetime.date.today() settings.evaluation_date = today() start_date = datetime.date(2016, 6, 20) term_date = datetime.date(2021, 6, 20) recovery = 0.4 fixed_rate = 0.01 ig26 = Index(start_date, term_date, recovery, fixed_rate) yc = build_yc(trade_date, True) exercise_date = datetime.date(2016, 10, 19) exercise_date_settle = pd.Timestamp(exercise_date + 3* BDay()).date() spread = np.array([65, 70, 72.5, 75, 77.5, 80, 85, 90, 95, 100, 110, 120, 130, 140]) tailprob = np.array([64.2, 51.7, 45.8, 40.2, 35, 30.4, 23.2, 18, 14.3, 11.6, 7.9, 5.6, 4.1, 3]) cumprob = 1-tailprob/100 hist = cumprob/spread hist = np.hstack((0, hist))