diff options
Diffstat (limited to 'python/analytics')
| -rw-r--r-- | python/analytics/scenarios.py | 44 |
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) |
