diff options
Diffstat (limited to 'python/analytics/cms_spread.py')
| -rw-r--r-- | python/analytics/cms_spread.py | 62 |
1 files changed, 47 insertions, 15 deletions
diff --git a/python/analytics/cms_spread.py b/python/analytics/cms_spread.py index ee26373a..c4f0bf58 100644 --- a/python/analytics/cms_spread.py +++ b/python/analytics/cms_spread.py @@ -2,6 +2,11 @@ from .tranche_functions import GHquad from math import exp, sqrt, log from .black import cnd_erf from bbg_helpers import BBG_IP, retrieve_data, init_bbg_session +from quantlib.time.api import Date, Period, Days, Years, UnitedStates +from quantlib.time.calendars.united_states import GOVERNMENTBOND +from quantlib.indexes.swap.usd_libor_swap import UsdLiborSwapIsdaFixAm +from yieldcurve import YC +from db import dbconn def CMS_spread(T_alpha, X, beta, gamma): Z, w = GHquad(100) @@ -23,25 +28,52 @@ def h(v, X, S_alpha_beta, mu_beta, sigma_alpha_beta, T_alpha): sigma_alpha_beta * sqrt(T_alpha) * v return X + S_alpha_beta * exp(r) -def get_fixings(tenor1, tenor2): - securities = [f"USISDA{t:02} Index" for t in [tenor1, tenor2]] - with init_bbg_session(BBG_IP) as session: - field = "PX_LAST" - fixings = retrieve_data(session, securities, field) - return fixings +def get_fixings(conn, tenor1, tenor2, fixing_date=None): + if fixing_date: + sql_str = f'SELECT fixing_date, "{tenor1}y" ,"{tenor2}y" FROM USD_swap_fixings ' \ + 'WHERE fixing_date=%s' + with conn.cursor() as c: + c.execute(sql_str) + date, fixing1, fixing2 = next(c) + else: + sql_str = f'SELECT fixing_date, "{tenor1}y" ,"{tenor2}y" FROM USD_swap_fixings ' \ + 'ORDER BY fixing_date DESC LIMIT 1' + with conn.cursor() as c: + c.execute(sql_str, fixing_date) + date, fixing1, fixing2 = next(c) -def get_forward(tenor1, tenor2, maturity): + date = Date.from_datetime(date) + fixing1 = float(fixing1) + fixing2 = float(fixing2) + return date, fixing1, fixing2 + +def get_forward_spread(tenor1, tenor2, maturity): yc = YC() yc.extrapolation = True + conn = dbconn('serenitasdb') + fixing_date, fixing1, fixing2 = get_fixings(conn, tenor1, tenor2) + USISDA1 = UsdLiborSwapIsdaFixAm(Period(tenor1, Years), + forwarding=yc, discounting=yc) + USISDA1.add_fixing(fixing_date, fixing1) + USISDA2 = UsdLiborSwapIsdaFixAm(Period(tenor2, Years), + forwarding=yc, discounting=yc) + USISDA2.add_fixing(fixing_date, fixing2) + expiration = UnitedStates(GOVERNMENTBOND).advance( + Date.from_datetime(maturity), + 0, Days) + + USFS1 = USISDA1.underlying_swap(Date.from_datetime(maturity)) + USFS2 = USISDA2.underlying_swap(Date.from_datetime(maturity)) + return USFS2.fair_rate - USFS1.fair_rate - USISDA1 = UsdLiborSwapIsdaFixAm(Period(tenor1, Years), forwarding=yc, discounting=yc) - USISDA1.add_fixing(Date(25, 1, 2018), 0.02781) - USISDA2 = UsdLiborSwapIsdaFixAm(Period(tenor2, Years), forwarding=yc, discounting=yc) - USISDA2.add_fixing(Date(25, 1, 2018), 0.02283) - USFS1 = USISDA1.underlying_swap(maturity) - USFS2 = USISDA2.underlying_swap(maturity) - return USFS1.fair_rate - USFS2.fair_rate +def get_swaption_vol_surface(): + sql_str = "SELECT * FROM swaption_vol ORDER BY date DESC LIMIT 1" + conn = dbconn('serenitasdb') + with conn.cursor() as c: + c.execute(sql_str) + return next(c) -def globeop_model(sigma0202, sigma0230, rho, forward, strike, maturity): +def globeop_model(tenor1, tenor2, rho, strike, maturity): + forward = get_forward_spread(tenor1, tenor2, maturity) vol_spread = sqrt(sigma0202**2 + sigma0230**2 - 2 * rho * sigma02 * sigma0230) return black(forward, strike, T, False) |
