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