aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/index.py21
-rw-r--r--python/analytics/option.py44
2 files changed, 46 insertions, 19 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py
index d12f4de3..f9c353de 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -38,6 +38,13 @@ def g(index, spread, exercise_date, forward_yc=None, pv=0.):
class Index(object):
""" minimal class to represent a credit index """
+ __slots__ = ['fixed_rate', 'notional', '_start_date', '_end_date',
+ 'recovery', 'factor', '_fee_leg', '_default_leg',
+ '_trade_date', '_yc', '_sc', '_risky_annuity', '_spread',
+ '_price', 'name', 'issue_date', '_quote_is_price',
+ '_direction', 'currency', '_step_in_date', '_accrued',
+ '_value_date', '_dl_pv', '_pv', '_clean_pv',
+ '_original_clean_pv', '_original_trade_date']
def __init__(self, start_date, end_date, recovery, fixed_rate,
notional = 10e6, quote_is_price=False, issue_date=None):
"""
@@ -60,14 +67,18 @@ class Index(object):
self._fee_leg = FeeLeg(self._start_date, end_date, True, 1., 1.)
self._default_leg = ContingentLeg(self._start_date, end_date, True)
self._trade_date = None
- self._yc = None
- self._sc = None
+ self._yc, self._sc = None, None
self._risky_annuity = None
- self._spread = None
- self._price = None
+ self._spread, self._price = None, None
self.name = None
self.issue_date = issue_date
self._quote_is_price = quote_is_price
+ self._direction = -1.
+ self.currency = None
+ self._step_in_date, self._value_date = None, None
+ self._accrued = None
+ self._dl_pv, self._pv, self._clean_pv = None, None, None
+ self._original_clean_pv, self._original_trade_date = None, None
@property
def start_date(self):
@@ -411,6 +422,8 @@ class Index(object):
class ForwardIndex(object):
+ __slots__ = ['index', 'forward_date', 'exercise_date_settle', 'df',
+ '_forward_annuity', '_forward_pv', '_forward_spread']
def __init__(self, index, forward_date):
self.index = index
self.forward_date = forward_date
diff --git a/python/analytics/option.py b/python/analytics/option.py
index 7be140a9..64b2187a 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -73,19 +73,20 @@ def ATMstrike(index, exercise_date):
class BlackSwaption(ForwardIndex):
"""Swaption class"""
+ __slots__ = ['_forward_yc', '_T', '_G', '_strike', 'option_type',
+ 'notional', 'sigma', '_original_pv', '_direction']
+
def __init__(self, index, exercise_date, strike, option_type="payer",
direction="Long"):
ForwardIndex.__init__(self, index, exercise_date)
- self._exercise_date = exercise_date
self._forward_yc = roll_yc(index._yc, exercise_date)
self._T = None
self.strike = strike
self.option_type = option_type.lower()
- self._Z, self._w = GHquad(50)
self.notional = 1
self.sigma = None
- self._cache = {}
- self._direction = 1
+ self._original_pv = None
+ self.direction = direction
@classmethod
def from_tradeid(cls, trade_id):
@@ -96,22 +97,23 @@ class BlackSwaption(ForwardIndex):
return ValueError("trade_id doesn't exist")
index = Index.from_name(redcode=rec.security_id, maturity=rec.maturity, trade_date=rec.trade_date)
index.spread = 62
- instance = cls(index, rec.expiration_date, rec.strike, rec.swaption_type.lower())
+ instance = cls(index, rec.expiration_date, rec.strike, rec.swaption_type.lower(),
+ direction="Long" if rec.buysell else "Short")
instance.notional = rec.notional
instance.pv = rec.price * 1e-2 * rec.notional
- instance.direction = "Long" if rec.buysell else "Short"
+ instance._original_pv = rec.price * 1e-2 * rec.notional
return instance
@property
def exercise_date(self):
- return self._exercise_date
+ return self.forward_date
@exercise_date.setter
def exercise_date(self, d):
- self._exercise_date = d
+ self.forward_date = d
ForwardIndex.__init__(self, self.index, d)
self._forward_yc = roll_yc(self.index._yc, d)
- self._G = g(self.index, self.strike, self.exercise_date, self._forward_yc)
+ self._G = g(self.index, self.strike, d, self._forward_yc)
@property
def strike(self):
@@ -163,11 +165,11 @@ class BlackSwaption(ForwardIndex):
def intrinsic_value(self):
V = self.df * (self.forward_pv - self._G)
intrinsic = max(V, 0) if self.option_type == "payer" else max(-V, 0)
- return self._direction * intrinsic
+ return self._direction * intrinsic * self.notional
def __hash__(self):
- return hash(dumps([v for k, v in self.__dict__.items() if k not in
- ['_cache', '_Z', '_w']], protocol=pickle.HIGHEST_PROTOCOL))
+ return hash((super().__hash__(),
+ tuple(getattr(self, k) for k in BlackSwaption.__slots__[:-1])))
@property
def pv(self):
@@ -328,6 +330,16 @@ class BlackSwaption(ForwardIndex):
return "\n".join(s)
class Swaption(BlackSwaption):
+ __slots__ = ["_cache", "_Z", "_w"]
+ def __init__(self, index, exercise_date, strike, option_type="payer",
+ direction="Long"):
+ super().__init__(index, exercise_date, strike, option_type, direction)
+ self._Z, self._w = GHquad(50)
+ self._cache = {}
+
+ def __hash__(self):
+ return super().__hash__()
+
@property
@memoize
def pv(self):
@@ -386,8 +398,10 @@ class Swaption(BlackSwaption):
def __setpv_black(self, val):
black_self = BlackSwaption.__new__(BlackSwaption)
- black_self.__dict__ = vars(self).copy()
- black_self._cache = {}
+ for k in super().__slots__:
+ setattr(black_self, k, getattr(self, k))
+ for k in ForwardIndex.__slots__:
+ setattr(black_self, k, getattr(self, k))
black_self.pv = val
self.sigma = black_self.sigma
@@ -413,7 +427,7 @@ class VolatilitySurface(ForwardIndex):
"ORDER BY quotedate DESC",
engine,
parse_dates = ['quotedate', 'expiry'],
- params=(trade_date, index_type, series))
+ params=(trade_date, index_type.upper(), series))
self._quotes['quotedate'] = (self._quotes['quotedate'].
dt.tz_convert('America/New_York').
dt.tz_localize(None))