diff options
| -rw-r--r-- | python/analytics/__init__.py | 5 | ||||
| -rw-r--r-- | python/analytics/curve_trades.py | 8 | ||||
| -rw-r--r-- | python/analytics/tranche_basket.py | 13 | ||||
| -rw-r--r-- | python/notebooks/Reto Report.ipynb | 58 |
4 files changed, 47 insertions, 37 deletions
diff --git a/python/analytics/__init__.py b/python/analytics/__init__.py index 7fce2295..8875a11d 100644 --- a/python/analytics/__init__.py +++ b/python/analytics/__init__.py @@ -1,3 +1,4 @@ +from .curve_trades import on_the_run from .index import CreditIndex, ForwardIndex from .option import (BlackSwaption, Swaption, ATMstrike, ProbSurface, QuoteSurface, VolSurface, BlackSwaptionVolSurface) @@ -8,8 +9,8 @@ from .ir_swaption import IRSwaption import datetime -def init_ontr(): +def init_ontr(value_date=datetime.date.today()): global _ontr, _beta - _ontr = CreditIndex('HY', 31, '5yr') + _ontr = CreditIndex('HY', on_the_run("HY", value_date), '5yr', value_date) _ontr.mark() _beta = {'HY': 1, 'IG': .3, 'EU': .22} diff --git a/python/analytics/curve_trades.py b/python/analytics/curve_trades.py index 73be4ab5..9fe7da00 100644 --- a/python/analytics/curve_trades.py +++ b/python/analytics/curve_trades.py @@ -10,15 +10,17 @@ from itertools import chain from copy import deepcopy from matplotlib import cm +import datetime import pandas as pd import math import statsmodels.formula.api as smf import numpy as np import matplotlib.pyplot as plt -def on_the_run(index): - r = serenitas_engine.execute("SELECT max(series) FROM index_version WHERE index=%s", - (index,)) +def on_the_run(index, value_date=datetime.date.today()): + r = serenitas_engine.execute("SELECT max(series) FROM index_maturity WHERE index=%s " + "and issue_date <= %s", + (index, value_date)) series, = r.fetchone() return series diff --git a/python/analytics/tranche_basket.py b/python/analytics/tranche_basket.py index 3167841d..728662e9 100644 --- a/python/analytics/tranche_basket.py +++ b/python/analytics/tranche_basket.py @@ -24,12 +24,23 @@ class DualCorrTranche(): _cache = LRU(64) _Legs = namedtuple('Legs', 'coupon_leg, protection_leg, bond_price') - def __init__(self, index_type: str, series: int, tenor: str, *, + def __init__(self, index_type: str=None, series: int=None, + tenor: str=None, *, attach: float, detach: float, corr_attach: float, corr_detach: float, tranche_running: float, notional: float=10_000_000, + redcode: str=None, + maturity: datetime.date=None, value_date: pd.Timestamp=pd.Timestamp.today().normalize(), use_trunc=False): + + if all((redcode, maturity)): + r = (serenitas_engine. + execute("SELECT index, series, tenor FROM index_desc " + "WHERE redindexcode=%s AND maturity = %s", + (redcode, maturity))) + index_type, series, tenor = next(r) + self._index = BasketIndex(index_type, series, [tenor], value_date=value_date) diff --git a/python/notebooks/Reto Report.ipynb b/python/notebooks/Reto Report.ipynb index f1a8d9e8..f45b54ce 100644 --- a/python/notebooks/Reto Report.ipynb +++ b/python/notebooks/Reto Report.ipynb @@ -7,21 +7,15 @@ "outputs": [], "source": [ "import datetime\n", - "import pandas.tseries.offsets as off\n", + "from pandas.tseries.offsets import BDay, MonthEnd\n", "import globeop_reports as go\n", "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import exploration.VaR as var\n", "import analytics\n", "\n", - "from analytics.curve_trades import curve_pos, on_the_run\n", "from analytics.index_data import get_index_quotes\n", - "from analytics.scenarios import run_portfolio_scenarios, run_swaption_scenarios\n", - "from analytics import Swaption, BlackSwaption, CreditIndex, BlackSwaptionVolSurface, Portfolio, ProbSurface, DualCorrTranche\n", - "from db import serenitas_engine, dawn_engine\n", - "\n", - "analytics.init_ontr()" + "from analytics.scenarios import run_portfolio_scenarios\n", + "from analytics import BlackSwaption, CreditIndex, BlackSwaptionVolSurface, Portfolio,DualCorrTranche\n", + "from db import dawn_engine" ] }, { @@ -31,8 +25,8 @@ "outputs": [], "source": [ "#PNL Allocation\n", - "date = datetime.date.today() - off.BDay(1)\n", - "report_date = date - off.MonthEnd(1)\n", + "date = datetime.date.today() - BDay(1)\n", + "report_date = date - MonthEnd(1)\n", "report_date" ] }, @@ -70,7 +64,7 @@ "nav = go.get_net_navs()\n", "sql_string = \"SELECT * FROM bonds WHERE buysell IS False\"\n", "df = pd.read_sql_query(sql_string, dawn_engine,\n", - " parse_dates={'lastupdate':'utc=True', 'trade_date':'', 'settle_date':''},\n", + " parse_dates={'lastupdate':{'utc':True}, 'trade_date': {}, 'settle_date':{}},\n", " index_col = 'trade_date')\n", "df = df.groupby(pd.Grouper(freq='M')).sum()\n", "#Now get portfolio paydown per month\n", @@ -102,6 +96,19 @@ "metadata": {}, "outputs": [], "source": [ + "position_date = (datetime.date.today() - BDay(1)).date()\n", + "spread_date = position_date\n", + "shock_date = (datetime.date.today() - BDay(1)).date()\n", + "(position_date, spread_date, shock_date)\n", + "analytics.init_ontr(spread_date)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "#Calculate amount of stress for reports\n", "df = get_index_quotes('HY', list(range(on_the_run('HY') - 10, on_the_run('HY') + 1)),\n", " tenor=['5yr'], years=5)\n", @@ -122,18 +129,6 @@ "metadata": {}, "outputs": [], "source": [ - "position_date = (datetime.date.today() - pd.tseries.offsets.BDay(1)).date()\n", - "spread_date = position_date\n", - "shock_date = (datetime.date.today() - pd.tseries.offsets.BDay(1)).date()\n", - "(position_date, spread_date, shock_date)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ "#tranche positions\n", "df_tranches = pd.read_sql_query(\"SELECT * from list_tranche_positions_by_strat(%s)\",\n", " dawn_engine, params=(position_date,))\n", @@ -172,19 +167,17 @@ " for t in df_curve.itertuples(index=False)])\n", "curve_portf.value_date = spread_date\n", "curve_portf.mark()\n", - "portf.add_trade(CreditIndex('HY', on_the_run('HY'), '5yr', \n", + "portf.add_trade(CreditIndex('HY', on_the_run('HY', spread_date), '5yr', \n", " value_date=spread_date, \n", " notional=-curve_portf.hy_equiv), ('curve_trades', ''))\n", " \n", "#get bond risks:\n", "rmbs_pos = go.rmbs_pos(position_date)\n", "clo_pos = go.clo_pos(position_date)\n", - "r = serenitas_engine.execute(\"select duration from on_the_run where index = 'HY' and date = %s\",\n", - " spread_date)\n", - "duration, = next(r)\n", + "duration = analytics._ontr.risky_annuity\n", "rmbs_pos['hy_equiv'] = rmbs_pos['delta_yield']/duration * 100\n", "notional = rmbs_pos['hy_equiv'].sum() + clo_pos['hy_equiv'].sum()\n", - "portf.add_trade(CreditIndex('HY', on_the_run('HY'), '5yr', \n", + "portf.add_trade(CreditIndex('HY', on_the_run('HY', spread_date), '5yr', \n", " value_date = spread_date, \n", " notional = -notional), ('bonds', ''))\n", " \n", @@ -213,6 +206,7 @@ " groupby(level=0, axis=1).sum())\n", "attrib.columns.name = 'strategy'\n", "results = attrib.xs((widen[2], 0.), level=['spread_shock', 'corr_shock']).unstack('strategy')\n", + "results.name = 'pnl'\n", "#results.to_clipboard(header=True)" ] }, @@ -221,7 +215,9 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "results.to_clipboard(header=True)" + ] } ], "metadata": { |
