IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Composantes vecteur à modifier [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2017
    Messages : 22
    Par défaut Composantes vecteur à modifier
    Bonsoir,

    J'ai un petit soucis au niveau de la programmation vba

    J'utilise une méthode de récursion pour retrouver les paramètres de mon vecteur intensite;
    Cependant la valeur de mes résultats ne changent pas après chaque itération et je comprends pas pourquoi puisque j'ai modifier une variable dans leur calcul.

    Voici les codes utilisées

    -> le programme principale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Sub calibration_intensite()
     
    'programme qui retrouve les intensites de défaut
     
    Dim paiement As Double 'pas des paiement des cds
    Dim time(10) 'date de maturité des cds
    Dim intensite(10) 'intensité de défaut
    Dim ss As Double  'flux jambe fixe
    Dim sss As Double  'flux jambe variable
    Dim jf(10) 'jambe fixe du cds
    Dim jv(10) 'jambe variable du cds
    Dim s(10) 'spread des cds
     
    'date de maturité des cds
    time(0) = 0
    time(1) = 0.5
    time(2) = 1
    time(3) = 2
    time(4) = 3
    time(5) = 4
    time(6) = 5
    time(7) = 7
    time(8) = 10
    time(9) = 20
    time(10) = 30
     
    'on récupère les valeurs des variables
    For i = 1 To 10
        intensite(i) = 0
        s(i) = Cells(i + 4, 4) / 10000
        jv(i) = 1
        jf(i) = -1
    Next
     
    'début de la récursion
    For i = 1 To 10
        paiement = 0.25
        ss = 0
        sss = 0
        While Abs(jv(i) - jf(i)) > 0.0000001
     
            intensite(i) = intensite(i) + 0.00000001
            Cells(27 + i, 6) = intensite(i)
            While paiement <= time(i)
     
                ss = proba_de_survie(paiement, intensite) * Exp(-spline(paiement) * paiement) * 0.25 + ss
                sss = sss + 0.64 * (proba_de_survie(paiement - 0.25, intensite) - proba_de_survie(paiement, intensite)) * Exp(-spline(paiement) * paiement)
                paiement = paiement + 0.25
            Wend
     
            jv(i) = sss
            jf(i) = ss * s(i)
            Cells(16 + i, 5) = jf(i)
            Cells(16 + i, 6) = jv(i)
        Wend
     
    Next
    End Sub
    ->ceux utilisés pour dans le programme principale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Function proba_de_survie(t, lambda)
     
    Dim i As Integer 'pas de temps
    Dim q As Double 'proba de survie
    Dim temps 'date de maturité des spreads
    Dim n As Integer
     
     
     
    ReDim temps(10)
    'initialisation
     
    i = 1 'pas de temps
    q = 1 'proba de survie égale à un en 0
     
    'récupération des paramètres
     
    temps(0) = 0
    For j = 1 To 10
        temps(j) = Cells(j + 4, 1) 'récupération des dates de changements d'intensité
    Next
     
     
    'calcul des proba de défaut à chaque pas
    While t > temps(i)
    q = q * Exp(-(temps(i) - temps(i - 1)) * lambda(i))
    i = i + 1
    Wend
     
    'calcul de la probabilité de défaut finale
    q = q * Exp(-(t - temps(i - 1)) * lambda(i))
     
    proba_de_survie = q
     
     
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    Function spline(x)
     
    Dim xin(29) As Single 'variable de temps
    Dim yin(29) As Single 'variable de taux
     
     
    Dim i As Integer 'variable de boucle
     
    'on implémente les vecteurs avec les coordonées des points observés
    For i = 1 To 29
        xin(i) = Sheets("spline").Cells(i + 2, 1)
        yin(i) = Sheets("spline").Cells(i + 2, 2)
    Next
     
     
     
     
    Dim n As Integer 'variable du nombre total de valeur = nb_input
    Dim k As Integer 'variable de boucle
     
    Dim p, qn, sig, un As Single
     
    ReDim u(29 - 1) As Single
    ReDim yt(29) As Single 'valeur de la dérivée seconde
     
     
    n = 29
     
     
    yt(1) = 0
    u(1) = 0
     
     
    'calcul de la spline
    For i = 2 To n - 1
        sig = (xin(i) - xin(i - 1)) / (xin(i + 1) - xin(i - 1))
        p = sig * yt(i - 1) + 2
        yt(i) = (sig - 1) / p
        u(i) = (yin(i + 1) - yin(i)) / (xin(i + 1) - xin(i)) - (yin(i) - yin(i - 1)) / (xin(i) - xin(i - 1))
        u(i) = (6 * u(i) / (xin(i + 1) - xin(i - 1)) - sig * u(i - 1)) / p
    Next
     
     
     
    qn = 0
    un = 0
     
    yt(n) = (un - qn * u(n - 1)) / (qn * yt(n - 1) + 1)
     
     
     
     
     
    For k = n - 1 To 1 Step -1
        yt(k) = yt(k) * yt(k + 1) + u(k)
    Next k
     
    'évaluation de la spline en un point
     
    Dim klo, khi As Integer 'variable contenant les noeuds
    'ils ne correspondent pas à l'abscisse en lui même mais à leur position
    'klo --> k low
    'khi --> k high
    'klo<khi
     
     
    'recherche du bon intervalle
     
    Dim h, b, a As Single
     
     
    klo = 1
    khi = n
     
    Do
    k = khi - klo
    If xin(k) > x Then
        khi = k
    Else
        klo = k
    End If
     
    k = khi - klo
     
    Loop While k > 1
        h = xin(khi) - xin(klo)
        a = (xin(khi) - x) / h
        b = (x - xin(klo)) / h
        y = a * yin(klo) + b * yin(khi) + ((a ^ 3 - a) * yt(klo) + (b ^ 3 - b) * yt(khi)) * (h ^ 2) / 6
     
    spline = y
    endnow:
    End Function
    Je vous remercie déjà pour les propositions

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    il n'y a pas à proprement parlé de récursivité. Il faudrait qu'une de tes fonction s'appelle elle-même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        'on récupère les valeurs des variables
        For i = 1 To 10
            intensite(i) = 0
            s(i) = Cells(i + 4, 4) / 10000
            jv(i) = 1
            jf(i) = -1
        Next
     
        'début de la récursion
        For i = 1 To 10
            paiement = 0.25
            ss = 0
            sss = 0
            While Abs(jv(i) - jf(i)) > 0.0000001
     
                intensite(i) = intensite(i) + 0.00000001
    Qu'est-ce qui change dans les 10 départs de ta 2nde boucle ? Rien apparemment
    Quelque soit i, intensite(i) =0, jv(i)=1 et jf(i)=-1 fixés dans la 1ère boucle
    Plus bas je ne vois pas d'autre variables qui pourraient changer le cours des choses à part s(i). Est-ce suffisant ?

    Mais bon, sans une feuille en situation pour tester en réel pas facile de tout voir.
    eric

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2017
    Messages : 22
    Par défaut
    Désolé pour la réponse tardive.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] comparaison d'une variable avec toutes les composantes d'un vecteur
    Par artituro dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/05/2011, 18h53
  2. [Débutant] Retirer composante i d'un vecteur boucle for
    Par SpacedCb dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/03/2011, 16h20
  3. construction d'un vecteur de n composantes identiques
    Par bendesarts dans le forum MATLAB
    Réponses: 1
    Dernier message: 04/01/2010, 09h01
  4. Réponses: 1
    Dernier message: 03/06/2009, 23h18
  5. Vecteur couleur à trois composantes
    Par kromartien dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 28/02/2007, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo