Avatar billede benderen Nybegynder
25. oktober 2011 - 14:13 Der er 1 kommentar

Exercise policy for optioner i VBA

Det er sikkert et ret basic spørgsmål, men here goes:

Jeg er i gang med at udarbejde et ark for finansielle optioner i excel og skal i den forbindelse lave en kode i VBA der automatisk kan vise om optionen skal indløses eller om den skal beholdes. Jeg har udarbejdet, hvordan stockprice og optionprice bevæger sig vha VBA, men jeg kan ikke få koden der skal vise om optionen skal "Keep" eller "Exercise" til at fungere. Jeg har c/p de to første koder som fungerer ind herunder og nederst har jeg indsat den kode som jeg ikke kan få til at virke lige nu:


Module1:
Option Base 1

Function stockgridVarPeriod(S, X, T, rf, sigma, n)

Dim delta_t, u, d

delta_t = T / n
u = Exp(sigma * Sqr(delta_t))
d = Exp(-sigma * Sqr(delta_t))


Dim stockgrid()
ReDim stockgrid(n + 1, n + 1)

stockgrid(1, 1) = S

Dim time, i

For time = 2 To n + 1
    i = time
    stockgrid(i, time) = d * stockgrid(i - 1, time - 1)
Next time

For time = 2 To n + 1
    For i = 1 To time - 1
        stockgrid(i, time) = u * stockgrid(i, time - 1)
    Next i
Next time

stockgridVarPeriod = stockgrid

End Function


Module2:
Option Base 1

Function optiongridVarPeriodAmrPut(S, X, T, rf, sigma, n)

Dim delta_t, u, d, R, qu, qd, time, i


Dim stockgrid()
ReDim stockgrid(n + 1, n + 1)
stockgrid = stockgridVarPeriod(S, X, T, rf, sigma, n)

delta_t = T / n
u = Exp(sigma * Sqr(delta_t))
d = Exp(-sigma * Sqr(delta_t))
R = Exp(rf * delta_t)
qu = (R - d) / (R * (u - d))
qd = (u - R) / (R * (u - d))


Dim optiongrid()
ReDim optiongrid(n + 1, n + 1)


For i = 1 To n + 1
    time = n + 1
    optiongrid(i, time) = Application.Max(X - stockgrid(i, time), 0)
Next i


For time = n To 1 Step -1
    For i = 1 To time
        optiongrid(i, time) = Application.Max(X - stockgrid(i, time), qu * optiongrid(i, time + 1) + qd * optiongrid(i + 1, time + 1))
    Next i
Next time

optiongridVarPeriodAmrPut = optiongrid

End Function


Function gridAmrPutPrice(S, X, T, rf, sigma, n)

Dim delta_t, u, d, R, qu, qd, time, i


Dim stockgrid()
ReDim stockgrid(n + 1, n + 1)
stockgrid = stockgridVarPeriod(S, X, T, rf, sigma, n)


delta_t = T / n
u = Exp(sigma * Sqr(delta_t))
d = Exp(-sigma * Sqr(delta_t))
R = Exp(rf * delta_t)
qu = (R - d) / (R * (u - d))
qd = (u - R) / (R * (u - d))


Dim optiongrid()
ReDim optiongrid(n + 1, n + 1)


For i = 1 To n + 1
    time = n + 1
    optiongrid(i, time) = Application.Max(X - stockgrid(i, time), 0)
Next i


For time = n To 1 Step -1
    For i = 1 To time
        optiongrid(i, time) = Application.Max(X - stockgrid(i, time), qu * optiongrid(i, time + 1) + qd * optiongrid(i + 1, time + 1))
    Next i
Next time


gridAmrPutPrice = optiongrid(1, 1)


End Function


Module3:
Option Base 1

Function PolicyAmrPut(S, X, T, rf, sigma, n)

Dim delta_t, u, d, R, qu, qd, time, i

delta_t = T / n
u = Exp(sigma * Sqr(delta_t))
d = Exp(-sigma * Sqr(delta_t))
R = Exp(rf * delta_t)
qu = (R - d) / (R * (u - d))
qd = (u - R) / (R * (u - d))

Dim stockgrid()
ReDim stockgrid(n + 1, n + 1)
stockgrid = stockgridVarPeriod(S, X, T, rf, sigma, n)

Dim optiongrid()
ReDim optiongrid(n + 1, n + 1)
optiongrid = optiongridVarPeriodAmrPut(S, X, T, rf, sigma, n)

Dim Policygrid()
ReDim Policygrid(n + 1, n + 1)

For time = 1 To n + 1 Step 1
    For i = 1 To time
        Policygrid(i, time) = Application.if(X - stockgrid(i, time) > qu * optiongrid(i, time + 1) + qd * optiongrid(i + 1, time + 1), "Exercise", "Keep")
    Next i
