1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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
def CMS_spread(T_alpha, X, beta, gamma):
Z, w = GHquad(100)
return np.inner(f(Z), w)
def f(v, X, S_alpha_beta, S_alpha_gamma, mu_beta, mu_gamma, T_alpha, rho):
h = h(v, X, S_alpha_beta, mu_beta, sigma_alpha_beta, T_alpha)
u = rho * sigma_alpha_gamma * sqrt(T_alpha) * v
d = sigma_alpha_gamma * sqrt(T_alpha) * sqrt(1 - rho ** 2)
r = mu_gamma * T_alpha - 0.5 * rho * rho * sigma_alpha_gamma ** 2 * T_alpha + u
u0 = log(S_alpha_gamma / h) + u
u1 = u0 + (mu_gamma + (0.5 - rho ** 2) * sigma_alpha_gamma**2) * T_alpha
u2 = u0 + (mu_gamma - 0.5 * sigma_alpha_gamma**2) * T_alpha
return 0.5 * (S_alpha_gamma * exp(r) * cnd_erf(u1 / d) - h * cnd_erf(u2 / d))
def h(v, X, S_alpha_beta, mu_beta, sigma_alpha_beta, T_alpha):
r = (mu_beta - 0.5 * sigma_alpha_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_forward(tenor1, tenor2, maturity):
yc = YC()
yc.extrapolation = True
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 globeop_model(sigma0202, sigma0230, rho, forward, strike, maturity):
vol_spread = sqrt(sigma0202**2 + sigma0230**2 - 2 * rho * sigma02 * sigma0230)
return black(forward, strike, T, False)
|