{ "cells": [ { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "# better formatting for large floats\n", "import pandas as pd\n", "pd.options.display.float_format = \"{:,.2f}\".format" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "from risk.swaptions import get_swaption_portfolio\n", "import datetime\n", "from utils.db import dbconn\n", "from analytics import init_ontr\n", "import analytics\n", "conn = dbconn('dawndb')\n", "conn.autocommit = True\n", "value_date = datetime.date.today()\n", "init_ontr(value_date)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Portfolio 2020-01-24\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ProductIndexNotionalRefStrikeDirectionTypeExpiryVolPVDeltaGammaThetaVegaHY Equiv
ids
SWPTN91SwaptionIG33 5yr200,000,000.0046.5945.0Longreceiver2020-02-1940.83%96,319.39-26.75%60.60%-3,188.644,080.47-15,787,111.54
SWPTN92SwaptionIG33 5yr200,000,000.0046.5965.0Shortpayer2020-02-1974.83%-23,794.79-7.31%-15.04%2,128.60-1,542.26-4,314,115.94
SWPTN97SwaptionIG33 5yr200,000,000.0046.5942.5Longreceiver2020-03-1837.97%63,066.05-15.51%36.70%-1,502.934,332.40-9,151,352.04
SWPTN107SwaptionIG33 5yr200,000,000.0046.5942.5Longreceiver2020-03-1837.97%63,066.05-15.51%36.70%-1,502.934,332.40-9,151,352.04
SWPTN108SwaptionIG33 5yr200,000,000.0046.5955.0Shortpayer2020-03-1854.38%-152,837.83-30.95%-34.76%2,916.80-5,825.18-18,264,316.98
SWPTN98SwaptionIG33 5yr200,000,000.0046.5957.5Shortpayer2020-03-1857.60%-124,368.10-25.43%-30.04%2,793.20-5,282.54-15,009,920.16
SWPTN93SwaptionIG33 5yr300,000,000.0046.5962.5Shortpayer2020-03-1863.32%-128,800.98-17.73%-22.36%3,702.11-6,405.66-15,692,360.25
SWPTN103SwaptionIG33 5yr200,000,000.0046.5942.5Longreceiver2020-04-1539.55%95,237.93-17.86%30.89%-1,363.285,704.92-10,542,143.17
SWPTN101SwaptionIG33 5yr100,000,000.0046.5842.5Longreceiver2020-04-1539.56%47,737.99-17.90%30.92%-682.452,855.09-5,281,382.51
SWPTN99SwaptionIG33 5yr200,000,000.0046.5842.5Longreceiver2020-04-1539.56%95,475.99-17.90%30.92%-1,364.905,710.18-10,562,765.02
SWPTN102SwaptionIG33 5yr100,000,000.0046.5857.5Shortpayer2020-04-1555.32%-100,969.24-32.34%-28.64%1,236.12-3,680.38-9,542,511.78
SWPTN104SwaptionIG33 5yr200,000,000.0046.5857.5Shortpayer2020-04-1555.32%-201,938.48-32.34%-28.64%2,472.24-7,360.76-19,085,023.56
SWPTN100SwaptionIG33 5yr200,000,000.0046.5860.0Shortpayer2020-04-1557.63%-171,842.33-27.86%-25.74%2,399.51-6,871.65-16,441,512.64
SWPTN110SwaptionHY33 5yr50,000,000.00108.92105.0Shortpayer2020-04-1548.17%-165,874.84-21.56%-4.50%2,606.42-8,963.31-10,777,542.75
SWPTN109SwaptionHY33 5yr50,000,000.00108.92109.5Longreceiver2020-04-1528.93%63,201.34-13.82%5.98%-1,144.086,622.99-6,908,992.84
SWPTN105SwaptionIG33 5yr200,000,000.0046.5842.5Longreceiver2020-05-2041.02%127,547.56-19.02%25.85%-1,214.846,979.90-11,222,185.16
SWPTN106SwaptionIG33 5yr200,000,000.0046.5860.0Shortpayer2020-05-2056.10%-264,316.54-34.57%-24.46%2,167.00-9,068.51-20,398,849.70
" ], "text/plain": [ "Portfolio 2020-01-24\n", "\n", " Product Index Notional Ref Strike Direction Type Expiry Vol \\\n", "ids \n", "SWPTN91 Swaption IG33 5yr 200,000,000.00 46.59 45.0 Long receiver 2020-02-19 40.83% \n", "SWPTN92 Swaption IG33 5yr 200,000,000.00 46.59 65.0 Short payer 2020-02-19 74.83% \n", "SWPTN97 Swaption IG33 5yr 200,000,000.00 46.59 42.5 Long receiver 2020-03-18 37.97% \n", "SWPTN107 Swaption IG33 5yr 200,000,000.00 46.59 42.5 Long receiver 2020-03-18 37.97% \n", "SWPTN108 Swaption IG33 5yr 200,000,000.00 46.59 55.0 Short payer 2020-03-18 54.38% \n", "SWPTN98 Swaption IG33 5yr 200,000,000.00 46.59 57.5 Short payer 2020-03-18 57.60% \n", "SWPTN93 Swaption IG33 5yr 300,000,000.00 46.59 62.5 Short payer 2020-03-18 63.32% \n", "SWPTN103 Swaption IG33 5yr 200,000,000.00 46.59 42.5 Long receiver 2020-04-15 39.55% \n", "SWPTN101 Swaption IG33 5yr 100,000,000.00 46.58 42.5 Long receiver 2020-04-15 39.56% \n", "SWPTN99 Swaption IG33 5yr 200,000,000.00 46.58 42.5 Long receiver 2020-04-15 39.56% \n", "SWPTN102 Swaption IG33 5yr 100,000,000.00 46.58 57.5 Short payer 2020-04-15 55.32% \n", "SWPTN104 Swaption IG33 5yr 200,000,000.00 46.58 57.5 Short payer 2020-04-15 55.32% \n", "SWPTN100 Swaption IG33 5yr 200,000,000.00 46.58 60.0 Short payer 2020-04-15 57.63% \n", "SWPTN110 Swaption HY33 5yr 50,000,000.00 108.92 105.0 Short payer 2020-04-15 48.17% \n", "SWPTN109 Swaption HY33 5yr 50,000,000.00 108.92 109.5 Long receiver 2020-04-15 28.93% \n", "SWPTN105 Swaption IG33 5yr 200,000,000.00 46.58 42.5 Long receiver 2020-05-20 41.02% \n", "SWPTN106 Swaption IG33 5yr 200,000,000.00 46.58 60.0 Short payer 2020-05-20 56.10% \n", "\n", " PV Delta Gamma Theta Vega HY Equiv \n", "ids \n", "SWPTN91 96,319.39 -26.75% 60.60% -3,188.64 4,080.47 -15,787,111.54 \n", "SWPTN92 -23,794.79 -7.31% -15.04% 2,128.60 -1,542.26 -4,314,115.94 \n", "SWPTN97 63,066.05 -15.51% 36.70% -1,502.93 4,332.40 -9,151,352.04 \n", "SWPTN107 63,066.05 -15.51% 36.70% -1,502.93 4,332.40 -9,151,352.04 \n", "SWPTN108 -152,837.83 -30.95% -34.76% 2,916.80 -5,825.18 -18,264,316.98 \n", "SWPTN98 -124,368.10 -25.43% -30.04% 2,793.20 -5,282.54 -15,009,920.16 \n", "SWPTN93 -128,800.98 -17.73% -22.36% 3,702.11 -6,405.66 -15,692,360.25 \n", "SWPTN103 95,237.93 -17.86% 30.89% -1,363.28 5,704.92 -10,542,143.17 \n", "SWPTN101 47,737.99 -17.90% 30.92% -682.45 2,855.09 -5,281,382.51 \n", "SWPTN99 95,475.99 -17.90% 30.92% -1,364.90 5,710.18 -10,562,765.02 \n", "SWPTN102 -100,969.24 -32.34% -28.64% 1,236.12 -3,680.38 -9,542,511.78 \n", "SWPTN104 -201,938.48 -32.34% -28.64% 2,472.24 -7,360.76 -19,085,023.56 \n", "SWPTN100 -171,842.33 -27.86% -25.74% 2,399.51 -6,871.65 -16,441,512.64 \n", "SWPTN110 -165,874.84 -21.56% -4.50% 2,606.42 -8,963.31 -10,777,542.75 \n", "SWPTN109 63,201.34 -13.82% 5.98% -1,144.08 6,622.99 -6,908,992.84 \n", "SWPTN105 127,547.56 -19.02% 25.85% -1,214.84 6,979.90 -11,222,185.16 \n", "SWPTN106 -264,316.54 -34.57% -24.46% 2,167.00 -9,068.51 -20,398,849.70 " ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portf = get_swaption_portfolio(value_date, conn, source_list=[\"GS\"])\n", "portf" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "df = portf._todf()\n", "positions = df.set_index(\"Index\")[[\"Delta\", \"Notional\"]].prod(axis=1).groupby(level=\"Index\").sum()\n", "positions.name = 'current_delta'\n", "gamma = df.set_index(\"Index\")[[\"Gamma\", \"Notional\"]].prod(axis=1).groupby(level=\"Index\").sum()\n", "gamma.name = 'gamma'" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "hedges = pd.read_sql_query(\"SELECT security_desc, notional FROM list_cds_positions_by_strat(%s) \"\n", " \"WHERE folder in ('IGOPTDEL', 'HYOPTDEL')\",\n", " conn, params=(value_date,))" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
current hedgecurrent_deltagammanet_delta
Index
HY33 5yr18,500,000.00-17,686,535.58741,481.67813,464.42
IG33 5yr646,400,000.00-645,431,240.7361,135,754.02968,759.27
\n", "
" ], "text/plain": [ " current hedge current_delta gamma net_delta\n", "Index \n", "HY33 5yr 18,500,000.00 -17,686,535.58 741,481.67 813,464.42\n", "IG33 5yr 646,400,000.00 -645,431,240.73 61,135,754.02 968,759.27" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def f(s):\n", " l = s.split(\" \")\n", " return f\"{l[1]}{l[3][1:]} {l[4].lower()}r\"\n", "\n", "hedges[\"Index\"] = hedges[\"security_desc\"].apply(f)\n", "hedges = hedges.rename(columns={\"notional\": \"current hedge\"})\n", "hedges = hedges.set_index(\"Index\")[\"current hedge\"]\n", "hedges = hedges.reindex(positions.index, fill_value=0.)\n", "risk = pd.concat([hedges, positions, gamma], axis=1)\n", "risk['net_delta'] = risk[\"current hedge\"] + risk.current_delta\n", "risk" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10457.96370760693" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portf.theta" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.1" } }, "nbformat": 4, "nbformat_minor": 4 }