Serving the Quantitative Finance Community

 
User avatar
Alan
Posts: 3050
Joined: December 19th, 2001, 4:01 am
Location: California
Contact:

Heston - Reference Prices

December 9th, 2015, 4:09 am

QuoteOriginally posted by: mjThis thread is very useful.One thing I have found is that small $T$ and small $V_0$ render the problem challenging.Would it be possible to get some reference prices with $T=V_0 =0.01$ ?Sure, here's what I find using those values and otherwise, the same parameters as my Weds May 30, 2012 post:I used a finite, but large Fourier cutoff and then tried again with a new cutoff 10x larger.Based on that, I will guess the error is < 10^(-16). on each.90 4.5183603586861772678458799126881903336734*10^-89.98900159506527654493594810876217846949899720545595 0.0004619548556538515796726125115670489755548426824.989963479738160122154264702537267818924011696274100 0.4777811716295046800232396554371143807266825016430.467782671512844263098248405185136578006502340105105 5.0095010525636502991306351105210567530089439100492.527447823194706060519991400377620126733382*10^-6110 10.0089985501151237246842105219208389513706829244551.29932760052591113504003313228732660*10^-13
Last edited by Alan on December 8th, 2015, 11:00 pm, edited 1 time in total.
 
User avatar
mj
Posts: 12
Joined: December 20th, 2001, 12:32 pm

Heston - Reference Prices

December 9th, 2015, 4:19 am

thanks.My cos method pricer is agreeing with you to 6 decimal places so I guess it works!
 
User avatar
yeahmoon
Posts: 17
Joined: April 22nd, 2008, 1:11 am

Heston - Reference Prices

February 14th, 2016, 2:44 am

QuoteOriginally posted by: AlanJust ran my codes in Mathematica at high precision:dS = (r - q) S dt + sqrt{V} S dW1dV = (a - b V) dt + c sqrt{V} dW2dW1 dW2 = rho dtr = 1/100, q = 2/100, S0=100, T=1, V0 = 4/100, a=1, b=4, c=1, rho= -1/2 Various strikes K below: (put, then call)80 7.95887811325676828521326307759898719348216130173326.7747587439988542213821953257269492016870748483419012.01796670734630498770957329023647165499207130818720.93334900059671038813944576656406808547619404225610017.05527096127010941352265399941100097489543630918316.07015491702883427821346670393823182765876823071411023.01782589844280053890878183482256077776322572218812.13221151670984486786053476754942605280576683118112029.8110262026824718433406822931658574391673013706979.024913483457835636553375454092357136489051667150With WorkingPrecision=50, I asked Mathematica for 20 good digits, which means thesenumbers should be good for about that. So treat the remaining digits as "noise". The Fourier integral cutoff was set to Infinity, so that should not be a source of error.Perhaps other board members can confirm, say, the first 20 digits.Would someone please verify that Heston prices from my code are correct or not?Using the model and parameters in the above Alan's post, but there is no dividend: q = 0.dS = rS dt + sqrt{V} S dW1dV = (a - b V) dt + c sqrt{V} dW2dW1 dW2 = rho dtr = 1/100, S0=100, T=1, V0 = 4/100, a=1, b=4, c=1, rho= -1/2 The Heston prices from my codes are:----------------------------------------strike = 80closed form EU put price = 7.389765closed form EU call price = 28.185778-----------------------------------------strike = 90closed form EU put price = 11.250797closed form EU call price = 22.146312---------------------------------------strike = 100.0000closed form EU put price = 16.087111closed form EU call price = 17.082128-----------------------------------------strike = 110closed form EU put price = 21.858721closed form EU call price = 12.953239-----------------------------------------strike = 120closed form EU put price = 28.480500closed form EU call price = 9.674520----------------------------------------------Thanks!
 
User avatar
Alan
Posts: 3050
Joined: December 19th, 2001, 4:01 am
Location: California
Contact:

Heston - Reference Prices

February 14th, 2016, 3:37 am

