aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics/scenarios.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics/scenarios.py')
-rw-r--r--python/analytics/scenarios.py30
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')