Partage
  • Partager sur Facebook
  • Partager sur Twitter

Projet étudiant - Crédit Risque

Traduction en Python d'un exercice de Crédit Risque

    1 décembre 2020 à 14:47:27

    Bonjour chère communauté,

    Pour expliquer le contexte de notre problème, nous sommes un groupe de deux étudiants (Julien et moi même Antoine) et nous étudions la finance. Aujourd'hui, nous travaillons sur notre projet final sur le risque de crédit. Je vais montrer notre sujet avec l'exemple et notre travail, il s'agit d'un exercice de crédit risque dont les formules résolues doivent nous permettent de trouver une probabilité de défaut de 12,7%. 

    C'est un début pour nous, mais nous aimerions que vous compreniez pourquoi notre programme ne fonctionne pas et comment nous pouvons corriger l'erreur.Il y a un peu de lecture mais c'est nécessaire si vous voulez comprendre notre exercice et ce qui ne va pas dans notre code (et oui j'organise mes projets comme un enfant avec du collage).

    Page 1

    page 2

    Notre première initiative fut de tester l'exemple mot pour mot en intégrant toute les variables données, c'est à dire sans utiliser les équations 22.3 et 22.4 et en considérant que V0 et Sigma_V étaient définies :

    import numpy as np
    
    r = 0.05
    T = 1
    D = 10
    V_O = 12.4
    sigma_val = 0.2123
    
    def d1(r,T,D,V_0,sigma_val):
        return (np.log(V_O/D)+(r+sigma_val**2/2)*T)/sigma_val*np.sqrt(T)
    
    a = d1(0.05,1,10,12.4,0.2123)
    print("d1 =",a)
    
    def d2(r,T,D,V_0,sigma_val):
        return d1(r,T,D,V_O,sigma_val)-sigma_val*np.sqrt(T)
    
    b = d2(0.05,1,10,12.4,0.2123)
    print("d2 =",b)
    
    import scipy.integrate as integrate
    
    def phi(x):
        return np.exp(-x**2/2)
    
    def N(x):
        return 1/np.sqrt(2*np.pi)*integrate.quad(phi,-np.inf,x)[0]
    
    
    print ("The default probability of the company is",1-N(b))

    Ce premier jet a été positif puisque nous avons obtenu :

    runfile('/Users/Chvantoine/Downloads/topic5.py', wdir='/Users/Chvantoine/Downloads')

    d1 = 1.3549082647995547

    d2 = 1.1426082647995548

    The default probability of the company is 0.1266006362637757

    CEPENDANT IL NOUS FALLAIT DESORMAIS INTEGRER LES DEUX EQUATIONS (22.3 et 22.4) QUI PERMETTRAIENT AU PROGRAMME DE TROUVER LUI-MÊME LES VALEURS V0 ET SIGMA_V POUR TROUVER UNE PROBABILITÉ DE DÉFAUT DE 12,7%.

    NOUS AVONS DONC FAIT EVOLUER NOTRE PROGRAMME COMME SUIT :

    import numpy as np
    import scipy.optimize
    from scipy import integrate as intg
    
    # valeurs donnees
    E0 = 3
    sE = 0.8
    r = 0.05
    T = 1
    D = 10
    
    # fonctions intermediaires :
    def g(u):
        return np.exp(-u*u/2)/np.sqrt(np.pi*2)
    
    def N(d):
        res = intg.quad(g, -np.inf, d)
        return res[0]
    
    def d1(V0, sV):
        return (np.log(V0/D)+T*(r + sV*sV/2)) / (sV*np.sqrt(T))
    
    def d2(V0, sV):
        return d1(V0, sV) - sV*np.sqrt(T)
    
    # FONCTION A MINIMISER : obligation avoir 1 variable mais  X = vecteur à 2 coordonnées
    
    def F(X):
        V0 = X[0]
        sV = X[1]
        return np.abs(E0 - V0*N(d1(V0, sV)) + D*np.exp(-r*T)*N(d2(V0, sV))) + np.abs(sE * E0 - N(d1(V0, sV))*sV*V0)
    
    
    # Valeurs de départ X0: il faut donner des valeurs initiales, l'algo va chercher à minimiser la fonction de proche en proche.
    X0 = np.array([12.4, 0.21])
    resultat = scipy.optimize.least_squares(F, X0, ftol=1e-20)
    Xfinal = resultat.x
    print('Current asset value and volatility are', Xfinal)
    print('Valeur de F en ce point : ', F(Xfinal))
    
    print('d1=', d1(Xfinal[0], Xfinal[1]))
    print('d2=', d2(Xfinal[0], Xfinal[1]))
    
    print('The default probability is', (1-N(d2(Xfinal[0], Xfinal[1])))*100, '%')

    ET NOUS AVONS OBTENU :

    runfile('/Users/Chvantoine/Downloads/Final.py', wdir='/Users/Chvantoine/Downloads')

    /Users/Chvantoine/opt/anaconda3/lib/python3.8/site-packages/scipy/optimize/_lsq/least_squares.py:110: UserWarning: Setting `ftol` below the machine epsilon (2.22e-16) effectively disables the corresponding termination condition.

      warn("Setting `{}` below the machine epsilon ({:.2e}) effectively "

    Current asset value and volatility are [12.40012136     0.2121201 ]

    Valeur de F en ce point :  0.0039537810988634625

    d1= 1.3559235075207152

    d2= 1.143803403426495

    The default probability is 12.635258903691348 %

    OR VOICI LE PROBLEME : la dernière valeur de 12,635% ne nous donne pas 12,7% à l'arrondi.

    Nous bloquons réellement sur ce point car nous ne savons pas ce que nous pouvons changer pour nous rapprocher au maximums des Sigma_V et d2 de l'exemple tout en obtenant une probabilité de défaut de 12,7%

    Je tiens à remercier d'avance tous les expert.e.s qui liront et tenteront de nous aider.

    Merci à tous !

    ps: Mea culpa pour l'énoncé de l'exercice, car oui par souci d'organisation je fais encore du collage à 26 ans

    -
    Edité par AntoineChevalierRauchman 1 décembre 2020 à 14:49:23

    • Partager sur Facebook
    • Partager sur Twitter
      1 décembre 2020 à 15:18:02

      Bonjour !

      J'aime beaucoup la méthode du collage, ça fait peut-être « vieille école » mais ce n'est pas un problème.

      Est-ce que tu es sûr que cette valeur de 12,7 % n'est pas elle même un arrondi de quelque chose ? En général, si on donne un chiffre après la virgule, c'est qu'il s'agit d'une valeur connue à 1/10 près, et 12,6 est peut-être correct ? (C'est pas comme si on donnait 12,70.)

      Est-ce que tu connais la précision de la fonction qui calcule l'intégrale de moins l'infini à d ? Ça ne pourrait pas venir de là ?

      • Partager sur Facebook
      • Partager sur Twitter

      Projet étudiant - Crédit Risque

      × 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