diff options
Diffstat (limited to 'python/notebooks/Reto Report.ipynb')
| -rw-r--r-- | python/notebooks/Reto Report.ipynb | 78 |
1 files changed, 38 insertions, 40 deletions
diff --git a/python/notebooks/Reto Report.ipynb b/python/notebooks/Reto Report.ipynb index 8440088c..f266cd63 100644 --- a/python/notebooks/Reto Report.ipynb +++ b/python/notebooks/Reto Report.ipynb @@ -20,6 +20,7 @@ "from utils.db import dbconn, dbengine\n", "\n", "from risk.tranches import get_tranche_portfolio\n", + "from risk.swaptions import get_swaption_portfolio\n", "from risk.bonds import subprime_risk, clo_risk, crt_risk\n", "\n", "dawn_engine = dbengine('dawndb')" @@ -151,6 +152,31 @@ "metadata": {}, "outputs": [], "source": [ + "################################## Calculate Historical Bond Duration/Yield\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", + "calc_df = pd.DataFrame()\n", + "sql_string = (\"SELECT distinct timestamp::date FROM priced where normalization = 'current_notional' and model_version = 1 \"\n", + " \"and date(timestamp) < %s and date(timestamp) > %s order by timestamp desc\")\n", + "with dbconn('etdb') as etconn, dbconn('dawndb') as dawnconn:\n", + " for d in dates:\n", + " timestamps = pd.read_sql_query(sql_string, dawn_engine, parse_dates=[\"timestamp\"], params=[d, d - pd.tseries.offsets.DateOffset(15, \"D\")])\n", + " calc_df = calc_df.append(subprime_risk(d.date(), dawnconn, mysql_engine, timestamps.iloc[0,0].date()))\n", + "calc_df=calc_df.reset_index().set_index('date')\n", + "calc_df = calc_df.dropna(subset=['bond_yield', 'hy_equiv']) \n", + "bond_stats = pd.DataFrame()\n", + "for d, g in calc_df.groupby(pd.Grouper(freq='M')):\n", + " bond_stats.loc[d, 'dur'] = sum(g.notional * g.factor * g.modDur)/sum(g.notional * g.factor)\n", + " bond_stats.loc[d, 'yield'] = sum(g.usd_market_value * g.modDur * g.bond_yield) /sum(g.usd_market_value * g.modDur)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "################################### Calculate stress scenario \n", "position_date = (datetime.date.today() - BDay(1)).date()\n", "shock_date = (datetime.date.today() - BDay(1)).date()\n", @@ -188,41 +214,33 @@ "source": [ "#tranche positions\n", "conn = dawn_engine.raw_connection()\n", - "portf = get_tranche_portfolio(position_date, conn, False, 'SERCGMAST')\n", - "\n", - "#swaption positions\n", - "swaption_sql_string = (\"select id, folder, expiration_date from swaptions where expiration_date > %s \"\n", - " \"AND swap_type = 'CD_INDEX_OPTION' \"\n", - " \"AND trade_date <= %s AND termination_date IS NULL\")\n", + "mysql_engine = dbengine('rmbs_model')\n", + "mysqlcrt_engine = dbengine('crt')\n", "\n", - "with conn.cursor() as c:\n", - " c.execute(swaption_sql_string, (position_date, position_date))\n", - " for trade_id, strat, expiration_date in c:\n", - " if expiration_date > shock_date:\n", - " portf.add_trade(BlackSwaption.from_tradeid(trade_id), (strat, trade_id))\n", - "conn.close()\n", + "portf = get_tranche_portfolio(position_date, conn, False, 'SERCGMAST')\n", + "s_portf = get_swaption_portfolio(position_date, conn)\n", + "for t, id in zip(s_portf.trades, s_portf.trade_ids):\n", + " portf.add_trade(t, id)\n", "\n", "#index positions\n", "df = pd.read_sql_query(\"SELECT * from list_cds_positions_by_strat(%s)\",\n", " dawn_engine, params=(position_date,))\n", - "df_curve = df[df.folder.str.contains(\"CURVE\")]\n", "df_no_curve = df[~df.folder.str.contains(\"CURVE\")]\n", "for t in df_no_curve.itertuples(index=False):\n", " portf.add_trade(CreditIndex(redcode=t.security_id, maturity=t.maturity, notional=t.notional),\n", " (t.folder, t.security_desc))\n", " \n", "#separately add in curve delta\n", + "df_curve = df[df.folder.str.contains(\"CURVE\")]\n", "curve_portf = Portfolio([CreditIndex(redcode=t.security_id, maturity=t.maturity, notional=t.notional)\n", " for t in df_curve.itertuples(index=False)])\n", "curve_portf.value_date = spread_date\n", "curve_portf.mark()\n", + "\n", "portf.add_trade(CreditIndex('HY', on_the_run('HY', spread_date), '5yr', \n", " value_date=spread_date, \n", " notional=curve_portf.hy_equiv), ('curve_trades', ''))\n", "\n", - "mysql_engine = dbengine('rmbs_model')\n", - "mysqlcrt_engine = dbengine('crt')\n", - "\n", "#get bond risks:\n", "with dbconn('etdb') as etconn, dbconn('dawndb') as dawnconn:\n", " rmbs_pos = subprime_risk(position_date, dawnconn, mysql_engine)\n", @@ -269,7 +287,7 @@ "outputs": [], "source": [ "################################### Run set of scenario\n", - "spread_shock = np.round(np.arange(-.2, 1, .1), 3)\n", + "spread_shock = np.round(np.arange(-.2, 1, .05), 3)\n", "scens = run_portfolio_scenarios(portf, date_range, params=['pnl', 'delta'],\n", " spread_shock=spread_shock,\n", " vol_shock=vol_shock,\n", @@ -291,29 +309,9 @@ "\n", "synthetic = scenarios[['options', 'tranches', 'curve_trades']]\n", "synthetic['total'] = synthetic.sum(axis = 1)\n", - "synthetic.plot()" + "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": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -336,5 +334,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } |
