 # VBA

annechap_8294 Messages postés 7 Date d'inscription mardi 15 décembre 2020 Statut Membre Dernière intervention 18 décembre 2020 - Modifié le 15 déc. 2020 à 16:17
Whismeril Messages postés 18639 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2023 - 18 déc. 2020 à 23:41
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

Whismeril Messages postés 18639 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2023 629
15 déc. 2020 à 12:48
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.
Whismeril Messages postés 18639 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2023 629
15 déc. 2020 à 12:48
Ps tu peux modifier ton message pendant une heure
Whismeril Messages postés 18639 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2023 629
15 déc. 2020 à 17:48
Merci à Japee d'avoir rendu ton code lisible.

Qu'as tu essayé en VBA?
annechap_8294 Messages postés 7 Date d'inscription mardi 15 décembre 2020 Statut Membre Dernière intervention 18 décembre 2020
Modifié le 15 déc. 2020 à 19:15
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
Whismeril Messages postés 18639 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2023 629
15 déc. 2020 à 19:08
Pour VBA c'est comme pour python, si le code n'est pas lisible, on ne répond pas.....
annechap_8294 Messages postés 7 Date d'inscription mardi 15 décembre 2020 Statut Membre Dernière intervention 18 décembre 2020
15 déc. 2020 à 19:18
Désolée, je viens de rectifier
Whismeril Messages postés 18639 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2023 629
15 déc. 2020 à 19:25
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
annechap_8294 Messages postés 7 Date d'inscription mardi 15 décembre 2020 Statut Membre Dernière intervention 18 décembre 2020
17 déc. 2020 à 18:37
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
annechap_8294 Messages postés 7 Date d'inscription mardi 15 décembre 2020 Statut Membre Dernière intervention 18 décembre 2020
17 déc. 2020 à 19:17
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à.
Whismeril Messages postés 18639 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2023 629
18 déc. 2020 à 18:17
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
annechap_8294 Messages postés 7 Date d'inscription mardi 15 décembre 2020 Statut Membre Dernière intervention 18 décembre 2020
18 déc. 2020 à 18:31
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


Whismeril Messages postés 18639 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 octobre 2023 629
18 déc. 2020 à 23:41
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
Rejoignez-nous