Partage
  • Partager sur Facebook
  • Partager sur Twitter

Retranscrire python en VBA

    16 décembre 2020 à 16:08:41

    Bonjour à tous,

    y aurait -il qqlun parmis vous qui serait en mesure de m'aider à retranscrire un code python en VBA 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
    



    • Partager sur Facebook
    • Partager sur Twitter
      17 décembre 2020 à 16:45:33

      vba ? ou vb.net ?

       ça devrait un quelque chose comme ça

      function binomial_tree_put_option(S as double, K as double, T as double, r as double, vol as double, N as double) as double
         dim dt as double, u as double, d as double, p as double
         dim i as integer, j as integer
         dim f
         dt = T/N
         u =  math.exp(vol * math.sqrt(dt))
         d = 1/u
         p = (math.exp(r * dt) - d)/(u - d)
         Set f = CreateObject("Scripting.Dictionary")
         for j =0 to N
               f.add join(array(N, j),","), WorkSheetFunction.Max(K - S * (u ^ (j)) * (d ^ (N-j)), 0)
         next j
         for i =(N-1) to 0 step  -1
            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
         binomial_tree_put_option f("0,0")
      end function
      
      ' une autre méthode
      sub test()
         dim price_put(24) as double 'ça devrait être 23 pour avoir des indices de 0 à 23 (soit 24 éléments)
         dim Step_put(24) as double 'ça devrait être 23 pour avoir des indices de 0 à 23 (soit 24 éléments)
         dim i as integer, N as integer
         i = 0
         for N = 2 to 69 step 3
            price_put(i) = binomial_tree_put_option(50, 50, 0.4167, 0.10, 0.4, N)
            Step_put(i) = N
            debug.print("Option put price is " & price_put(i) & " for " & price_put(i) & " Steps")
            i = 1+i
         next N
      end sub



      • Partager sur Facebook
      • Partager sur Twitter
        17 décembre 2020 à 19:12:02

        Bonsoir, 

        C'est bien du vba.

        J'ai tenté de reproduire le code que vous m'avez suggéré (encore un grand merci ça m'aide beaucoup), 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).

        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





        • Partager sur Facebook
        • Partager sur Twitter
          18 décembre 2020 à 16:33:27

          je vois une erreur en ligne 21 il manque un espace entre add et join ; et il y a un = en trop (à remplacer par une virgule) cf mon code

          et si tu ne mets pas de séparateur dans les join au début, il faut aussi les supprimer dans le calcul ligne 26 

          => f(join(array(i+1,j+1),",")) devient f(join(array(i+1,j+1)))

          join(array(a,b,c),sep) === cstr(a) & sep & cstr(b) & sep & cstr(c) (sep étant optionnel, si il n'est pas utilisé, le séparateur est un espace simple)

          ex: join(array(10,12)) => c'est la chaine "10 12"

          join(array(10,12),",")) => c'est la chaine "10,12"

          PS: je n'avais pas précisé mais c'est le code pour du vba Excel (on utilise la fonction max d'Excel) sinon il faut soit faire sa propre fonction max, soit créer un objet excel pour utiliser sa fonction max

          • Partager sur Facebook
          • Partager sur Twitter

          Retranscrire python en VBA

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown