aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/index.py5
-rw-r--r--python/analytics/utils.py41
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):