diff options
Diffstat (limited to 'python/exploration/VaR.py')
| -rw-r--r-- | python/exploration/VaR.py | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/python/exploration/VaR.py b/python/exploration/VaR.py index 50d637f7..f79b81af 100644 --- a/python/exploration/VaR.py +++ b/python/exploration/VaR.py @@ -6,33 +6,40 @@ import pandas as pd import math import datetime -dawndb = dbengine('dawndb') -serenitasdb = dbengine('serenitasdb') +dawndb = dbengine("dawndb") +serenitasdb = dbengine("serenitasdb") -def hist_var(portf, index_type='IG', quantile=.05, years=5): - df = index_returns(index=index_type, years=years, - tenor=['3yr', '5yr', '7yr', '10yr']) - df = (df.reset_index(['index'], drop=True). - reorder_levels(['date', 'series', 'tenor'])) - returns = df.spread_return.dropna().reset_index('series') - returns['dist_on_the_run'] = (returns. - groupby('date')['series']. - transform(lambda x: x.max() - x)) - del returns['series'] - returns = returns.set_index('dist_on_the_run', append=True).unstack('tenor') + +def hist_var(portf, index_type="IG", quantile=0.05, years=5): + df = index_returns( + index=index_type, years=years, tenor=["3yr", "5yr", "7yr", "10yr"] + ) + df = df.reset_index(["index"], drop=True).reorder_levels( + ["date", "series", "tenor"] + ) + returns = df.spread_return.dropna().reset_index("series") + returns["dist_on_the_run"] = returns.groupby("date")["series"].transform( + lambda x: x.max() - x + ) + del returns["series"] + returns = returns.set_index("dist_on_the_run", append=True).unstack("tenor") returns.columns = returns.columns.droplevel(0) portf.reset_pv() otr = on_the_run(index_type) - spreads = pd.DataFrame({'spread': portf.spread, - 'tenor': [ind.tenor for ind in portf.indices], - 'dist_on_the_run': [otr - ind.series for ind in portf.indices]}) - spreads = spreads.set_index(['dist_on_the_run', 'tenor']) + spreads = pd.DataFrame( + { + "spread": portf.spread, + "tenor": [ind.tenor for ind in portf.indices], + "dist_on_the_run": [otr - ind.series for ind in portf.indices], + } + ) + spreads = spreads.set_index(["dist_on_the_run", "tenor"]) r = [] - for k, g in returns.groupby(level='date', as_index=False): - shocks = g.reset_index('date', drop=True).stack('tenor') - shocks.name = 'shocks' + for k, g in returns.groupby(level="date", as_index=False): + shocks = g.reset_index("date", drop=True).stack("tenor") + shocks.name = "shocks" portf.spread = spreads.spread * (1 + spreads.join(shocks).shocks) r.append((k, portf.pnl)) - pnl = pd.DataFrame.from_records(r, columns=['date', 'pnl'], index=['date']) + pnl = pd.DataFrame.from_records(r, columns=["date", "pnl"], index=["date"]) return pnl.quantile(quantile) * math.sqrt(20) |
