aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/__init__.py2
-rw-r--r--python/analytics/scenarios.py19
-rw-r--r--python/exploration/swaption_calendar_spread.py37
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]])