aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/analytics/black.py18
-rw-r--r--python/analytics/option.py2
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):