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
17467
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2022
- 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
17467
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2022
599
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.
0
Whismeril
Messages postés
17467
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2022
599
15 déc. 2020 à 12:48
Ps tu peux modifier ton message pendant une heure
0
Whismeril
Messages postés
17467
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2022
599
15 déc. 2020 à 17:48
Merci à Japee d'avoir rendu ton code lisible.

Qu'as tu essayé en VBA?
0
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
0
Whismeril
Messages postés
17467
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2022
599
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.....
0
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
0
Whismeril
Messages postés
17467
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2022
599
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

0

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
0
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
0
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à.
0
Whismeril
Messages postés
17467
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2022
599
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
0
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

0
Whismeril
Messages postés
17467
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
28 juin 2022
599
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
0