diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/scenarios.py | 22 | ||||
| -rw-r--r-- | python/exploration/swaption_calendar_spread.py | 53 |
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) |
