aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/analytics/__init__.py5
-rw-r--r--python/analytics/curve_trades.py8
-rw-r--r--python/analytics/tranche_basket.py13
-rw-r--r--python/notebooks/Reto Report.ipynb58
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": {