aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics')
-rw-r--r--python/analytics/index.py27
1 files changed, 15 insertions, 12 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py
index d782310e..75e7202c 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -16,8 +16,6 @@ from pyisda.curve import SpreadCurve
from .utils import previous_twentieth, build_table
from yieldcurve import YC, ql_to_jp, roll_yc, rate_helpers
-from blinker import signal
-
engine = dbengine('serenitasdb')
def g(index, spread, exercise_date, forward_yc=None, pv=0.):
@@ -46,7 +44,7 @@ class Index(object):
'_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']
+ '_original_clean_pv', '_original_trade_date', '_observed']
def __init__(self, start_date, end_date, recovery, fixed_rate,
notional = 10e6, quote_is_price=False, issue_date=None):
"""
@@ -81,10 +79,11 @@ 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 = []
def __hash__(self):
- return hash(tuple(getattr(self, k) for k in self.__slots__))
+ return hash(tuple(getattr(self, k) for k in self.__slots__ if k != '_observed'))
@property
def start_date(self):
@@ -150,7 +149,7 @@ class Index(object):
if self.spread is None or s != self.spread:
self._spread = s * 1e-4
self._update()
- signal(self.name).send("spread was updated")
+ self.notify()
@property
def flat_hazard(self):
@@ -205,7 +204,7 @@ class Index(object):
self._spread = self._clean_pv / (self._risky_annuity - self._accrued) \
+ self.fixed_rate * 1e-4
self._price = val
- signal(self.name).send("price was updated")
+ self.notify()
@property
def ref(self):
@@ -296,7 +295,7 @@ class Index(object):
self._value_date = pd.Timestamp(self._trade_date) + 3* BDay()
if self._spread is not None:
self._update()
- signal(self.name).send("trade_date was updated")
+ self.notify()
def set_original_pv(self):
self._original_clean_pv = self._clean_pv
@@ -313,6 +312,13 @@ class Index(object):
(self._clean_pv - self._original_clean_pv -
days_accrued * self.fixed_rate * 1e-4)
+ def notify(self):
+ for obj in self._observed:
+ obj._update()
+
+ def observe(self, obj):
+ self._observed.append(obj)
+
@classmethod
def from_name(cls, index=None, series=None, tenor=None, trade_date=datetime.date.today(),
notional=10_000_000, redcode=None, maturity=None):
@@ -433,15 +439,14 @@ class Index(object):
class ForwardIndex(object):
__slots__ = ['index', 'forward_date', 'exercise_date_settle', 'df',
'_forward_annuity', '_forward_pv', '_forward_spread',
- '_debug', '__weakref__']
+ '__weakref__']
def __init__(self, index, forward_date):
self.index = index
self.forward_date = forward_date
self.exercise_date_settle = pd.Timestamp(forward_date) + 3* BDay()
self.df = index._yc.discount_factor(self.exercise_date_settle)
- signal(index.name).connect(self._update)
- self._debug = False
self._update()
+ self.index.observe(self)
@classmethod
def from_name(cls, index_type, series, tenor, forward_date,
@@ -473,8 +478,6 @@ class ForwardIndex(object):
return hash(tuple(getattr(self, k) for k in ForwardIndex.__slots__ if k != '__weakref__'))
def _update(self, *args):
- if self._debug and args is not None:
- print(args[0])
if self.index._sc is not None:
step_in_date = self.forward_date + datetime.timedelta(days=1)
a = self.index._fee_leg.pv(self.index.trade_date, step_in_date,