 # VBA

Messages postés
7
Date d'inscription
mardi 15 décembre 2020
Statut
Membre
Dernière intervention
18 décembre 2020
-
Messages postés
16011
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juin 2021
-
Bonjour,
J'ai réalisé un code en python et je dois le faire en VBA mais je n'y parviens pas, qqlun serait-il en mesure de m'indiquer comment m'y prendre svp

```def binomial_tree_put_option(S, K, T, r, vol, N):
dt = T/N
u =  math.exp(vol * math.sqrt(dt))
d = 1/u
p = (math.exp(r * dt) - d)/(u - d)
f = {}
for j in range(0, N+1):
f[(N, j)] = max(K - S * (u * (j)) * (d * (N-j)), 0)
for i in range(N-1, -1, -1):
for j in range(0,i+1):
f[(i, j)] = max(K - S * (u * (j)) * (d * (i-j)), math.exp(-r * dt) * (p * f[(i+1, j+1)] + (1-p) * f[(i+1, j)]))
return f[(0,0)]

price_put = [None]*24
Step_put = [None]*24
i = 0
for N in range(2, 70, 3):
price_put[i] = binomial_tree_put_option(50, 50, 0.4167, 0.10, 0.4, N)
Step_put[i] = N
print("Option put price is {:2f} for {:2d}
Steps".format(price_put[i], Step_put[i]))
i = 1+i```

## 9 réponses

Messages postés
16011
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juin 2021
549
Y’a un des liens que tu n’as pas lu dans les régles.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Pour Python, c’est essentiel car cela conserve l’indentation.
Messages postés
16011
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juin 2021
549
Ps tu peux modifier ton message pendant une heure
Messages postés
16011
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juin 2021
549
Merci à Japee d'avoir rendu ton code lisible.

Qu'as tu essayé en VBA?
Messages postés
7
Date d'inscription
mardi 15 décembre 2020
Statut
Membre
Dernière intervention
18 décembre 2020

Bonjour,
Je n'arrivais plus à modifier le message.
J'ai essayé ceci :

```Function binomialtreeputoption (S, K, T, r, vol, N):
dt = T / N
u = T / N
d = 1 / u
p = (Math.Exp(r * dt) - d) / (u - d)
f = {}
for j  in range (0 , N+1) :
f [(N, j) = max (K - S * (u **( j ) )*( d**(N-j)), 0)
for i in range ( N-1; -1;-1):
for j in range (0, i+1) :
f [( i, j) ]  = max(K-S* (u ** (j)) *(d** (i-j)), math.exp( -r *dt)* (p*f[(i+1 , j+1)] + (1-p) * f[( i +1,j)]))
return f [ ( 0,0) ]
priceput = [None] * 24
Stepput = [None] * 24
i = 0
for N in range(2,70,3):
priceput [i] = binomial_tree_put_option(50, 50, 0, 4167, 0, 1, 0, 4, N)
Stepput [i] = N
Msgbox ("Option put price is {:2f} for {:2d} (N) Steps") (format(price_put[i], Step_put[i]))
i = 1 + i
End Function
End Sub```
Messages postés
16011
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juin 2021
549
Pour VBA c'est comme pour python, si le code n'est pas lisible, on ne répond pas.....
Messages postés
7
Date d'inscription
mardi 15 décembre 2020
Statut
Membre
Dernière intervention
18 décembre 2020

Désolée, je viens de rectifier
Messages postés
16011
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juin 2021
549
Ok,

en gros t'as copié collé le code python.

Sauf, que ça n'est pas du tout le même type de langage.

Commence par chercher comment on fait une boucle for en VBA, tu verras que c'est différent. Tu peux aussi chercher for each.

De même, le calcul d'une puissance et d'une exponentielle se codent différemment.

C'est pas tout, mais ce sera déjà un début

Messages postés
7
Date d'inscription
mardi 15 décembre 2020
Statut
Membre
Dernière intervention
18 décembre 2020

Bonsoir,
J'ai revu mon code VBA, malheureusement je n'arrive pas à faire tourner ma boucle For.
Je ne sais pas comment définir mon vecteur f(i,j) sur vba.
Lorsque j'entre f(N,j)= max((K-(S*u^j*d^(N-j)),0) je reçois un message d'erreur disant: "erreur de compilation/ attendu: )" au niveau du premier j de ma formule (u^j).
Mon code vba ce trouve ci-dessous,

Merci d'avance pour votre aide,

