diff options
Diffstat (limited to 'python/notebooks')
| -rw-r--r-- | python/notebooks/Reto Report.ipynb | 92 |
1 files changed, 71 insertions, 21 deletions
diff --git a/python/notebooks/Reto Report.ipynb b/python/notebooks/Reto Report.ipynb index f266cd63..6769a123 100644 --- a/python/notebooks/Reto Report.ipynb +++ b/python/notebooks/Reto Report.ipynb @@ -71,9 +71,11 @@ "#(total Bond Sales Proceeds + paydown)/average starting 12 months NAV\n", "#Actually: Rolling 12 months sum of (total bond sales proceeds + paydown)/monthly NAV\n", "nav = go.get_net_navs()\n", - "sql_string = \"SELECT * FROM bonds WHERE buysell IS False\"\n", + "fund='SERCGMAST'\n", + "sql_string = \"SELECT * FROM bonds WHERE buysell IS False and fund = %s\"\n", "df = pd.read_sql_query(sql_string, dawn_engine,\n", " parse_dates={'lastupdate':{'utc':True}, 'trade_date': {}, 'settle_date':{}},\n", + " params=[fund,],\n", " index_col = 'trade_date')\n", "df = df.groupby(pd.Grouper(freq='M')).sum()\n", "#Average traded volume (Bonds only)\n", @@ -81,15 +83,14 @@ "#Now get portfolio paydown per month\n", "portfolio = go.get_portfolio()\n", "portfolio = portfolio[(portfolio.custacctname == 'V0NSCLMAMB') &\n", - " (portfolio.port == 'MORTGAGES') &\n", " (portfolio.identifier != 'USD') &\n", " (portfolio.endqty != 0)]\n", - "portfolio = portfolio.set_index('identifier', append=True)\n", - "portfolio = portfolio['endqty'].groupby(['identifier', 'periodenddate']).sum()\n", - "portfolio = portfolio.reset_index('identifier')\n", "cf = pd.read_sql_query(\"SELECT * FROM cashflow_history\", dawn_engine,\n", " parse_dates=['date'],\n", " index_col=['date']).sort_index()\n", + "portfolio = portfolio.set_index('identifier', append=True)\n", + "portfolio = portfolio['endqty'].groupby(['identifier', 'periodenddate']).sum()\n", + "portfolio = portfolio.reset_index('identifier')\n", "df_1 = pd.merge_asof(cf, portfolio.sort_index(), left_index=True, right_index=True, by='identifier')\n", "df_1 = df_1.dropna(subset=['endqty'])\n", "df_1 = df_1[(df_1.principal_bal != 0) & (df_1.principal != 0)]\n", @@ -97,7 +98,6 @@ "paydowns = df_1.paydown.groupby(pd.Grouper(freq='M')).sum()\n", "temp = pd.concat([paydowns, df.principal_payment, df.accrued_payment], axis=1).fillna(0)\n", "turnover = (temp.sum(axis=1)/nav.begbooknav).rolling(12).sum()\n", - "#turnover = temp.rolling(12).sum().sum(axis=1)/ nav.begbooknav.rolling(12).mean()\n", "turnover[12:].plot()\n", "turnover[-1]" ] @@ -108,6 +108,36 @@ "metadata": {}, "outputs": [], "source": [ + "################################### Average Portfolio Sales Turnover - as of last monthend from today\n", + "#(total Bond Sales Proceeds + paydown)/average starting 12 months NAV\n", + "#Actually: Rolling 12 months sum of (total bond sales proceeds + paydown)/monthly NAV\n", + "nav = go.get_net_navs()\n", + "fund='SERCGMAST'\n", + "sql_string = \"SELECT * FROM bonds WHERE buysell IS False and fund = %s\"\n", + "df = pd.read_sql_query(sql_string, dawn_engine,\n", + " parse_dates={'lastupdate':{'utc':True}, 'trade_date': {}, 'settle_date':{}},\n", + " params=[fund,],\n", + " index_col = 'trade_date')\n", + "df = df.groupby(pd.Grouper(freq='M')).sum()\n", + "\n", + "cf = pd.read_sql_query(\"SELECT * FROM cashflow_history\", dawn_engine,\n", + " parse_dates=['date'],\n", + " index_col=['date']).sort_index()\n", + "sql_string = \"SELECT description, identifier, notional, price, factor FROM risk_positions(%s, %s, 'BRINKER')\"\n", + "pos = {}\n", + "for d in cf.index.unique():\n", + " for ac in ['Subprime', 'CRT']:\n", + " pos[d, ac] = pd.read_sql_query(sql_string, dawn_engine, params=[d.date(), ac])\n", + "pos = pd.concat(pos, names=['date', 'asset_class'])\n", + "pos = pos.reset_index(level=[1,2])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "################################### Average Monthly Traded Volume\n", "nav = go.get_net_navs()\n", "sql_string = \"SELECT * FROM bonds\"\n", @@ -153,6 +183,7 @@ "outputs": [], "source": [ "################################## Calculate Historical Bond Duration/Yield\n", + "analytics.init_ontr()\n", "mysql_engine = dbengine('rmbs_model')\n", "end_date = pd.datetime.today() - MonthEnd(1)\n", "dates = pd.date_range(datetime.date(2013, 1, 30), end_date, freq=\"M\")\n", @@ -246,7 +277,10 @@ " rmbs_pos = subprime_risk(position_date, dawnconn, mysql_engine)\n", " clo_pos = clo_risk(position_date, dawnconn, etconn)\n", " crt_pos = crt_risk(position_date, dawnconn, mysqlcrt_engine)\n", - "notional = rmbs_pos['hy_equiv'].sum() + clo_pos['hy_equiv'].sum() + crt_pos['hy_equiv'].sum()\n", + "if clo_pos is None:\n", + " notional = rmbs_pos['hy_equiv'].sum() + crt_pos['hy_equiv'].sum()\n", + "else:\n", + " notional = rmbs_pos['hy_equiv'].sum() + clo_pos['hy_equiv'].sum() + crt_pos['hy_equiv'].sum()\n", "portf.add_trade(CreditIndex('HY', on_the_run('HY', spread_date), '5yr', \n", " value_date = spread_date, \n", " notional = -notional), ('bonds', ''))\n", @@ -259,25 +293,27 @@ "for trade in portf.swaptions:\n", " vs = BlackSwaptionVolSurface(trade.index.index_type, trade.index.series, \n", " value_date=spread_date, interp_method = \"bivariate_linear\")\n", - " vol_surface[(trade.index.index_type, trade.index.series)] = vs[vs.list(option_type='payer')[-1]]\n", - "vol_shock = [0]\n", - "corr_shock = [0, -.1]\n", - "spread_shock = tighten + [0] + widen\n", - "date_range = [pd.Timestamp(shock_date)]\n", + " vol_surface[(trade.index.index_type, trade.index.series, trade.option_type)] = vs[vs.list(source='MS', option_type=trade.option_type)[-1]]\n", "\n", - "scens = run_portfolio_scenarios(portf, date_range, params=[\"pnl\"],\n", - " spread_shock=spread_shock,\n", - " vol_shock=vol_shock,\n", - " corr_shock=corr_shock,\n", + "scens = run_portfolio_scenarios(portf, date_range=[pd.Timestamp(shock_date)], params=[\"pnl\"],\n", + " spread_shock=widen,\n", + " vol_shock=[0],\n", + " corr_shock = [0],\n", " vol_surface=vol_surface)\n", "\n", "attrib = (scens.\n", " reset_index(level=['date'], drop=True).\n", " groupby(level=0, axis=1).sum())\n", - "attrib.columns.name = 'strategy'\n", - "results = attrib.xs((widen[2], 0.), level=['spread_shock', 'corr_shock']).unstack('strategy')\n", - "results.name = 'pnl'\n", - "#results.to_clipboard(header=True)" + "results = attrib.xs((widen[2], 0., 0.), level=['spread_shock', 'corr_shock', 'vol_shock']).T" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results.to_clipboard(header=True)" ] }, { @@ -312,6 +348,20 @@ "nav = go.get_net_navs()\n", "(synthetic/nav.endbooknav[-1]).plot()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -330,7 +380,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" } }, "nbformat": 4, |
