Has anybody tried that. Hull's book says it is difficult to implement Monte Carlo for American Options. My problem is that my Exotic is an intensely path dependent American Option. To start with I was trying to price an American Option but no luck. Here is my code..see if you something very silly. My values are converging for a price almost double Europen Option. Shouldn't they be converging to the same value. (p.s.: Don't tell me the random number generator!}Enclosed:Monte Carlo for Simple American OptionSub SimpleAmericanOption()' Simple American Call OptionDim InitialPrice, StrikePrice, Barrier, Count As IntegerDim StockReturn, Volatility, Dividend, Shock, Maturity, Iterations As DoubleDim Counter, Rowname As IntegerDim Stocktree1(), Stocktree2() As DoubleDim Optiontree1(), Optiontree2() As DoubleDim intI, Stockcolumn, Optioncolumn As IntegerDim dt, dz As Double' Specifies model initial values and parameters'Specifies Random number seedSeed = 2000'Specifies number of iterationsIterations = 500Volatility = 0.25InitialPrice = 217StockReturn = 0.052Shock = 1 / 365StrikePrice = 250Rowname = 1Stockcolumn = 2Optioncolumn = 3Maturity = 3 / Shock'Sizes Array length based on desired maturity of the optionReDim Stocktree1(Maturity)ReDim Stocktree2(Maturity)ReDim Optiontree1(Maturity)ReDim Optiontree2(Maturity)Workbooks.Item(1).ActivateFor i = 1 To Iterations'Fills the stockprice tree Stocktree1(0) = InitialPrice Stocktree2(0) = InitialPrice intI = 1 While intI < Maturity dt = (StockReturn - (0.5 * (Volatility ^ 2))) * Shock dz = ((Shock) ^ 0.5) * Volatility * WorksheetFunction.NormSInv(Ran()) On Error GoTo Line2:' dz and -dz for antithetic adjustment Stocktree1(intI) = Stocktree1(intI - 1) * Exp(dt + dz) Stocktree2(intI) = Stocktree2(intI - 1) * Exp(dt - dz) intI = intI + 1Line2: Wend 'Fills in the loop control variables Count = 0 'Traces stock tree for 30 consecutive days of barrier 'Need to go upto 1259 - 30 days only intI = Maturity - 2 'Calculates the optiontree Optiontree1(Maturity - 1) = Application.Max(Stocktree1(Maturity - 1) - StrikePrice, 0) Optiontree2(Maturity - 1) = Application.Max(Stocktree2(Maturity - 1) - StrikePrice, 0) While intI > 0 Optiontree1(intI) = Application.Max(Optiontree1(intI + 1) * Exp(-StockReturn * Shock), Stocktree1(intI) - StrikePrice) Optiontree2(intI) = Application.Max(Optiontree2(intI + 1) * Exp(-StockReturn * Shock), Stocktree2(intI) - StrikePrice) intI = intI - 1 Wend 'No option to call on day 0, hence simple discount Optiontree1(0) = Optiontree1(1) * Exp(-StockReturn * Shock) Optiontree2(0) = Optiontree2(1) * Exp(-StockReturn * Shock) 'Changes the column in which the result is to be printed after every 60000 iterations 'Resets rowname to 1 after 30000 runs If i Mod 30001 = 0 Then Stockcolumn = Stockcolumn + 2 If i Mod 30001 = 0 Then Optioncolumn = Optioncolumn + 2 If i Mod 30001 = 0 Then Rowname = 1 'Prints the stockvalue after 1260 days and resulting option price Sheets(2).Cells(Rowname, Stockcolumn).Value = 0.5 * (Stocktree1(Maturity - 1) + Stocktree2(Maturity - 1)) Sheets(2).Cells(Rowname, Optioncolumn).Value = 0.5 * (Optiontree1(0) + Optiontree2(0)) Rowname = Rowname + 1 'Saves after every 500 iterations, remember doing CTRL + S all the time If i Mod 500 = 0 Then ActiveWorkbook.SaveNext iEnd Sub

First a gripe. You're asking for a favor for someone to review your code, you should make sure it compiles and runs first (unless that's your question). You had a typo in the RND function (RAN) so it wouldn't compile for me. Then it wouldn't run because the first time through it tries to reference StockTree(-1) and OptionTree(-1). It shouldn't do that, it should start at zero, but that's not your problem. I had to change the Redims to (-1 to Maturity) to get it to run.The first thing I noticed is that the minimum simulated stock price was 231 from an initial price of 217. Your underlying never goes down, which probably accounts for the unreasonably high option price. Here is the relevant code:dt = (StockReturn - (0.5 * (Volatility ^ 2))) * Shockdz = ((Shock) ^ 0.5) * Volatility * WorksheetFunction.NormSInv(Rnd())Stocktree1(intI) = Stocktree1(intI - 1) * Exp(dt + dz)Stocktree2(intI) = Stocktree2(intI - 1) * Exp(dt - dz)Stock price is the average of Stocktree1(1095) and Stocktree2(1095). StockReturn is 0.052, Volatility is 0.25 and Shock is 1/365. dt+dz is Normal with mean 0.0000568 and standard deviation 0.0131. That gives Stocktree1(1095) a lognormal distribution with mean 254 and standard deviation 115. Stocktree2(1095) = 231/Stocktree1(1095). The minimum possible value for stock price is 231, its average is about 260 with a standard deviation of about 35.In addition to this problem, I don't see any code in here to determine the barrier, nor any code to decide the American exercise. This appears to be a vanilla european call. You don't have any tree, which you need for both the American and your barrier feature.

