aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/index.py9
-rw-r--r--python/analytics/option.py21
2 files changed, 29 insertions, 1 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py
index aa93b5ee..c4a28a7f 100644
--- a/python/analytics/index.py
+++ b/python/analytics/index.py
@@ -372,6 +372,15 @@ class Index(object):
else:
return None
+ def shock(self, params, *, spread_shocks, **kwargs):
+ r = []
+ orig_spread = self.spread
+ for s in spread_shocks:
+ self.spread = orig_spread * ( 1 + s )
+ r.append([getattr(self, p) for p in params])
+ self.spread = orig_spread
+ return pd.DataFrame(r, index=spread_shocks)
+
@classmethod
def from_name(cls, index=None, series=None, tenor=None, value_date=datetime.date.today(),
notional=10_000_000, redcode=None, maturity=None):
diff --git a/python/analytics/option.py b/python/analytics/option.py
index 97475a61..bdc9b6c6 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -148,7 +148,7 @@ class BlackSwaption(ForwardIndex):
self._strike = g(self.index, self.index.fixed_rate,
self.exercise_date, self._G)
else:
- self._G = g(self.index, K, self.exercise_date)
+ self._G = g(self.index, self._strike, self.exercise_date)
@property
def strike(self):
@@ -347,6 +347,25 @@ 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
+ r = []
+ for s in spread_shock:
+ self.spread = orig_spread * (1 + s)
+ curr_vol = vol_surface.ev(t, mon)
+ 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.sigma = orig_sigma
+ return pd.DataFrame.from_records(
+ r,
+ columns=params,
+ index=pd.MultiIndex.from_product(spread_shock, vol_shock))
+
def __repr__(self):
s = ["{:<20}{}".format(self.index.name, self.option_type),
"",