schema d'euler d'une equation différentiel stochastique

schema d'euler d'une equation différentiel stochastique - C++ - Programmation

Marsh Posté le 27-01-2008 à 13:11:03    

hello,
 
quelqu'un aurait un lien où je pourrais trouver le source en C++ de la méthode indiqué dans le titre  
 
Merci.


Message édité par frenchtoucco le 27-01-2008 à 13:11:22

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 27-01-2008 à 13:11:03   

Reply

Marsh Posté le 27-01-2008 à 13:28:57    

As-tu un souci avec l'algorithme ?
Ou bien une difficulté pour le retranscrire sous forme de code C++ ?

 

Merci de préciser ta demande. Par contre, ici on ne donne pas de source toute faite, on aide juste les intervenants à trouver la solution à leurs problèmes.


Message édité par Elmoricq le 27-01-2008 à 13:29:04
Reply

Marsh Posté le 27-01-2008 à 13:37:40    

en faite j'ai implémenté moi même l'algo mais ça en marche pas
 

Code :
  1. double SousJacent::MethodeEuler(double eps)
  2. {
  3.     double r     = bs->getCaracCall()->r;
  4.     double T     = bs->getCaracCall()->T;
  5.     double sigma = bs->getCaracCall()->sigma;
  6.     double S0    = bs->getCaracCall()->S0;
  7.     double VA    = LoiNormal::GetInstance()->GetOneGaussian(0);
  8.     double VA2;
  9.     double ST=S0+eps;
  10.     for(int i=1;i<=pas;i++)
  11.     {
  12.         VA2 = LoiNormal::GetInstance()->GetOneGaussian( (((double)i)*T)/(double)pas );
  13.         ST=ST+r*ST*(T/((double)pas))+sigma*ST*(VA2-VA);
  14.         VA=VA2;
  15.     }
  16.     return ST;
  17. }


 
je veux coder cette équation: dST=rdt+sigdWt


Message édité par frenchtoucco le 27-01-2008 à 13:41:17

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 27-01-2008 à 13:39:22    

pour générer la loi normal j'utilise le code ci-dessous :
 

Code :
  1. double LoiNormal::GetOneGaussian(double variance)
  2. {
  3.     return GetOneGaussianByBoxMuller()*sqrt(variance);
  4. }
  5. double LoiNormal::GetOneGaussianByBoxMuller()
  6. {
  7.     double result;
  8.     double x;
  9.     double y;
  10.     double sizeSquared;
  11.     do
  12.     {
  13.     x = 2.0*rand()/static_cast<double>(RAND_MAX)-1.0;
  14.     y = 2.0*rand()/static_cast<double>(RAND_MAX)-1.0;
  15.     sizeSquared = x*x + y*y;
  16.     }
  17.     while
  18.     ( sizeSquared >= 1.0);
  19.     result = x*sqrt(-2.0*log(sizeSquared)/sizeSquared);
  20.     return result;
  21. }


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 27-01-2008 à 19:23:37    

correction :
 

Code :
  1. 1. double SousJacent::MethodeEuler(double eps)
  2.    2. {
  3.    3.     double r     = bs->getCaracCall()->r;
  4.    4.     double T     = bs->getCaracCall()->T;
  5.    5.     double sigma = bs->getCaracCall()->sigma;
  6.    6.     double S0    = bs->getCaracCall()->S0;
  7.    7.     double VA;
  8.    9.     double ST=S0+eps;
  9.   10.
  10.   11.     for(int i=0;i<pas;i++)
  11.   12.     {
  12.   13.         VA2 = LoiNormal::GetInstance()->GetOneGaussian( T/pas );
  13.   14.         ST=ST+r*ST*(T/pas)+sigma*ST*VA;
  14.   16.     }
  15.   17.     return ST;
  16.   18. }


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 30-01-2008 à 13:18:10    

up


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 30-01-2008 à 21:04:56    

Tu cherches "Euler integration" dans gogol, tu devrais pouvoir trouver ça.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 30-01-2008 à 21:55:45    

euh là je parle d'équation différentielle stochastique, pas d'équa diff de base


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 01-02-2008 à 20:21:41    

Gogol "Numerical Solution of Stochastic Differential Equations"


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 01-02-2008 à 21:04:04    

merci , mais déjà fait


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 01-02-2008 à 21:04:04   

Reply

Marsh Posté le 02-02-2008 à 13:23:22    

Bah c'est très spécifique comme question, ca m'etonnerait que quelqu'un ici puisse t'aider à résoudre ton probleme (on est en catégorie programmation, pas mathematiques ).
 
Tu as essayé de contacter un chercheur ou un laboratoire qui pourrait t'aider ? Généralement ils n'hésitent pas à te répondre, ne serait-ce que pour te conseiller des lectures ou des personnes à joindre.

Reply

Marsh Posté le 08-02-2008 à 10:44:51    

Bon je suis une bonne âme donc on reprend:
ton EDS est:
dS=rdt + sigmadW
donc ST=S0+rT+sigmaWT.
En plus un mouvement brownien ca commence à 0, donc l'initialisation de ton VA c'est 0. (3 erreurs de corrigées)
 
donc pour ta boucle c'est  
 

Code :
  1. 1. double SousJacent::MethodeEuler(double eps)
  2.    2. {
  3.    3.     double r     = bs->getCaracCall()->r;
  4.    4.     double T     = bs->getCaracCall()->T;
  5.    5.     double sigma = bs->getCaracCall()->sigma;
  6.    6.     double S0    = bs->getCaracCall()->S0;
  7.    7.     double VA    = 0.0;
  8.    8.     double VA2;
  9.    9.     double ST=S0+eps;
  10.   10.
  11.   11.     for(int i=1;i<=pas;i++)
  12.   12.     {
  13.   13.         VA2 = LoiNormal::GetInstance()->GetOneGaussian( T/(double)pas );
  14.   14.         ST=ST+r*(T/((double)pas))+sigma*(VA2-VA);
  15.   15.         VA=VA2;
  16.   16.     }
  17.   17.     return ST;
  18.   18. }


 
Ensuite puisque tu utilise une volatilité constante (sigma) il est absolument inutile de faire une boucle il suffit de faire un pas. Ensuite au vu des noms de fonction, je pense que tu t'es planté dans la définition de ton EDS, ca ne m'étonnerait pas que ce soit plutôt:
dS/S=rdt+sigmadW (bref une diffusion lognormale)
et donc en utilisant le lemme d'Itô etc...
ST=S0*exp((r-0.5*sigma^2)*T+sigma*WT)
et là encore tu as seulement besoin d'un seul saut, je te laisse le soin d'écrire la relation dans ton algo. Enfin bref il faudrait sans doute revoir tes définitions...
 
Quoiqu'il en soit tu as besoin de faire une boucle pour l'algo d'Euler si ta volatilité dépend du temps i.e. sigma=sigma_t, et qu'elle a le bon goût d'être constante par morceaux. Si ta volatilité est "path-dependent" tu dois utilisé un algorithme plus performant afin de réduire l'erreur systématique, style Milstein.
 
Voilà ce devrait être tout, quoiqu'il en soit revoit ton cours de calcul sto...

Reply

Marsh Posté le 13-02-2008 à 15:07:16    

Bon alors ca marche maintenant???

Reply

Marsh Posté le 15-02-2008 à 13:10:39    

merci non


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 18-02-2008 à 10:48:19    

id est?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed