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