예제 #1
0
        public static double m1_beta_black(double beta, double mu, double sigma)
        {
            var betaMinusOne   = beta - 1.0;
            var betaMinusOneSq = betaMinusOne * betaMinusOne;
            var sigma2         = sigma * sigma;
            var sqrt2          = Math.Sqrt(2.0);
            var sqrtPi         = Math.Sqrt(Math.PI);
            var t  = -mu / sigma;
            var t2 = t * t;
            var one_over_two_betaMinusOneSq = 0.5 / betaMinusOneSq;
            var e4     = Math.Exp(-0.5 * t2);
            var a1     = t + sigma / betaMinusOne;
            var group1 = -SpecialFunction.exp_x_N_y(-beta * mu / betaMinusOneSq + (sigma2 + 2.0 * mu) * one_over_two_betaMinusOneSq, a1);
            var a2     = sigma - t;
            var group2 = SpecialFunction.exp_x_N_y(mu + 0.5 * sigma2, a2);
            var f0     = -1.0 / (2.0 * sqrtPi);

            return(f0 * sqrt2 * e4 * beta * sigma
                   - betaMinusOneSq * group1
                   + group2
                   - beta * (mu - beta + 2) * (SpecialFunction.cdf_normal(-t) - 1.0));
        }
예제 #2
0
        public static double beta_black_trunc(double beta, double mu, double sigma, double x)
        {
            var betaMinusOne   = beta - 1.0;
            var betaMinusOneSq = betaMinusOne * betaMinusOne;
            var sigma2         = sigma * sigma;
            var sqrt2          = Math.Sqrt(2.0);
            var sqrtPi         = Math.Sqrt(Math.PI);
            var t = -mu / sigma;
            var one_over_two_betaMinusOneSq = 0.5 / betaMinusOneSq;
            var f0 = -1.0 / (2.0 * sqrtPi);

            if (x < t)
            {
                var x2     = x * x;
                var e2     = Math.Exp(-0.5 * x2);
                var a4     = x + sigma / betaMinusOne;
                var group4 = SpecialFunction.exp_x_N_y(-beta * mu / betaMinusOneSq + (sigma2 + 2.0 * mu) * one_over_two_betaMinusOneSq, a4);
                return(f0 * sqrt2 * e2 * beta * sigma +
                       +betaMinusOneSq * group4
                       + beta * SpecialFunction.cdf_normal(x) * (mu - beta + 2.0));
            }
            else
            {
                var t2     = t * t;
                var e4     = Math.Exp(-0.5 * t2);
                var a1     = t + sigma / betaMinusOne;
                var group1 = -SpecialFunction.exp_x_N_y(-beta * mu / betaMinusOneSq + (sigma2 + 2.0 * mu) * one_over_two_betaMinusOneSq, a1);
                var a2     = sigma - t;
                var a3     = x - sigma;
                var group2 = -SpecialFunction.exp_x_N_y(mu + 0.5 * sigma2, -a2);
                var group3 = SpecialFunction.exp_x_N_y(mu + 0.5 * sigma2, a3);
                return(f0 * sqrt2 * e4 * beta * sigma
                       - betaMinusOneSq * group1
                       + (group2 + group3)
                       - beta * (mu - beta + 2) * (SpecialFunction.cdf_normal(-t) - 1.0));
            }
        }