Last edited by Aaron on September 11th, 2003, 10:00 pm, edited 1 time in total.

Last edited by ppauper on November 15th, 2004, 11:00 pm, edited 1 time in total.

longstaff & schwarz have the following very good article: Longstaff, F. A. & Schwartz, E. S. (2001), “Valuing american options by simulation: A simple least squares approach”, Review of Financial Studies Vol.14, No. 1 (Spring 2001), 113-147done some (school)work on it, and at least at first sight their method works very well, though as usual with MC it can be fairly intensive on computational power, depending on the preciseness you require, and, naturally, your random number generator makes a significant difference...

Quote'Calculates the optiontreeOptiontree1(Maturity - 1) = Application.Max(Stocktree1(Maturity - 1) - StrikePrice, 0)Optiontree2(Maturity - 1) = Application.Max(Stocktree2(Maturity - 1) - StrikePrice, 0)While intI > 0Optiontree1(intI) = Application.Max(Optiontree1(intI + 1) * Exp(-StockReturn * Shock), Stocktree1(intI) - StrikePrice)Optiontree2(intI) = Application.Max(Optiontree2(intI + 1) * Exp(-StockReturn * Shock), Stocktree2(intI) - StrikePrice)intI = intI - 1Wend'No option to call on day 0, hence simple discountOptiontree1(0) = Optiontree1(1) * Exp(-StockReturn * Shock)Optiontree2(0) = Optiontree2(1) * Exp(-StockReturn * Shock)Hi All, Aaron, I am really sorry about ran(). Actually I wrote a random number generator of my own, which is what this program was calling and hence the error. Can't trust VB random number generator, it is periodic..add to that the imperfections with Normsinv(); no better way to ask for trouble. Don't get the other objection though. I am trying to simulate in the risk neutral world. The logic beings(t+1) = s(t)*exp(r-vol^2*0.5*dt)*exp(vol^dz). So ending up with high prices doesn't make that much sense. In fact I am getting "good" convergence with European Call Option. My worry is that my high call values can be partly attributed to almost always early exercise of Amercian Option. (pst..My boss will fire me if I say it very often ).As far as the problem of figuring out exercise boundary is concerned, I thought the quoted code does precisely that. I have been thru Longstaff's paper. Will implement it once I get past the simple American Option! BTW, I came across Paul's paper on Early Exercise of American Option. Have yet to read it properly to see if I share the same fate as his paper.Ppauper thanks for the reference to http://www.mcqmc.org/ RegardsR

Last edited by ppauper on November 15th, 2004, 11:00 pm, edited 1 time in total.

The basic premise of this paper is that the exercise boundary has the form S=F(B), where S is one of the state variables and B the remainingstate variables.Even if the exercise bounday has this form the choice of S is usually not abritray and how does one know which S to chose.In the main example (call on the maximum of two assets) the exercise boundary does not have this form instead it consists of two such curves:S_1=F(S_1) and S_2=G(S_1).For a general exotic nothing is known about the exercise boundary.I wonder how the S=F(B) model fits this case.

You can also play arround with American MC

Last edited by ppauper on November 15th, 2004, 11:00 pm, edited 1 time in total.

Hi,I have used Longstaff algorithm to price American Puts and the results are converging fine (and quick). But I am not getting similar results with Amercican Calls (I mean the algorithm should throw same price as European Call but it is not). An idea what could be the reason?Regardsrajni

why bother - use the put-call symmetry instead (swap share price with strike price and risk-free rate with div yield)mike

re american calls -- its a very degenerate case in that you have to develop the exercise strategy of do not early exercise. It doesn't surprise me that Longstaff-Schwartz doesn't find this. MJ

- nitishranjan
**Posts:**10**Joined:**

doesn't that make Longstaff algo incomplete? BTW does all single stock American Call Options (including path dependent ones) are the same as European Call Options. Most of the lit being discussed here is on American Put Options, does anybody know of Call Option treatments. Any reference will be a great help.-- "It's at times like this, when I'm trapped in a Vogon airlock with a manfrom Betelgeuse, and about to die of asphyxiation in deep space, that Ireally wish I'd listened to what my mother told me when I was young."- Arthur Dent in Douglas Adams' The Hitchhiker's Guide to Galaxy

Last edited by nitishranjan on October 6th, 2003, 10:00 pm, edited 1 time in total.

Last edited by ppauper on November 15th, 2004, 11:00 pm, edited 1 time in total.

The Call payoff is (S-K)+ while the Put payoff is (K-S)+ (a bounded meter) so that why a Put converge better than a Call.About the exercised frontier of American I have a question that can we know the form of the frontier's courbe before we calculate the frontier's points (The method here is of Ibanez and Zapatero) ?That means with only the strike and spot price can we imagine how is the form of the frontier's courbe ( a quadratic , a cubic or a linear ) ?Thanks alots

GZIP: On