diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/index.py | 27 | ||||
| -rw-r--r-- | python/calibrate_swaption.py | 2 |
2 files changed, 16 insertions, 13 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, diff --git a/python/calibrate_swaption.py b/python/calibrate_swaption.py index a396438b..7a9611f7 100644 --- a/python/calibrate_swaption.py +++ b/python/calibrate_swaption.py @@ -70,7 +70,7 @@ def calibrate(index_type=None, series=None, date=None, nproc=4, latest=False): index = Index.from_name(index_type, series, "5yr", trade_date) option = Swaption(index, expiry.date(), 100) r = Parallel(n_jobs=nproc)( - delayed(calib)(d, option, index_type, series) for d in + delayed(calib, check_pickle=False)(d, option, index_type, series) for d in v[['ref', 'quotedate', 'strike', 'pay_bid', 'pay_offer', 'rec_bid', 'rec_offer']]. to_dict(orient = 'records')) serenitas_engine.execute(sql_str, r) |
