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