diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/exploration/curve_trades.py | 78 | ||||
| -rw-r--r-- | python/notebooks/Curve Trades.ipynb | 43 |
2 files changed, 98 insertions, 23 deletions
diff --git a/python/exploration/curve_trades.py b/python/exploration/curve_trades.py index 89149306..ce134b6f 100644 --- a/python/exploration/curve_trades.py +++ b/python/exploration/curve_trades.py @@ -1,4 +1,5 @@ from index_data import get_index_quotes, index_returns, _serenitas_engine +from analytics import Index, Portfolio import pandas as pd import math import statsmodels.formula.api as smf @@ -65,12 +66,13 @@ def curve_3_5_10(df): df['3_5_10'] = - df.theta2['3yr'] / df.duration_ratio_to_5yr['3yr'] \ + 2 * df.theta2['5yr'] \ - df.theta2['10yr'] / df.duration_ratio_to_5yr['10yr'] - df['3_5_10'].dropna().unstack(-1).plot() + df1['3_5_10'].dropna().unstack(-1).plot() def curve_5_10(df): #buy sell 5y, buy 10y - df['5_10'] = df.theta2['5yr'] - df.theta2['10yr'] / df.duration_ratio_to_5yr['10yr'] - df['5_10'].dropna().unstack(-1).plot() + df1 = pd.DataFrame() + df1['5_10'] = df.theta2['5yr'] - df.theta2['10yr'] / df.duration_ratio_to_5yr['10yr'] + df1['5_10'].dropna().unstack(-1).plot() def on_the_run_theta(index='IG', rolling=6): otr = on_the_run(index) @@ -144,28 +146,68 @@ def forward_loss(index='IG'): df['fwd_loss_rate'] = df.indexel.diff(2)/df.duration.diff(2) def read_IG_curve_pos(): - from analytics import Index, Portfolio trade_1 = Index.from_tradeid(886) trade_2 = Index.from_tradeid(885) - trade_3 = Index.from_tradeid(884) - portf = Portfolio([trade_1, trade_2, trade_3]) + trade_1.notional = 132_900_000 + trade_2.notional = 75_000_000 + return Portfolio([trade_1, trade_2]) -def curve_model(): +def curve_model(tenor_1='5yr', tenor_2='10yr'): #OLS model df = ratio_within_series(param='closespread') df = df.groupby(level='date').last() - - df = pd.concat([df.duration['5yr'], df.closespread['5yr'], df.closespread_ratio_to_5yr['10yr']], - axis=1, keys=['duration', 'closespread', 'ratio']) - results = smf.ols('np.log(ratio) ~ np.log(duration) + np.log(closespread)', data=df).fit() + df = pd.concat([df.duration[tenor_1],df.closespread[tenor_1], df.closespread_ratio_to_5yr[tenor_2]], axis = 1, keys=['duration', 'closespread', 'ratio']) + ols_model = smf.ols('np.log(ratio) ~ np.log(duration) + np.log(closespread)', data=df).fit() df['predicted'] = np.exp(results.predict()) - results.summary() - prstd_ols, iv_l, iv_u = wls_prediction_std(results) - df['up_2_stdev'] = np.exp(iv_u) - df['down_2_stdev'] = np.exp(iv_l) + return df, ols_model + +def curve_model_results(df, model): - #dr/dspread = exp(k) * spread_coeff * duration ^ dur_coeff * spread ^ (spread_coeff-1) - df['dr_dspread'] = np.exp(results.params[0]) * results.params[2] * df.duration ** results.params[1] * df.closespread ** (results.params[2] -1) - df['beta'] = df.dr_dspread * df.closespread + prstd_ols, df['down_2_stdev'], df['up_2_stdev'] = wls_prediction_std(model) + #dr/dspread = exp(k) + spread_coeff * duration ^ dur_coeff * spread ^ (spread_coeff-1) + df['down_2_stdev'] = np.exp(df['down_2_stdev']) + df['up_2_stdev'] = np.exp(df['up_2_stdev']) + df['predicted'] = np.exp(model.predict()) + df['dr_dspread'] = np.exp(model.params[0]) * model.params[2] * df.duration ** model.params[1] * df.closespread ** (model.params[2] -1) return df + +def curve_var(): + portf = read_IG_curve_pos() + df = curve_model_results(curve_model()[0], curve_model()[1]) + portf.trade_date = pd.datetime.today() - pd.tseries.offsets.BDay(1) + portf.mark() + portf_orig_pv = portf.pv + portf.indices[1].spread = portf.indices[0].spread * df.ratio.quantile(.05) + stress_1 = portf_orig_pv - portf.pv + portf.indices[1].spread = portf.indices[0].spread * df.predicted[-1] + stress_2 = portf_orig_pv - portf.pv + portf.indices[1].spread = portf.indices[0].spread * df.down_2_stdev[-1] + stress_3 = portf_orig_pv - portf.pv + + return stress_1, stress_2, stress_3 + +def spread_fin_crisis(index='IG'): + on_the_run = on_the_run(index) + ## look at spreads + df = get_index_quotes(index, list(range(8,on_the_run+1)), tenor=['3yr', '5yr', '7yr', '10yr'], years = 20) + spreads = df.groupby(level=['date', 'tenor']).nth(-1)['closespread'].unstack(-1) + spreads.columns = [int(col[:-2]) for col in spreads.columns] + spreads = spreads.sort_index(1) + spreads_diff = spreads.diff(axis=1) + to_plot = pd.DataFrame() + to_plot['spread'] = spreads[5] + to_plot['3 - 5 diff'] = spreads_diff[5] + to_plot['5 - 10 diff'] = spreads_diff[7] + spreads_diff[10] + + fig = plt.figure() + ax = fig.add_subplot(111) + ax2 = ax.twinx() # Create another axes that shares the same x-axis as ax + + width = 0.4 + to_plot['spread'].plot(color='red', ax=ax) + to_plot['5 - 10 diff'].plot(color='blue', ax=ax2) + to_plot['3 - 5 diff'].plot(color='green', ax=ax2) + plt.legend(bbox_to_anchor=(.5, -.1), ncol = 2) + + plt.show() diff --git a/python/notebooks/Curve Trades.ipynb b/python/notebooks/Curve Trades.ipynb index 6042ccc6..7f120638 100644 --- a/python/notebooks/Curve Trades.ipynb +++ b/python/notebooks/Curve Trades.ipynb @@ -125,7 +125,8 @@ "metadata": {}, "outputs": [], "source": [ - "model = ct.curve_model()" + "model = ct.curve_model()\n", + "model_results = ct.curve_model_results(model[0], model[1])" ] }, { @@ -134,9 +135,7 @@ "metadata": {}, "outputs": [], "source": [ - "ax = model[['ratio','predicted']].plot()\n", - "ax.plot(model.index, model.up_2_stdev, 'r--')\n", - "ax.plot(model.index, model.down_2_stdev, 'b--')" + "model[1].summary()" ] }, { @@ -145,7 +144,41 @@ "metadata": {}, "outputs": [], "source": [ - "model.iloc[-1]" + "import numpy as np\n", + "ax = model_results[['ratio','predicted']].plot()\n", + "ax.plot(model_results.index, model_results.up_2_stdev, 'r--')\n", + "ax.plot(model_results.index, model_results.down_2_stdev, 'b--')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model_results.iloc[-1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Var on current position\n", + "results = ct.curve_var()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results\n", + "#first number: at 5% flatness\n", + "#second number: at predicted curve shape\n", + "#third number: at 5% flatness given duration and spread" ] }, { |
