Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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;
            }
        }