aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics')
-rw-r--r--python/analytics/cms_spread.py62
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)