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
 

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

Statistiques des forums

Discussions
315 104
Messages
2 116 253
Membres
112 702
dernier inscrit
JRCa91