diff options
| -rw-r--r-- | python/cds_curve.py | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/python/cds_curve.py b/python/cds_curve.py index 2b5285f0..4cd09f81 100644 --- a/python/cds_curve.py +++ b/python/cds_curve.py @@ -7,6 +7,7 @@ import datetime import math import numpy as np import pandas as pd + from yieldcurve import YC, ql_to_jp from quantlib.settings import Settings from quantlib.time.api import Date @@ -17,6 +18,7 @@ from index_data import get_index_quotes from pandas.tseries.offsets import BDay from scipy.optimize import brentq from dateutil.relativedelta import relativedelta +from pyisda.logging import enable_logging def get_singlenames_quotes(indexname, date): conn = dbconn('serenitasdb') @@ -31,7 +33,8 @@ def build_curve(r, today_date, yc, start_date, step_in_date, value_date, end_dat try: sc = SpreadCurve(today_date, yc, start_date, step_in_date, value_date, end_dates, spread_curve, upfront_curve, recovery_curve, True) - except ValueError: + except ValueError as e: + print(e) pdb.set_trace() return (r['cds_ticker'], sc) @@ -91,6 +94,26 @@ def forward_hazard_rates(sc): h1, t1 = h2, t2 return t, r +def roll_date(d, tenor): + """ roll_date to the next CDS maturity + + convention is only valid starting 09-20-2015""" + if isinstance(tenor, (int, float)): + d_rolled = d + relativedelta(years=tenor) + else: + d_rolled = d + relativedelta(years=1) + if((d >= d + relativedelta(month=9, day=20)) or \ + (d < d + relativedelta(month=3, day=20))): + d_rolled += relativedelta(month=12, day=20) + if d.month <= 3: + d_rolled -= relativedelta(years=1) + else: + d_rolled += relativedelta(month=6, day=20) + if isinstance(tenor, (int, float)): + return d_rolled + else: + return [d_rolled + relativedelta(years=t-1) for t in tenor] + serenitas_engine = dbengine('serenitasdb') def calibrate_portfolio(index_type, series, tenors=['3yr', '5yr', '7yr', '10yr']): @@ -118,6 +141,7 @@ def calibrate_portfolio(index_type, series, tenors=['3yr', '5yr', '7yr', '10yr'] for k, s in index_quotes.iterrows(): trade_date = k[0] print(trade_date) + end_dates = roll_date(trade_date, [1,2,3,4,5,7,10]) sn_quotes = get_singlenames_quotes("{}{}".format(index_type.lower(), series), trade_date.date()) Settings().evaluation_date = Date.from_datetime(trade_date) @@ -150,4 +174,5 @@ def calibrate_portfolio(index_type, series, tenors=['3yr', '5yr', '7yr', '10yr'] return pd.concat(r) if __name__=="__main__": + enable_logging() df = calibrate_portfolio("IG", 27) |
