aboutsummaryrefslogtreecommitdiffstats
path: root/python/globeop_reports.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/globeop_reports.py')
-rw-r--r--python/globeop_reports.py109
1 files changed, 96 insertions, 13 deletions
diff --git a/python/globeop_reports.py b/python/globeop_reports.py
index 3e7eb3df..f5fa8dbb 100644
--- a/python/globeop_reports.py
+++ b/python/globeop_reports.py
@@ -1,42 +1,55 @@
from glob import iglob
+from db import dbengine
+from pandas.tseries.offsets import MonthEnd
+
import os
import pandas as pd
import datetime
-from db import dbengine
-from pandas.tseries.offsets import MonthEnd
-import load_globeop_report as load_globeop
+import numpy as np
+import matplotlib.pyplot as plt
+import pandas.tseries.offsets as off
-def get_monthly_pnl():
+def get_monthly_pnl(group_by = ['identifier']):
sql_string = "SELECT * FROM pnl_reports"
df_pnl = pd.read_sql_query(sql_string, dbengine('dawndb'), parse_dates=['date'],
index_col=['date'])
df_pnl['identifier'] = df_pnl.invid.str.replace("_A$", "")
pnl_cols = ['bookunrealmtm', 'bookrealmtm', 'bookrealincome', 'bookunrealincome', 'totalbookpl']
monthend_pnl = df_pnl.groupby(pd.TimeGrouper('M')).apply(lambda df: df.loc[df.index[-1]])
- return monthend_pnl.groupby(['date', 'identifier'])[['mtd' + col for col in pnl_cols]].sum()
+ return monthend_pnl.groupby(['date'] + group_by)[['mtd' + col for col in pnl_cols]].sum()
+
+def get_portfolio(report_date):
+ sql_string = "SELECT * FROM valuation_reports where periodenddate = %s"
+ df = pd.read_sql_query(sql_string, dbengine('dawndb'), parse_dates=['periodenddate'],
+ index_col=['periodenddate'], params=[report_date,])
+ df['identifier'] = df.invid.str.replace("_A$", "")
+ return df
def curr_port_PNL(date = datetime.date.today(), asset_class='Subprime'):
- date = (date - pd.tseries.offsets.MonthEnd(1)).date()
+ date = (date - off.MonthEnd(1)).date()
sql_string = "SELECT * FROM risk_positions(%s, %s) WHERE notional > 0"
- df_positions = pd.read_sql_query(sql_string, dbengine('dawndb'),params = [date, asset_class])
+ df_positions = pd.read_sql_query(sql_string, dbengine('dawndb'), params=[date, asset_class])
df_pnl = get_monthly_pnl()[:date]
df_all = df_positions.merge(df_pnl.groupby('identifier').sum().reset_index(), on=['identifier'])
return df_all
def trade_performance():
sql_string = "SELECT * FROM bonds"
- df_trades = pd.read_sql_query(sql_string, dbengine('dawndb'), parse_dates= ['lastupdate', 'trade_date','settle_date'])
+ df_trades = pd.read_sql_query(sql_string, dbengine('dawndb'), parse_dates=['lastupdate', 'trade_date', 'settle_date'])
df_trades = df_trades[df_trades.asset_class == 'Subprime']
df_pnl = get_monthly_pnl()
df_sell = df_trades[df_trades.buysell == False].groupby('identifier').last().reset_index()
df_sell.identifier = df_sell.identifier.str[:9]
- df_sell['trade_pnl_date'] = df_sell.trade_date + MonthEnd(0)
+ df_sell['trade_pnl_date'] = df_sell.trade_date + off.MonthEnd(0)
df_buy = df_trades[df_trades.buysell == True].groupby('identifier').last().reset_index()
df_all = df_sell.merge(df_pnl.groupby('identifier').sum().reset_index(), on=['identifier'])
- df_all = df_all.merge(df_pnl.reset_index()[['date', 'identifier', 'mtdtotalbookpl']], left_on=['trade_pnl_date','identifier'], right_on=['date','identifier'], suffixes=('','_at_trade_month'))
- df_all = df_all.drop(['date','trade_pnl_date'], axis = 1)
+ df_all = df_all.merge(df_pnl.reset_index()[['date', 'identifier', 'mtdtotalbookpl']],
+ left_on=['trade_pnl_date', 'identifier'],
+ right_on=['date', 'identifier'],
+ suffixes=('', '_at_trade_month'))
+ df_all = df_all.drop(['date', 'trade_pnl_date'], axis=1)
#now build up the table
g = df_buy.groupby('identifier').sum()
@@ -65,7 +78,77 @@ def get_net_navs():
nav = nav.resample('M').last()
df = pd.read_csv('/home/serenitas/edwin/Python/subscription_fee_data.csv', parse_dates=['date'], index_col =['date'])
df.index = df.index.to_period('M').to_timestamp('M')
- return df.join(nav)
+ df = df.join(nav)
+ df['begbooknav'] = (df.endbooknav + df.net_flow).shift(1)
+ df.at[('2013-01-31', 'begbooknav')] = 12500000
+ return df
+
+def alloc(report_date, alloc = 'pnl'):
+
+ """ Takes strategy grouping """
+ "Alloc: pnl or capital"
+
+ if alloc == 'pnl':
+ nav = get_net_navs()
+ df = get_monthly_pnl(['strat', 'custacctname'])
+ df = df.join(nav.begbooknav)
+ df['strat_return'] = df.mtdtotalbookpl / df.begbooknav
+ df = df.loc[report_date.date()]
+ elif alloc == 'capital':
+ df = get_portfolio(report_date)
+ df.set_index(['strat','custacctname'], inplace=True)
+
+ #get strategy lookup table: group-by a merged DF to spot unmapped strategies
+ strats = pd.read_csv('/home/serenitas/edwin/Python/strat_map.csv', index_col=['strat','custacctname'])
+ #Check for empty sets: df.set_index(['strat','custacctname']).groupby(['strat','custacctname'])
+ df = df.merge(strats, left_index=True, right_index=True)
+ df = df.fillna(-1)
+ return df.set_index(alloc).groupby(alloc).sum()
+
+def pnl_alloc_plot(df):
+
+ """ Takes the alloc('pnl') dataframe """
+ y = df.strat_return
+ x = df.index
+ x_loc = np.arange(len(df.index))
+
+ width = .35 #width of the bar
+ fig, ax = plt.subplots(figsize = (6,6))
+ ax.bar(x_loc, y, width)
+
+ ax.set_xlabel('Strategy')
+ ax.set_xticks(x_loc + width /2)
+ ax.set_xticklabels(x, rotation='45')
+
+ #set y-axis as percentage
+ ax.set_ylabel('Return (%)')
+ y_ticks = ax.get_yticks()
+ ax.set_yticklabels(['{:.2f}%'.format(y*100) for y in y_ticks])
+ plt.tight_layout()
+
+def cap_alloc_plot(df):
+
+ """ Takes the alloc('capital') dataframe"""
+ # create piechart and add a circle at the center
+
+ df['alloc'] = df.endbooknav/df.endbooknav.sum()
+ fig, ax = plt.subplots(figsize=(8,4))
+ ax.pie(df.alloc, labels=df.index, autopct='%1.1f%%',
+ pctdistance=1.25, labeldistance=1.5)
+ ax.add_artist(plt.Circle((0,0), 0.7, color='white'))
+ ax.axis('equal')
+ plt.tight_layout()
+
+def avg_turnover():
+ #Total Bond Sales Proceeds/Average starting 12 months NAV
+ avg_nav = get_net_navs().begbooknav[-12:].mean()
+ last_monthend = datetime.date.today() - off.MonthEnd(1)
+ sql_string = "SELECT * FROM bonds where buysell = 'False'"
+ df = pd.read_sql_query(sql_string, dbengine('dawndb'),
+ parse_dates=['lastupdate', 'trade_date', 'settle_date'])
+ df = df[(df.trade_date > last_monthend - off.MonthEnd(12))
+ & (df.trade_date <= last_monthend)]
+ return (df.principal_payment + df.accrued_payment).sum()/avg_nav
def calc_trade_performance_stats():
df = trade_performance().set_index('trade_date')
@@ -85,7 +168,7 @@ def calc_trade_performance_stats():
import pdb; pdb.set_trace()
y = y.date().year
results.loc[y] = df2[df2.days_held.notnull()].mean()[['curr_face','initialinvestment', 'days_held']]
- results.loc[] = len(df2[df2.winners == x].index)/len(df)
+ #results.loc[] = len(df2[df2.winners == x].index)/len(df)
df[df.days_held.notnull()]['days_held'].groupby(pd.TimeGrouper(freq='A')).mean()