예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="t"></param>
        /// <param name="f"></param>
        /// <param name="k"></param>
        /// <param name="p"></param>
        /// <param name="atm"></param>
        /// <param name="pay"></param>
        /// <returns></returns>
        public static double GetImpliedVolatility(double t, double f, double k, double p, double atm, PayStyle pay)
        {
            const double tolerance = 0.000000001;
            double       result    = atm;

            for (int i = 0; i < 50; i++)
            {
                var fun = GetValue(t, f, k, result, pay) - p;
                if (Math.Abs(fun) < tolerance)
                {
                    return(result);
                }
                var f1    = GetValue(t, f, k, result + 0.00001, pay) - p;
                var delta = -fun * 0.00001 / (f1 - fun);
                result += 0.7 * delta;
                //0.7 is a dampening factor
            }
            return(result);
        }