aboutsummaryrefslogtreecommitdiffstats
path: root/python/exploration
diff options
context:
space:
mode:
Diffstat (limited to 'python/exploration')
-rw-r--r--python/exploration/swaption_calendar_spread.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/python/exploration/swaption_calendar_spread.py b/python/exploration/swaption_calendar_spread.py
new file mode 100644
index 00000000..1da708ec
--- /dev/null
+++ b/python/exploration/swaption_calendar_spread.py
@@ -0,0 +1,48 @@
+import sys
+#don't do this at home
+sys.path.append("..")
+from analytics import Swaption, Index, VolatilitySurface
+from analytics.scenarios import run_swaption_scenarios
+from pandas.tseries.offsets import BDay
+import datetime
+import numpy as np
+import pandas as pd
+from scipy.interpolate import SmoothBivariateSpline
+from matplotlib import cm
+from mpl_toolkits.mplot3d import Axes3D
+import matplotlib.pyplot as plt
+
+def plot_df(df, spread_shock, vol_shock):
+ fig = plt.figure()
+ ax = fig.gca(projection='3d')
+ ## use smoothing spline on a finer grid
+ f = SmoothBivariateSpline(df.vol_shock.values, df.spread_shock.values,
+ df.pv.values)
+ xx, yy = np.meshgrid(vol_shock, spread_shock)
+ surf = ax.plot_surface(xx, yy, f(vol_shock, spread_shock).T, cmap=cm.viridis)
+ ax.set_xlabel("volatility shock")
+ ax.set_ylabel("spread shock")
+ ax.set_zlabel("PV")
+
+trade_date = datetime.date(2017, 2, 23)
+ig27 = Index.from_name("IG", 27, '5yr', trade_date=trade_date)
+ig27.ref = 62
+payer1 = Swaption(ig27, datetime.date(2017, 4, 19), 65)
+payer2 = Swaption(ig27, datetime.date(2017, 5, 17), 72)
+payer1.notional = 100e6
+payer2.notional = 100e6
+date_range = pd.bdate_range(trade_date, pd.Timestamp('2017-04-19') - BDay(), freq = '5B')
+vol_shock = np.arange(-0.15, 0.3, 0.01)
+spread_shock = np.arange(-0.2, 0.3, 0.01)
+vs = VolatilitySurface("IG", 27, trade_date=trade_date)
+vol_surface = vs[vs.list()[-1]]
+
+df1 = run_swaption_scenarios(payer1, date_range, spread_shock, vol_shock, vol_surface,
+ params=['pv_black', 'delta'])
+df2 = run_swaption_scenarios(payer2, date_range, spread_shock, vol_shock, vol_surface,
+ params=['pv_black', 'delta'])
+#plot it
+df = df1
+df = df.assign(pv=df1.pv_black-df2.pv_black)
+plot_df(df.loc[date_range[-1]], np.arange(-0.2, 0.3, 0.001),
+ np.arange(-0.15, 0.3, 0.001))