Mathematica 8 – FinancialDerivative American options issue

Again while testing my routines (Java code to implement the binomial tree to price American options) I came across an issue with the FinancialDerivative command of Mathematica 8 (I am working with the linux version). The default algorithm chosen by Mathematica for American style options seem to converge to a wrong result. To get the correct result  one must manually set the option  “Method” -> “Binomial”. As a simple example of the issue I post here the code to compute the price of a European and American call option with zero dividends. The two prices should be the same in this case. Here what I get instead:

In[1]:= $Version
Out[1]= "8.0 for Linux x86 (32-bit) (October 10, 2011)"

In[2]:= FinancialDerivative[{"American", "Call"}, {"StrikePrice" -> 110.00, "Expiration" -> 1},  {"InterestRate" -> 0.08, "Volatility" -> 0.,"CurrentPrice" -> 100, "Dividend" -> 0.0}]

Out[2]= 7.10517

In[3]:= FinancialDerivative[{"European","Call"}, {"StrikePrice" -> 110.00,"Expiration" -> 1},  {"InterestRate" -> 0.08, "Volatility" -> 0.2,"CurrentPrice" -> 100, "Dividend" -> 0.0}]

Out[3]= 7.27904

the two results are different. To get the correct price also for the American option try this

In[4]:= FinancialDerivative[{"American","Call"}, {"StrikePrice" -> 110.00,Expiration" -> 1},  {"InterestRate" -> 0.08, "Volatility" -> 0.2,"CurrentPrice" -> 100, "Dividend" -> 0.0}, "Method" -> "Binomial"]

Out[4]= 7.27904

I reported the issue to Wolfram support also asking what is the default method for American options and how to get the full list of available methods. By now I just received a short answer saying

[...] I have
forwarded your example to our developers so that they can take a look into
this and resolve the issue for a future version of Mathematica.

so let’s hope that this will be fixed in Mathematica v9. If I will get more information I’ll modify the post, by now just use the Binomial method to get the correct price for American options.

Mathematica v8 – Linux 32-bit – FinancialDerivative issues

- fixed in Mathematica 9 -

Some problems with FinancialDerivative in Mathematica 8? Wait for v9 (should be released in a couple of months) or try the the Finance Platform.

While testing my app European Options, I used as a cross-check the excellent FinancialDerivative function of Mathematica 8. FinancialDerivative gives price and greeks for a wide choice of financial products, European and American style. Nevertheless at some point I came across some problems:

    • For the “Out” BarrierOptions the “Rebate” term is not implemented. So you get the following wrong result by typing
      In[2]:= FinancialDerivative[{"BarrierUpOut", "European",
        "Call"}, {"StrikePrice" -> 110.00, "Expiration" -> 0.5,
        "Barrier" -> 105, "Rebate" -> 3}, {"InterestRate" -> 0.08,
        "Volatility" -> 0.25, "CurrentPrice" -> 100,
        "Dividend" -> 0.04}, {"Value", "Greeks"}]
      
      Out[2]= {0., {"Delta" -> 0., "Gamma" -> 0., "Rho" -> 0.,
        "Theta" -> 0., "Vega" -> 0.}}

      Which is correct with a zero rebate, while in this case the correct result should be

       Out[2]=
      {2.34535,{Delta->0.130242,Gamma->0.000861361,Rho->1.57311,Theta->-0.61502,Vega->2.02904}}
    • The “Gamma” (the sensitivity of Delta with respect the spot price) for all the financial products I tested so far is surprisingly inaccurate. As an example I show here what we get for simple vanilla call and put for which it easily derived by call-put paritythat the Gamma should be the same.
      In[3]:= FinancialDerivative[{"Vanilla", "European",
        "Put"}, {"StrikePrice" -> 110.00,
        "Expiration" -> 0.5}, {"InterestRate" -> 0.08, "Volatility" -> 0.25,
         "CurrentPrice" -> 100, "Dividend" -> 0.04}, {"Value", "Greeks"}]
      
      Out[3]= {11.6465, {"Delta" -> -0.619661, "Gamma" -> 0.020876,
        "Rho" -> -36.8063, "Theta" -> -3.11937, "Vega" -> 26.1189}}
      
      In[4]:= FinancialDerivative[{"Vanilla", "European",
        "Call"}, {"StrikePrice" -> 110.00,
        "Expiration" -> 0.5}, {"InterestRate" -> 0.08, "Volatility" -> 0.25,
         "CurrentPrice" -> 100, "Dividend" -> 0.04}, {"Value", "Greeks"}]
      
      Out[4]= {3.97952, {"Delta" -> 0.360538, "Gamma" -> 0.0208805,
        "Rho" -> 16.0371, "Theta" -> -7.65352, "Vega" -> 26.1189}}

      The two Gamma are different from each other and different from the correct result which is in this case Gamma = 0.0208952.

I reported the bug to the Wolphram Support and after few days I received a first answer. The guy at support was very kind, but told me that the problem was not showing up on his version (Windows and Finance Platform). After a few try the final answer has been the following:
Hi Stefano

I have carried out the same evaluations as you mentioned for FinancialDerivative for BarrierDownOut and BarrierUpOut options under Linux and have been able to replicate your problems. Thank you for bringing this to our attention. It has now been fixed for version 9 of Mathematica which will be released in a couple of months. Also the problems with the inaccuracy of Gamma were not showing up in my version because I was running it on the Finance Platform, which had fixed that bug. All these errors have been resolved in version 9 of Mathematica. Thanks again for sending in your emails about this as they help to improve our product.

So… keep waiting for v9.

- fixed in Mathematica 9 -