Message Boards Message Boards

Implementation of Newton Method in FindRoot for implied volatilty?

Posted 8 years ago

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.

Attachments:
POSTED BY: Sandu Ursu
4 Replies
Posted 8 years ago

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}
POSTED BY: Sandu Ursu

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:

http://reference.wolfram.com/language/tutorial/UnconstrainedOptimizationLineSearchMethods.html

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

POSTED BY: Sean Clarke

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?

POSTED BY: Sean Clarke
Posted 8 years ago

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.

POSTED BY: Sandu Ursu
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract