aboutsummaryrefslogtreecommitdiffstats
path: root/python/mark_backtest_underpar.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mark_backtest_underpar.py')
-rw-r--r--python/mark_backtest_underpar.py94
1 files changed, 65 insertions, 29 deletions
diff --git a/python/mark_backtest_underpar.py b/python/mark_backtest_underpar.py
index 3d1239a2..c6128b13 100644
--- a/python/mark_backtest_underpar.py
+++ b/python/mark_backtest_underpar.py
@@ -7,59 +7,95 @@ import statsmodels.api as sm
from statsmodels.formula.api import gls
import seaborn as sb
-df = pd.read_sql_table('external_marks_mapped',dbengine('dawndb'),
+df = pd.read_sql_table('external_marks_mapped', dbengine('dawndb'),
parse_dates=['date'])
df = df[df.source.notnull()]
df_wide = (pd.pivot_table(df, 'mark', ['identifier', 'date'], 'source').
reset_index().
sort_values('date'))
-df_trades = pd.read_sql_query("select trade_date, identifier, principal_payment, price " \
+
+df_trades = {}
+df_trades['sell'] = pd.read_sql_query("select trade_date, identifier, faceamount, principal_payment, price " \
"from bonds where buysell = 'f'"
- ,dbengine('dawndb'),
- parse_dates=['trade_date'])
-df_trades = df_trades.sort_values('trade_date')
-df_wide = pd.merge_asof(df_trades, df_wide, left_on='trade_date', right_on='date', by='identifier')
-d = {}
+ , dbengine('dawndb'),
+ parse_dates=['trade_date'])
+df_trades['buy'] = pd.read_sql_query("select trade_date, identifier, faceamount, principal_payment, price " \
+ "from bonds where buysell = 't'"
+ , dbengine('dawndb'),
+ parse_dates=['trade_date'])
+for direction, trades in df_trades.items():
+ df_trades[direction] = trades.sort_values('trade_date')
+
+df_sell_wide = pd.merge_asof(df_trades['sell'], df_wide, left_on='trade_date', right_on='date', by='identifier')
+df_wide_temp = df_wide.set_index('date').shift(periods = -1, freq= 'M', axis = 1).reset_index()
+df_buy_wide = pd.merge_asof(df_trades['buy'], df_wide_temp
+ , left_on='trade_date', right_on='date', by='identifier')
+
+d_sell = {}
+d_buy = {}
+df_long = {}
+
for source, g in df.groupby('source'):
- d[source] = pd.merge_asof(df_trades, g, left_on='trade_date', right_on='date', by='identifier')
-df_long = pd.concat(d, join='inner')
-df_long = df_long.reset_index()
-df_long = df_long.dropna(subset=['price','mark'])
+ d_sell[source] = pd.merge_asof(df_trades['sell'], g, left_on='trade_date', right_on='date', by='identifier')
+ d_sell[source]['dir'] = 'sell'
+ d_buy[source] = pd.merge_asof(df_trades['buy'], g.set_index('date').shift(periods = -1, freq= 'BM', axis = 1).reset_index(), left_on='trade_date', right_on='date', by='identifier')
+ d_buy[source]['dir'] = 'buy'
+
+#add a column saying it is buy or sell
+
+df_long = pd.concat(d_sell, join='inner')
+df_long = df_long.append(pd.concat(d_buy, join='inner'))
+df_long = df_long.reset_index().dropna(subset=['price','mark'])
+df_long['difference'] = (df_long['price'] - df_long['mark'])/df_long['mark']
#filtering
diff_threshold = 5
begindate = '2013-01-01'
enddate = '2018-01-01'
+
df_long = df_long[df_long.identifier.str.len() == 9]
df_long = df_long[(df_long['trade_date'] > begindate) & (df_long['trade_date'] < enddate)]
-#difference= df_long[df_long['<filter].groupby('level_0').[.mean(), columns=['Average'])
+
#difference['Std Dev'] = df_long[df_long<filter].std()
#pretty plot
-#dotsize = pd.Series.tolist(df_long['level_0'].apply(lambda x: 400 if x == 'MANAGER' else 20))
#df_long['dotsize'] = df_long['level_0'].apply(lambda x: 400 if x == 'MANAGER' else 20)
-df_long['dotsize'] = df_long['level_0'].apply(lambda x: 400 if x == 'MANAGER' else 20)
+
plt.switch_backend('Agg')
sb.set_style("whitegrid")
sb.set_context("notebook")
-regplot = sb.lmplot(x='mark', y='price', hue = 'source', data=df_long, fit_reg=False, legend_out=True, aspect = 2.1, size = 4, scatter_kws={"s": df_long['dotsize']})
-regplot.set(ylim=(0, 105), xlim=(0, 105))
-#plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
-#regplot.fig.savefig("/home/serenitas/edwin/fig1.png")
-
#plt.switch_backend('Qt4Agg')
order = ['MANAGER','BROKER','BVAL','IDC','MARKIT','PB','PRICESERVE','PRICINGDIRECT','REUTERS','S&P']
sb.set_palette(sb.hls_palette(10, l=.4, s=.8))
-g = sb.FacetGrid(df_long, hue='source', hue_kws={'s':[50] + [20]*9, 'marker': ["o"]+["s"]*9, 'alpha': [1]+[.4]*9}, legend_out=True, aspect = 2.1, size = 4, hue_order = order)
-g.set(ylim=(0, 105), xlim=(0, 105))
-ax = g.map(plt.scatter, 'mark', 'price').add_legend()
-ax.fig.savefig("/home/serenitas/edwin/fig2.png")
+
+g_sell = sb.FacetGrid(df_long[df_long.dir == 'sell'], hue='source', hue_kws={'s':[50] + [20]*9, 'marker': ["o"]+["s"]*9, 'alpha': [1]+[.4]*9}, legend_out=True, aspect = 2.1, size = 4, hue_order = order)
+g_sell.set(ylim=(0, 105), xlim=(0, 105))
+ax_sell = g_sell.map(plt.scatter, 'mark', 'price').add_legend()
+
+g_buy = sb.FacetGrid(df_long[df_long.dir == 'buy'], hue='source', hue_kws={'s':[50] + [20]*9, 'marker': ["o"]+["s"]*9, 'alpha': [1]+[.4]*9}, legend_out=True, aspect = 2.1, size = 4, hue_order = order)
+g_buy.set(ylim=(0, 105), xlim=(0, 105))
+ax_buy = g_buy.map(plt.scatter, 'mark', 'price').add_legend()
+
+ax_sell.fig.savefig("/home/serenitas/edwin/backtest_sales.png")
+ax_buy.fig.savefig("/home/serenitas/edwin/backtest_buys.png")
+
+params = {}
+error = {}
+trade_PNL = {}
+trade_PNL_stat = {}
#fit all the models at once
-params = (df_long.
- groupby('source').
- apply(lambda df: gls('price~mark', df).fit().params))
-df_long['diff'] = (df_long['price'] - df_long['mark'])/df_long['mark']
-error = [df_long[df_long['diff'] < diff_threshold].groupby('source').mean()['diff'],
- df_long[df_long['diff'] < diff_threshold].groupby('source').std()['diff']]
+for direction, df_temp in df_long[(df_long.difference < diff_threshold)].groupby('dir'):
+ params[direction] = (df_temp.
+ groupby('source').
+ apply(lambda df: gls('price~mark', df).fit().params))
+ error[direction] = [df_temp.groupby('source').mean()['difference'],
+ df_temp.groupby('source').std()['difference']]
+ trade_PNL[direction] = df_temp.groupby(['date', 'source']).apply(
+ lambda df: sum(df.principal_payment * df.difference)/
+ sum(df.principal_payment))
+ trade_PNL_stat[direction] = [trade_PNL[direction].groupby(level = 'source').mean(),
+ trade_PNL[direction].groupby(level = 'source').std()]
+
+buychart = trade_PNL['buy'].unstack(-1).plot()