aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics/scenarios.py
blob: 84505101b57257cc70cfd2a30262349734904511 (plain)
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
from analytics import ATMstrike
from joblib import delayed, Parallel
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.strike / atm_strike)
            curr_vol = float(vol_surface(T, moneyness))
            def aux(swaption, vol, params, prepend):
                swaption.sigma = vol
                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

    df = pd.DataFrame.from_records(r, columns=['date', 'spread_shock',
                                               'vol_shock'] + params)
    return df.set_index('date')