diff options
Diffstat (limited to 'python/analytics/cms_spread.py')
| -rw-r--r-- | python/analytics/cms_spread.py | 96 |
1 files changed, 4 insertions, 92 deletions
diff --git a/python/analytics/cms_spread.py b/python/analytics/cms_spread.py index 24c45e73..fa61c7cf 100644 --- a/python/analytics/cms_spread.py +++ b/python/analytics/cms_spread.py @@ -1,12 +1,12 @@ -import atexit +from . import cms_spread_utils +from .cms_spread_utils import h_call, h_put import datetime import matplotlib.pyplot as plt import numpy as np import pandas as pd import re from math import exp, sqrt, log, pi -from .black import bachelier, cnd_erf -from numba import cfunc, types, float64, vectorize +from .black import bachelier from quantlib.time.api import ( Date, Period, @@ -45,95 +45,7 @@ from utils.db import dawn_engine, serenitas_pool __all__ = ["CmsSpread"] -@vectorize( - [ - float64( - float64, - float64, - float64, - float64, - float64, - float64, - float64, - float64, - float64, - ) - ], - cache=True, - nopython=True, -) -def h_call(z, K, S1, S2, mu_x, mu_y, sigma_x, sigma_y, rho): - # conditionned on S2, integral wrt S1 - # z = (y - mu_y) / sigma_y - u1 = mu_x + rho * sigma_x * z - Ktilde = K + S2 * exp(mu_y + sigma_y * z) - u2 = log(Ktilde / S1) - - v = sigma_x * sqrt(1 - rho * rho) - v2 = sigma_x * sigma_x * (1 - rho * rho) - x = (u1 - u2) / v - return 0.5 * (S1 * exp(u1 + 0.5 * v2) * cnd_erf(x + v) - Ktilde * cnd_erf(x)) - - -@vectorize( - [ - float64( - float64, - float64, - float64, - float64, - float64, - float64, - float64, - float64, - float64, - ) - ], - cache=True, - nopython=True, -) -def h_put(z, K, S1, S2, mu_x, mu_y, sigma_x, sigma_y, rho): - # z = (y - mu_y) / sigma_y - u1 = mu_x + rho * sigma_x * z - Ktilde = K + S2 * exp(mu_y + sigma_y * z) - u2 = log(Ktilde / S1) - - v = sigma_x * sqrt(1 - rho * rho) - v2 = sigma_x * sigma_x * (1 - rho * rho) - x = (u2 - u1) / v - return 0.5 * (Ktilde * cnd_erf(x) - S1 * exp(u1 + 0.5 * v2) * cnd_erf(x - v)) - - -_sig = types.double(types.intc, types.CPointer(types.double)) - - -@cfunc(_sig, cache=True, nopython=True) -def _h1(n, args): - # z = (y - mu_y) / sigma_y - z = args[0] - K = args[1] - S1 = args[2] - S2 = args[3] - mu_x = args[4] - mu_y = args[5] - sigma_x = args[6] - sigma_y = args[7] - rho = args[8] - u1 = mu_x + rho * sigma_x * z - Ktilde = K + S2 * exp(mu_y + sigma_y * z) - u2 = log(Ktilde / S1) - - v = sigma_x * sqrt(1 - rho * rho) - v2 = sigma_x * sigma_x * (1 - rho * rho) - x = (u1 - u2) / v - return ( - 0.5 - * (S1 * exp(u1 + 0.5 * v2) * cnd_erf(x + v) - Ktilde * cnd_erf(x)) - * exp(-0.5 * z * z) - ) - - -_call_integrand = LowLevelCallable(_h1.ctypes) +_call_integrand = LowLevelCallable.from_cython(cms_spread_utils, "h1") def get_fixings(conn, tenor1, tenor2, fixing_date=None): |