QuoteOriginally posted by: yeahmoonQuoteOriginally posted by: AlanJust ran my codes in Mathematica at high precision:dS = (r - q) S dt + sqrt{V} S dW1dV = (a - b V) dt + c sqrt{V} dW2dW1 dW2 = rho dtr = 1/100, q = 2/100, S0=100, T=1, V0 = 4/100, a=1, b=4, c=1, rho= -1/2 Various strikes K below: (put, then call)80 7.95887811325676828521326307759898719348216130173326.7747587439988542213821953257269492016870748483419012.01796670734630498770957329023647165499207130818720.93334900059671038813944576656406808547619404225610017.05527096127010941352265399941100097489543630918316.07015491702883427821346670393823182765876823071411023.01782589844280053890878183482256077776322572218812.13221151670984486786053476754942605280576683118112029.8110262026824718433406822931658574391673013706979.024913483457835636553375454092357136489051667150With WorkingPrecision=50, I asked Mathematica for 20 good digits, which means thesenumbers should be good for about that. So treat the remaining digits as "noise". The Fourier integral cutoff was set to Infinity, so that should not be a source of error.Perhaps other board members can confirm, say, the first 20 digits.Would someone please verify that Heston prices from my code are correct or not?Using the model and parameters in the above Alan's post, but there is no dividend: q = 0.dS = rS dt + sqrt{V} S dW1dV = (a - b V) dt + c sqrt{V} dW2dW1 dW2 = rho dtr = 1/100, S0=100, T=1, V0 = 4/100, a=1, b=4, c=1, rho= -1/2 The Heston prices from my codes are:----------------------------------------strike = 80closed form EU put price = 7.389765closed form EU call price = 28.185778-----------------------------------------strike = 90closed form EU put price = 11.250797closed form EU call price = 22.146312---------------------------------------strike = 100.0000closed form EU put price = 16.087111closed form EU call price = 17.082128-----------------------------------------strike = 110closed form EU put price = 21.858721closed form EU call price = 12.953239-----------------------------------------strike = 120closed form EU put price = 28.480500closed form EU call price = 9.674520----------------------------------------------Thanks!way off. Advice: first match the ref prices; this will catch at least one serious error in your code. then re-post.
Last edited by Alan on February 13th, 2016, 11:00 pm, edited 1 time in total.
 
User avatar
yeahmoon
Posts: 17
Joined: April 22nd, 2008, 1:11 am

Heston - Reference Prices

February 14th, 2016, 5:01 am

QuoteOriginally posted by: AlanQuoteOriginally posted by: yeahmoonQuoteOriginally posted by: AlanJust ran my codes in Mathematica at high precision:dS = (r - q) S dt + sqrt{V} S dW1dV = (a - b V) dt + c sqrt{V} dW2dW1 dW2 = rho dtr = 1/100, q = 2/100, S0=100, T=1, V0 = 4/100, a=1, b=4, c=1, rho= -1/2 Various strikes K below: (put, then call)80 7.95887811325676828521326307759898719348216130173326.7747587439988542213821953257269492016870748483419012.01796670734630498770957329023647165499207130818720.93334900059671038813944576656406808547619404225610017.05527096127010941352265399941100097489543630918316.07015491702883427821346670393823182765876823071411023.01782589844280053890878183482256077776322572218812.13221151670984486786053476754942605280576683118112029.8110262026824718433406822931658574391673013706979.024913483457835636553375454092357136489051667150With WorkingPrecision=50, I asked Mathematica for 20 good digits, which means thesenumbers should be good for about that. So treat the remaining digits as "noise". The Fourier integral cutoff was set to Infinity, so that should not be a source of error.Perhaps other board members can confirm, say, the first 20 digits.Would someone please verify that Heston prices from my code are correct or not?Using the model and parameters in the above Alan's post, but there is no dividend: q = 0.dS = rS dt + sqrt{V} S dW1dV = (a - b V) dt + c sqrt{V} dW2dW1 dW2 = rho dtr = 1/100, S0=100, T=1, V0 = 4/100, a=1, b=4, c=1, rho= -1/2 The Heston prices from my codes are:----------------------------------------strike = 80closed form EU put price = 7.389765closed form EU call price = 28.185778-----------------------------------------strike = 90closed form EU put price = 11.250797closed form EU call price = 22.146312---------------------------------------strike = 100.0000closed form EU put price = 16.087111closed form EU call price = 17.082128-----------------------------------------strike = 110closed form EU put price = 21.858721closed form EU call price = 12.953239-----------------------------------------strike = 120closed form EU put price = 28.480500closed form EU call price = 9.674520----------------------------------------------Thanks!way off. Advice: first match the ref prices; this will catch at least one serious error in your code. then re-post.dS = rS dt + sqrt{V} S dW1dV = (a - b V) dt + c sqrt{V} dW2dW1 dW2 = rho dtthere is no dividend,r = 1/100, S0=100, T=1, V0 = 4/100, a=1, b=4, c=1, rho= -1/2 ----------------------------------------strike = 80closed form EU put price = 7.555895closed form EU call price = 28.351908-----------------------------------------strike = 90closed form EU put price = 11.448955closed form EU call price = 22.344470---------------------------------------strike = 100.0000closed form EU put price = 16.304827closed form EU call price = 17.299843-----------------------------------------strike = 110closed form EU put price = 22.081822closed form EU call price = 13.176340-----------------------------------------strike = 120closed form EU put price = 28.695907closed form EU call price = 9.889927I caught one error in my code, re-run and get the above Heston prices for European options, when dividend is not considered.Please help me to see there are any other bugs in my code or not!Thanks!
 
