aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics')
-rw-r--r--python/analytics/index.py5
-rw-r--r--python/analytics/option.py5
-rw-r--r--python/analytics/portfolio.py5
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: