diff options
| -rw-r--r-- | python/analytics/index.py | 11 | ||||
| -rw-r--r-- | python/analytics/option.py | 18 |
2 files changed, 14 insertions, 15 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py index c4a28a7f..fad1ba30 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -352,7 +352,7 @@ class Index(object): else: run = _engine.execute("""SELECT * FROM index_quotes WHERE index=%s AND series=%s AND tenor=%s AND date=%s""", - (self.index_type, self.series, self.tenor, self.value_date)) + (self.index_type, self.series, self.tenor, self.value_date)) rec = run.fetchone() self.spread = rec.closespread @@ -372,14 +372,15 @@ class Index(object): else: return None - def shock(self, params, *, spread_shocks, **kwargs): + def shock(self, params, *, spread_shock, **kwargs): r = [] orig_spread = self.spread - for s in spread_shocks: - self.spread = orig_spread * ( 1 + s ) + for ss in spread_shock: + self.spread = orig_spread * (1 + ss) r.append([getattr(self, p) for p in params]) self.spread = orig_spread - return pd.DataFrame(r, index=spread_shocks) + ind = pd.Index(spread_shock, name='spread_shock', fastpath=True) + return pd.DataFrame(r, index=ind, columns=params) @classmethod def from_name(cls, index=None, series=None, tenor=None, value_date=datetime.date.today(), diff --git a/python/analytics/option.py b/python/analytics/option.py index bdc9b6c6..08614ab9 100644 --- a/python/analytics/option.py +++ b/python/analytics/option.py @@ -347,24 +347,22 @@ class BlackSwaption(ForwardIndex): return g(self.index, self.index.fixed_rate, self.exercise_date, pv=self._G - pv) - def shock(self, params, *, spread_shock, vol_surface, vol_shock, - vol_time_roll, **kwargs): - orig_spread, orig_sigma = self.spread, self.sigma - if vol_time_roll: - t = self.T + def shock(self, params, *, spread_shock, vol_surface, vol_shock, **kwargs): + orig_spread, orig_sigma = self.index.spread, self.sigma r = [] - for s in spread_shock: - self.spread = orig_spread * (1 + s) - curr_vol = vol_surface.ev(t, mon) + for ss in spread_shock: + self.index.spread = orig_spread * (1 + ss) + curr_vol = vol_surface.ev(self.T, self.moneyness) for vs in vol_shock: self.sigma = curr_vol * ( 1 + vs ) r.append([getattr(self, p) for p in params]) - self.spread = orig_spread + self.index.spread = orig_spread self.sigma = orig_sigma return pd.DataFrame.from_records( r, columns=params, - index=pd.MultiIndex.from_product(spread_shock, vol_shock)) + index=pd.MultiIndex.from_product([spread_shock, vol_shock], + names=['spread_shock', 'vol_shock'])) def __repr__(self): s = ["{:<20}{}".format(self.index.name, self.option_type), |
