aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/analytics/__init__.py2
-rw-r--r--python/analytics/scenarios.py34
2 files changed, 35 insertions, 1 deletions
diff --git a/python/analytics/__init__.py b/python/analytics/__init__.py
index 5802457d..4c9cecff 100644
--- a/python/analytics/__init__.py
+++ b/python/analytics/__init__.py
@@ -1,2 +1,2 @@
from .index import Index, ForwardIndex
-from .option import Swaption
+from .option import Swaption, VolatilitySurface, ATMstrike
diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py
new file mode 100644
index 00000000..45db5096
--- /dev/null
+++ b/python/analytics/scenarios.py
@@ -0,0 +1,34 @@
+from analytics import ATMstrike
+import pandas as pd
+
+def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock, vol_surface):
+ """computes the pv of a swaption for a range of scenarios
+
+ Parameters
+ ----------
+ swaption : Swaption
+ date_range : `pandas.Datetime.Index`
+ spread_shock : `np.array`
+ vol_shock : `np.array`
+ vol_surface
+ """
+ r = []
+ spread_start = swaption.index.spread
+ for date in date_range:
+ swaption.index.trade_date = date.date()
+ T = swaption.T
+ for ss in spread_shock:
+ spread = spread_start * (1 + ss)
+ swaption.index.ref = spread
+ swaption._update()
+ atm_strike = ATMstrike(swaption.index, swaption.exercise_date)
+ moneyness = (swaption.index.spread / atm_strike)
+ curr_vol = float(vol_surface.ev(T, moneyness))
+ for vs in vol_shock:
+ vol = curr_vol * (1 + vs)
+ swaption.sigma = vol
+ r.append([date, ss, vs, swaption.pv_black])
+ swaption.index.spread = spread_start
+ df = pd.DataFrame.from_records(r, columns=['date', 'spread_shock',
+ 'vol_shock', 'pv'])
+ return df.set_index('date')