diff options
Diffstat (limited to 'python/notebooks')
| -rw-r--r-- | python/notebooks/Risk Management.ipynb | 286 |
1 files changed, 243 insertions, 43 deletions
diff --git a/python/notebooks/Risk Management.ipynb b/python/notebooks/Risk Management.ipynb index a650b1c3..fe0457f3 100644 --- a/python/notebooks/Risk Management.ipynb +++ b/python/notebooks/Risk Management.ipynb @@ -2,8 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "execution_count": 1, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import portfolio_var as port\n", @@ -11,6 +13,7 @@ "from analytics.scenarios import run_swaption_scenarios, run_index_scenarios, run_portfolio_scenarios\n", "import datetime\n", "import pandas as pd\n", + "from pandas.tseries.offsets import BDay, BMonthEnd\n", "\n", "#import exploration.swaption_calendar_spread as spread\n", "import exploration.swaption_calendar_spread as spread" @@ -18,79 +21,276 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "execution_count": 2, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ - "df, spread, dur = port.rel_spread_diff()" + "#Oct ME Bond HY Equiv\n", + "report_date = (datetime.date.today() + BMonthEnd(-1)).date()\n", + "bond_HY_equiv = -.12088\n", + "percentile = .95" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "execution_count": 3, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "#The 95%tile \n", - "stress = pd.DataFrame(index = ['widen', 'tighten'], columns=['pts'])\n", - "stress.loc['widen'] = df.quantile(.975) \n", - "stress.loc['tighten'] = df.quantile(.025)\n", - "stress = -stress * spread * dur/100" + "df, spread, dur = port.rel_spread_diff(report_date)\n", + "stress = pd.DataFrame()\n", + "stress.at[('2SD_widen', 'spread')] = df.quantile(.975) \n", + "stress.at[('2SD_tighten', 'spread')] = df.quantile(.025) \n", + "stress.at[('worst_widen', 'spread')] = df.max()\n", + "stress['pts'] = -stress * spread * dur/100\n", + "stress['nav_impact'] = bond_HY_equiv * stress['pts']" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style>\n", + " .dataframe thead tr:only-child th {\n", + " text-align: right;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: left;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>spread</th>\n", + " <th>pts</th>\n", + " <th>nav_impact</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>2SD_widen</th>\n", + " <td>0.157884</td>\n", + " <td>-2.208036</td>\n", + " <td>0.266907</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2SD_tighten</th>\n", + " <td>-0.163480</td>\n", + " <td>2.286301</td>\n", + " <td>-0.276368</td>\n", + " </tr>\n", + " <tr>\n", + " <th>worst_widen</th>\n", + " <td>0.359386</td>\n", + " <td>-5.026082</td>\n", + " <td>0.607553</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " spread pts nav_impact\n", + "2SD_widen 0.157884 -2.208036 0.266907\n", + "2SD_tighten -0.163480 2.286301 -0.276368\n", + "worst_widen 0.359386 -5.026082 0.607553" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "#August ME Bond HY Equiv\n", - "bond_HY_equiv = .1652\n", - "stress['nav_impact'] = bond_HY_equiv * stress" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#Swaptions\n", - "#Aug 2018: Buy Sept HY payer spread\n", - "option_delta = Index.from_tradeid(891)\n", - "option1 = BlackSwaption.from_tradeid(10, option_delta)\n", - "option2 = BlackSwaption.from_tradeid(11, option_delta)\n", - "portf = Portfolio([option1, option2, option_delta])\n", - "portf.trade_date = datetime.date(2017, 8, 31)\n", - "portf.mark()\n", - "orig_pv = portf.pv\n", - "orig_ref = portf.ref" + "stress" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style>\n", + " .dataframe thead tr:only-child th {\n", + " text-align: right;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: left;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>level_1</th>\n", + " <th>notional</th>\n", + " <th>factor</th>\n", + " <th>coupon</th>\n", + " <th>duration</th>\n", + " <th>theta</th>\n", + " <th>price</th>\n", + " <th>closespread</th>\n", + " <th>clean_nav</th>\n", + " <th>accrued</th>\n", + " <th>onTR_notional</th>\n", + " <th>widen</th>\n", + " <th>tighten</th>\n", + " <th>total</th>\n", + " </tr>\n", + " <tr>\n", + " <th>strategy</th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>HEDGE_MBS</th>\n", + " <td>3</td>\n", + " <td>-30500000.0</td>\n", + " <td>2.92</td>\n", + " <td>0.15</td>\n", + " <td>9.579586</td>\n", + " <td>0.091530</td>\n", + " <td>323.911577</td>\n", + " <td>728.775311</td>\n", + " <td>-2.454496e+06</td>\n", + " <td>-173891.666667</td>\n", + " <td>-2.271120e+07</td>\n", + " <td>-392951.746260</td>\n", + " <td>439165.979817</td>\n", + " <td>439165.979817</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SER_IGCURVE</th>\n", + " <td>1</td>\n", + " <td>-11000000.0</td>\n", + " <td>2.00</td>\n", + " <td>0.02</td>\n", + " <td>4.202955</td>\n", + " <td>0.005495</td>\n", + " <td>203.166063</td>\n", + " <td>38.112262</td>\n", + " <td>-2.220374e+04</td>\n", + " <td>-12833.333333</td>\n", + " <td>1.006705e+06</td>\n", + " <td>3787.727425</td>\n", + " <td>-3681.218467</td>\n", + " <td>3787.727425</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SER_ITRXCURVE</th>\n", + " <td>1</td>\n", + " <td>39300000.0</td>\n", + " <td>2.00</td>\n", + " <td>0.02</td>\n", + " <td>14.638235</td>\n", + " <td>0.021951</td>\n", + " <td>203.615045</td>\n", + " <td>138.590158</td>\n", + " <td>2.027082e+06</td>\n", + " <td>53396.910000</td>\n", + " <td>-3.481913e+06</td>\n", + " <td>-15658.882722</td>\n", + " <td>16533.674519</td>\n", + " <td>16533.674519</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " level_1 notional factor coupon duration theta \\\n", + "strategy \n", + "HEDGE_MBS 3 -30500000.0 2.92 0.15 9.579586 0.091530 \n", + "SER_IGCURVE 1 -11000000.0 2.00 0.02 4.202955 0.005495 \n", + "SER_ITRXCURVE 1 39300000.0 2.00 0.02 14.638235 0.021951 \n", + "\n", + " price closespread clean_nav accrued \\\n", + "strategy \n", + "HEDGE_MBS 323.911577 728.775311 -2.454496e+06 -173891.666667 \n", + "SER_IGCURVE 203.166063 38.112262 -2.220374e+04 -12833.333333 \n", + "SER_ITRXCURVE 203.615045 138.590158 2.027082e+06 53396.910000 \n", + "\n", + " onTR_notional widen tighten total \n", + "strategy \n", + "HEDGE_MBS -2.271120e+07 -392951.746260 439165.979817 439165.979817 \n", + "SER_IGCURVE 1.006705e+06 3787.727425 -3681.218467 3787.727425 \n", + "SER_ITRXCURVE -3.481913e+06 -15658.882722 16533.674519 16533.674519 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "for x, y in stress.pts.iteritems():\n", - " portf.ref = orig_ref + y\n", - " stress[x] = portf.pv - orig_pv" + "port.cleared_cds_margins(report_date, percentile)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "120816.55576340854" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "stress" + "port.index_curve_margins(report_date)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [] } |
