Heston Model Reference Prices

A few years back, over at the Wilmott forum, somebody requested some high precision reference prices for the Heston ’93 stochastic volatility model, so as to compare to an implementation. I responded to that with some prices computed in Mathematica to high precision. A number of people found that thread quite useful, and other cases were added over time. Unfortunately, the thread became corrupted after a forum revision. I have gotten a recent request for the same data, so I reproduce some of those results here as perhaps a more permanent record.

In SDE notation, the Heston model is the system

\displaystyle \left \{ \begin{array}{l}dS_t = (r-q) \, S_t \, dt + \sqrt{V_t} S_t \, dB_t, \\dV_t = (\omega - \theta V_t) \, dt + \xi \, \sqrt{V_t} \, dW_t, \quad dB_t \, dW_t = \rho \, dt. \end{array}\right. \quad\quad\quad (1)

I use the parameter set:

\displaystyle r = \frac{1}{100},\quad q = \frac{2}{100}, \quad S_0 = 100, \quad T = 1, \quad V_0 = \frac{4}{100},  \omega = 1, \quad \theta = 4, \quad \xi = 1, \quad \mbox{and} \quad \rho = -\frac{1}{2}.

With WorkingPrecision=50, I asked Mathematica for 20 good digits, which is probably a conservative estimate of how many good digits there are in the result. (The results have been confirmed by others to at least 15-16 good digits). With that, the results for Put and Call option values were:

StrikeType (P=Put, C=Call)Option Price
80P7.958878113256768285213263077598987193482161301733
80C26.774758743998854221382195325726949201687074848341
90P12.017966707346304987709573290236471654992071308187
90C20.933349000596710388139445766564068085476194042256
100P17.055270961270109413522653999411000974895436309183
100C16.070154917028834278213466703938231827658768230714
110P23.017825898442800538908781834822560777763225722188
110C12.132211516709844867860534767549426052805766831181
120P29.811026202682471843340682293165857439167301370697
120C9.024913483457835636553375454092357136489051667150

Subsequently, Mark Joshi, a well-known researcher who has since passed away, asked for more extreme cases with small T and small volatility, specifically T = V_0 = 0.01. With those changes, but otherwise the same parameters, I found:

StrikeType (P=Put, C=Call)Option Price
90P4.5183603586861772614990106188215872180542*10^-8
90C9.989001595065276544935948045293485530832966049263
95P0.000461954855653851579672612557018857858641926937
95C4.989963479738160122154264702582719627807098780529
100P0.477781171629504680023239655436072890669645669297
100C0.467782671512844263098248405184095087949465507760
105P5.009501052563650299130635110520904481889436667608
105C2.527447823194706060519991248106500619490942*10^-6
110P10.008998550115123724684210555728039829315964456261
110C1.29932760052624920704881258510264466*10^-13

Mark found agreement with his results to 6 digits.

Update (Feb 21, 2019). Recently, Wilmott forum member zukimaten did additional checks. He confirmed the accuracy of the first panel of results to machine precision (say 15 digits). For the more difficult second panel, he confirmed the call values with strikes (90,95,100) to 15 leading digits, and the strikes (105, 110) to 13 leading digits. Of course, by put-call parity, similar results can be inferred for the corresponding puts.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.