aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/cds_curve.py27
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)