VBA

Signaler
Messages postés
7
Date d'inscription
mardi 15 décembre 2020
Statut
Membre
Dernière intervention
18 décembre 2020
-
Messages postés
15392
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
15 janvier 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
15392
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
15 janvier 2021
499
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
15392
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
15 janvier 2021
499
Ps tu peux modifier ton message pendant une heure
Messages postés
15392
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
15 janvier 2021
499
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
15392
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
15 janvier 2021
499
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
15392
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
15 janvier 2021
499
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
15392
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
15 janvier 2021
499
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
15392
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
15 janvier 2021
499
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