```Function binomial_tree_put_option(S As Integer, K As Integer, r As Single, vol As Single, T As Single, q As Single, N As Integer)

Dim dt As Single
Dim u As Single
Dim d As Single
Dim p As Single

dt = T / N
u = Exp(vol * sqrt(dt))
d = 1 / u
p = (Exp(r - q) * dt - d) / (u - d)

Dim i As Integer
Dim j As Integer
Dim f(0 To N, 0 To N) As Single

For j = 0 To N

f(N,j)= max((K-(S*u^j*d^(N-j)),0)

For i = N - 1 To 0
For j = 0 To i
f(i,j)=max(K-S*u^j*d^(i-j),exp(-r*dt)*(p*f(i+1,j+1)+(1-p)*f(i+1,j))

End Function```
Messages postés
7
Date d'inscription
mardi 15 décembre 2020
Statut
Membre
Dernière intervention
18 décembre 2020

J'ai tenté de retravailler mon code et de définir les vecteurs, je suis arrivée au résultat ci-dessous.
Malheureusement un message d'erreur s'affiche pour la formule de la seconde boucle For disant "erreur de compilation/ attendu: séparateur de liste ou parenthèse). Pourriez-vous m'aider s'il vous plaît?

Merci d'avance,

```Function binomial_tree_put_option(S As Integer, K As Integer, r As Single, vol As Single, T As Single, q As Single, N As Integer)

Dim dt As Single
Dim u As Single
Dim d As Single
Dim p As Single

dt = T / N
u = Exp(vol * sqrt(dt))
d = 1 / u
p = (Exp(r - q) * dt - d) / (u - d)

Dim i As Integer
Dim j As Integer
Dim f(0 To N, 0 To N) As Single

Set f = CreateObject("Scripting.Dictionary")

For j = 0 To N

f.addjoin(Array(N, j)) = WorksheetFunction.Max(K - (S * (u^(j)) * (d^(N - j))), 0)
Next j

For i = N - 1 To 0
For j = 0 To i
f(join(array(i,j),",")=WorksheetFunction.Max(K-(S*(u^(j))*(d^(i-j))),Exp(-r*dt)*((p*f(join(array(i+1,j+1),","))))+(1-p)*f(join(array(i+1,j),",")))

Next j
Next i

End Function```
Bonjour

j'ai pas tout regardé (notamment la ligne 26 qui est toute rouge)

Mais déjà

ligne 9, c'est Sqr et pas sqrt

Ligne 15, en vba tu ne peux pas initialiser un tableau avec des variables.

il faut faire un tableau sans dimension et le redimensionner (c'est un peu c.., mais c'est comme ça)
```Dim f() As Single
ReDim f(0 To N, 0 To N)```

ligne 17, f étant un tableau de single, tu ne peux pas y mettre un dictionnaire.

Je me suis arrété là.
Messages postés
16011
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juin 2021
549
J'ai eu un peu de temps pour aller voir plus loin.

Je ne comprends pas ce que tu veux faire avec des "join"

ceci
```   f = {}
for j in range(0, N+1):
f[(N, j)] = max(K - S * (u * (j)) * (d * (N-j)), 0)```

devrait ressembler à

```Dim f() As Single
ReDim f(0 To N, 0 To N)

For j = 0 To N
f(N, j) = WorksheetFunction.Max(K - (S * (u ^ (j)) * (d ^ (N - j))), 0)
Next j```

J'ai dit devrait car dans le max tu mets des puissances en VBA mais pas en python.
Comme je ne sais pas laquelle des 2 formules est juste mathématiquement, je te signale juste la différence
Messages postés
7
Date d'inscription
mardi 15 décembre 2020
Statut
Membre
Dernière intervention
18 décembre 2020

J'ai remodifié comme cela mais j'ai un message d’erreur qui s’affiche me disant que "le caractère de la déclaration de type ne correspond pas au type de données déclaré » (le u^ en gras est surligné)

``` Function binomial_tree_put_option(S As Long, K As Long, r As Long, vol As Long, T As Long, N As Long)

Dim dt, u, d, p As Long

dt = T / N
u = Exp(vol * Sqr(dt))
d = 1 / u
p = (Exp(r - q) * dt - d) / (u - d)

For j = 0 To N
WorksheetFunction.Combin(N, j) = WorksheetFunction.Max(0, K - (S * (u^(j)) * (d^(N - j))))
Next j

For i = N - 1 To 0
WorksheetFunction.Combin(i, j) = WorksheetFunction.Max(K - (S * (u^(j)) * (d^(i - j))), Exp(-r * dt) * (p * WorksheetFunction.Combin(i + 1, j + 1) + (1 - p) * WorksheetFunction.Combin(i + 1, j)))

Next i

binomial_tree_put_option = WorksheetFunction.Combin(0, 0)

End Function
```

Messages postés
16011
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
7 juin 2021
549
Qu.est ce que
` WorksheetFunction.Combin`
vient faire là?

En plus c’est une fonction, donc elle fournit un résultat. Ce n’est pas une variable que l’on affecte