aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/analytics/utils.py14
-rw-r--r--python/index_data.py10
2 files changed, 15 insertions, 9 deletions
diff --git a/python/analytics/utils.py b/python/analytics/utils.py
index bd390255..daf93967 100644
--- a/python/analytics/utils.py
+++ b/python/analytics/utils.py
@@ -31,14 +31,19 @@ def next_twentieth(d):
def roll_date(d, tenor, nd_array=False):
""" roll date d to the next CDS maturity"""
cutoff = pd.Timestamp('2015-12-20')
+ def kwargs(t):
+ if abs(t) == 0.5:
+ return {'months': int(12 * t)}
+ else:
+ return {'years': int(t)}
if not isinstance(d, pd.Timestamp):
cutoff = cutoff.date()
if d <= cutoff:
if isinstance(tenor, (int, float)):
- d_rolled = d + relativedelta(years=tenor, days=1)
+ d_rolled = d + relativedelta(**kwargs(tenor), days=1)
return next_twentieth(d_rolled)
elif hasattr(tenor, '__iter__'):
- v = [next_twentieth(d + relativedelta(years=t, days=1)) for t in tenor]
+ v = [next_twentieth(d + relativedelta(**kwargs(t), days=1)) for t in tenor]
if nd_array:
return np.array([pydate_to_TDate(d) for d in v])
else:
@@ -47,11 +52,12 @@ def roll_date(d, tenor, nd_array=False):
raise TypeError('tenor is not a number nor an iterable')
else: #semi-annual rolling starting 2015-12-20
if isinstance(tenor, (int, float)):
- d_rolled = d + relativedelta(years=tenor)
+ d_rolled = d + relativedelta(**kwargs(tenor))
elif hasattr(tenor, '__iter__'):
d_rolled = d + relativedelta(years=1)
else:
raise TypeError('tenor is not a number nor an iterable')
+
if((d >= d + relativedelta(month=9, day=20)) or \
(d < d + relativedelta(month=3, day=20))):
d_rolled += relativedelta(month=12, day=20)
@@ -62,7 +68,7 @@ def roll_date(d, tenor, nd_array=False):
if isinstance(tenor, (int, float)):
return d_rolled
else:
- v = [d_rolled + relativedelta(years=t-1) for t in tenor]
+ v = [d_rolled + relativedelta(**kwargs(t-1)) for t in tenor]
if nd_array:
return np.array([pydate_to_TDate(d) for d in v])
else:
diff --git a/python/index_data.py b/python/index_data.py
index 21e202b6..dbe60a2e 100644
--- a/python/index_data.py
+++ b/python/index_data.py
@@ -134,9 +134,9 @@ def get_singlenames_quotes(indexname, date):
return [r for r in c]
def build_curve(r, today_date, yc, start_date, step_in_date, value_date, end_dates):
- spread_curve = 1e-4 * np.array(r['spread_curve'][1:], dtype='float')
- upfront_curve = 1e-2 * np.array(r['upfront_curve'][1:], dtype='float')
- recovery_curve = np.array(r['recovery_curve'][1:], dtype='float')
+ spread_curve = 1e-4 * np.array(r['spread_curve'], dtype='float')
+ upfront_curve = 1e-2 * np.array(r['upfront_curve'], dtype='float')
+ recovery_curve = np.array(r['recovery_curve'], dtype='float')
try:
sc = SpreadCurve(today_date, yc, start_date, step_in_date, value_date,
end_dates, spread_curve, upfront_curve, recovery_curve,
@@ -159,14 +159,14 @@ def build_curves_dist(quotes, args, workers=4):
return r
def get_singlenames_curves(index_type, series, trade_date):
- end_dates = roll_date(trade_date, [1, 2, 3, 4, 5, 7, 10], nd_array=True)
+ end_dates = roll_date(trade_date, [0.5, 1, 2, 3, 4, 5, 7, 10], nd_array=True)
sn_quotes = get_singlenames_quotes("{}{}".format(index_type.lower(), series),
trade_date.date())
currency = "EUR" if index_type in ["XO", "EU"] else "USD"
jp_yc = get_curve(trade_date, currency)
start_date = previous_twentieth(trade_date)
step_in_date = trade_date + datetime.timedelta(days=1)
- value_date = pd.Timestamp(trade_date) + 3* BDay()
+ value_date = pd.Timestamp(trade_date) + 3 * BDay()
args = (trade_date, jp_yc, start_date, step_in_date, value_date, end_dates)
curves = build_curves_dist(sn_quotes, args)
return curves, args