diff options
Diffstat (limited to 'python/analytics/utils.py')
| -rw-r--r-- | python/analytics/utils.py | 14 |
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: |
