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.py3
2 files changed, 17 insertions, 7 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py
index 5fa1ed48..265e470d 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -17,8 +17,9 @@ from db import dbengine
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
+from yieldcurve import YC, ql_to_jp, roll_yc, rate_helpers
+from weakref import WeakSet
engine = dbengine('serenitasdb')
@@ -90,12 +91,19 @@ class Index(object):
self._accrued = None
self._dl_pv, self._pv, self._clean_pv = None, None, None
self._original_clean_pv, self._original_trade_date = None, None
- self._observed = []
-
+ self._observed = WeakSet()
def __hash__(self):
return hash(tuple(getattr(self, k) for k in self.__slots__[:-1]))
+ def __getstate__(self):
+ return {k: getattr(self, k) for k in self.__slots__[:-1]}
+
+ def __setstate__(self, state):
+ for name, value in state.items():
+ setattr(self, name, value)
+ self._observed = WeakSet()
+
@property
def start_date(self):
return self._start_date
@@ -347,7 +355,7 @@ class Index(object):
obj._update()
def observe(self, obj):
- self._observed.append(obj)
+ self._observed.add(obj)
def mark(self):
index_type, series, tenor = _key_from_index(self)
@@ -485,7 +493,7 @@ class ForwardIndex(object):
__slots__ = ['index', 'forward_date', 'exercise_date_settle', 'df',
'_forward_annuity', '_forward_pv', '_forward_spread',
'__weakref__']
- def __init__(self, index, forward_date):
+ def __init__(self, index, forward_date, observer=True):
self.index = index
if isinstance(forward_date, pd.Timestamp):
self.forward_date = forward_date.date()
@@ -494,7 +502,8 @@ class ForwardIndex(object):
self.exercise_date_settle = pd.Timestamp(forward_date) + 3* BDay()
self.df = index._yc.discount_factor(self.exercise_date_settle)
self._update()
- self.index.observe(self)
+ if observer:
+ self.index.observe(self)
@classmethod
def from_name(cls, index_type, series, tenor, forward_date,
diff --git a/python/analytics/option.py b/python/analytics/option.py
index 9d7cab0e..a0c00167 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -74,7 +74,7 @@ class BlackSwaption(ForwardIndex):
def __init__(self, index, exercise_date, strike, option_type="payer",
direction="Long"):
- ForwardIndex.__init__(self, index, exercise_date)
+ ForwardIndex.__init__(self, index, exercise_date, False)
self._forward_yc = roll_yc(index._yc, exercise_date)
self._T = None
self.strike = strike
@@ -83,6 +83,7 @@ class BlackSwaption(ForwardIndex):
self.sigma = None
self._original_pv = None
self.direction = direction
+ index.observe(self)
@classmethod
def from_tradeid(cls, trade_id, index=None):