diff options
Diffstat (limited to 'python/notebooks/swaption_risk.ipynb')
| -rw-r--r-- | python/notebooks/swaption_risk.ipynb | 466 |
1 files changed, 454 insertions, 12 deletions
diff --git a/python/notebooks/swaption_risk.ipynb b/python/notebooks/swaption_risk.ipynb index 00b5db55..ce860db3 100644 --- a/python/notebooks/swaption_risk.ipynb +++ b/python/notebooks/swaption_risk.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -21,24 +21,389 @@ "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", - "init_ontr()" + "value_date = datetime.date.today()\n", + "init_ontr(value_date)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "Portfolio 2020-01-22\n", + "\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Product</th>\n", + " <th>Index</th>\n", + " <th>Notional</th>\n", + " <th>Ref</th>\n", + " <th>Strike</th>\n", + " <th>Direction</th>\n", + " <th>Type</th>\n", + " <th>Expiry</th>\n", + " <th>Vol</th>\n", + " <th>PV</th>\n", + " <th>Delta</th>\n", + " <th>Gamma</th>\n", + " <th>Theta</th>\n", + " <th>Vega</th>\n", + " <th>HY Equiv</th>\n", + " </tr>\n", + " <tr>\n", + " <th>ids</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", + " <th></th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>SWPTN91</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.13</td>\n", + " <td>45.0</td>\n", + " <td>Long</td>\n", + " <td>receiver</td>\n", + " <td>2020-02-19</td>\n", + " <td>40.74%</td>\n", + " <td>150,061.67</td>\n", + " <td>-37.06%</td>\n", + " <td>66.00%</td>\n", + " <td>-3,327.79</td>\n", + " <td>4,576.20</td>\n", + " <td>-21,825,100.50</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN92</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.13</td>\n", + " <td>65.0</td>\n", + " <td>Short</td>\n", + " <td>payer</td>\n", + " <td>2020-02-19</td>\n", + " <td>75.62%</td>\n", + " <td>-20,633.56</td>\n", + " <td>-6.40%</td>\n", + " <td>-13.42%</td>\n", + " <td>1,809.79</td>\n", + " <td>-1,399.72</td>\n", + " <td>-3,765,995.13</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN97</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.13</td>\n", + " <td>42.5</td>\n", + " <td>Long</td>\n", + " <td>receiver</td>\n", + " <td>2020-03-18</td>\n", + " <td>38.45%</td>\n", + " <td>96,216.26</td>\n", + " <td>-21.68%</td>\n", + " <td>43.36%</td>\n", + " <td>-1,761.48</td>\n", + " <td>5,166.44</td>\n", + " <td>-12,768,492.88</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN107</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.13</td>\n", + " <td>42.5</td>\n", + " <td>Long</td>\n", + " <td>receiver</td>\n", + " <td>2020-03-18</td>\n", + " <td>38.45%</td>\n", + " <td>96,216.26</td>\n", + " <td>-21.68%</td>\n", + " <td>43.36%</td>\n", + " <td>-1,761.48</td>\n", + " <td>5,166.44</td>\n", + " <td>-12,768,492.88</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN108</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.13</td>\n", + " <td>55.0</td>\n", + " <td>Short</td>\n", + " <td>payer</td>\n", + " <td>2020-03-18</td>\n", + " <td>54.75%</td>\n", + " <td>-123,985.48</td>\n", + " <td>-26.66%</td>\n", + " <td>-32.67%</td>\n", + " <td>2,590.27</td>\n", + " <td>-5,340.77</td>\n", + " <td>-15,699,000.27</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN98</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.13</td>\n", + " <td>57.5</td>\n", + " <td>Short</td>\n", + " <td>payer</td>\n", + " <td>2020-03-18</td>\n", + " <td>57.96%</td>\n", + " <td>-101,557.29</td>\n", + " <td>-21.92%</td>\n", + " <td>-27.94%</td>\n", + " <td>2,453.43</td>\n", + " <td>-4,793.54</td>\n", + " <td>-12,910,454.18</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN93</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>300,000,000.00</td>\n", + " <td>45.13</td>\n", + " <td>62.5</td>\n", + " <td>Short</td>\n", + " <td>payer</td>\n", + " <td>2020-03-18</td>\n", + " <td>63.80%</td>\n", + " <td>-107,301.85</td>\n", + " <td>-15.41%</td>\n", + " <td>-20.60%</td>\n", + " <td>3,231.38</td>\n", + " <td>-5,769.27</td>\n", + " <td>-13,613,875.38</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN103</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.13</td>\n", + " <td>42.5</td>\n", + " <td>Long</td>\n", + " <td>receiver</td>\n", + " <td>2020-04-15</td>\n", + " <td>39.95%</td>\n", + " <td>130,102.18</td>\n", + " <td>-22.89%</td>\n", + " <td>35.40%</td>\n", + " <td>-1,518.80</td>\n", + " <td>6,419.89</td>\n", + " <td>-13,477,124.52</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN101</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>100,000,000.00</td>\n", + " <td>45.13</td>\n", + " <td>42.5</td>\n", + " <td>Long</td>\n", + " <td>receiver</td>\n", + " <td>2020-04-15</td>\n", + " <td>39.95%</td>\n", + " <td>65,051.09</td>\n", + " <td>-22.89%</td>\n", + " <td>35.40%</td>\n", + " <td>-759.40</td>\n", + " <td>3,209.94</td>\n", + " <td>-6,738,562.26</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN99</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.12</td>\n", + " <td>42.5</td>\n", + " <td>Long</td>\n", + " <td>receiver</td>\n", + " <td>2020-04-15</td>\n", + " <td>39.96%</td>\n", + " <td>130,399.30</td>\n", + " <td>-22.93%</td>\n", + " <td>35.43%</td>\n", + " <td>-1,520.20</td>\n", + " <td>6,424.14</td>\n", + " <td>-13,500,437.56</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN102</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>100,000,000.00</td>\n", + " <td>45.12</td>\n", + " <td>57.5</td>\n", + " <td>Short</td>\n", + " <td>payer</td>\n", + " <td>2020-04-15</td>\n", + " <td>55.99%</td>\n", + " <td>-86,043.53</td>\n", + " <td>-28.92%</td>\n", + " <td>-27.46%</td>\n", + " <td>1,137.31</td>\n", + " <td>-3,432.55</td>\n", + " <td>-8,516,333.11</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN104</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.12</td>\n", + " <td>57.5</td>\n", + " <td>Short</td>\n", + " <td>payer</td>\n", + " <td>2020-04-15</td>\n", + " <td>55.99%</td>\n", + " <td>-172,087.07</td>\n", + " <td>-28.92%</td>\n", + " <td>-27.46%</td>\n", + " <td>2,274.63</td>\n", + " <td>-6,865.09</td>\n", + " <td>-17,032,666.22</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN100</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.12</td>\n", + " <td>60.0</td>\n", + " <td>Short</td>\n", + " <td>payer</td>\n", + " <td>2020-04-15</td>\n", + " <td>58.42%</td>\n", + " <td>-147,765.75</td>\n", + " <td>-24.99%</td>\n", + " <td>-24.50%</td>\n", + " <td>2,198.93</td>\n", + " <td>-6,373.46</td>\n", + " <td>-14,714,847.97</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN105</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.12</td>\n", + " <td>42.5</td>\n", + " <td>Long</td>\n", + " <td>receiver</td>\n", + " <td>2020-05-20</td>\n", + " <td>41.20%</td>\n", + " <td>161,429.07</td>\n", + " <td>-23.06%</td>\n", + " <td>29.16%</td>\n", + " <td>-1,309.02</td>\n", + " <td>7,595.96</td>\n", + " <td>-13,577,001.50</td>\n", + " </tr>\n", + " <tr>\n", + " <th>SWPTN106</th>\n", + " <td>Swaption</td>\n", + " <td>IG33 5yr</td>\n", + " <td>200,000,000.00</td>\n", + " <td>45.12</td>\n", + " <td>60.0</td>\n", + " <td>Short</td>\n", + " <td>payer</td>\n", + " <td>2020-05-20</td>\n", + " <td>56.55%</td>\n", + " <td>-229,470.13</td>\n", + " <td>-31.54%</td>\n", + " <td>-23.91%</td>\n", + " <td>2,020.49</td>\n", + " <td>-8,542.41</td>\n", + " <td>-18,570,543.35</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>" + ], + "text/plain": [ + "Portfolio 2020-01-22\n", + "\n", + " Product Index Notional Ref Strike Direction Type Expiry Vol \\\n", + "ids \n", + "SWPTN91 Swaption IG33 5yr 200,000,000.00 45.13 45.0 Long receiver 2020-02-19 40.74% \n", + "SWPTN92 Swaption IG33 5yr 200,000,000.00 45.13 65.0 Short payer 2020-02-19 75.62% \n", + "SWPTN97 Swaption IG33 5yr 200,000,000.00 45.13 42.5 Long receiver 2020-03-18 38.45% \n", + "SWPTN107 Swaption IG33 5yr 200,000,000.00 45.13 42.5 Long receiver 2020-03-18 38.45% \n", + "SWPTN108 Swaption IG33 5yr 200,000,000.00 45.13 55.0 Short payer 2020-03-18 54.75% \n", + "SWPTN98 Swaption IG33 5yr 200,000,000.00 45.13 57.5 Short payer 2020-03-18 57.96% \n", + "SWPTN93 Swaption IG33 5yr 300,000,000.00 45.13 62.5 Short payer 2020-03-18 63.80% \n", + "SWPTN103 Swaption IG33 5yr 200,000,000.00 45.13 42.5 Long receiver 2020-04-15 39.95% \n", + "SWPTN101 Swaption IG33 5yr 100,000,000.00 45.13 42.5 Long receiver 2020-04-15 39.95% \n", + "SWPTN99 Swaption IG33 5yr 200,000,000.00 45.12 42.5 Long receiver 2020-04-15 39.96% \n", + "SWPTN102 Swaption IG33 5yr 100,000,000.00 45.12 57.5 Short payer 2020-04-15 55.99% \n", + "SWPTN104 Swaption IG33 5yr 200,000,000.00 45.12 57.5 Short payer 2020-04-15 55.99% \n", + "SWPTN100 Swaption IG33 5yr 200,000,000.00 45.12 60.0 Short payer 2020-04-15 58.42% \n", + "SWPTN105 Swaption IG33 5yr 200,000,000.00 45.12 42.5 Long receiver 2020-05-20 41.20% \n", + "SWPTN106 Swaption IG33 5yr 200,000,000.00 45.12 60.0 Short payer 2020-05-20 56.55% \n", + "\n", + " PV Delta Gamma Theta Vega HY Equiv \n", + "ids \n", + "SWPTN91 150,061.67 -37.06% 66.00% -3,327.79 4,576.20 -21,825,100.50 \n", + "SWPTN92 -20,633.56 -6.40% -13.42% 1,809.79 -1,399.72 -3,765,995.13 \n", + "SWPTN97 96,216.26 -21.68% 43.36% -1,761.48 5,166.44 -12,768,492.88 \n", + "SWPTN107 96,216.26 -21.68% 43.36% -1,761.48 5,166.44 -12,768,492.88 \n", + "SWPTN108 -123,985.48 -26.66% -32.67% 2,590.27 -5,340.77 -15,699,000.27 \n", + "SWPTN98 -101,557.29 -21.92% -27.94% 2,453.43 -4,793.54 -12,910,454.18 \n", + "SWPTN93 -107,301.85 -15.41% -20.60% 3,231.38 -5,769.27 -13,613,875.38 \n", + "SWPTN103 130,102.18 -22.89% 35.40% -1,518.80 6,419.89 -13,477,124.52 \n", + "SWPTN101 65,051.09 -22.89% 35.40% -759.40 3,209.94 -6,738,562.26 \n", + "SWPTN99 130,399.30 -22.93% 35.43% -1,520.20 6,424.14 -13,500,437.56 \n", + "SWPTN102 -86,043.53 -28.92% -27.46% 1,137.31 -3,432.55 -8,516,333.11 \n", + "SWPTN104 -172,087.07 -28.92% -27.46% 2,274.63 -6,865.09 -17,032,666.22 \n", + "SWPTN100 -147,765.75 -24.99% -24.50% 2,198.93 -6,373.46 -14,714,847.97 \n", + "SWPTN105 161,429.07 -23.06% 29.16% -1,309.02 7,595.96 -13,577,001.50 \n", + "SWPTN106 -229,470.13 -31.54% -23.91% 2,020.49 -8,542.41 -18,570,543.35 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "portf = get_swaption_portfolio(datetime.date.today(), conn, source_list=['GS'])\n", + "portf = get_swaption_portfolio(value_date, conn, source_list=[\"GS\"])\n", "portf" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -51,20 +416,77 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "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=(datetime.date.today(),))" + " conn, params=(value_date,))" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>current hedge</th>\n", + " <th>current_delta</th>\n", + " <th>gamma</th>\n", + " <th>net_delta</th>\n", + " </tr>\n", + " <tr>\n", + " <th>Index</th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " <th></th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>IG33 5yr</th>\n", + " <td>681,400,000.00</td>\n", + " <td>-677,507,134.07</td>\n", + " <td>151,731,367.46</td>\n", + " <td>3,892,865.93</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " current hedge current_delta gamma net_delta\n", + "Index \n", + "IG33 5yr 681,400,000.00 -677,507,134.07 151,731,367.46 3,892,865.93" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "def f(s):\n", " l = s.split(\" \")\n", @@ -81,6 +503,26 @@ }, { "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5758.050875686662" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "portf.theta" + ] + }, + { + "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], @@ -103,7 +545,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.8.1" } }, "nbformat": 4, |
