def black_digital_delta(forward_value, strike_value, implied_vol_value, time_value, is_call_bool): """ Black-76 delta sensitivity for digital payoff. :param float forward_value: forward price of underlying at exercise date :param float strike_value: strike price :param float implied_vol_value: volatility of underlying price :param float time_value: year fraction until exercise date :param boolean is_call_bool: call -> True, put -> False :return: float """ sigma, fms, d0, d1 = _black_param(forward_value, strike_value, implied_vol_value, time_value) if sigma == 0.0: return 0.0 if is_call_bool: # call return normal_density(d1) / (sigma * forward_value) else: # put return -normal_density(-d1) / (sigma * forward_value)
def bachelier(forward_value, strike_value, implied_vol_value, time_value, is_call_bool): """ Bachelier formula (Black formula for normal underlying distribution). :param float forward_value: forward price of underlying at exercise date :param float strike_value: strike price :param float implied_vol_value: volatility of underlying price :param float time_value: year fraction until exercise date :param boolean is_call_bool: call -> True, put -> False :return: float """ sigma, fms, d = _bachelier_param(forward_value, strike_value, implied_vol_value, time_value) if sigma == 0.0: return option_payoff(forward_value, strike_value, is_call_bool) # call # call_value = fms * normal_cdf(d) + exp(-d ** 2 / 2) * sigma / sqrt(2 * pi) # intern version call_value = fms * normal_cdf(d) + sigma * normal_density(d) put_value = -fms * normal_cdf(-d) + sigma * normal_density(d) return call_value if is_call_bool else call_value - fms # put
def black_straddle_vega(forward_value, strike_value, implied_vol_value, time_value, is_call_bool): """ Black-76 vega sensitivity for straddle payoff. :param float forward_value: forward price of underlying at exercise date :param float strike_value: strike price :param float implied_vol_value: volatility of underlying price :param float time_value: year fraction until exercise date :param boolean is_call_bool: call -> True, put -> False :return: float """ sigma, fms, d0, d1 = _black_param(forward_value, strike_value, implied_vol_value, time_value) if sigma == 0.0: return 0.0 return 2.0 * forward_value * sqrt(time_value) * normal_density(d1)
def bachelier_gamma(forward_value, strike_value, implied_vol_value, time_value, is_call_bool): """ gamma sensitivity for Bachelier formula. :param float forward_value: forward price of underlying at exercise date :param float strike_value: strike price :param float implied_vol_value: volatility of underlying price :param float time_value: year fraction until exercise date :param boolean is_call_bool: call -> True, put -> False :return: float """ sigma, fms, d = _bachelier_param(forward_value, strike_value, implied_vol_value, time_value) if sigma == 0.0: return 0.0 return normal_density(d) / sigma
def black_digital_vega(forward_value, strike_value, implied_vol_value, time_value, is_call_bool): """ Black-76 vega sensitivity for digital payoff. :param float forward_value: forward price of underlying at exercise date :param float strike_value: strike price :param float implied_vol_value: volatility of underlying price :param float time_value: year fraction until exercise date :param boolean is_call_bool: call -> True, put -> False :return: float """ sigma, fms, d0, d1 = _black_param(forward_value, strike_value, implied_vol_value, time_value) if sigma == 0.0: return 0.0 # call call_value = d1 * normal_density(d0) / implied_vol_value return call_value if is_call_bool else -call_value # put
def bachelier_digital_vega(forward_value, strike_value, implied_vol_value, time_value, is_call_bool): """ vega sensitivity for Bachelier formula for digital option. :param float forward_value: forward price of underlying at exercise date :param float strike_value: strike price :param float implied_vol_value: volatility of underlying price :param float time_value: year fraction until exercise date :param boolean is_call_bool: call -> True, put -> False :return: float """ sigma, fms, d = _bachelier_param(forward_value, strike_value, implied_vol_value, time_value) if sigma == 0.0: return 0.0 # call call_value = -d * normal_density(d) / implied_vol_value return call_value if is_call_bool else -call_value # put