Next time

PolicyAmrPut = Policygrid

End Function


Det er som nævnt ovenfor Module3 jeg ikke kan få til at virke, hvor modulet trækker data fra både module1 og module2 og skal skrive enten "Exercise" eller "Keep" alt efter om ligningen for Policygrid(i, time) er opfyldt.

Jeg håber der er en der kan gennemskue det :)
Avatar billede benderen Nybegynder
25. oktober 2011 - 14:28 #1
Jeg havde noget kode med i det første indlæg, som ikke skal bruges til løsningen - det er nu renset i nedenstående, så se bort fra min første post.


Det er sikkert et ret basic spørgsmål, men here goes:

Jeg er i gang med at udarbejde et ark for finansielle optioner i excel og skal i den forbindelse lave en kode i VBA der automatisk kan vise om optionen skal indløses eller om den skal beholdes. Jeg har udarbejdet, hvordan stockprice og optionprice bevæger sig vha VBA, men jeg kan ikke få koden der skal vise om optionen skal "Keep" eller "Exercise" til at fungere. Jeg har c/p de to første koder som fungerer ind herunder og nederst har jeg indsat den kode som jeg ikke kan få til at virke lige nu:


Module1:
Option Base 1

Function stockgridVarPeriod(S, X, T, rf, sigma, n)

Dim delta_t, u, d

delta_t = T / n
u = Exp(sigma * Sqr(delta_t))
d = Exp(-sigma * Sqr(delta_t))


Dim stockgrid()
ReDim stockgrid(n + 1, n + 1)

stockgrid(1, 1) = S

Dim time, i

For time = 2 To n + 1
    i = time
    stockgrid(i, time) = d * stockgrid(i - 1, time - 1)
Next time

For time = 2 To n + 1
    For i = 1 To time - 1
        stockgrid(i, time) = u * stockgrid(i, time - 1)
    Next i
Next time

stockgridVarPeriod = stockgrid

End Function


Module2:
Option Base 1

Function optiongridVarPeriodAmrPut(S, X, T, rf, sigma, n)

Dim delta_t, u, d, R, qu, qd, time, i


Dim stockgrid()
ReDim stockgrid(n + 1, n + 1)
stockgrid = stockgridVarPeriod(S, X, T, rf, sigma, n)

delta_t = T / n
u = Exp(sigma * Sqr(delta_t))
d = Exp(-sigma * Sqr(delta_t))
R = Exp(rf * delta_t)
qu = (R - d) / (R * (u - d))
qd = (u - R) / (R * (u - d))


Dim optiongrid()
ReDim optiongrid(n + 1, n + 1)


For i = 1 To n + 1
    time = n + 1
    optiongrid(i, time) = Application.Max(X - stockgrid(i, time), 0)
Next i


For time = n To 1 Step -1
    For i = 1 To time
        optiongrid(i, time) = Application.Max(X - stockgrid(i, time), qu * optiongrid(i, time + 1) + qd * optiongrid(i + 1, time + 1))
    Next i
Next time

optiongridVarPeriodAmrPut = optiongrid

End Function


Module3:
Option Base 1

Function PolicyAmrPut(S, X, T, rf, sigma, n)

Dim delta_t, u, d, R, qu, qd, time, i

delta_t = T / n
u = Exp(sigma * Sqr(delta_t))
d = Exp(-sigma * Sqr(delta_t))
R = Exp(rf * delta_t)
qu = (R - d) / (R * (u - d))
qd = (u - R) / (R * (u - d))

Dim stockgrid()
ReDim stockgrid(n + 1, n + 1)
stockgrid = stockgridVarPeriod(S, X, T, rf, sigma, n)

Dim optiongrid()
ReDim optiongrid(n + 1, n + 1)
optiongrid = optiongridVarPeriodAmrPut(S, X, T, rf, sigma, n)

Dim Policygrid()
ReDim Policygrid(n + 1, n + 1)

For time = 1 To n + 1 Step 1
    For i = 1 To time
        Policygrid(i, time) = Application.if(X - stockgrid(i, time) > qu * optiongrid(i, time + 1) + qd * optiongrid(i + 1, time + 1), "Exercise", "Keep")
    Next i
Next time

PolicyAmrPut = Policygrid

End Function


Det er som nævnt ovenfor Module3 jeg ikke kan få til at virke, hvor modulet trækker data fra både module1 og module2 og skal skrive enten "Exercise" eller "Keep" alt efter om ligningen for Policygrid(i, time) er opfyldt.

Jeg håber der er en der kan gennemskue det :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester