Why am i getting american option prices lower than european prices?

  • Thread starter Thread starter YuZhao
  • Start date Start date
Joined
3/25/11
Messages
26
Points
13
I am using monte carlo process to price american options, based on black-scholes framework. i expect the american call option prices equal to european prices when there is no dividend and larger than european call prices otherwise,
However, the simualted price i got for american options is lower than the black-scholes european prices, which is ridiculous. Can i anybody help me see where is the problem?
 
I am using monte carlo process to price american options, based on black-scholes framework. i expect the american call option prices equal to european prices when there is no dividend and larger than european call prices otherwise,
However, the simualted price i got for american options is lower than the black-scholes european prices, which is ridiculous. Can i anybody help me see where is the problem?

MC method for American option is non-trivial. What methodology did you use?
 
MC method for American option is non-trivial. What methodology did you use?

Basicly, I am plugging in random numbers to the lognormal distribution of stock and generating payoff in each node like a binomial tree.
this is the VBA code.

Code:
Function YuAmericanCall(s0 As Double, k As Double, r As Double, t As Double, d As Double, v As Double)
Dim normalnum As Double
Dim stock() As Double
Dim sum As Double
Dim payoff(10000)
ReDim stock(1 To 10000, 1 To t * 12)
For i = 1 To 10000
For j = 1 To t * 12
normalnum = WorksheetFunction.NormInv(Rnd(), 0, 1)
stock(i, j) = s0 * Exp((r - d - (v ^ 2) / 2) * t * j / 12 + v * ((t * j / 12) ^ 0.5) * normalnum)
Next j
Next
j = t * 12
Do While j >= 2
For i = 1 To 10000
If (stock(i, j) - k) * Exp(-r / 12) > (stock(i, j - 1) - k) And stock(i, j) - k > 0 Then payoff(i) = (stock(i, j) - k) * Exp(-r / 12)
If (stock(i, j) - k) * Exp(-r / 12) <= (stock(i, j - 1) - k) And stock(i, j - 1) - k > 0 Then payoff(i) = (stock(i, j - 1) - k)
Next i
j = j - 1
Loop

For i = 1 To 10000
sum = sum + payoff(i)
Next i
YuAmericanCall = sum / 10000

End Function
 
i expect the american call option prices equal to european prices when there is no dividend and larger than european call prices otherwise,

Firstly American call option prices are always greater than or equal to European call prices when there is no dividend. See Hull (Chapter 9) for further details. Hull also explains even with dividend. Please pay extra attention to this chapter. The (boundary) conditions for american options are different compared to European options (not what you would initially guess). I am assuming you have not done Finite Difference Method for American options yet.

Code Issues:

  1. Your stock paths for stock(I,j) (here I is constant and j is varying) need to be releated: stock(I,j+1) = stock(I,j)* Exp(...)
  2. Your if..then payoffs are not correct. Read Hull Chapter 9.
 
Firstly American call option prices are always greater than or equal to European call prices when there is no dividend. See Hull (Chapter 9) for further details. Hull also explains even with dividend. Please pay extra attention to this chapter. The (boundary) conditions for american options are different compared to European options (not what you would initially guess). I am assuming you have not done Finite Difference Method for American options yet.

Code Issues:

  1. Your stock paths for stock(I,j) (here I is constant and j is varying) need to be releated: stock(I,j+1) = stock(I,j)* Exp(...)
  2. Your if..then payoffs are not correct. Read Hull Chapter 9.
My program only allow for continuous dividend rate. So, no discrete dividend exits in program. I modified the code. It seems that it make better sense this time, but the result of american options prices still goes lower than european option prices. I bolded the part where i modeified.

Function YuAmericanCall(s0 As Double, k As Double, r As Double, t As Double, d As Double, v As Double)
Dim normalnum As Double
Dim stock() As Double
Dim sum As Double
Dim payoff(10000)
ReDim stock(1 To 10000, 1 To t * 12)
For i = 1 To 10000
For j = 1 To t * 12
normalnum = WorksheetFunction.NormInv(Rnd(), 0, 1)
stock(i, j) = s0 * Exp((r - d - (v ^ 2) / 2) * t * j / 12 + v * ((t * j / 12) ^ 0.5) * normalnum)
Next j
Next i
j = t * 12
Do While j >= 2
For i = 1 To 10000
If payoff(i) * Exp(-r / 12) > (stock(i, j - 1) - k) Then
payoff(i) = payoff(i) * Exp(-r / 12)
ElseIf payoff(i) * Exp(-r / 12) <= (stock(i, j - 1) - k) And stock(i, j - 1) - k > 0 Then
payoff(i) = (stock(i, j - 1) - k)
Else
payoff(i) = 0
End If
Next i
j = j - 1
Loop

