Hi,I am trying to adapt the method by Ju & Zhong (1999) for pricing American Put options to be used for pricing options on commodities futures (cost of carry (b=0)).The article I am looking at can be found here:
http://www.london.edu/IFA/Risk_Measurem ... 105a.pdfMy first question is: Can I adapt this model to price options on futures by simply setting r=q? I have done this and attached the resulting code below.My second question is:Can anyone tell me what I need to do to adapt this formula/code to price an American Call on options on futures?Thanks!'VB.NET code for JZ American Option'Note that iopt is used to attempt to value call versus put'I believe that my implementation below is incorrect.Public Shared Function JZAmer(ByVal enmCallPut As Models.GeneralEuroBS.CallPut, ByVal S As Double, ByVal X As Double, ByVal tyr As Double, ByVal r As Double, ByVal sigma As Double, ByVal e As Double, ByVal intMaxIter As Double, ByVal dblVolSlope As Double) As Double Try Dim atol, va, SStar, eqt, ht, alpha, gam, gamdash, c0, hA, Nd1, Nd2, Ndashd1, calca, calcb, calcc, dv, b, c, chi, iopt, dblBSD1 as Double 'Set iopt = 1 for call, 0 for put iopt = CallPutInt(enmCallPut) atol = e 'Get critical price SStar SStar = MBWSstar1(enmCallPut, S, X, r, tyr, sigma, e, intMaxIter, dblVolSlope) eqt = Exp(-r * tyr) ht = 1 - eqt alpha = 2 * r / (sigma ^ 2) gam = 0.5 * (1 + iopt * Sqrt(1 + 4 * alpha / ht)) gamdash = alpha / (ht ^ 2 * Sqrt(1 + 4 * alpha / ht)) c0 = 2 * gam - 1 'Using Black 76 european valuation for futures options hA = iopt * (SStar - X) - GeneralEuroBS.Black76(enmCallPut, SStar, X, tyr, r, sigma) 'Get D1 using standard formulat where b=0 dblBSD1 = Models.GeneralEuroBS.D1Fut(SStar, X, r, tyr, sigma) 'Distributions.nc is the Cumulative Normal Distribution Function Nd1 = Distributions.nc(iopt * dblBSD1) Nd2 = Distributions.nc(iopt * Models.GeneralEuroBS.D2(dblBSD1, sigma, tyr)) 'Distributions.ndf is the density function of a standard normal random variable Ndashd1 = Distributions.ndf(dblBSD1) calca = SStar * Ndashd1 * sigma / (2 * r * Sqrt(tyr)) calcb = SStar * Nd1 calcc = X * Nd2 dv = -iopt * (calca + calcb - calcc) b = -iopt * (1 - ht) * alpha * gamdash / (2 * c0) c = iopt * (1 - ht) * alpha * (dv / hA + 1 / ht + gamdash / c0) / c0 chi = b * (Log(S / SStar)) ^ 2 + c * Log(S / SStar) If enmCallPut = GeneralEuroBS.CallPut.Call_ Then If S < SStar Then Return GeneralEuroBS.Black76(enmCallPut, S, X, tyr, r, sigma) + hA * ((S / SStar) ^ (gam)) / (1 - chi) Else Return S - X End If Else If S > SStar Then Return GeneralEuroBS.Black76(enmCallPut, S, X, tyr, r, sigma) + hA * ((S / SStar) ^ (gam)) / (1 - chi) Else Return X - S End If End If Catch ex As Exception Return System.Double.NaN End Try End Function