Exemplo n.º 1
0
        public static double ComputeQuantile(double forward, double maturity, Func <double, double> vol, double proba)
        {
            double s      = vol(forward) * Math.Sqrt(maturity);
            double kGuess = forward * Math.Exp(s * (NormalDistribution.FastCumulativeInverse(proba) + 0.5 * s));

            Func <double, double> cumErr = m => Cumulative(forward, maturity, vol, forward * Math.Exp(m)) - proba;

            double m1, m2;

            RootUtils.Bracket(cumErr, Math.Log(kGuess / forward), 0.0, out m1, out m2);
            var mQuantile = RootUtils.Brenth(cumErr, m1, m2, forward * 1.0e-5, DoubleUtils.MachineEpsilon);

            return(forward * Math.Exp(mQuantile));
        }
Exemplo n.º 2
0
        public void FastVsPreciseInverse()
        {
            var bound = NormalDistribution.CumulativeInverse(1.0e-6);
            var grid  = GridUtils.RegularGrid(bound, -bound, 1000);

            foreach (var x in grid)
            {
                var p           = NormalDistribution.Cumulative(x);
                var precise     = NormalDistribution.CumulativeInverse(p);
                var fast        = NormalDistribution.FastCumulativeInverse(p);
                var errRelative = Math.Abs(fast - precise);
                Assert.IsTrue(errRelative < 3.0e-9);
            }
        }