For i = 1 To 10000
sum = sum + payoff(i)
Next i
YuAmericanCall = sum / 10000

End Function
 
Yu,

Code: stock(i, j) = s0 * Exp((r - d - (v ^ 2) / 2) * t * j / 12 + v * ((t * j / 12) ^ 0.5) * normalnum)

I am not familar with VBA but this does not look correct. Looks like your code will generate non-connected stock paths i.e., discontinuous stock paths. Try plotting stock (I,j) for small time intervals and see if it looks continuous. The correction IMO would be : To get the value of Stock(i, j+1), first start with Stock(i,j) adjust it for drift and diffusion to get Stock(i, j+1).

Without dividend C>=S-K*exp(-r*(T-t)). This is if the call option is not excercised. Hull explains why call options without dividend are almost never exercised.

With continuous dividend C>= S *exp(-q*(T-t)) - K*exp(-r*(T-t)). This is the value if the call option is not exercised. With dividend calls may get exercised depending on the dividend. Hence you need to check S *exp(-q*(T-t)) - K*exp(-r*(T-t)) with S-K. The bigger of the two must be selected. Again, go through chapter 9 of Hull to undertsand this. Extracting this information from the post will not help you much.
 
Monte Carlo and early exercise is problematic; performance, underlying theory and what about discrete dividends?

A more robust method is to use PDE/FDM.
 
Thanks enthusiast, This is really helpful. i see the problem of my previous stock path. Below is the new code of my stock path. This time, the call option prices are always higher than the eurpean prices. This is good!!! However, when dividend rate is zero, the american price and european price are not the same, which imply mistakes. I can see why C>= S *exp(-q*(T-t)) - K*exp(-r*(T-t)) is the condition for early exercises of american options, but isnt this built in the recursive payoff formula we just talked about? I dont see why my american prices are not the same as european prices when there is no dividend.

Again, thanks enthusiast

Dim cur_price As Double
For i = 1 To 10000
For j = 1 To t * 12
normalnum = WorksheetFunction.NormInv(Rnd(), 0, 1)
If j = 1 Then
cur_price = s0
Else
cur_price = stock(i, j - 1)
End If
stock(i, j) = cur_price * Exp((r - d - (v ^ 2) / 2) / 12 + v * ((1 / 12) ^ 0.5) * normalnum)
Next j
Next i
 
However, when dividend rate is zero, the american price and european price are not the same, which imply mistakes.i

This is not true. With no dividend, american option price >= European price. This tells me you have not read chapter 9.

Yu, Pricing American options is not as easy as it appears. Trust me, I thought so during my first implementation of FDM. Read Chapter 9. After reading chapter 9 it will take a some additonal time for most to get it. I will not answer any more of your questions until you read chapter 9. chapter 9 -- chapter 9, damn it!

Finite Difference Method is definitely much better for American Option Pricing. You can also used Binomial Trees, but i think performance will be much better with FDM using Crank Nicolson / SOR scheme.
 
This is not true. With no dividend, american option price >= European price. This tells me you have not read chapter 9.

Yu, Pricing American options is not as easy as it appears. Trust me, I thought so during my first implementation of FDM. Read Chapter 9. After reading chapter 9 it will take a some additonal time for most to get it. I will not answer any more of your questions until you read chapter 9. chapter 9 -- chapter 9, damn it!

Finite Difference Method is definitely much better for American Option Pricing. You can also used Binomial Trees, but i think performance will be much better with FDM using Crank Nicolson / SOR scheme.
enthusiast, i dont have that textbook. I know it is a good one and many people are reading it, but i cant get that right away. I think i may buy one later. i guess I will take a course using that book in my junior year...
 
enthusiast, i dont have that textbook. I know it is a good one and many people are reading it, but i cant get that right away. I think i may buy one later. i guess I will take a course using that book in my junior year...

Check the library.
 
enthusiast, i dont have that textbook. I know it is a good one and many people are reading it, but i cant get that right away. I think i may buy one later. i guess I will take a course using that book in my junior year...

btw, when i said the american option prices and european option prices are the same when there is no dividend, i really meant for call options and i was testing my program for only call options. For all american options, it is true that american option prices >= European prices.
 
Back
Top Bottom