aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics')
-rw-r--r--python/analytics/utils.py14
1 files changed, 10 insertions, 4 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: