aboutsummaryrefslogtreecommitdiffstats
path: root/python/notebooks/Risk Management.ipynb
diff options
context:
space:
mode:
Diffstat (limited to 'python/notebooks/Risk Management.ipynb')
-rw-r--r--python/notebooks/Risk Management.ipynb286
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": []
}