diff options
| -rw-r--r-- | python/analytics/index.py | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py index a4e70b15..c65e2428 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -4,7 +4,9 @@ import datetime import math import numpy as np import pandas as pd +import warnings +from dateutil.relativedelta import relativedelta from pyisda.legs import ContingentLeg, FeeLeg from quantlib.settings import Settings from quantlib.time.api import Date, Actual365Fixed @@ -15,6 +17,7 @@ from sqlalchemy import exc from pyisda.curve import SpreadCurve from .utils import previous_twentieth, build_table from yieldcurve import YC, ql_to_jp, roll_yc, rate_helpers +from bbg_helpers import BBG_IP, retrieve_data, init_bbg_session engine = dbengine('serenitasdb') @@ -36,6 +39,12 @@ def g(index, spread, exercise_date, forward_yc=None, pv=0.): else: return (spread - index.fixed_rate) * a * 1e-4 +def _key_from_index(index): + _, index_type, _, series, tenor = index.name.split() + series = int(series[1:]) + tenor = tenor.lower() + 'r' + return index_type, series, tenor + class Index(object): """ minimal class to represent a credit index """ __slots__ = ['fixed_rate', 'notional', '_start_date', '_end_date', @@ -229,6 +238,17 @@ class Index(object): return dv01 @property + def theta(self): + old_pv, old_trade_date = self.clean_pv, self.trade_date + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + self.trade_date = self.trade_date + relativedelta(days=1) + carry = self.notional * self._direction * self.fixed_rate * 1e-4/360 + roll_down = self.clean_pv - old_pv + self.trade_date = old_trade_date + return carry + roll_down + + @property def IRDV01(self): old_pv, old_yc = self.pv, self._yc # for rh in self._helpers: @@ -319,6 +339,21 @@ class Index(object): def observe(self, obj): self._observed.append(obj) + def mark(self): + index_type, series, tenor = _key_from_index(self) + if self.trade_date == datetime.date.today(): + with init_bbg_session(BBG_IP) as session: + security = self.name + " Corp" + field = "PX_LAST" + ref_data = retrieve_data(session, security, field) + self.ref = ref_data[security][field] + else: + run = engine.execute("""SELECT * FROM index_quotes + WHERE index=%s AND series=%s AND tenor=%s AND date=%s""", + (index_type, series, tenor, self.trade_date)) + rec = run.fetchone() + self.spread = rec.closespread + @classmethod def from_name(cls, index=None, series=None, tenor=None, trade_date=datetime.date.today(), notional=10_000_000, redcode=None, maturity=None): @@ -405,7 +440,7 @@ class Index(object): self.notional/1_000_000, self.currency, self.factor), - "{:<20}\t{:>15}".format("CDS Index", colored(self.name, attrs = ['bold'])), + "{:<20}\t{:>15}".format("CDS Index", colored(self.name, attrs=['bold'])), ""] rows = [["Trd Sprd (bp)", self.spread, "Coupon (bp)", self.fixed_rate], ["1st Accr Start", self.issue_date, "Payment Freq", "Quarterly"], |
