{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import datetime\n", "import pandas as pd\n", "import numpy as np\n", "\n", "from graphics import plot_time_color_map, plot_color_map\n", "from analytics import Swaption, BlackSwaption, BlackSwaptionVolSurface, Index, Portfolio\n", "from analytics.scenarios import run_swaption_scenarios, run_index_scenarios, run_portfolio_scenarios\n", "from scipy.interpolate import SmoothBivariateSpline\n", "from db import dbengine" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Delta Chart: Red = Long Risk, Blue = Short Risk" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def plot_trade_scenarios(portf, shock_min=-.15, shock_max=.2, period=-1, vol_time_roll=True):\n", " portf.reset_pv()\n", " earliest_date = min(portf.swaptions, key=lambda x: x.exercise_date).exercise_date\n", " date_range = pd.bdate_range(portf.indices[0].value_date,\n", " earliest_date - pd.tseries.offsets.BDay(), freq='3B')\n", " vol_shock = np.arange(-0.15, 0.3, 0.01)\n", " spread_shock = np.arange(shock_min, shock_max, 0.01)\n", " index = portf.indices[0].name.split()[1]\n", " series = portf.indices[0].name.split()[3][1:]\n", " vs = BlackSwaptionVolSurface(index, series, value_date=portf.indices[0].value_date)\n", " vol_surface = vs[vs.list(option_type='payer')[-1]]\n", "\n", " df = run_portfolio_scenarios(portf, date_range, spread_shock, vol_shock, vol_surface,\n", " params=[\"pnl\",\"delta\"])\n", "\n", " hy_plot_range = 100 + (500 - portf.indices[0].spread * (1 + spread_shock)) * \\\n", " abs(portf.indices[0].DV01) / portf.indices[0].notional * 100\n", "\n", " shock = hy_plot_range if index == 'HY' else portf.indices[0].spread * (1 + spread_shock)\n", "\n", " plot_time_color_map(df[round(df.vol_shock,2)==0], shock, 'pnl', index=index)\n", " plot_time_color_map(df[round(df.vol_shock,2)==.2], shock, 'pnl', index=index)\n", " plot_color_map(df.loc[date_range[period]], shock, vol_shock, 'pnl', index=index)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Ad hoc\n", "option_delta = Index.from_name('IG', 30, '5yr', value_date=datetime.date(2018, 5, 17))\n", "option_delta.spread = 61\n", "option1 = BlackSwaption(option_delta, datetime.date(2018, 8, 15), 60, option_type=\"payer\")\n", "option2 = BlackSwaption(option_delta, datetime.date(2018, 8, 15), 80, option_type=\"payer\")\n", "option3 = BlackSwaption(option_delta, datetime.date(2018, 8, 15), 80, option_type=\"payer\")\n", "option1.sigma = .381\n", "option2.sigma = .545\n", "option3.sigma = .69\n", "option1.notional = 100_000_000\n", "option2.notional = 300_000_000\n", "option3.notional = 1\n", "option1.direction = 'Long'\n", "option2.direction = 'Short'\n", "option3.direction = 'Long'\n", "#option_delta.notional = 1\n", "option_delta.notional = option1.notional * option1.delta + option2.notional * option2.delta + option3.notional * option3.delta\n", "option_delta.direction = 'Seller' if option_delta.notional > 0 else 'Buyer'\n", "option_delta.notional = abs(option_delta.notional)\n", "portf = Portfolio([option1, option2, option3, option_delta])\n", "#Plot Scenarios Inputs: Portfolio, spread shock tightening%, spread shock widening%, snapshot period)\n", "portf" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_trade_scenarios(portf, -.15, .8, -4, vol_time_roll=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Dec Jan 2017 Trade\n", "option_delta = Index.from_tradeid(864)\n", "option1 = BlackSwaption.from_tradeid(3, option_delta)\n", "option2 = BlackSwaption.from_tradeid(4, option_delta)\n", "portf = Portfolio([option1, option2, option_delta])\n", "#plot_trade_scenarios(portf)\n", "\n", "#Feb 2017: Sell May Buy April Calendar Trade\n", "option_delta = Index.from_tradeid(870)\n", "option1 = BlackSwaption.from_tradeid(5, option_delta)\n", "option2 = BlackSwaption.from_tradeid(6, option_delta)\n", "portf = Portfolio([option1, option2, option_delta])\n", "#plot_trade_scenarios(portf)\n", "\n", "#April 2017: Sell May Buy June Calendar Trade\n", "option_delta = Index.from_tradeid(874)\n", "option1 = BlackSwaption.from_tradeid(7, option_delta)\n", "option2 = BlackSwaption.from_tradeid(8, option_delta)\n", "portf = Portfolio([option1, option2, option_delta])\n", "#plot_trade_scenarios(portf)\n", "\n", "#June July 2017 Calendar Trade\n", "option_delta_pf = Index.from_tradeid(874)\n", "option_delta2_pf = Index.from_tradeid(879)\n", "\n", "option1_pf = BlackSwaption.from_tradeid(7, option_delta_pf)\n", "option2_pf = BlackSwaption.from_tradeid(9, option_delta_pf)\n", "option_delta_pf.notional = 50_335_169\n", "\n", "portf = Portfolio([option1_pf, option2_pf, option_delta_pf])\n", "portf.value_date = datetime.date(2017, 5, 17)\n", "portf.mark()\n", "#plot_trade_scenarios(portf)\n", "\n", "#July 2017: 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", "#plot_trade_scenarios(portf)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Look at steepness of volatility - 90 days, .75 vs .25 payer deltas\n", "sql_str = \"select b.quotedate, b.ref, b.ref_id, b.expiry, a.delta_pay, a.vol from \" \\\n", " \"swaption_quotes a join swaption_ref_quotes b on a.ref_id = b.ref_id and index = 'IG'\"\n", "df = pd.read_sql_query(sql_str, dbengine('serenitasdb'), \n", " index_col=['quotedate'], parse_dates={'quotedate': {'utc': True}})\n", "df['days_expiry'] = (df.expiry - df.index.date).dt.days\n", "r_1 = []\n", "for i, g in df.groupby(pd.Grouper(freq='D', level='quotedate')):\n", " r = []\n", " for i_1, g_1 in g.groupby(['days_expiry', 'delta_pay']):\n", " r.append([i_1[0], i_1[1], g_1['vol'].mean()])\n", " if len(r) > 0:\n", " temp = np.dstack(r)\n", " f = SmoothBivariateSpline(temp[0][0], temp[0][1], temp[0][2])\n", " r = (f(90, .75) - f(90, .25))[0][0]\n", " r_1.append([i, r])\n", " else:\n", " pass\n", "df_1 = pd.DataFrame(r_1, columns=['date', 'steepness'])\n", "df_1.set_index('date').plot()" ] }, { "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }