1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
from analytics import ATMstrike
from joblib import delayed, Parallel
import pandas as pd
from copy import deepcopy
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_copy : Swaption
date_range : `pandas.Datetime.Index`
spread_shock : `np.array`
vol_shock : `np.array`
vol_surface
params : list of strings
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
for ss in spread_shock:
spread = spread_start * (1 + ss)
swaption.index.ref = spread
swaption._update()
atm_strike = ATMstrike(swaption.index, swaption.exercise_date)
moneyness = (swaption.strike / atm_strike)
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]
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)
return df.set_index('date')
|