diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/option.py | 2 | ||||
| -rw-r--r-- | python/analytics/scenarios.py | 37 |
2 files changed, 33 insertions, 6 deletions
diff --git a/python/analytics/option.py b/python/analytics/option.py index 79ba4d96..08410ed3 100644 --- a/python/analytics/option.py +++ b/python/analytics/option.py @@ -96,7 +96,7 @@ class BlackSwaption(ForwardIndex): if rec is None: return ValueError("trade_id doesn't exist") index = Index.from_name(redcode=rec.security_id, maturity=rec.maturity, trade_date=rec.trade_date) - index.spread = rec.indexref + index.ref = rec.index_ref instance = cls(index, rec.expiration_date, rec.strike, rec.swaption_type.lower(), direction="Long" if rec.buysell else "Short") instance.notional = rec.notional diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py index 07c0f042..17a143f2 100644 --- a/python/analytics/scenarios.py +++ b/python/analytics/scenarios.py @@ -9,7 +9,7 @@ def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock, Parameters ---------- - swaption_copy : Swaption + swaption : Swaption date_range : `pandas.Datetime.Index` spread_shock : `np.array` vol_shock : `np.array` @@ -17,7 +17,6 @@ def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock, params : list of strings list of attributes to call on the swaption object. """ - r = [] swaption = deepcopy(swaption) spreads = swaption.ref * (1 + spread_shock) @@ -35,12 +34,10 @@ def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock, def run_index_scenarios(index, date_range, spread_shock): - r = [] index = deepcopy(index) - starting_pv = index.clean_pv - starting_date = index.trade_date spreads = index.spread * (1 + spread_shock) + r = [] for date in date_range: index.trade_date = date.date() for s in spreads: @@ -48,3 +45,33 @@ def run_index_scenarios(index, date_range, spread_shock): r.append([date, s, index.pnl]) df = pd.DataFrame.from_records(r, columns=['date', 'spread_shock', 'pnl']) return df.set_index('date') + +def run_portfolio_scenarios(portf, date_range, spread_shock, vol_shock, + vol_surface, params=["pv"]): + """computes the pv of a portfolio 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 of attributes to call on the Portfolio object. + """ + portf = deepcopy(portf) + spreads = portf.index.spread * (1 + spread_shock) + + for date in date_range: + portf.index.trade_date = date.date() + curr_vols = [max(0., vol_surface(swaption.T, swaption.moneyness)) \ + for swaption in portf.swaptions] + for s in spreads: + portf.index.ref = s + for vs in vol_shock: + for swaption, curr_vol in zip(portf.swaptions, curr_vols): + swaption.sigma = curr_vol * (1 + vs) + r.append([date, s, vs] + [getattr(portf, p) for p in params]) + df = pd.DataFrame.from_records(r, columns=['date', 'spread_shock', 'vol_shock'] + params) + return df.set_index('date') |
