aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics/credit_default_swap.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics/credit_default_swap.py')
-rw-r--r--python/analytics/credit_default_swap.py17
1 files changed, 12 insertions, 5 deletions
diff --git a/python/analytics/credit_default_swap.py b/python/analytics/credit_default_swap.py
index dfba07ca..d489f453 100644
--- a/python/analytics/credit_default_swap.py
+++ b/python/analytics/credit_default_swap.py
@@ -6,6 +6,7 @@ import pandas as pd
import warnings
from dateutil.relativedelta import relativedelta
+from itertools import chain
from pandas.tseries.offsets import BDay
from pyisda.curve import SpreadCurve
from pyisda.date import previous_twentieth
@@ -21,13 +22,13 @@ class CreditDefaultSwap():
__slots__ = ('_observed', 'fixed_rate', 'notional', '_start_date',
'_end_date', 'recovery', '_version', '_fee_leg',
'_default_leg', '_value_date', '_yc', '_sc', '_risky_annuity',
- '_spread', '_price', 'name', 'issue_date', '_quote_is_price',
+ '_spread', '_price', 'name', 'issue_date',
'_direction', 'currency', '_step_in_date', '_accrued',
'_cash_settle_date', '_dl_pv', '_pv', '_clean_pv',
'_original_clean_pv', '_trade_date', '_factor')
def __init__(self, start_date, end_date, recovery, fixed_rate,
- notional=10e6, quote_is_price=False, issue_date=None):
+ notional=10e6, issue_date=None):
"""
start_date : :class:`datetime.date`
index start_date (Could be issue date, or last imm date)
@@ -52,7 +53,6 @@ class CreditDefaultSwap():
self._spread, self._price = None, None
self.name = None
self.issue_date = issue_date
- self._quote_is_price = quote_is_price
self._direction = -1. if notional > 0 else 1.
self._factor = 1
for attr in ['currency', '_step_in_date', '_cash_settle_date',
@@ -62,10 +62,17 @@ class CreditDefaultSwap():
self._observed = WeakSet()
def __hash__(self):
- return hash(tuple(getattr(self, k) for k in self.__slots__[1:]))
+ return hash(tuple(getattr(self, k) for k in self._getslots()))
+
+ def _getslots(self):
+ classes = reversed(self.__class__.__mro__)
+ next(classes) # skip object
+ slots = chain.from_iterable(cls.__slots__ for cls in classes)
+ next(slots) # skip _observed
+ yield from slots
def __getstate__(self):
- return {k: getattr(self, k) for k in self.__slots__[1:]}
+ return {k: getattr(self, k) for k in self._getslots()}
def __setstate__(self, state):
for name, value in state.items():