Implementation of Newton Method in FindRoot for implied volatilty?

I found out that among the methods proposed by Mathematica, the Brent Method works best for finding the implied volatility.

Good.

But what puzzles me is that Newton Method also works pretty well here.

The classical Newton Method is supposed to fail when attempting to use it in order to find a low implied volatility.
I am, therefore, very curious: how is this method implemented in the FindRoot function.

For sigma = 3, it looks like they’re doing the same thing:

Reap[FindRoot[f[sigma], {sigma, 3}, Method -> "Newton", EvaluationMonitor :> Sow[sigma]]]

{{4.99998 -> 5.}, {{3., 3.39587, 3.75194, 4.07615, 4.3707, 4.63, 4.83583, 4.95918, 4.99704, 4.99998, 5., 5.}}}

NestList[# - f[#]/f'[#] &, 3., 10]

{3., 3.39587, 3.75194, 4.07615, 4.3707, 4.63, 4.83583, 4.95918, 4.99704, 4.99998, 5.}

Your concern is when sigma is 0.05. But I see the same behavior:

Reap[FindRoot[f[sigma], {sigma, 0.05}, Method -> "Newton",  EvaluationMonitor :> Sow[sigma]]]

{{3 -> 5.}, {{0.05, 2.56497, 3.01392, 3.40828, 3.76319, 4.08642,  4.37994, 4.63784, 4.84141, 4.96165, 4.99738, 4.99999, 5., 5.}}}

NestList[# - f[#]/f'[#] &, 0.05, 10]

{0.05, 2.56497, 3.01392, 3.40828, 3.76319, 4.08642, 4.37994, 4.63784, 4.84141, 4.96165, 4.99738}

What is your concern? These numbers seem to be almost exactly the same. FindRoot appears to be doing a basic Newton iteration. Are you seeing different results on your machine?

Pardon, Sean. I wasn’t explicit enough.

You should first compute the price with a sigma/volatility of 0.05 (i.e. the volatility which we will later attempt to find).
The initial value can be left to be 3.

If you run the analysis above with the case you mentioned, you’ll see that Newton’s method by itself diverges for your example and that FindRoot gradually tries smaller and smaller starting values .

FindRoot’s implementation of Newton’s method has some subtleties that you can find outlined in the tutorial sections. I’m not sure that it states what it does in this case however:

If it does, it’s not readily apparent to me.

Thank you!

It seems that it uses a Step Control and more precisely the following one:

Reap[FindRoot[f[sigma], {sigma, 3}, 
  Method -> {"Newton", "StepControl" -> {"LineSearch", Method -> "Backtracking"}}, 
  EvaluationMonitor :> Sow[sigma]]]

{3., -36.6846, -14.5286, -3.74788, -0.373938, 0.104742, 0.0572332, 0.0504611, 0.0500025, 0.05, 0.05}