Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Convertir code Pyhton en VBA (convert Python to VBA)

angel11

XLDnaute Nouveau
Bonjour je souhaiterais convertir ce code Python en VBA mais je n'ai que très peu de connaissance en VBA et pas le temps d'apprendre un nouveau languages.

Voici le code Pyhton c'est un pricer avec simulation monte carlo pour option asiatique et européenne

import math
import random as ran



def option_eu_MC(S0, K, T, r, sigma, call=True):

n=1000000
if call: # call
e = 1
else: # put
e = -1
sigmaT = sigma * math.sqrt(T)
S_T = S0 * math.exp(-sigmaT**2/2)
K_T = K * math.exp(-r*T)

gain = [max(e*( ran.lognormvariate(0,sigmaT)*S_T - K_T ) ,0)
for k in range(n)]
return( moyenne_ecart(gain) )



def moyenne_ecart(xlist):

n = len(xlist)
assert(n>1)
m = sum(xlist)/n
v = sum((x-m)**2 for x in xlist)/n
return( m, math.sqrt(v/(n-1)) )


def option_as_MC(S0, K, T, r, sigma, m, call=True):

n=1000000
drift = (r-sigma**2/2)*T/m
sigmaT= sigma*math.sqrt(T/m)

def echantillon():
somme = 0
Sk = S0
for k in range(m):
Sk *= ran.lognormvariate(drift, sigmaT)
somme += Sk
return(somme/m)

if call:
gain = [max(0, echantillon()-K) for k in range(n)]
else:
gain = [max(0, K-echantillon()) for k in range(n)]

P,sigmaP = moyenne_ecart(gain)

return( math.exp(-r*T)*P, math.exp(-r*T)*sigmaP)
 

ThierryP

XLDnaute Occasionnel
OK, là c'est plus clair.....
Tu peux t'inspirer de ceci :
Sinon, ceci doit lancer ton script Python :
VB:
Sub Python
Fichier_Python = """" & "Le_chemin_ d'accès" & "le_nom_de_ton_fichier" & """"
With CreateObject("WScript.Shell")
        .Run Fichier_Python
    End With
End sub
 

angel11

XLDnaute Nouveau
Merci, oui j'avais trouvé cette solution sauf que si quelqu'un lance le programme sur son ordinateur il doit retourner dans le code et changer tous les chemins ce qui est très contraignant c'est pour cela que je souhaitais voir si quelqu'un avait un moyen de le convertir directement en VBA
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
J'ai cette fonction qui devrait vous intéresser :
VB:
Function DistrN(ByVal Rnd1 As Double, ByVal Rnd2 As Double, ByVal ÉTyp As Double, ParamArray Moy() As Variant) As Variant
   Const Pi×2 = 491701844 / 78256779
   Rnd1 = Sqr(-2 * Log(Rnd1)) * ÉTyp: Rnd2 = Rnd2 * Pi×2
   If UBound(Moy) = 1 Then
   DistrN = Array(Moy(0) + Rnd1 * Cos(Rnd2), Moy(1) + Rnd1 * Sin(Rnd2))
   Else: DistrN = Moy(0) + Rnd1 * Cos(Rnd2): End If
   End Function
 
Dernière édition:

angel11

XLDnaute Nouveau
def option_as_MC_2(S0, K, T, r, sigma, m, call=True,n=1000000):
drift = (r-sigma**2/2)*T/m
sigmaT= sigma*math.sqrt(T/m)
samples = np.random.lognormal(drift,sigmaT,size=(n,m))


Sk_array = S0 * np.cumprod(samples, axis=1)


if call:
gain = np.clip(np.mean(Sk_array, axis=1) - K, 0, None)
else:
gain = np.clip(K - np.mean(Sk_array, axis=1), 0, None)


return( np.mean(gain) * math.exp(-r*T) )

J'ai amélioré l'efficacité de mon code pour la deuxième fonction mais le problème c'est que je ne trouve pas d'équivalent sur VBA des fonctions : random.lognormal, cumprod et clip
 

Dranreb

XLDnaute Barbatruc
Avec ma fonction essayez quelque chose du genre Exp(DistrN(Rnd, Rnd, Log(ÉTyp), Log(Moy)))
Ma fonction renvoie un nombre aléatoire en distribution normale à partir de deux nombres en distribution uniforme compris entre 0 et 1 exclus.
 

Dranreb

XLDnaute Barbatruc
… Mais cette fonction peut peut être vous intéresser :
VB:
Function Borné(ByVal LimInf As Double, ByVal V As Double, ByVal LimSup As Double) As Double
   Borné = (LimInf + Abs(V - LimInf) - Abs(LimSup - V) + LimSup) / 2
   End Function
 

dysorthographie

XLDnaute Accro
Bonjour,
Je ne connais rien à la langue fourchu {python} mais j'avais cru comprendre que l'indentation comptait beaucoup !

Bon nombre d'entre nous n'ont aucune idée de ce qu'est ce langage.
Si tu le maîtrise présentes nous le pseudo code de ton python !
Code:
Faire procédure/Fonction
   Si condition alors
       Faire
       Fin Faire
   Si non 
        Faire
        Fin Faire 
   Fin si
Fin Faire
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…