from analytics import ATMstrike import pandas as pd def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock, vol_surface, params=["pv_black"]): """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 params : list of strings list attributes to call on the swaption object. """ 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] + [getattr(swaption, p) for p in params]) swaption.index.spread = spread_start df = pd.DataFrame.from_records(r, columns=['date', 'spread_shock', 'vol_shock'] + params) return df.set_index('date')