aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/scenarios.py44
1 files changed, 22 insertions, 22 deletions
diff --git a/python/analytics/scenarios.py b/python/analytics/scenarios.py
index b389d7a3..cdbcf4f0 100644
--- a/python/analytics/scenarios.py
+++ b/python/analytics/scenarios.py
@@ -111,41 +111,41 @@ def run_tranche_scenarios(tranche, spread_range, date_range, corr_map=False):
corr_map: static correlation or mapped correlation
"""
- if np.isnan(tranche.rho[2]):
+ _get_singlenames_curves.cache_clear()
+ if np.isnan(tranche.rho[1]):
tranche.build_skew()
temp_tranche = deepcopy(tranche)
- _get_singlenames_curves.cache_clear()
orig_tranche_pvs = tranche.tranche_pvs().bond_price
results = []
index_pv = np.empty_like(spread_range)
tranche_pv = np.empty((len(spread_range), tranche.K.size - 1))
tranche_delta = np.empty((len(spread_range), tranche.K.size - 1))
for d in date_range:
- temp_tranche.value_date = d.date()
+ try:
+ temp_tranche.value_date = d.date()
+ except ValueError: # we shocked in the future probably
+ pass
for i, spread in enumerate(spread_range):
+ print(spread)
temp_tranche.tweak(spread)
if corr_map:
temp_tranche.rho = tranche.map_skew(temp_tranche, 'TLP')
index_pv[i] = temp_tranche._snacpv(spread * 1e-4,
- temp_tranche.coupon(temp_tranche.maturity),
- temp_tranche.recovery)
+ temp_tranche.coupon(temp_tranche.maturity),
+ temp_tranche.recovery)
tranche_pv[i] = temp_tranche.tranche_pvs().bond_price
tranche_delta[i] = temp_tranche.tranche_deltas()['delta']
- carry = temp_tranche.tranche_quotes.running * \
- (d.date() - tranche.value_date).days / 360
- df = pd.concat({'pv': pd.DataFrame(tranche_pv, index=spread_range,
- columns=tranche._row_names),
- 'delta': pd.DataFrame(tranche_delta, index=spread_range,
- columns=tranche._row_names),
- 'carry': pd.DataFrame(
- np.tile(carry, (len(spread_range), 1)),
- index=spread_range, columns=tranche._row_names)},
- axis=1)
+ columns = pd.MultiIndex.from_product([['pv', 'delta'], tranche._row_names])
+ df = pd.DataFrame(np.hstack([tranche_pv, tranche_delta]), columns=columns,
+ index=spread_range)
+ carry = pd.Series((d.date() - tranche.value_date).days / 360 * \
+ tranche.tranche_quotes.running.values,
+ index=tranche._row_names)
df = df.join(
- pd.concat({'pnl': df['pv'].sub(orig_tranche_pvs),
- 'index_price_snac_pv': pd.Series(index_pv, index=spread_range,
+ pd.concat({'pnl': df['pv'] - orig_tranche_pvs + carry,
+ 'index_price_snac_pv': pd.Series(index_pv, index=spread_range,
name='pv')},
- axis=1))
+ axis=1))
results.append(df)
results = pd.concat(results, keys=date_range)
results.index.names = ['date', 'spread_range']
@@ -168,9 +168,9 @@ def run_tranche_scenarios_rolldown(tranche, spread_range, date_range, corr_map=F
orig_tranche_pvs = tranche.tranche_pvs().bond_price
#create blanks
- index_pv, tranche_pv, tranche_delta = [], [], []
+ tranche_pv, tranche_delta = [], []
tranche_pv_f, tranche_delta_f = [], []
-
+ index_pv = np.empty(smaller_spread_range.shape[0], days.shape[0])
#do less scenarios, takes less time since the convexity is not as strong as swaptions
days = np.diff((tranche.cs.index - date_range[0]).days.values)
num_shortened = np.sum(tranche.cs.index < date_range[-1])
@@ -186,10 +186,10 @@ def run_tranche_scenarios_rolldown(tranche, spread_range, date_range, corr_map=F
temp_tranche.tweak(spread)
if corr_map:
temp_tranche.rho = tranche.map_skew(temp_tranche, 'TLP')
- index_pv.append(temp_tranche.index_pv().bond_price)
+ index_pv[i] = temp_tranche.index_pv().bond_price
tranche_pv.append(temp_tranche.tranche_pvs().bond_price)
tranche_delta.append(temp_tranche.tranche_deltas()['delta'])
- index_pv = np.reshape(index_pv, (smaller_spread_range.shape[0], days.shape[0])).transpose()
+
tranche_pv = np.array(tranche_pv).transpose()
tranche_delta = np.array(tranche_delta).transpose()
index_pv_f = RectBivariateSpline(days, smaller_spread_range, index_pv, kx=1, ky=1)