diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/__init__.py | 2 | ||||
| -rw-r--r-- | python/analytics/scenarios.py | 19 | ||||
| -rw-r--r-- | python/exploration/swaption_calendar_spread.py | 37 |
3 files changed, 42 insertions, 16 deletions
diff --git a/python/analytics/__init__.py b/python/analytics/__init__.py index 4c9cecff..a2cbc200 100644 --- a/python/analytics/__init__.py +++ b/python/analytics/__init__.py @@ -1,2 +1,2 @@ from .index import Index, ForwardIndex -from .option import Swaption, VolatilitySurface, ATMstrike +from .option import BlackSwaption, Swaption, VolatilitySurface, ATMstrike diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py index 84505101..6ce10899 100644 --- a/python/analytics/scenarios.py +++ b/python/analytics/scenarios.py @@ -1,14 +1,15 @@ from analytics import ATMstrike from joblib import delayed, Parallel import pandas as pd +from copy import deepcopy -def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock, vol_surface, - params=["pv_black"]): +def run_swaption_scenarios(swaption_copy, date_range, spread_shock, vol_shock, vol_surface, + params=["pv"]): """computes the pv of a swaption for a range of scenarios Parameters ---------- - swaption : Swaption + swaption_copy : Swaption date_range : `pandas.Datetime.Index` spread_shock : `np.array` vol_shock : `np.array` @@ -17,7 +18,9 @@ def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock, vol_su list attributes to call on the swaption object. """ r = [] + swaption = deepcopy(swaption_copy) spread_start = swaption.index.spread + for date in date_range: swaption.index.trade_date = date.date() T = swaption.T @@ -30,11 +33,13 @@ def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock, vol_su curr_vol = float(vol_surface(T, moneyness)) def aux(swaption, vol, params, prepend): swaption.sigma = vol + import pdb; pdb.set_trace() return prepend + [getattr(swaption, p) for p in params] - r.append(Parallel(-1)( - delayed(aux(swaption, curr_vol * (1 + vs), params, [date, spread, vs])) \ - for vs in vol_shock)) - swaption.index.spread = spread_start + for vs in vol_shock: + r.append(aux(swaption, curr_vol * (1 + vs), params, [date, spread, vs])) + #r.append(Parallel(1)( + # delayed(aux(swaption, curr_vol * (1 + vs), params, [date, spread, vs])) \ + # for vs in vol_shock)) df = pd.DataFrame.from_records(r, columns=['date', 'spread_shock', 'vol_shock'] + params) diff --git a/python/exploration/swaption_calendar_spread.py b/python/exploration/swaption_calendar_spread.py index 5a798e5b..4424e1f9 100644 --- a/python/exploration/swaption_calendar_spread.py +++ b/python/exploration/swaption_calendar_spread.py @@ -1,7 +1,7 @@ import sys #don't do this at home sys.path.append("..") -from analytics import Swaption, Index, VolatilitySurface +from analytics import BlackSwaption, Swaption, Index, VolatilitySurface from analytics.scenarios import run_swaption_scenarios from pandas.tseries.offsets import BDay import datetime @@ -11,6 +11,7 @@ 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 numpy as np import matplotlib @@ -104,13 +105,31 @@ def plot_color_map(df): fig.savefig("/home/serenitas/edwin/PythonGraphs/payer_swap_" + str(val_date.date()) + ".png") +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 -payer1 = Swaption(ig27, datetime.date(2017, 4, 19), 65) -payer2 = Swaption(ig27, datetime.date(2017, 5, 17), 72) +ig27.notional = 13000000 +payer1 = BlackSwaption(ig27, datetime.date(2017, 4, 19), 65) +payer2 = BlackSwaption(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') @@ -120,16 +139,18 @@ 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']) + #params=['pv', 'delta']) df2 = run_swaption_scenarios(payer2, date_range, spread_shock, vol_shock, vol_surface) +df3 = calc_delta_pnl(ig27, date_range, spread_shock) + #plot it week = -1 df = df1 -df = df.assign(pv=df1.pv_black-df2.pv_black) +df = df.assign(pv=df1.pv-df2.pv) spread_plot_range = np.arange((1-0.2)*ig27.ref, (1+0.3)*ig27.ref, 0.001*ig27.ref) -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]]) +#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]]) |
