diff options
| -rw-r--r-- | python/analytics/black.py | 18 | ||||
| -rw-r--r-- | python/analytics/option.py | 2 |
2 files changed, 14 insertions, 6 deletions
diff --git a/python/analytics/black.py b/python/analytics/black.py index 3548978c..2c4f58db 100644 --- a/python/analytics/black.py +++ b/python/analytics/black.py @@ -1,4 +1,6 @@ from math import log, sqrt, erf +from numba import jit, float64, boolean +import math def d1(F, K, sigma, T): return (log(F / K) + sigma**2 * T / 2) / (sigma * math.sqrt(T)) @@ -6,6 +8,7 @@ def d1(F, K, sigma, T): def d2(F, K, sigma, T): return d1(F, K, sigma, T) - sigma * math.sqrt(T) +@jit(cache=True,nopython=True) def d12(F, K, sigma, T): sigmaT = sigma * sqrt(T) d1 = log(F / K) / sigmaT @@ -14,10 +17,15 @@ def d12(F, K, sigma, T): d2 -= 0.5 * sigmaT return d1, d2 -def black(F, K, T, sigma, option_type="payer"): +@jit(float64(float64),cache=True,nopython=True) +def cnd_erf(d): + RSQRT2 = 0.7071067811865475 + return 1 + erf(RSQRT2 * d) + +@jit(float64(float64,float64,float64,float64,boolean),cache=True,nopython=True) +def black(F, K, T, sigma, payer=True): d1, d2 = d12(F, K, sigma, T) - s = 1 / sqrt(2) - if option_type == "payer": - return 0.5 * (F * (1+erf(s*d1)) - K * (1+erf(s*d2))) + if payer: + return 0.5 * (F * cnd_erf(d1) - K * cnd_erf(d2)) else: - return 0.5 * (K * (1+erf(-s*d2)) - F * (1+erf(-s*d1))) + return 0.5 * (K * cnd_erf(-d2) - F * cnd_erf(-d1)) diff --git a/python/analytics/option.py b/python/analytics/option.py index c12fc816..2863e77b 100644 --- a/python/analytics/option.py +++ b/python/analytics/option.py @@ -160,7 +160,7 @@ class BlackSwaption(ForwardIndex): strike_tilde, self.T, self.sigma, - self.option_type) * self.notional + self.option_type == "payer") * self.notional @pv.setter def pv(self, val): if np.isnan(val): |
