import math from scipy.stats import norm def d1(F, K, sigma, T): return (math.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 return d1, d2 def black(F, K, T, sigma, option_type = "payer"): d1, d2 = d12(F, K, sigma, T) if option_type == "payer": return F * norm.cdf(d1) - K * norm.cdf(d2) else: return K * norm.cdf(-d2) - F * norm.cdf(-d1)