diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/index.py | 21 | ||||
| -rw-r--r-- | python/analytics/option.py | 44 |
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)) |
