{
"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",
" 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",
" 46.59 | \n",
" 45.0 | \n",
" Long | \n",
" receiver | \n",
" 2020-02-19 | \n",
" 40.83% | \n",
" 96,319.39 | \n",
" -26.75% | \n",
" 60.60% | \n",
" -3,188.64 | \n",
" 4,080.47 | \n",
" -15,787,111.54 | \n",
"
\n",
" \n",
" | SWPTN92 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.59 | \n",
" 65.0 | \n",
" Short | \n",
" payer | \n",
" 2020-02-19 | \n",
" 74.83% | \n",
" -23,794.79 | \n",
" -7.31% | \n",
" -15.04% | \n",
" 2,128.60 | \n",
" -1,542.26 | \n",
" -4,314,115.94 | \n",
"
\n",
" \n",
" | SWPTN97 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.59 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-03-18 | \n",
" 37.97% | \n",
" 63,066.05 | \n",
" -15.51% | \n",
" 36.70% | \n",
" -1,502.93 | \n",
" 4,332.40 | \n",
" -9,151,352.04 | \n",
"
\n",
" \n",
" | SWPTN107 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.59 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-03-18 | \n",
" 37.97% | \n",
" 63,066.05 | \n",
" -15.51% | \n",
" 36.70% | \n",
" -1,502.93 | \n",
" 4,332.40 | \n",
" -9,151,352.04 | \n",
"
\n",
" \n",
" | SWPTN108 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.59 | \n",
" 55.0 | \n",
" Short | \n",
" payer | \n",
" 2020-03-18 | \n",
" 54.38% | \n",
" -152,837.83 | \n",
" -30.95% | \n",
" -34.76% | \n",
" 2,916.80 | \n",
" -5,825.18 | \n",
" -18,264,316.98 | \n",
"
\n",
" \n",
" | SWPTN98 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.59 | \n",
" 57.5 | \n",
" Short | \n",
" payer | \n",
" 2020-03-18 | \n",
" 57.60% | \n",
" -124,368.10 | \n",
" -25.43% | \n",
" -30.04% | \n",
" 2,793.20 | \n",
" -5,282.54 | \n",
" -15,009,920.16 | \n",
"
\n",
" \n",
" | SWPTN93 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 300,000,000.00 | \n",
" 46.59 | \n",
" 62.5 | \n",
" Short | \n",
" payer | \n",
" 2020-03-18 | \n",
" 63.32% | \n",
" -128,800.98 | \n",
" -17.73% | \n",
" -22.36% | \n",
" 3,702.11 | \n",
" -6,405.66 | \n",
" -15,692,360.25 | \n",
"
\n",
" \n",
" | SWPTN103 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.59 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-04-15 | \n",
" 39.55% | \n",
" 95,237.93 | \n",
" -17.86% | \n",
" 30.89% | \n",
" -1,363.28 | \n",
" 5,704.92 | \n",
" -10,542,143.17 | \n",
"
\n",
" \n",
" | SWPTN101 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 100,000,000.00 | \n",
" 46.58 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-04-15 | \n",
" 39.56% | \n",
" 47,737.99 | \n",
" -17.90% | \n",
" 30.92% | \n",
" -682.45 | \n",
" 2,855.09 | \n",
" -5,281,382.51 | \n",
"
\n",
" \n",
" | SWPTN99 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.58 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-04-15 | \n",
" 39.56% | \n",
" 95,475.99 | \n",
" -17.90% | \n",
" 30.92% | \n",
" -1,364.90 | \n",
" 5,710.18 | \n",
" -10,562,765.02 | \n",
"
\n",
" \n",
" | SWPTN102 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 100,000,000.00 | \n",
" 46.58 | \n",
" 57.5 | \n",
" Short | \n",
" payer | \n",
" 2020-04-15 | \n",
" 55.32% | \n",
" -100,969.24 | \n",
" -32.34% | \n",
" -28.64% | \n",
" 1,236.12 | \n",
" -3,680.38 | \n",
" -9,542,511.78 | \n",
"
\n",
" \n",
" | SWPTN104 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.58 | \n",
" 57.5 | \n",
" Short | \n",
" payer | \n",
" 2020-04-15 | \n",
" 55.32% | \n",
" -201,938.48 | \n",
" -32.34% | \n",
" -28.64% | \n",
" 2,472.24 | \n",
" -7,360.76 | \n",
" -19,085,023.56 | \n",
"
\n",
" \n",
" | SWPTN100 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.58 | \n",
" 60.0 | \n",
" Short | \n",
" payer | \n",
" 2020-04-15 | \n",
" 57.63% | \n",
" -171,842.33 | \n",
" -27.86% | \n",
" -25.74% | \n",
" 2,399.51 | \n",
" -6,871.65 | \n",
" -16,441,512.64 | \n",
"
\n",
" \n",
" | SWPTN110 | \n",
" Swaption | \n",
" HY33 5yr | \n",
" 50,000,000.00 | \n",
" 108.92 | \n",
" 105.0 | \n",
" Short | \n",
" payer | \n",
" 2020-04-15 | \n",
" 48.17% | \n",
" -165,874.84 | \n",
" -21.56% | \n",
" -4.50% | \n",
" 2,606.42 | \n",
" -8,963.31 | \n",
" -10,777,542.75 | \n",
"
\n",
" \n",
" | SWPTN109 | \n",
" Swaption | \n",
" HY33 5yr | \n",
" 50,000,000.00 | \n",
" 108.92 | \n",
" 109.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-04-15 | \n",
" 28.93% | \n",
" 63,201.34 | \n",
" -13.82% | \n",
" 5.98% | \n",
" -1,144.08 | \n",
" 6,622.99 | \n",
" -6,908,992.84 | \n",
"
\n",
" \n",
" | SWPTN105 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.58 | \n",
" 42.5 | \n",
" Long | \n",
" receiver | \n",
" 2020-05-20 | \n",
" 41.02% | \n",
" 127,547.56 | \n",
" -19.02% | \n",
" 25.85% | \n",
" -1,214.84 | \n",
" 6,979.90 | \n",
" -11,222,185.16 | \n",
"
\n",
" \n",
" | SWPTN106 | \n",
" Swaption | \n",
" IG33 5yr | \n",
" 200,000,000.00 | \n",
" 46.58 | \n",
" 60.0 | \n",
" Short | \n",
" payer | \n",
" 2020-05-20 | \n",
" 56.10% | \n",
" -264,316.54 | \n",
" -34.57% | \n",
" -24.46% | \n",
" 2,167.00 | \n",
" -9,068.51 | \n",
" -20,398,849.70 | \n",
"
\n",
" \n",
"
"
],
"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",
" current hedge | \n",
" current_delta | \n",
" gamma | \n",
" net_delta | \n",
"
\n",
" \n",
" | Index | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | HY33 5yr | \n",
" 18,500,000.00 | \n",
" -17,686,535.58 | \n",
" 741,481.67 | \n",
" 813,464.42 | \n",
"
\n",
" \n",
" | IG33 5yr | \n",
" 646,400,000.00 | \n",
" -645,431,240.73 | \n",
" 61,135,754.02 | \n",
" 968,759.27 | \n",
"
\n",
" \n",
"
\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
}