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.py37
1 files changed, 32 insertions, 5 deletions
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')