aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/analytics/option.py2
-rw-r--r--python/analytics/scenarios.py7
-rw-r--r--python/tests/test_scenarios.py9
3 files changed, 6 insertions, 12 deletions
diff --git a/python/analytics/option.py b/python/analytics/option.py
index 34f1b7a0..a714ae17 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -352,7 +352,7 @@ class BlackSwaption(ForwardIndex):
actual_params = [p for p in params if hasattr(self, p)]
for ss in spread_shock:
self.index.spread = orig_spread * (1 + ss)
- curr_vol = vol_surface.ev(self.T, self.moneyness)
+ curr_vol = vol_surface.ev(self.T, math.log(self.moneyness))
for vs in vol_shock:
self.sigma = curr_vol * (1 + vs)
r.append([getattr(self, p) for p in actual_params])
diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py
index 9996d405..1ebf9371 100644
--- a/python/analytics/scenarios.py
+++ b/python/analytics/scenarios.py
@@ -1,3 +1,4 @@
+import math
import pandas as pd
from copy import deepcopy
import numpy as np
@@ -33,13 +34,11 @@ def run_swaption_scenarios(swaption, date_range, spread_shock, vol_shock,
if vol_time_roll: T = swaption.T
for s in spreads:
swaption.index.spread = s
- curr_vol = max(0, float(vol_surface(T, swaption.moneyness)))
- if date.date() > swaption.exercise_date: curr_vol = 0
+ curr_vol = float(vol_surface(T, math.log(swaption.moneyness)))
for vs in vol_shock:
swaption.sigma = curr_vol * (1 + vs)
- r.append([date, s, round(vs,2)] + [getattr(swaption, p) for p in params])
+ r.append([date, s, round(vs, 2)] + [getattr(swaption, p) for p in params])
df = pd.DataFrame.from_records(r, columns=['date', 'spread', 'vol_shock'] + params)
- df.loc[df.date > pd.to_datetime(swaption.exercise_date), 'delta'] = 0
return df.set_index(['date', 'spread', 'vol_shock'])
diff --git a/python/tests/test_scenarios.py b/python/tests/test_scenarios.py
index c22c8be3..6536c97e 100644
--- a/python/tests/test_scenarios.py
+++ b/python/tests/test_scenarios.py
@@ -12,7 +12,7 @@ class TestSenarios(unittest.TestCase):
option_delta = CreditIndex.from_tradeid(874)
option1 = BlackSwaption.from_tradeid(7, option_delta)
option2 = BlackSwaption.from_tradeid(8, option_delta)
- portf = Portfolio([option1, option2, option_delta])
+ portf = Portfolio([option1, option2, option_delta], trade_ids=['opt1', 'opt2', 'delta'])
date_range = pd.bdate_range(option_delta.value_date,
pd.Timestamp('2017-05-17') - BDay(), freq='5B')
@@ -26,21 +26,16 @@ class TestSenarios(unittest.TestCase):
spread_shock=spread_shock,
vol_shock=vol_shock,
vol_surface=vol_surface)
- df = df.set_index(['spread', 'vol_shock'], append=True)
-
df1 = run_swaption_scenarios(self.option1, self.date_range,
spread_shock, vol_shock, vol_surface, ["pnl"])
df2 = run_swaption_scenarios(self.option2, self.date_range,
spread_shock, vol_shock, vol_surface, ["pnl"])
df_index = run_index_scenarios(self.option_delta, self.date_range, spread_shock)
- df1 = df1.set_index(['spread', 'vol_shock'], append=True)
- df2 = df2.set_index(['spread', 'vol_shock'], append=True)
- df_index = df_index.set_index(['spread'], append=True)
df_swaptions = df1 + df2
df_swaptions = df_swaptions.reset_index(level='vol_shock')
df_orig = df_index.add(df_swaptions, fill_value=0)
df_orig = df_orig.set_index('vol_shock', append=True)
- self.assertFalse(np.any((df-df_orig).values))
+ self.assertFalse(np.any((df.sum(axis=1).values-df_orig['pnl'].values)))
if __name__ == "__main__":
unittest.main()