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. 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 = 0.0;
- 8. double VA2;
- 9. double ST=S0+eps;
- 10.
- 11. for(int i=1;i<=pas;i++)
- 12. {
- 13. VA2 = LoiNormal::GetInstance()->GetOneGaussian( T/(double)pas );
- 14. ST=ST+r*(T/((double)pas))+sigma*(VA2-VA);
- 15. VA=VA2;
- 16. }
- 17. return ST;
- 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...