{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"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": 2,
"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": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Portfolio 2020-01-22\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Product | \n",
" Index | \n",
" Notional | \n",
" Ref | \n",
" Strike | \n",
" Direction | \n",
" Type | \n",
" Expiry | \n",
" Vol | \n",
" PV | \n",
" Delta | \n",
" Gamma | \n",
" Theta | \n",
" Vega | \n",
" HY Equiv | \n",
"
\n",
" \n",
" | ids | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | SWPTN91 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.13 | \n",
" 45.0 | \n",
" Long | \n",
" receiver | \n",
" 2020-02-19 | \n",
" 40.74% | \n",
" 150,061.67 | \n",
" -37.06% | \n",
" 66.00% | \n",
" -3,327.79 | \n",
" 4,576.20 | \n",
" -21,825,100.50 | \n",
"
\n",
" \n",
" | SWPTN92 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.13 | \n",
" 65.0 | \n",
" Short | \n",
" payer | \n",
" 2020-02-19 | \n",
" 75.62% | \n",
" -20,633.56 | \n",
" -6.40% | \n",
" -13.42% | \n",
" 1,809.79 | \n",
" -1,399.72 | \n",
" -3,765,995.13 | \n",
"
\n",
" \n",
" | SWPTN97 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.13 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-03-18 | \n",
" 38.45% | \n",
" 96,216.26 | \n",
" -21.68% | \n",
" 43.36% | \n",
" -1,761.48 | \n",
" 5,166.44 | \n",
" -12,768,492.88 | \n",
"
\n",
" \n",
" | SWPTN107 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.13 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-03-18 | \n",
" 38.45% | \n",
" 96,216.26 | \n",
" -21.68% | \n",
" 43.36% | \n",
" -1,761.48 | \n",
" 5,166.44 | \n",
" -12,768,492.88 | \n",
"
\n",
" \n",
" | SWPTN108 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.13 | \n",
" 55.0 | \n",
" Short | \n",
" payer | \n",
" 2020-03-18 | \n",
" 54.75% | \n",
" -123,985.48 | \n",
" -26.66% | \n",
" -32.67% | \n",
" 2,590.27 | \n",
" -5,340.77 | \n",
" -15,699,000.27 | \n",
"
\n",
" \n",
" | SWPTN98 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.13 | \n",
" 57.5 | \n",
" Short | \n",
" payer | \n",
" 2020-03-18 | \n",
" 57.96% | \n",
" -101,557.29 | \n",
" -21.92% | \n",
" -27.94% | \n",
" 2,453.43 | \n",
" -4,793.54 | \n",
" -12,910,454.18 | \n",
"
\n",
" \n",
" | SWPTN93 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 300,000,000.00 | \n",
" 45.13 | \n",
" 62.5 | \n",
" Short | \n",
" payer | \n",
" 2020-03-18 | \n",
" 63.80% | \n",
" -107,301.85 | \n",
" -15.41% | \n",
" -20.60% | \n",
" 3,231.38 | \n",
" -5,769.27 | \n",
" -13,613,875.38 | \n",
"
\n",
" \n",
" | SWPTN103 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.13 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-04-15 | \n",
" 39.95% | \n",
" 130,102.18 | \n",
" -22.89% | \n",
" 35.40% | \n",
" -1,518.80 | \n",
" 6,419.89 | \n",
" -13,477,124.52 | \n",
"
\n",
" \n",
" | SWPTN101 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 100,000,000.00 | \n",
" 45.13 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-04-15 | \n",
" 39.95% | \n",
" 65,051.09 | \n",
" -22.89% | \n",
" 35.40% | \n",
" -759.40 | \n",
" 3,209.94 | \n",
" -6,738,562.26 | \n",
"
\n",
" \n",
" | SWPTN99 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.12 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-04-15 | \n",
" 39.96% | \n",
" 130,399.30 | \n",
" -22.93% | \n",
" 35.43% | \n",
" -1,520.20 | \n",
" 6,424.14 | \n",
" -13,500,437.56 | \n",
"
\n",
" \n",
" | SWPTN102 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 100,000,000.00 | \n",
" 45.12 | \n",
" 57.5 | \n",
" Short | \n",
" payer | \n",
" 2020-04-15 | \n",
" 55.99% | \n",
" -86,043.53 | \n",
" -28.92% | \n",
" -27.46% | \n",
" 1,137.31 | \n",
" -3,432.55 | \n",
" -8,516,333.11 | \n",
"
\n",
" \n",
" | SWPTN104 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.12 | \n",
" 57.5 | \n",
" Short | \n",
" payer | \n",
" 2020-04-15 | \n",
" 55.99% | \n",
" -172,087.07 | \n",
" -28.92% | \n",
" -27.46% | \n",
" 2,274.63 | \n",
" -6,865.09 | \n",
" -17,032,666.22 | \n",
"
\n",
" \n",
" | SWPTN100 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.12 | \n",
" 60.0 | \n",
" Short | \n",
" payer | \n",
" 2020-04-15 | \n",
" 58.42% | \n",
" -147,765.75 | \n",
" -24.99% | \n",
" -24.50% | \n",
" 2,198.93 | \n",
" -6,373.46 | \n",
" -14,714,847.97 | \n",
"
\n",
" \n",
" | SWPTN105 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.12 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-05-20 | \n",
" 41.20% | \n",
" 161,429.07 | \n",
" -23.06% | \n",
" 29.16% | \n",
" -1,309.02 | \n",
" 7,595.96 | \n",
" -13,577,001.50 | \n",
"
\n",
" \n",
" | SWPTN106 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 45.12 | \n",
" 60.0 | \n",
" Short | \n",
" payer | \n",
" 2020-05-20 | \n",
" 56.55% | \n",
" -229,470.13 | \n",
" -31.54% | \n",
" -23.91% | \n",
" 2,020.49 | \n",
" -8,542.41 | \n",
" -18,570,543.35 | \n",
"
\n",
" \n",
"
"
],
"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(value_date, conn, source_list=[\"GS\"])\n",
"portf"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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": 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=(value_date,))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" current hedge | \n",
" current_delta | \n",
" gamma | \n",
" net_delta | \n",
"
\n",
" \n",
" | Index | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | IG33 5yr | \n",
" 681,400,000.00 | \n",
" -677,507,134.07 | \n",
" 151,731,367.46 | \n",
" 3,892,865.93 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"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",
" 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": 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": [],
"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
}