diff options
| -rw-r--r-- | python/analytics/utils.py | 14 | ||||
| -rw-r--r-- | python/index_data.py | 10 |
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 |
