/// <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); }