diff options
Diffstat (limited to 'python/analytics')
| -rw-r--r-- | python/analytics/index.py | 5 | ||||
| -rw-r--r-- | python/analytics/option.py | 5 | ||||
| -rw-r--r-- | python/analytics/portfolio.py | 5 |
3 files changed, 10 insertions, 5 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py index fad1ba30..ebd0d82b 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -374,13 +374,14 @@ class Index(object): def shock(self, params, *, spread_shock, **kwargs): r = [] + actual_params = [p for p in params if hasattr(self, p)] orig_spread = self.spread for ss in spread_shock: self.spread = orig_spread * (1 + ss) - r.append([getattr(self, p) for p in params]) + r.append([getattr(self, p) for p in actual_params]) self.spread = orig_spread ind = pd.Index(spread_shock, name='spread_shock', fastpath=True) - return pd.DataFrame(r, index=ind, columns=params) + return pd.DataFrame(r, index=ind, columns=actual_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 b15d3e81..8acdf121 100644 --- a/python/analytics/option.py +++ b/python/analytics/option.py @@ -353,17 +353,18 @@ class BlackSwaption(ForwardIndex): def shock(self, params, *, spread_shock, vol_surface, vol_shock, **kwargs): orig_spread, orig_sigma = self.index.spread, self.sigma r = [] + actual_params = [p for p in params if hasattr(self, p)] 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]) + r.append([getattr(self, p) for p in actual_params]) self.index.spread = orig_spread self.sigma = orig_sigma return pd.DataFrame.from_records( r, - columns=params, + columns=actual_params, index=pd.MultiIndex.from_product([spread_shock, vol_shock], names=['spread_shock', 'vol_shock'])) diff --git a/python/analytics/portfolio.py b/python/analytics/portfolio.py index 508201f1..004288f2 100644 --- a/python/analytics/portfolio.py +++ b/python/analytics/portfolio.py @@ -52,7 +52,7 @@ class Portfolio: def items(self): for trade_id, trade in zip(self.trade_ids, self.trades): - yield(trade_id, trade) + yield (trade_id, trade) @property def pnl(self): @@ -88,6 +88,9 @@ class Portfolio: for t in self.trades: t.mark(**kwargs) + def shock(self, params=["pnl"], **kwargs): + return {trade_id: trade.shock(params, **kwargs) for trade_id, trade in self.items()} + @property def ref(self): if len(self.indices) == 1: |