User avatar
spursfan
Posts: 2
Joined: October 7th, 2001, 3:43 pm

Heston - Reference Prices

February 14th, 2016, 12:08 pm

The call prices look OK (the put ones just then follow by put-call parity)But even better if you now just adapt your Heston method to allow non-zero dividends and then see how many of the digits of the reference prices from Alan that you can match
 
User avatar
yeahmoon
Posts: 17
Joined: April 22nd, 2008, 1:11 am

Heston - Reference Prices

February 14th, 2016, 7:03 pm

QuoteOriginally posted by: spursfanThe call prices look OK (the put ones just then follow by put-call parity)But even better if you now just adapt your Heston method to allow non-zero dividends and then see how many of the digits of the reference prices from Alan that you can matchAfter I add dividend, my code can calculate Heston prices, which match the ref prices from Alan post.Thanks!----------------------------------------------dS = (r-q)S dt + sqrt{V} S dW1dV = (a - b V) dt + c sqrt{V} dW2dW1 dW2 = rho dtr = 1/100, q = 2/100, S0=100, T=1, V0 = 4/100, a=1, b=4, c=1, rho= -1/2 ----------------------------------------strike = 80closed form EU put price = 7.958878113256closed form EU call price = 26.774758743998-----------------------------------------strike = 90closed form EU put price = 12.017966707346closed form EU call price = 20.933349000596---------------------------------------strike = 100.0000closed form EU put price = 17.055270961270closed form EU call price = 16.070154917029-----------------------------------------strike = 110closed form EU put price = 23.017825898442closed form EU call price = 12.132211516709-----------------------------------------strike = 120closed form EU put price = 29.811026202683closed form EU call price = 9.024913483458
Last edited by yeahmoon on February 13th, 2016, 11:00 pm, edited 1 time in total.
 
User avatar
yeahmoon
Posts: 17
Joined: April 22nd, 2008, 1:11 am

Heston - Reference Prices

May 21st, 2016, 8:21 pm

QuoteOriginally posted by: AlanQuoteOriginally posted by: mjThis thread is very useful.One thing I have found is that small $T$ and small $V_0$ render the problem challenging.Would it be possible to get some reference prices with $T=V_0 =0.01$ ?Sure, here's what I find using those values and otherwise, the same parameters as my Weds May 30, 2012 post:I used a finite, but large Fourier cutoff and then tried again with a new cutoff 10x larger.Based on that, I will guess the error is < 10^(-16). on each.90 4.5183603586861772678458799126881903336734*10^-89.98900159506527654493594810876217846949899720545595 0.0004619548556538515796726125115670489755548426824.989963479738160122154264702537267818924011696274100 0.4777811716295046800232396554371143807266825016430.467782671512844263098248405185136578006502340105105 5.0095010525636502991306351105210567530089439100492.527447823194706060519991400377620126733382*10^-6110 10.0089985501151237246842105219208389513706829244551.29932760052591113504003313228732660*10^-13my matlab program for Heston could get the same results as above, when there is no dividend.But now another problem I am having is that, when interest rate is very low, say r = 0.02% as in 2014, call options have one single discrete dividend payment during the life.Using my matlab program, almost 60% chance, American call price = European call price.when interest rate is much higher, say r = 13%, most of the time, i can get American call price > European call price.I used the method in in Haug, Haug, and Lewis to deal with single discrete dividend.My question is that for very low interest rate, call options with one single discrete dividend (0.5% < dividend/stcokprice < 2%), will American call = European call most of the time?if not, there might be bugs in my codes.PS: I also tried Black-Schole model, then almost for sure, American call = European call, when r is very low and call options having one single discrete dividend during the life.
 
