aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics')
-rw-r--r--python/analytics/credit_default_swap.py17
-rw-r--r--python/analytics/index.py8
2 files changed, 16 insertions, 9 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():
diff --git a/python/analytics/index.py b/python/analytics/index.py
index 0541c727..3130398a 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -38,7 +38,7 @@ def g(index, spread, exercise_date, pv=None):
class CreditIndex(CreditDefaultSwap):
- __slots__ = ('_indic', '_version', 'index_type', 'series', 'tenor')
+ __slots__ = ('_indic', '_version', 'index_type', 'series', 'tenor', '_quote_is_price')
def __init__(self, index_type=None, series=None, tenor=None,
value_date=datetime.date.today(), notional=10_000_000,
@@ -151,7 +151,7 @@ class CreditIndex(CreditDefaultSwap):
self._version = version
else:
self._factor = 1.
- self._version = None
+ self._version = 1
@property
def factor(self):
@@ -180,7 +180,7 @@ class ForwardIndex():
@classmethod
def from_name(cls, index_type, series, tenor, forward_date,
value_date=datetime.date.today(), notional=10e6):
- index = Index.from_name(index_type, series, tenor, value_date, notional)
+ index = CreditIndex(index_type, series, tenor, value_date, notional)
return cls(index, forward_date)
@property
@@ -204,7 +204,7 @@ class ForwardIndex():
self.index.ref = val
def __hash__(self):
- return hash(tuple(getattr(self, k) for k in ForwardIndex.__slots__ if k != '__weakref__'))
+ return hash(tuple(getattr(self, k) for k in ForwardIndex.__slots__[:-1]))
def _update(self, *args):
if self.index.value_date > self.forward_date: