public static double beta_black_break_even(double beta, double f, double t, double sigma, double dt = 1.0 / 365.0) { try { //var pack = new OptionBetaBlack(beta, OptionType.Put, f, f, t, sigma); //var gamma = pack.d2PV_dS2; //if (gamma == 0.0) throw FS.FailWith($"Cannot compute breakeven, gamma is zero."); //var res = Math.Sqrt(2.0 * pack.dPV_dT * dt / pack.d2PV_dS2); var zz = 0.0; var T_b = 0.0; var f_b = 0.0; beta_black_b(beta, OptionType.Put, f, f, t, sigma, ref zz, ref f_b, ref zz, ref T_b, ref zz, 1.0); var df = Math.Sqrt(DoubleUtils.DoubleEpsilon) * (1.0 + Math.Abs(f)); var fup_b = 0.0; beta_black_b(beta, OptionType.Put, f + df, f, t, sigma, ref zz, ref fup_b, ref zz, ref zz, ref zz, 1.0); var gamma = (fup_b - f_b) / df; if (gamma == 0.0) { throw FS.FailWith($"Cannot compute Break even, gamma is zero"); } var res = Math.Sqrt(2.0 * T_b * dt / gamma); // if (double.IsNaN(res)) throw FS.FailWith("Nan"); return(res); } catch (Exception e) { FS.WithInfo(e, $"beta ={beta}, f = {f}, t = {t}, sigma = {sigma}, dt = {dt}"); throw; } }
public static double beta_black_normal_vol(double beta, double F, double K, double T, double sigma) { var optType = OptionType.Put; // F > K ? OptionType.Put : OptionType.Call; var bbPrice = beta_black(beta, optType, F, K, T, sigma); try { return(ClosedForm.ibachelier(optType, F, K, T, bbPrice)); } catch (Exception e) { FS.WithInfo(e, $"beta ={beta}, optType = {optType}, F = {F}, K = {K}, T = {T}, sigma = {sigma}, bbPrice = {bbPrice}"); throw; } }