User avatar
Alan
Posts: 3050
Joined: December 19th, 2001, 4:01 am
Location: California
Contact:

Heston - Reference Prices

May 23rd, 2016, 5:15 pm

Hard to say. The probability of an early exercise of a call (to capture a dividend) can be estimated (Black-Scholes case) from [$]\Phi(d_2)[$],the second term in the BS formula, except the strike is replaced by [$]S^*[$] and the time-to-maturity is replacedby the time-to-exdate [$]T_d[$]. Here [$]S^*[$] is the critical stock price that satisfies [$]S^* - K \equiv c_{BS}(S^* - Div,K, T-T_d)[$],where [$]T[$] is the option time-to-maturity. (If there is no solution, then [$]S^* = \infty[$]).So, there is a big list of parameters that determine if the probability of early exercise is either 0 or financially negligible. In particular, the timing of the dividend is important. If it is negligible, then the American and European-style call prices will be extremely close. Similar notions will apply to the Heston (or other stochastic volatility) case.
Last edited by Alan on May 23rd, 2016, 10:00 pm, edited 1 time in total.
 
User avatar
yeahmoon
Posts: 17
Joined: April 22nd, 2008, 1:11 am

Re: Heston - Reference Prices

October 26th, 2016, 8:32 pm

I would like to confirm the way to choose option value on ex-dividend date, when using bushy tree for one-time discrete dividend payment (not recombining, it is documented there are ways to make the tree recombining or use other more efficient methods, but let's talk about the bushy tree for now), under the BS model.
For European options, $$\text{suppose at node  } S_0u^2-D, \text{ option value is } O_{ex}, \text{ then at node } S_0u^2, \text{ is the option value } O_{ex} \text{ also }?$$
For American call, $$\text{suppose at node  } S_0u^2-D, \text{ option value is } O_{ex}, \text{ then at node } S_0u^2, \text{ is the option value } \max\{O_{ex}, S_0u^2-K \}? K \text{ is strike}.$$
Attachments
bushtree.JPG
 
User avatar
JohnLeM
Posts: 379
Joined: September 16th, 2008, 7:15 pm

Re: Heston - Reference Prices

October 27th, 2016, 11:14 am

Hello,

This thread is quite helpful for benchmarking tests for Heston models thanks !

I have a similar concern but for forward start options : is there a paper or source that provides Forward start options prices under Heston that have been computed to high precision for a range of strikes ?
 
User avatar
Billy7
Posts: 262
Joined: March 30th, 2016, 2:12 pm

Re: Heston - Reference Prices

October 27th, 2016, 2:47 pm

Hello,

This thread is quite helpful for benchmarking tests for Heston models thanks !

I have a similar concern but for forward start options : is there a paper or source that provides Forward start options prices under Heston that have been computed to high precision for a range of strikes ?
By "high accuracy" you mean that of semi-analytical integration formulas, like 10 digits plus?
By the way, since this is a thread about Heston reference prices in general, here are a couple that I recently posted elsewhere but probably belong here:

Heston parameters: spot variance = 0.1, long-run variance = 0.1, reversion rate = 2, vol of vol = 0.1, correlation = -0.5
Case 1: Up and Out Call, S = 100, K = 100, H = 150, T = 0.5, r = 0.03, stock pays one fixed dividend of D = 4 at t = 0.25. 
Value: 5.621298526
Case 2: Up and Out Call, S = 100, K = 100, H = 150, T = 1, r = 0.03, stock pays two fixed dividends of D = 4 at t = 0.25 & t = 0.75. 
Value: 4.010478640

Assumed dividend policy is  [$]\mathcal{D}(S) = \min[D,S][$])
Last edited by Billy7 on October 27th, 2016, 7:05 pm, edited 1 time in total.
 
