aboutsummaryrefslogtreecommitdiffstats
path: root/python/notebooks/Reto Report.ipynb
diff options
context:
space:
mode:
Diffstat (limited to 'python/notebooks/Reto Report.ipynb')
-rw-r--r--python/notebooks/Reto Report.ipynb112
1 files changed, 97 insertions, 15 deletions
diff --git a/python/notebooks/Reto Report.ipynb b/python/notebooks/Reto Report.ipynb
index 1454b51b..d0c16dea 100644
--- a/python/notebooks/Reto Report.ipynb
+++ b/python/notebooks/Reto Report.ipynb
@@ -12,6 +12,7 @@
"import numpy as np\n",
"\n",
"from pandas.tseries.offsets import BDay, MonthEnd, BMonthEnd, CustomBusinessMonthEnd\n",
+ "import warnings\n",
"\n",
"from risk.bonds import subprime_risk, crt_risk, clo_risk\n",
"from risk.portfolio import build_portfolio, generate_vol_surface\n",
@@ -50,10 +51,18 @@
"outputs": [],
"source": [
"################################### Run spread scenarios\n",
- "spread_shock = np.array([-100., -25., 1., +25. , 100., 200., 500, 1000])\n",
- "spread_shock /= Trade._ontr['HY'].spread\n",
+ "import warnings\n",
+ "warnings.filterwarnings('ignore')\n",
+ "curr_spread = Trade._ontr['HY'].spread\n",
+ "spread_shock = np.array([-200., -25., 1., +25. , 100., 200., 500, 1000])\n",
+ "spread_shock /= curr_spread\n",
+ "#Add in 2020 HY Wides, 2021 HY Tights, 2022 HY Wides scenarios\n",
+ "spread_shock = np.append(spread_shock, \n",
+ " [(872/curr_spread-1),\n",
+ " (269/curr_spread-1),\n",
+ " (626/curr_spread-1)])\n",
"portf, _ = build_portfolio(position_date, spread_date, fund)\n",
- "vol_surface = generate_vol_surface(portf, 10, 'BAML')\n",
+ "vol_surface = generate_vol_surface(portf, 1, 'GS')\n",
"portf.reset_pv()\n",
"scens = run_portfolio_scenarios(portf, date_range=[pd.Timestamp(spread_date)], params=['pnl', 'hy_equiv'],\n",
" spread_shock=spread_shock,\n",
@@ -86,6 +95,11 @@
" temp['total'] = temp.sum(axis = 1)\n",
" results[i] = temp\n",
"results = pd.concat(results)\n",
+ "results.index.set_levels(\n",
+ " results.index.levels[results.index.names.index('spread_shock')]*Trade._ontr['HY'].spread,\n",
+ " level='spread_shock',\n",
+ " inplace=True\n",
+ ")\n",
"results.to_clipboard()"
]
},
@@ -125,7 +139,7 @@
" t._shift.value = r_shock * 1e-4\n",
" rate_results[i] += temp - t.pv\n",
" t._shift.value = 0\n",
- "rate_results = pd.DataFrame.from_dict(nav_before, orient='index') - pd.DataFrame.from_dict(nav_after, orient='index')\n"
+ "rate_results = pd.DataFrame.from_dict(nav_before, orient='index') - pd.DataFrame.from_dict(nav_after, orient='index')"
]
},
{
@@ -136,17 +150,31 @@
},
"outputs": [],
"source": [
- "#####our jump risks\n",
+ "#####jump risks\n",
+ "import warnings\n",
+ "warnings.filterwarnings('ignore')\n",
+ "portf, _ = build_portfolio(position_date, spread_date, fund)\n",
"jtd = portf.jtd_single_names()\n",
"with serenitas_pool.connection() as conn:\n",
" surv_curves = load_all_curves(conn, spread_date)\n",
- "surv_curves['spread'] = surv_curves['curve'].apply(lambda sc: sc.to_series(forward=False)[5] * (1-sc.recovery_rates[5]))\n",
- "jtd_sabo = jtd[[jtd.columns[0]]].join(surv_curves.groupby(level=0).first()[['name', 'company_id', 'spread']])\n",
- "jtd_sabo.columns = ['jtd', 'name', 'company_id', 'spread']\n",
- "jtd_sabo = jtd_sabo.groupby(['company_id', 'name']).sum()\n",
- "jtd_sabo = jtd_sabo.sort_values('spread', ascending=False)\n",
- "top_5_avg_loss = jtd_sabo.nlargest(5, columns='jtd')['jtd'].mean()\n",
- "widest_5_total_loss = jtd_sabo.nlargest(5, columns='spread')['jtd'].sum()"
+ "surv_curves['spread'] = surv_curves['curve'].apply(lambda sc: sc.inspect()['data'][5][1] * (1-sc.recovery_rates[5]))\n",
+ "jtd = jtd[[jtd.columns[0]]].join(surv_curves.groupby(level=0).first()[['name', 'company_id', 'spread']])\n",
+ "jtd.columns = ['jtd', 'name', 'company_id', '5yr_spread']\n",
+ "jtd = jtd.groupby(['company_id', 'name']).sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from serenitas.utils.db2 import dbconn\n",
+ "import datetime\n",
+ "conn = dbconn('dawndb')\n",
+ "from risk.tranches import get_tranche_portfolio\n",
+ "tranches = get_tranche_portfolio(datetime.date(2023,2,17), conn, False)\n",
+ "jtd = tranches.jtd_single_names()"
]
},
{
@@ -168,7 +196,7 @@
"pnl_alloc = pnl_alloc.join(nav.begbooknav)\n",
"pnl_alloc['strat_return'] = pnl_alloc.mtdtotalbookpl / pnl_alloc.begbooknav\n",
"#rolling 12 months PNL per strategy - copy to RiskMonitor\n",
- "start_date = position_date - MonthEnd(1) - pd.tseries.offsets.MonthEnd(11)\n",
+ "start_date = position_date - MonthEnd(12)\n",
"rolling_return = pnl_alloc[start_date:position_date - MonthEnd(1)].groupby('pnl').sum()['strat_return']\n",
"rolling_return.to_clipboard()"
]
@@ -179,14 +207,24 @@
"metadata": {},
"outputs": [],
"source": [
+ "undefined"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
"################################### Average Portfolio Sales Turnover\n",
"#Rolling min(month from inception, 12 months) sum of (total bond sales proceeds + paydown)/monthly NAV\n",
+ "warnings.filterwarnings('ignore')\n",
"nav = go.get_net_navs()\n",
"fund='SERCGMAST'\n",
"df_inst={}\n",
"for ac in ['CRT', 'Subprime', 'CLO']:\n",
" df_inst[ac] = get_bond_pv(\n",
- " datetime.date.today() - BMonthEnd(24),\n",
+ " datetime.date.today() - BMonthEnd(14),\n",
" datetime.date.today() - BMonthEnd(),\n",
" fund=fund,\n",
" conn=dbconn(\"dawndb\"),\n",
@@ -208,6 +246,26 @@
"outputs": [],
"source": [
"################################### Number of position (min/max/average) /position size (min/max/average) /Top 10 position size\n",
+ "warnings.filterwarnings('ignore')\n",
+ "fund='SERCGMAST'\n",
+ "df_inst={}\n",
+ "for ac in ['CRT', 'Subprime', 'CLO']:\n",
+ " df_inst[ac] = get_bond_pv(\n",
+ " datetime.date.today() - BMonthEnd(60),\n",
+ " datetime.date.today() - BMonthEnd(),\n",
+ " fund=fund,\n",
+ " conn=dbconn(\"dawndb\"),\n",
+ " asset_class =ac)\n",
+ "df_inst = pd.concat(df_inst)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "################################### Number of position (min/max/average) /position size (min/max/average) /Top 10 position size\n",
"portfolio = go.get_portfolio()\n",
"nav = go.get_net_navs()\n",
"exc_port_list = [None, 'SERCGLLC__SERCGLLC', 'CASH', 'SERCGLTD__SERCGLTD', 'GFS_HELPER_BUSINESS_UNIT', 'SER_TEST__SER_TEST']\n",
@@ -258,6 +316,23 @@
"metadata": {},
"outputs": [],
"source": [
+ "rmbs_pos = subprime_risk(position_date, conn, dbengine(\"rmbs_model\"), fund=fund)\n",
+ "crt_pos = crt_risk(position_date, conn, fund=fund)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
"################################### Average Traded Volume\n",
"nav = go.get_net_navs()\n",
"sql_string = \"SELECT * FROM bond_trades where fund='SERCGMAST'\"\n",
@@ -588,6 +663,13 @@
"metadata": {},
"outputs": [],
"source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
}
],
"metadata": {
@@ -606,7 +688,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.8"
+ "version": "3.10.9"
}
},
"nbformat": 4,