aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/scenarios.py22
-rw-r--r--python/exploration/swaption_calendar_spread.py53
2 files changed, 37 insertions, 38 deletions
diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py
index f1763100..9564556b 100644
--- a/python/analytics/scenarios.py
+++ b/python/analytics/scenarios.py
@@ -19,12 +19,12 @@ def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock,
"""
r = []
swaption = deepcopy(swaption)
- spread = swaption.ref * (1 + spread_shock)
+ spreads = swaption.ref * (1 + spread_shock)
for date in date_range:
swaption.index.trade_date = date.date()
T = swaption.T
- for s in spread:
+ for s in spreads:
swaption.ref = s
curr_vol = float(vol_surface(T, swaption.moneyness))
for vs in vol_shock:
@@ -32,3 +32,21 @@ def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock,
r.append([date, s, vs] + [getattr(swaption, p) for p in params])
df = pd.DataFrame.from_records(r, columns=['date', 'spread_shock', 'vol_shock'] + params)
return df.set_index('date')
+
+
+def run_index_scenarios(index, date_range, spread_shock):
+ r = []
+ index = deepcopy(index)
+ starting_pv = index.clean_pv
+ starting_date = index.trade_date
+ spreads = index.spread * (1 + spread_shock)
+
+ for date in date_range:
+ index.trade_date = date.date()
+ for s in spread:
+ index.spread = s
+ scen_pv = index.clean_pv +
+ index.notional * (date.date()-starting_date).days /360 * index.fixed_rate * 1e-4 - starting_pv
+ r.append([date, s, scen_pv])
+ df = pd.DataFrame.from_records(r, columns=['date', 'spread', 'pnl'])
+ return df.set_index('date')
diff --git a/python/exploration/swaption_calendar_spread.py b/python/exploration/swaption_calendar_spread.py
index a007bbb9..1584fe17 100644
--- a/python/exploration/swaption_calendar_spread.py
+++ b/python/exploration/swaption_calendar_spread.py
@@ -1,8 +1,8 @@
import sys
#don't do this at home
sys.path.append("..")
-from analytics import BlackSwaption, Swaption, Index, VolatilitySurface
-from analytics.scenarios import run_swaption_scenarios
+from analytics import Swaption, BlackSwaption, Index, VolatilitySurface
+from analytics.scenarios import run_swaption_scenarios, run_index_scenarios
from pandas.tseries.offsets import BDay
import datetime
import numpy as np
@@ -11,7 +11,6 @@ from scipy.interpolate import SmoothBivariateSpline
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
-from copy import deepcopy
import os
import numpy as np
@@ -70,22 +69,24 @@ def shiftedColorMap(cmap, start=0, midpoint=0.5, stop=1.0, name='shiftedcmap'):
return newcmap
-def plot_df(df, spread_shock, vol_shock):
+def plot_df(df, spread_shock, vol_shock, attr="pv"):
+ val_date = df.index[0].date()
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)
+ series = df[attr]
+ f = SmoothBivariateSpline(df.vol_shock.values, df.spread_shock.values, series.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")
- ax.set_zlabel("PV")
+ ax.set_xlabel("Volatility shock")
+ ax.set_ylabel("Spread")
+ ax.set_zlabel("PnL")
+ ax.set_title('{} of Trade on {}'.format(attr.title(), val_date))
def plot_color_map(df, spread_shock, vol_shock, attr="pv", path="."):
val_date = df.index[0].date()
-
#rows are spread, columns are volatility surface shift
fig, ax = plt.subplots()
series = df[attr]
@@ -105,29 +106,11 @@ def plot_color_map(df, spread_shock, vol_shock, attr="pv", path="."):
fig.colorbar(chart, shrink=.8)
fig.savefig(os.path.join(path, "payer_swap_{}.png".format(val_date)))
-def calc_delta_pnl(index, date_range, spread_shock):
-
- r = []
- index_obj = deepcopy(index)
- startingpv = -index_obj.clean_pv
- spread_start = index_obj.spread
-
- for date in date_range:
- index_obj.trade_date = date.date()
- for ss in spread_shock:
- index_obj.spread = spread_start * (1 + ss)
- index_obj._update()
- scen_pv = -index_obj.clean_pv + index_obj.notional * (date.date()-trade_date).days/360* index_obj.fixed_rate/10000 - startingpv
- r.append([date, index_obj.spread, scen_pv])
-
- df = pd.DataFrame.from_records(r, columns=['date', 'spread_shock', 'pv'])
-
- return df.set_index('date')
trade_date = datetime.date(2017, 2, 23)
ig27 = Index.from_name("IG", 27, '5yr', trade_date=trade_date)
ig27.ref = 62
-ig27.notional = 13000000
+ig27.notional = 13e6
payer1 = BlackSwaption(ig27, datetime.date(2017, 4, 19), 65)
payer2 = BlackSwaption(ig27, datetime.date(2017, 5, 17), 72)
payer1.notional = 100e6
@@ -137,17 +120,15 @@ 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)
df2 = run_swaption_scenarios(payer2, date_range, spread_shock, vol_shock, vol_surface)
-df3 = calc_delta_pnl(ig27, date_range, spread_shock)
-
-#plot it
+# #plot it
week = -1
df = df1
df = df.assign(pv=df1.pv-df2.pv)
spread_plot_range = ig27.ref * (1 + np.arange(-0.2, 0.3, 0.001))
-plot_df(df.loc[date_range[week]], spread_plot_range, np.arange(-0.15, 0.3, 0.001))
-plot_color_map(df.loc[date_range[week]], ig27.ref *(1 + spread_shock),
- vol_shock)
+vol_shock_range = np.arange(-0.15, 0.3, 0.001)
+plot_df(df.loc[date_range[week]], spread_plot_range, vol_shock_range)
+plot_color_map(df.loc[date_range[week]], ig27.ref * (1 + spread_shock), vol_shock)