diff options
Diffstat (limited to 'python/analytics/curve_trades.py')
| -rw-r--r-- | python/analytics/curve_trades.py | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/python/analytics/curve_trades.py b/python/analytics/curve_trades.py index 455d1422..f76f6b88 100644 --- a/python/analytics/curve_trades.py +++ b/python/analytics/curve_trades.py @@ -82,12 +82,11 @@ def on_the_run_theta(index='IG', rolling=6): theta_matrix = df.groupby(level=['date', 'tenor']).nth(-1)['theta_per_dur'] theta_matrix.unstack(-1).plot() - -def curve_returns(index='IG', rolling=6): +def curve_returns(index='IG', rolling=6, years=3): # look at returns otr = on_the_run(index) df = index_returns(index=index, series=list(range(otr - rolling, otr + 1)), - tenor=['3yr', '5yr', '7yr', '10yr']) + tenor=['3yr', '5yr', '7yr', '10yr'], years=years) # on-the-run returns df = df.reset_index('index', drop=True) returns = df.price_return.dropna().unstack('tenor').groupby(level='date').nth(-1) @@ -97,7 +96,17 @@ def curve_returns(index='IG', rolling=6): '7-10': 1.33 * returns['7yr'] - returns['10yr'], '3-5-10': -2 * returns['3yr'] + 3 * returns['5yr'] - returns['10yr'], '3-5': returns['5yr'] - 1.56 * returns['3yr'], - '3-7': returns['7yr'] - 2.07 * returns['3yr']}) + '3-7': returns['7yr'] - 2.07 * returns['3yr'], + '5yr long': returns['5yr']}) + + return strategies_return + + +def curve_returns_stats(strategies_return): + + ''' + Takes a curve_return df''' + strategies_return_monthly = (strategies_return. groupby(pd.Grouper(freq='M')). agg(lambda df: (1 + df).prod() - 1)) @@ -108,10 +117,10 @@ def curve_returns(index='IG', rolling=6): else: return df.mean() / df.std() * math.sqrt(12) - results = strategies_return.agg([sharpe, lambda df: df.nsmallest(10).mean()]) + results = strategies_return.agg([sharpe, lambda df: df.nsmallest(10).mean(), lambda df: df.std()]) sharpe_monthly = strategies_return_monthly.agg(sharpe, period="monthly") sharpe_monthly.name = 'Monthly Sharpe' - results.index = ['Sharpe', 'Mean Worst 10 Days DrawDown'] + results.index = ['Sharpe', 'Mean Worst 10 Days DrawDown', 'Standard Deviation'] return results.append(sharpe_monthly) @@ -169,7 +178,11 @@ def curve_model(tenor_1='5yr', tenor_2='10yr'): def curve_model_results(df, model): df = df.dropna() - prstd_ols, df['down_2_stdev'], df['up_2_stdev'] = wls_prediction_std(model) + a, b, c = wls_prediction_std(model) + b.name = 'down_2_stdev' + c.name = 'up_2_stdev' + df = df.join(b) + df = df.join(c) #dr/dspread = exp(k) + spread_coeff * duration ^ dur_coeff * spread ^ (spread_coeff-1) cols = ['ratio', 'closespread', 'down_2_stdev', 'up_2_stdev'] df[cols] = np.exp(df[cols]) @@ -324,7 +337,7 @@ def pos_pnl_abs(portf, value_date, index='IG', rolling=6, years=3): for date, row in df.iterrows(): f = interp1d(np.hstack([0, lookup_table['year_frac']]), np.hstack([row[0]/2, row])) for ind in portf_copy.indices: - ind.spread = f((pd.to_datetime(ind.end_date) - value_date).days/365) + ind.spread = f((ind.end_date - value_date).days/365) r.append([[date, f(5)] + [portf_copy.pnl]]) df = pd.DataFrame.from_records(chain(*r), columns=['date', 'five_yr_spread', 'pnl']) return df.set_index('date') |
