diff options
Diffstat (limited to 'python/exploration/curve_trades.py')
| -rw-r--r-- | python/exploration/curve_trades.py | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/python/exploration/curve_trades.py b/python/exploration/curve_trades.py index c80a41d5..fbdbf7ec 100644 --- a/python/exploration/curve_trades.py +++ b/python/exploration/curve_trades.py @@ -31,13 +31,38 @@ def spreads_diff_table(spreads_diff): pd.DataFrame(zscore(spreads_diff), index=spreads_diff.index, columns=spreads_diff.columns).plot() return df -def theta_matrix(index = 'IG', on_the_run = 28): +def theta_matrix_by_series(index = 'IG', on_the_run = 28): df = get_index_quotes(index, list(range(on_the_run-6,on_the_run+1)), tenor=['3yr', '5yr', '7yr', '10yr']) df['theta_per_dur'] = df.theta2/df.duration2 theta_matrix = df.groupby(level=['date', 'tenor','series']).nth(-1)['theta_per_dur'] theta_matrix_1 = theta_matrix.xs(theta_matrix.index.max()[0], level = 0).unstack(0) return theta_matrix_1[['3yr', '5yr', '7yr', '10yr']] +def theta_ratio_within_series(index = 'IG', on_the_run = 28): + df = get_index_quotes(index, list(range(on_the_run-6,on_the_run+1)), tenor=['3yr', '5yr', '7yr', '10yr']) + r = {} + for i,g in df.groupby(level=['date', 'series']): + five_yr = g.xs('5yr', level = 'tenor')['duration'] + r[i] = g.duration/five_yr[0] + df1 = pd.concat(r) + dftemp= pd.DataFrame(df1.groupby(level=['date', 'tenor','series']).nth(-1).rename('ratio_to_5yr')) + df2 = df.groupby(level=['date', 'tenor','series']).nth(-1).merge(dftemp, left_index=True, right_index=True) + return df2.unstack(-2) + +def curve_3_5_10(theta_ratio_within_series): + df = theta_ratio_within_series + #buy 3y, sell 5y, buy 10y + df['3_5_10'] = - df.theta2['3yr'] / df.ratio_to_5yr['3yr'] \ + + 2 * df.theta2['5yr'] \ + - df.theta2['10yr'] / df.ratio_to_5yr['10yr'] + df['3_5_10'].dropna().unstack(-1).plot() + +def curve_5_10(theta_ratio_within_series): + df = theta_ratio_within_series + #buy sell 5y, buy 10y + df['5_10'] = df.theta2['5yr'] - df.theta2['10yr'] / df.ratio_to_5yr['10yr'] + df['5_10'].dropna().unstack(-1).plot() + def on_the_run_theta(index = 'IG', on_the_run = 28): df = get_index_quotes(index, list(range(on_the_run-6,on_the_run+1)), tenor=['3yr', '5yr', '7yr', '10yr']) df['theta_per_dur'] = df.theta2/df.duration2 @@ -61,6 +86,7 @@ def curve_returns(index = 'IG', on_the_run = 28): for strat in strategy: strategies_return_monthly[strat] = strategies_return[strat].groupby(pd.TimeGrouper(freq='M')).agg(lambda df:(1+df).prod()-1) + results = pd.DataFrame() sharpe = {} monthly_sharpe = {} for strat in strategy: @@ -69,22 +95,27 @@ def curve_returns(index = 'IG', on_the_run = 28): worst_drawdown = {} for strat in strategy: - worst_drawdown[strat] = strategies_return[strat].nsmallest(10) + worst_drawdown[strat] = strategies_return[strat].nsmallest(10).mean() + + results = results.append(sharpe, ignore_index=True) + results = results.append(monthly_sharpe, ignore_index=True) + results = results.append(worst_drawdown, ignore_index=True) + results['results'] = ['Sharpe','Monthly Sharpe','Mean Worst 10 Days Drawdown'] - return (sharpe, monthly_sharpe, worst_drawdown) + return results.set_index('results') def cross_series_curve(index = 'IG', on_the_run = 28): df = index_returns(index= index, series=list(range(on_the_run-6,on_the_run+1)), tenor=['3yr', '5yr', '7yr', '10yr']) - ## look cross series - returns1 = df.xs(['5yr','IG'], level = ['tenor','index']).price_return.unstack(-1) + ## look cross series - 3y to 5y + returns1 = df.xs(['5yr', index], level = ['tenor','index']).price_return.unstack(-1) price_diff = pd.DataFrame() - for ind in [28,27,26]: - price_diff[ind] = returns1[ind] - 1.55* returns1[ind - 4] + for ind in list(range(on_the_run-2, on_the_run+1)): + price_diff[ind] = returns1[ind] - 1.6* returns1[ind - 4] price_diff = price_diff.stack().groupby(level = 'date').nth(-1) monthly_returns_cross_series = price_diff.groupby(pd.TimeGrouper(freq='M')).agg(lambda df:(1+df).prod()-1) - monthly_returns_cross_series.plot() + plt.plot(monthly_returns_cross_series) def forward_loss(): |
