diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/__init__.py | 2 | ||||
| -rw-r--r-- | python/analytics/scenarios.py | 34 |
2 files changed, 35 insertions, 1 deletions
diff --git a/python/analytics/__init__.py b/python/analytics/__init__.py index 5802457d..4c9cecff 100644 --- a/python/analytics/__init__.py +++ b/python/analytics/__init__.py @@ -1,2 +1,2 @@ from .index import Index, ForwardIndex -from .option import Swaption +from .option import Swaption, VolatilitySurface, ATMstrike diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py new file mode 100644 index 00000000..45db5096 --- /dev/null +++ b/python/analytics/scenarios.py @@ -0,0 +1,34 @@ +from analytics import ATMstrike +import pandas as pd + +def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock, vol_surface): + """computes the pv of a swaption for a range of scenarios + + Parameters + ---------- + swaption : Swaption + date_range : `pandas.Datetime.Index` + spread_shock : `np.array` + vol_shock : `np.array` + vol_surface + """ + r = [] + 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.index.spread / atm_strike) + curr_vol = float(vol_surface.ev(T, moneyness)) + for vs in vol_shock: + vol = curr_vol * (1 + vs) + swaption.sigma = vol + r.append([date, ss, vs, swaption.pv_black]) + swaption.index.spread = spread_start + df = pd.DataFrame.from_records(r, columns=['date', 'spread_shock', + 'vol_shock', 'pv']) + return df.set_index('date') |