User avatar
Alan
Posts: 3050
Joined: December 19th, 2001, 4:01 am
Location: California
Contact:

Re: Heston - Reference Prices

October 27th, 2016, 5:34 pm

I would like to confirm the way to choose option value on ex-dividend date, when using bushy tree for one-time discrete dividend payment (not recombining, it is documented there are ways to make the tree recombining or use other more efficient methods, but let's talk about the bushy tree for now), under the BS model.
For European options, $$\text{suppose at node  } S_0u^2-D, \text{ option value is } O_{ex}, \text{ then at node } S_0u^2, \text{ is the option value } O_{ex} \text{ also }?$$
For American call, $$\text{suppose at node  } S_0u^2-D, \text{ option value is } O_{ex}, \text{ then at node } S_0u^2, \text{ is the option value } \max\{O_{ex}, S_0u^2-K \}? K \text{ is strike}.$$
Sounds correct to me, with two caveats:

-the arrow in the displayed figure should be pointing at the nodes in question.
-with a fine enough time step, bottom nodes at the ex-date will lie below zero, which is why you must adopt a [$]\mathcal{D}(S)[$] policy under the piecewise GBM model. 
 
User avatar
Billy7
Posts: 262
Joined: March 30th, 2016, 2:12 pm

Re: Heston - Reference Prices

November 1st, 2016, 2:43 pm

Hello,

This thread is quite helpful for benchmarking tests for Heston models thanks !

I have a similar concern but for forward start options : is there a paper or source that provides Forward start options prices under Heston that have been computed to high precision for a range of strikes
High precision (more than a couple of decimals) results for forward starting options in Heston do seem elusive, I couldn't find any (but maybe I didn't look enough). They are apparently no more difficult to value than vanillas (fast, via the forward characteristic function, for those familiar with such methods, not me), but all the papers I've seen do not offer any calculated values for reference. So I thought I'd give it a go in a stupid, brute force kind of way, initializing my PDE pricer with forward-starting vanilla values calculated with a dll I found (fast closed-form from http://www.axelvogt.de/axalom). If this dll isn't good enough for 10 digits, then my last digit(s) would be off. (there are two versions, I used the "exact" one). So here you go: 

Call, forward starting at t1 when the strike is set as k*S(t1).  t1 = 1Y, T = 2Y. S0 = 100;
Heston parameters: spot var = 0.010201, long-run var = 0.019, reversion rate = 6.21, vol of vol = 0.61, rho = -0.7.  r = 0.0319

k = 0.5,   FSCV = 51.57684084
k = 0.75  FSCV = 27.62484139
k = 1        FSCV = 6.95391850
k = 1.25   FSCV = 0.126962361
k = 1.5     FSCV = 0.0005246392

This being quite makeshift I cannot guarantee the above values 100%, but if someone matches them then we're both happy. 
Obviously this is not the recommended way to price those, but it's a way to provide some reference values, certainly more accurate than what MC could manage.
But what if this was American and/or paid discrete dividends? How would you price it? I'm guessing augmented PDE or LS MC.
Last edited by Billy7 on November 2nd, 2016, 2:51 pm, edited 1 time in total.
 
User avatar
yeahmoon
Posts: 17
Joined: April 22nd, 2008, 1:11 am

Re: Heston - Reference Prices

November 2nd, 2016, 4:28 am

Sounds correct to me, with two caveats:

-the arrow in the displayed figure should be pointing at the nodes in question.
-with a fine enough time step, bottom nodes at the ex-date will lie below zero, which is why you must adopt a [$]\mathcal{D}(S)[$] policy under the piecewise GBM model. 
@Alan: Thank you very much! Your reply is always helpful.
If some one has reference prices (American, European, or both) for Heston model with single discrete dividend, please post!
In Alan's paper, there are some numerical example for discrete dividend options, looks like there is no Heston model.