diff options
| -rw-r--r-- | python/analytics/index.py | 5 | ||||
| -rw-r--r-- | python/analytics/utils.py | 41 |
2 files changed, 29 insertions, 17 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py index 87f5471d..02d2d878 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -12,7 +12,8 @@ from termcolor import colored from pandas.tseries.offsets import BDay from sqlalchemy import exc from pyisda.curve import SpreadCurve -from .utils import previous_twentieth, build_table +from pyisda.date import previous_twentieth +from .utils import build_table from .db import _engine, dbengine from bbg_helpers import BBG_IP, retrieve_data, init_bbg_session @@ -220,7 +221,7 @@ class Index(object): self._yc, self._sc, self.recovery) self._pv = self._clean_pv - self._accrued * self.fixed_rate * 1e-4 self._spread = self._clean_pv / (self._risky_annuity - self._accrued) \ - + self.fixed_rate * 1e-4 + + self.fixed_rate * 1e-4 self._price = val self.notify() diff --git a/python/analytics/utils.py b/python/analytics/utils.py index f56d376d..51061e79 100644 --- a/python/analytics/utils.py +++ b/python/analytics/utils.py @@ -3,17 +3,22 @@ import pandas as pd from scipy.special import h_roots from dateutil.relativedelta import relativedelta, FR import datetime -from pyisda.date import pydate_to_TDate, previous_twentieth +from pyisda.date import pydate_to_TDate from pandas.api.types import CategoricalDtype from quantlib.time.date import nth_weekday, Wednesday, Date -tenor_t = CategoricalDtype(['3yr', '5yr', '7yr', '10yr'], ordered=True) +tenor_t = CategoricalDtype(['1m', '3m', '6m', '1yr', '2yr', '3yr', '4yr', + '5yr', '7yr', '10yr', '15yr', '20yr', '25yr', + '30yr'], + ordered=True) + def GHquad(n): """Gauss-Hermite quadrature weights""" Z, w = h_roots(n) return Z*np.sqrt(2), w/np.sqrt(np.pi) + def next_twentieth(d): r = d + relativedelta(day=20) if(r < d): @@ -23,12 +28,14 @@ def next_twentieth(d): r += relativedelta(months=3 - mod) return r + def third_wednesday(d): if isinstance(d, datetime.date): return d + relativedelta(day=1, weekday=FR(3)) elif isinstance(d, Date): return nth_weekday(3, Wednesday, d.month, d.year) + def next_third_wed(d): y = third_wednesday(d) if y < d: @@ -36,29 +43,32 @@ def next_third_wed(d): else: return y + def roll_date(d, tenor, nd_array=False): """ roll date d to the next CDS maturity""" cutoff = pd.Timestamp('2015-09-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(**kwargs(tenor), days=1) - return next_twentieth(d_rolled) - elif hasattr(tenor, '__iter__'): - 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: - return v - else: - 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(**kwargs(tenor), days=1) + return next_twentieth(d_rolled) + elif hasattr(tenor, '__iter__'): + 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: + return v + else: + 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(**kwargs(tenor)) elif hasattr(tenor, '__iter__'): @@ -66,7 +76,7 @@ def roll_date(d, tenor, nd_array=False): else: raise TypeError('tenor is not a number nor an iterable') - if((d >= d + relativedelta(month=9, day=20)) or \ + 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: @@ -82,6 +92,7 @@ def roll_date(d, tenor, nd_array=False): else: return v + def build_table(rows, format_strings, row_format): r = [] for row, format_string in zip(rows, format_strings): |
