diff options
Diffstat (limited to 'python/notebooks')
| -rw-r--r-- | python/notebooks/Reto Report.ipynb | 112 |
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, |
