diff options
Diffstat (limited to 'python/notebooks')
| -rw-r--r-- | python/notebooks/Reto Report.ipynb | 82 |
1 files changed, 69 insertions, 13 deletions
diff --git a/python/notebooks/Reto Report.ipynb b/python/notebooks/Reto Report.ipynb index 1d0cc038..1a2873a2 100644 --- a/python/notebooks/Reto Report.ipynb +++ b/python/notebooks/Reto Report.ipynb @@ -9,15 +9,17 @@ "import datetime\n", "import globeop_reports as go\n", "import pandas as pd\n", - "import analytics\n", "import numpy as np\n", "\n", "from pandas.tseries.offsets import BDay, MonthEnd\n", - "from analytics.scenarios import run_portfolio_scenarios\n", - "from risk.bonds import subprime_risk\n", - "from utils.db import dbconn, dbengine, serenitas_engine, dawn_engine\n", + "\n", + "from risk.bonds import subprime_risk, crt_risk, clo_risk\n", "from risk.portfolio import build_portfolio, generate_vol_surface\n", - "from analytics.basket_index import BasketIndex" + "\n", + "import serenitas.analytics as ana\n", + "from serenitas.analytics.scenarios import run_portfolio_scenarios\n", + "from serenitas.analytics.basket_index import BasketIndex\n", + "from serenitas.utils.db import dbconn, dbengine, serenitas_engine, dawn_engine" ] }, { @@ -27,10 +29,10 @@ "outputs": [], "source": [ "#Set dates\n", - "position_date = (datetime.date.today() - BDay(1)).date()\n", + "position_date = (datetime.date.today() - BDay(3)).date()\n", "spread_date = position_date\n", - "analytics._local = False\n", - "analytics.init_ontr(spread_date)" + "ana._local = False\n", + "ana.init_ontr(spread_date)" ] }, { @@ -42,9 +44,9 @@ "#Stress scenario for weekly report --> copy paste results to Excel\n", "fund = 'SERCGMAST'\n", "spread_shock = np.array([100., 200.])\n", - "spread_shock /= analytics._ontr['HY'].spread\n", + "spread_shock /= ana._ontr['HY'].spread\n", "portf, _ = build_portfolio(position_date, spread_date, fund)\n", - "vol_surface = generate_vol_surface(portf, 5)\n", + "vol_surface = generate_vol_surface(portf, 10)\n", "\n", "portf.reset_pv()\n", "scens = run_portfolio_scenarios(portf, date_range=[pd.Timestamp(spread_date)], params=[\"pnl\"],\n", @@ -66,6 +68,15 @@ "metadata": {}, "outputs": [], "source": [ + "position_date" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "################################### JTD\n", "_, portf = build_portfolio(position_date, spread_date)\n", "jtd_i = []\n", @@ -136,6 +147,7 @@ "nav = go.get_net_navs()\n", "m_pnl = go.get_monthly_pnl(['strat', 'custacctname'])\n", "m_pnl = m_pnl.reset_index().merge(strats, on=['strat', 'custacctname'], how='left')\n", + "m_pnl = m_pnl.loc[~m_pnl['pnl'].isin(['Test', 'Feeder'])]\n", "undefined = m_pnl[m_pnl.pnl.isna()].groupby(['strat', 'custacctname']).last()\n", "#Get PNL Allocation\n", "#Input latest NAVS to: '/home/serenitas/edwin/Python/subscription_fee_data.csv'\n", @@ -228,9 +240,15 @@ "latest = monthend_bonds.loc[last_date]\n", "#min/max/mean position size\n", "latest['percentage'][latest['percentage']>0.0000001].min(), latest['percentage'].max(), latest['percentage'].mean()\n", - "#10th largest positions\n", + "#10 largest positions\n", "ten_largest = monthend_bonds.groupby('periodenddate').apply(lambda df: df['percentage'].nlargest(10).sum())\n", - "ten_largest.min(), ten_largest.max(), ten_largest.mean()" + "print(\"ten largest position - min/max/mean\", ten_largest.min(), ten_largest.max(), ten_largest.mean())\n", + "#5 largest positions in the last 5 years\n", + "five_largest = monthend_bonds.groupby('periodenddate').apply(lambda df: df['percentage'].nlargest(5).sum())\n", + "print(\"five largest position - min/max/mean\",\n", + " five_largest[datetime.date.today() - pd.DateOffset(years=5):].min(),\n", + " five_largest[datetime.date.today() - pd.DateOffset(years=5):].max(),\n", + " five_largest[datetime.date.today() - pd.DateOffset(years=5):].mean())" ] }, { @@ -417,6 +435,44 @@ " d = d.date()\n", " portfs[d] = build_portf(d)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "################################### PNL Breakdown by income and appreciation\n", + "strats = pd.read_csv('/home/serenitas/edwin/Python/strat_map.csv')\n", + "nav = go.get_net_navs()\n", + "m_pnl = go.get_monthly_pnl(['strat', 'custacctname'])\n", + "m_pnl = m_pnl.reset_index().merge(strats, on=['strat', 'custacctname'], how='left')\n", + "m_pnl = m_pnl.loc[~m_pnl['pnl'].isin(['Test', 'Feeder'])]\n", + "\n", + "pnl_alloc = m_pnl.groupby(['date', 'pnl_lvl1']).sum()\n", + "pnl_alloc['income'] = pnl_alloc['mtdbookunrealincome'] + pnl_alloc['mtdbookrealincome']\n", + "pnl_alloc['appreciation'] = pnl_alloc['mtdtotalbookpl'] - pnl_alloc['income']\n", + "returns = nav.merge(pnl_alloc[['income', 'appreciation']], left_index=True, right_index=True)\n", + "returns['income'] /= returns['endbooknav']\n", + "returns['appreciation'] /= returns['endbooknav']\n", + "income = returns[['income']].unstack(level=0)\n", + "income.columns = income.columns.droplevel(0)\n", + "appreciation = returns[['appreciation']].unstack(level=0)\n", + "appreciation.columns = appreciation.columns.droplevel(0)\n", + "\n", + "#copy to pnl_breakdown_by_pnl_type - Monthly and Annually\n", + "income.sort_index().to_clipboard()\n", + "appreciation.sort_index().to_clipboard()\n", + "income.T.groupby(pd.Grouper(freq='A')).sum().T.sort_index().to_clipboard()\n", + "appreciation.T.groupby(pd.Grouper(freq='A')).sum().T.sort_index().to_clipboard()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -435,7 +491,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.9.1-final" } }, "nbformat": 4, |
