Problème dans mon code

AmelCres Messages postés 12 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 28 mai 2008 - 16 mars 2008 à 20:59
bies Messages postés 21 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 30 juillet 2010 - 7 janv. 2011 à 09:54
Bonjour,

 Je suis en train de coder le modèle trinomial pour le pricing de put américain ( c 'est un produit financier).

Le problème est que lorsque je compile mon code, il ne veut pas faire la boucle que vous pouvez voir ci dessous en rouge.

Est ce que qqn à une idée de l'erreur que j ai pu faire

Merci

Voici le code que j ai tapé

'initialisation des variables

prix_ssjacent = Sheets("arbre_trinomial").Range("Prix_ssjacent")
Strike = Sheets("arbre_trinomial").Range("Strike")
nbe_periode = Sheets("arbre_trinomial").Range("Nbe_de_période")
Taux = Sheets("arbre_trinomial").Range("Taux")
sigma = Sheets("arbre_trinomial").Range("Volatilité")
maturite = Sheets("arbre_trinomial").Range("Maturité")
ReDim arbre(2 * nbe_periode + 1, nbe_periode) As Double

dt = maturite / nbe_periode
up = Exp(sigma * Sqr(3 * dt))
down = 1 / up
Pu = 1 / 6 + Sqr(dt / (12 * sigma ^ 2))
Pd = 1 / 6 - Sqr(dt / (12 * sigma ^ 2))
Pm = 1 - Pu - Pd

For j = 0 To nbe_periode   'les calculs commencent pour la période 1

For i = 0 To 2 * j    'le nombre de noeuds de l'arbre est égal à 2*nbe_periode+1 ce qu'on obtient en commençant à zero

'On calcule directement les pay-off pour chaque noeud de l'arbre
arbre(i, j) = Application.WorksheetFunction.Max(0, Strike - prix_ssjacent * up ^ Application.WorksheetFunction.Max(0, (j - i)) * down ^ Application.WorksheetFunction.Max(0, (i - j)))

Next i

Next j

'Maintenant on veut calculer le prix du put américain
'Pour cela on procède par induction arrière

ReDim arbrefinal(2 * nbe_periode + 1, nbe_periode) As Double

For m = nbe_periode - 1 To 0

For p = 0 To 2 * m

arbrefinal(p, m) = Application.WorksheetFunction.Max(arbre(p, m), Pu * arbre(p, m + 1) + Pm * arbre(i + 1, j + 1) + Pd * arbre(p + 1, m + 1))

Next p
Next m

Sheets("arbre_trinomial").Range("Prix_du_Put") = arbrefinal(0, 0)

End Sub

9 réponses

cs_bouf Messages postés 114 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 20 mars 2008
16 mars 2008 à 21:14
salut,
si tu calcules en décroissant utilise step -1
 ce qui fait que ta boucle en rouge ne se lance pas
For m nbe_periode - 1 To 0 step -1 (step decroissant -1 est le pas)

For p = 0 To 2 * m

arbrefinal(p, m) = Application.WorksheetFunction.Max(arbre(p, m), Pu * arbre(p, m + 1) + Pm * arbre(i + 1, j + 1) + Pd * arbre(p + 1, m + 1))

Next p
Next m

a+
Cliff le bouffeur
0
dimitriusai Messages postés 76 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 7 mai 2009 1
16 mars 2008 à 21:14
Je n'ai pas essayé ton code, mais des petites parenthèses ? ca ne t'aiderai pas autour de ton (2*m)
0
AmelCres Messages postés 12 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 28 mai 2008
16 mars 2008 à 21:17
Merci beaucoup je vais essayer.
0
AmelCres Messages postés 12 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 28 mai 2008
16 mars 2008 à 21:22
Effectivement c'etait bien step -1 ...

J ai une derniere question :

Maintenant qu'il rentre dans la deuxieme boucle :

For p = 0 To 2 * m

arbrefinal(p, m) =
Application.WorksheetFunction.Max(arbre(p, m), Pu * arbre(p, m + 1) +
Pm * arbre(i + 1, j + 1) + Pd * arbre(p + 1, m + 1))

Next p

il me dit que l'indice n appartient pas a la selection.

Qu est ce que cela signifie ??

Merci de votre aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_bouf Messages postés 114 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 20 mars 2008
16 mars 2008 à 21:47
Salut,
n ? Je ne vois pas de n dans ton code...
essai ce qu'il t'a dit dimitriusai en mettant  For p = 0 To (2 * m) entre parenthese ou alors juste avant :
z= (2 * m)
For p = 0 To z
Mais je pense que lorsqu'il parle d'indice et de selection : en fait ta boucle va trop loin et il n'a plus de données. recontrole la PORTEE de ta boucle P

a+

Cliff le bouffeur
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
17 mars 2008 à 08:26
Salut,

> [auteur/BOUF/335873.aspx bouf]: step = decroissant ????

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_bouf Messages postés 114 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 20 mars 2008
17 mars 2008 à 08:45
Salut Jrivet,
Effectivement step ne signifie pas décroissant mais permet de donner la valeur d'incrémentation du counteraprès chaque exécution de la boucle.
Soyons précis dans nos propos...


a+
Cliff le bouffeur
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
17 mars 2008 à 08:48
Re,
>[auteur/BOUF/335873.aspx bouf] : MERKI effectivement c'est mieux.

@+: Ju£i?n
Pensez: Réponse acceptée
0
bies Messages postés 21 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 30 juillet 2010
7 janv. 2011 à 09:54
Bonjour,

dsl si je reponds sur ce topic mais comme j'ai un pb similaire...

en fait, je suis en train de programmer le modèle trinomial pour le pricing du put americain mais en c++..
mon code s'execute mais à chaque fois, le down et le middle sont égaux.
Quelqu'un aurait-il une solution à çà? sinon de pistes de forum et autres..

Merci
0
Rejoignez-nous