diff options
Diffstat (limited to 'python/analytics/scenarios.py')
| -rw-r--r-- | python/analytics/scenarios.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py index 1438349c..dfd0be05 100644 --- a/python/analytics/scenarios.py +++ b/python/analytics/scenarios.py @@ -8,6 +8,7 @@ from itertools import chain from functools import partial from multiprocessing import Pool from .index_data import _get_singlenames_curves +from .curve_trades import curve_shape def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock, vol_surface, params=["pv"], vol_time_roll=True): @@ -119,10 +120,12 @@ def run_tranche_scenarios(tranche, spread_range, date_range, corr_map=False): _get_singlenames_curves.cache_clear() orig_tranche_pvs = tranche.tranche_pvs().bond_price results = [] + print(tranche.tranche_pvs().bond_price) for d in date_range: temp_tranche.value_date = d.date() for i, spread in enumerate(spread_range): temp_tranche.tweak(spread) + print(tranche.tranche_pvs().bond_price) if corr_map: temp_tranche.rho = tranche.map_skew(temp_tranche, 'TLP') index_pv[i] = temp_tranche._snacpv(spread * 1e-4, @@ -149,3 +152,30 @@ def run_tranche_scenarios(tranche, spread_range, date_range, corr_map=False): results = pd.concat(results, keys=date_range) results.index.names = ['date', 'spread_range'] return results + +def run_curve_scenarios(portf, spread_range, date_range, curve_per): + + """computes the pnl of a portfolio of indices for a range of spread/curve scenarios + + Parameters + ---------- + portf : Portfolio + spread_range : `np.array` + date_range : `pandas.Datetime.Index` + """ + + portf.reset_pv() + portf = deepcopy(portf) + index = portf.indices[0].index_type + + r = [] + for p in curve_per: + new_curve = curve_shape(date_range[0], index, p, 100) + for date in date_range: + portf.value_date = date.date() + for s in spread_range: + for ind in portf.indices: + ind.spread = new_curve((pd.to_datetime(ind.end_date) - date).days/365) * s/100 + r.append([[date, s, p] + [portf.pnl]]) + df = pd.DataFrame.from_records(chain(*r), columns=['date', 'spread', 'curve_per', 'pnl']) + return df.set_index('date') |
