Serving the Quantitative Finance Community

 
User avatar
Royboy
Topic Author
Posts: 0
Joined: August 4th, 2006, 10:21 am

Excel VBA into MATLAB

August 9th, 2006, 7:42 am

Hi,I have coded up a quadrature methodology to price discrete barrier options in VBA, but I'm finding it difficult to convert into MATLAB.Could anybody please help.Th VBA Code is attached below:Function vaBarrierDownOutOptionQUAD#(iCallPut%, S#, K#, H#, r#, q#, tyr#, sigma#, nBarr%, ky#)' Uses vaQUADsimpson fn Dim vb#, nmj#, dt#, kq#, dy#, ymax#, nm#, xi#, Ax#, qstar# Dim bj#, npj#, sumint#, yi#, Bxy#, fval# Dim j%, i%, ii%, iadd% Dim bjvec#() Dim nplusvec#() Dim vvec#() If S <= H Then vb = CVErr(xlErrValue) ElseIf (iCallPut = -1 And K < H) Then vb = 0 Else ReDim bjvec(nBarr) ReDim nplusvec(nBarr) nmj = 0 dt = tyr / nBarr kq = (r - q) / (0.5 * sigma ^ 2) - 1 dy = Sqr(dt) / ky qstar = 10 * sigma * Sqr(dt) nm = 0 For j = nBarr To 0 Step -1 If j > 0 Then ymax = Log(S / K) + 10 * sigma * Sqr(j * dt) If (j = nBarr And iCallPut = 1) Then bjvec(nBarr) = Log(Max(H, K) / K) Else bjvec(j) = Log(H / K) End If nplusvec(j) = Int((ymax - bjvec(j)) / dy + 0.5) nm = Max(nm, CDbl(nplusvec(j))) Next j nplusvec(0) = 0 ReDim vvec(2 * nm + 1, nBarr)' j=nBarr, option expiry xi = bjvec(nBarr) - 0.5 * dy For i = 0 To 2 * nplusvec(nBarr) + 1 xi = xi + 0.5 * dy vvec(i, nBarr) = Max(iCallPut * K * (Exp(xi) - 1), 0) Next i' intermediate values of j For j = nBarr - 1 To 1 Step -1 bj = bjvec(j + 1) npj = nplusvec(j + 1) xi = bjvec(j) - 0.5 * dy For i = 0 To 2 * nplusvec(j) + 1 xi = xi + 0.5 * dy vvec(i, j) = vaQUADSimpson(xi, vvec, j + 1, bj, npj, nmj, dy, kq, dt, r, sigma, qstar) Next i Next j' j=0, option expiry bj = bjvec(1) npj = nplusvec(1) xi = Log(S / K) vvec(0, 0) = vaQUADSimpson(xi, vvec, 1, bj, npj, nmj, dy, kq, dt, r, sigma, qstar) End If vaBarrierDownOutOptionQUAD = vvec(0, 0)End FunctionFunction vaQUADSimpson#(xi#, vvec As Variant, jp1#, bj#, npj#, nmj#, dy#, kq#, dt#, r#, sigma#, qstar#) Dim sig2#, Ax#, sumint#, yi#, Bxy#, fval#, vi# Dim iplus%, iminus%, iii%, iv% sig2 = sigma * sigma Ax = Exp(-0.5 * kq * xi - 0.125 * dt * sig2 * kq * kq - r * dt) / Sqr(2 * PI * dt * sig2) iplus = Min(Int((xi + qstar - bj) / dy + 0.5), CDbl(npj)) iminus = Max(Int((xi - qstar - bj) / dy + 0.5), CDbl(nmj)) sumint = 0 For iii = iplus To iminus Step -1 For iv = 1 To 0 Step -1 yi = bj + (iii + 0.5 * iv) * dy Bxy = Exp(0.5 * kq * yi - (0.5 * (xi - yi) * (xi - yi)) / (dt * sig2)) vi = vvec(2 * iii + iv, jp1) fval = Bxy * vi sumint = sumint + (dy / 6) * (2 + 2 * iv) * fval Next iv Next iii vaQUADSimpson = Ax * (sumint - (dy / 6) * fval)End Function