diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/black.py | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/python/analytics/black.py b/python/analytics/black.py index d489ba2d..3548978c 100644 --- a/python/analytics/black.py +++ b/python/analytics/black.py @@ -1,21 +1,23 @@ -import math -from scipy.stats import norm +from math import log, sqrt, erf def d1(F, K, sigma, T): - return (math.log(F / K) + sigma**2 * T / 2) / (sigma * math.sqrt(T)) + return (log(F / K) + sigma**2 * T / 2) / (sigma * math.sqrt(T)) def d2(F, K, sigma, T): return d1(F, K, sigma, T) - sigma * math.sqrt(T) def d12(F, K, sigma, T): - sigmaT = sigma * math.sqrt(T) - d1 = (math.log(F / K) + sigma**2 * T / 2) / sigmaT - d2 = d1 - sigmaT + sigmaT = sigma * sqrt(T) + d1 = log(F / K) / sigmaT + d2 = d1 + d1 += 0.5 * sigmaT + d2 -= 0.5 * sigmaT return d1, d2 -def black(F, K, T, sigma, option_type = "payer"): +def black(F, K, T, sigma, option_type="payer"): d1, d2 = d12(F, K, sigma, T) + s = 1 / sqrt(2) if option_type == "payer": - return F * norm.cdf(d1) - K * norm.cdf(d2) + return 0.5 * (F * (1+erf(s*d1)) - K * (1+erf(s*d2))) else: - return K * norm.cdf(-d2) - F * norm.cdf(-d1) + return 0.5 * (K * (1+erf(-s*d2)) - F * (1+erf(-s*d1))) |
