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.py85
1 files changed, 37 insertions, 48 deletions
diff --git a/python/globeop_reports.py b/python/globeop_reports.py
index 55f21325..862fccce 100644
--- a/python/globeop_reports.py
+++ b/python/globeop_reports.py
@@ -1,20 +1,14 @@
-from glob import iglob
from db import dbengine
-from pandas.tseries.offsets import MonthEnd
+from pandas.tseries.offsets import DateOffset, MonthEnd
from yieldcurve import YC
-import os
import pandas as pd
-import datetime
import numpy as np
-import matplotlib.pyplot as plt
-import matplotlib.dates as mdates
-import pandas.tseries.offsets as off
-
-def get_monthly_pnl(group_by = ['identifier']):
+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'],
+ 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']
@@ -22,7 +16,7 @@ def get_monthly_pnl(group_by = ['identifier']):
return monthend_pnl.groupby(['date'] + group_by)[['mtd' + col for col in pnl_cols]].sum()
-def get_portfolio(report_date = None):
+def get_portfolio(report_date=None):
if report_date is not None:
sql_string = "SELECT * FROM valuation_reports where periodenddate = %s"
df = pd.read_sql_query(sql_string, dbengine('dawndb'), parse_dates=['periodenddate'],
@@ -37,14 +31,17 @@ def get_portfolio(report_date = None):
def trade_performance():
sql_string = "SELECT * FROM bonds"
- df_trades = pd.read_sql_query(sql_string, dbengine('dawndb'), parse_dates={'lastupdate': {'utc': True}, 'trade_date': {}, 'settle_date': {}})
+ df_trades = pd.read_sql_query(sql_string, dbengine('dawndb'),
+ parse_dates={'lastupdate': {'utc': True},
+ '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 = df_trades[~df_trades.buysell].groupby('identifier').last().reset_index()
df_sell.identifier = df_sell.identifier.str[:9]
- 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_sell['trade_pnl_date'] = df_sell.trade_date + MonthEnd(0)
+ df_buy = df_trades[df_trades.buysell].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']],
@@ -76,7 +73,9 @@ def get_net_navs():
df_val = pd.read_sql_query(sql_string, dbengine('dawndb'), parse_dates=['periodenddate'])
nav = df_val[df_val.fund == 'SERCGMAST'].groupby('periodenddate')['endbooknav'].sum()
nav = nav.resample('M').last()
- df = pd.read_csv('/home/serenitas/edwin/Python/subscription_fee_data.csv', parse_dates=['date'], index_col =['date'])
+ 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')
df = df.join(nav)
df['begbooknav'] = (df.endbooknav + df.net_flow).shift(1)
@@ -94,26 +93,23 @@ def shift_cash(date, amount, df, strat):
def calc_trade_performance_stats():
df = trade_performance().set_index('trade_date')
df.days_held = df.days_held.dt.days
- df['winners'] = df.apply(lambda df: True if df.percent_gain > 0 else False, axis = 1)
+ df['winners'] = df.percent_gain > 0
df['curr_face'] = df.principal_payment/(df.price/100)
index = ['All', '2017', '2016', '2015', '2014', '2013']
- results = pd.DataFrame(index = index)
+ results = pd.DataFrame(index=index)
- win_per = len(df[df.winners].index)/len(df)
- loss_per = 1- win_per
- temp = {}
- temp1 = {}
+ win_per = df.winners.mean()
+ loss_per = 1 - win_per
for x, df1 in df.groupby('winners'):
for y, df2 in df1.groupby(pd.Grouper(freq='A')):
- 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[y] = df2[df2.days_held.notnull()].mean()[['curr_face', 'initialinvestment', 'days_held']]
df[df.days_held.notnull()]['days_held'].groupby(pd.Grouper(freq='A')).mean()
-def get_rmbs_pos_df(date = None):
+def get_rmbs_pos_df(date=None):
engine = dbengine('dawndb')
end_date = pd.datetime.today() - MonthEnd(1)
@@ -132,42 +128,36 @@ def get_rmbs_pos_df(date = None):
calc_df = pd.DataFrame()
for d, g in df.groupby(pd.Grouper(freq='M')):
- model_date = pd.to_datetime(timestamps[timestamps.timestamp <= d+off.DateOffset(days=1)].max()[0]).date()
+ model_date = pd.to_datetime(timestamps[timestamps.timestamp <= d + DateOffset(days=1)].max()[0]).date()
yc = YC(evaluation_date=model_date)
libor = float(yc.zero_rate(.125))
+ sql_string = ("SELECT date(timestamp) as timestamp, cusip, model_version, "
+ "pv, moddur, delta_yield, delta_ir "
+ "FROM priced where date(timestamp) = %s "
+ "and model_version <> 2")
+ params_list = (model_date,)
if d > pd.datetime(2017, 9, 30):
- model_id_sql_string = "SELECT * FROM latest_sim(%s)"
- model_id = pd.read_sql_query(model_id_sql_string, engine, params=[model_date])
- model_id = model_id.loc[0][0]
+ r = engine.execute("SELECT latest_sim FROM latest_sim(%s)", model_date)
+ model_id, = next(r)
#special case
if model_date == pd.datetime(2017, 10, 27).date():
model_id = 4
- sql_string = """
- SELECT date(timestamp) as timestamp, cusip, model_version, pv, moddur, delta_yield, delta_ir
- FROM priced where date(timestamp) = %s
- and model_version <> 2
- and model_id_sub = %s"""
- params_list = [model_date, model_id]
- else:
- sql_string = """
- SELECT date(timestamp) as timestamp, cusip, model_version, pv, moddur, delta_yield, delta_ir
- FROM priced where date(timestamp) = %s
- and model_version <> 2"""
- params_list = [model_date]
+ sql_string += " AND model_version <>2 AND model_id_sub = %s"
+ params_list += (model_id,)
model = pd.read_sql_query(sql_string, engine, parse_dates=['timestamp'],
- params=params_list)
+ params=params_list)
model = model[model.pv != 0]
- comb_g = g.loc[d].groupby('identifier').agg({'endbookmv': np.sum,
- 'endlocalmarketprice': np.mean})
- model = pd.merge(comb_g, model, left_on = 'identifier', right_on='cusip')
+ comb_g = g.loc[d].groupby('identifier').agg({'endbookmv': 'sum',
+ 'endlocalmarketprice': 'mean'})
+ model = pd.merge(comb_g, model, left_on='identifier', right_on='cusip')
positions = model.set_index(['cusip', 'model_version']).unstack(1).dropna()
v1 = positions.xs(1, level='model_version', axis=1)
v3 = positions.xs(3, level='model_version', axis=1)
v3 = v3.assign(curr_ntl = v3.endbookmv/v3.endlocalmarketprice *100)
v3 = v3.assign(b_yield = v3.moddur.apply(lambda x:
- float(yc.zero_rate(x)) - libor))
+ float(yc.zero_rate(x)) - libor))
v3.b_yield += np.minimum((v1.pv / v1.endlocalmarketprice * 100)
- ** (1/v1.moddur) - 1, 1).dropna()
+ ** (1/v1.moddur) - 1, 1).dropna()
v3.delta_yield *= v3.endbookmv / v3.pv
v3.delta_ir *= np.minimum(1, 1/v3.moddur) * (v3.endlocalmarketprice/100)/ v3.pv * v3.curr_ntl
calc_df = calc_df.append(v3)
@@ -210,4 +200,3 @@ def get_clo_pos_df(date = None):
calc_df = pd.concat(r, names=['date', 'cusip'])
calc_df['hy_equiv'] = calc_df.delta * calc_df.endbookmv
return calc_df
-