aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/notebooks/Reto Report.ipynb82
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,