def BCC_calculate_model_values(p0): ''' Calculates all model values given parameter vector p0. ''' kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta = p0 values = [] for row, option in options.iterrows(): model_value = BCC_call_value(S0, option['Strike'], option['T'], option['r'], kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta) values.append(model_value) return np.array(values)
def BCC_iv_error_function(p0): ''' Error function for parameter calibration in BCC97 model via Lewis (2001) Fourier approach. Parameters ========== kappa_v: float mean-reversion factor theta_v: float long-run mean of variance sigma_v: float volatility of variance rho: float correlation between variance and stock/index level v0: float initial, instantaneous variance lamb: float jump intensity mu: float expected jump size delta: float standard deviation of jump Returns ======= MSE: float mean squared error ''' global i, min_MSE kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta = p0 if kappa_v < 0.0 or theta_v < 0.005 or sigma_v < 0.0 or \ rho < -1.0 or rho > 1.0 or v0 < 0.0 or lamb < 0.0 or \ mu < -.6 or mu > 0.0 or delta < 0.0: return 5000.0 if 2 * kappa_v * theta_v < sigma_v**2: return 5000.0 se = [] for row, option in options.iterrows(): call = call_option(S0, option['Strike'], option['Date'], option['Maturity'], option['r'], option['Market_IV']) model_value = BCC_call_value(S0, option['Strike'], option['T'], option['r'], kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta) model_iv = call.imp_vol(model_value, 0.15) se.append(((model_iv - option['Market_IV']) * call.vega())**2) MSE = sum(se) / len(se) min_MSE = min(min_MSE, MSE) if i % 25 == 0: print('%4d |' % i, np.array(p0), '| %7.3f | %7.3f' % (MSE, min_MSE)) i += 1 return MSE
def BCC_jump_calculate_model_values(p0): ''' Calculates all model values given parameter vector p0. ''' lamb, mu, delta = p0 values = [] for row, option in options.iterrows(): T = (option['Maturity'] - option['Date']).days / 365. B0T = B([kappa_r, theta_r, sigma_r, r0, T]) r = -math.log(B0T) / T model_value = BCC_call_value(S0, option['Strike'], T, r, kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta) values.append(model_value) return np.array(values)
def BCC_error_function(p0): ''' Error function for parameter calibration in M76 Model via Carr-Madan (1999) FFT approach. Parameters ========== lamb: float jump intensity mu: float expected jump size delta: float standard deviation of jump Returns ======= MSE: float mean squared error ''' global i, min_MSE, local_opt, opt1 lamb, mu, delta = p0 if lamb < 0.0 or mu < -0.6 or mu > 0.0 or delta < 0.0: return 5000.0 se = [] for row, option in options.iterrows(): model_value = BCC_call_value(S0, option['Strike'], option['T'], option['r'], kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta) se.append((model_value - option['Call'])**2) MSE = sum(se) / len(se) min_MSE = min(min_MSE, MSE) if i % 25 == 0: print('%4d |' % i, np.array(p0), '| %7.3f | %7.3f' % (MSE, min_MSE)) i += 1 if local_opt: penalty = np.sqrt(np.sum((p0 - opt1)**2)) * 1 return MSE + penalty return MSE