def undiscounted_black(F, K, sigma, t, flag): """Calculate the **undiscounted** Black option price. :param F: underlying futures price :type F: float :param K: strike price :type K: float :param sigma: annualized standard deviation, or volatility :type sigma: float :param t: time to expiration in years :type t: float >>> F = 100 >>> K = 100 >>> sigma = .2 >>> flag = 'c' >>> t = .5 >>> undiscounted_black(F, K, sigma, t, flag) 5.637197779701664 """ q = binary_flag[flag] F = float(F) K = float(K) sigma = float(sigma) t = float(t) return lets_be_rational.black(F, K, sigma, t, q)
def black_scholes_merton(flag, S, K, t, r, sigma, q): """Return the Black-Scholes-Merton option price. :param S: underlying asset price :type S: float :param K: strike price :type K: float :param sigma: annualized standard deviation, or volatility :type sigma: float :param t: time to expiration in years :type t: float :param r: risk-free interest rate :type r: float :param q: annualized continuous dividend rate :type q: float From Espen Haug, The Complete Guide To Option Pricing Formulas Page 4 >>> S=100 >>> K=95 >>> q=.05 >>> t = 0.5 >>> r = 0.1 >>> sigma = 0.2 >>> p_published_value = 2.4648 >>> p_calc = black_scholes_merton('p', S, K, t, r, sigma, q) >>> abs(p_published_value - p_calc) < 0.0001 True >>> c1 = bsm_call(S, K, t, r, sigma, q) >>> c2 = black_scholes_merton('c', S, K, t, r, sigma, q) >>> abs(c1-c2) < .0001 True """ S = S * numpy.exp((r-q)*t) p = black(S, K, sigma, t, binary_flag[flag]) conversion_factor = numpy.exp(-r*t) return p * conversion_factor
_q = [-1 if random.randint(0, 1) == 0 else 1 for _ in range(TestCases)] data = {} data['input'] = [] data['output'] = [] for i in range(TestCases): F = _F[i] K = _K[i] sigma = _sigma[i] T = _T[i] q = _q[i] z = _z[i] N = _N[i] black = lets_be_rational.black(F, K, sigma, T, q) iv = lets_be_rational.implied_volatility_from_a_transformed_rational_guess( black, F, K, T, q) ivi = lets_be_rational.implied_volatility_from_a_transformed_rational_guess_with_limited_iterations( black, F, K, T, q, N) x = _x[i] s = _s[i] nblack = lets_be_rational.normalised_black(x, s, q) nblackcall = lets_be_rational.normalised_black_call(x, s) niv = lets_be_rational.normalised_implied_volatility_from_a_transformed_rational_guess( nblack, x, q) nivi = lets_be_rational.normalised_implied_volatility_from_a_transformed_rational_guess_with_limited_iterations( nblack, x, q, N) vega = lets_be_rational.normalised_vega(x, s) norm_cdf = lets_be_rational.norm_cdf(z)
data = {} data['input'] = [] data['output'] = [] for i in range(TestCases): F = _F[i] K = _K[i] sigma = _sigma[i] T = _T[i] q = _q[i] z = _z[i] N = _N[i] black = lets_be_rational.black(F, K, sigma, T, q) iv = lets_be_rational.implied_volatility_from_a_transformed_rational_guess(black, F, K, T, q) ivi = lets_be_rational.implied_volatility_from_a_transformed_rational_guess_with_limited_iterations(black, F, K, T, q, N) x = _x[i] s = _s[i] nblack = lets_be_rational.normalised_black(x, s, q) nblackcall = lets_be_rational.normalised_black_call(x, s) niv = lets_be_rational.normalised_implied_volatility_from_a_transformed_rational_guess(nblack, x, q) nivi = lets_be_rational.normalised_implied_volatility_from_a_transformed_rational_guess_with_limited_iterations(nblack, x, q, N) vega = lets_be_rational.normalised_vega(x, s) norm_cdf = lets_be_rational.norm_cdf(z) data['input'].append({'F':F, 'K':K, 'sigma':sigma,