Évaluation de stock-options avec une méthode de Monte-Carlo

Comment la propagation de l'erreur d'arrondie se fait lors d'un calcul mathématique complexe chez Intel.

L'algorithme d'évaluation du prix de stock-options qui a été analysé à l'aide de nos outils a été fourni par Intel comme un exemple de leur savoir faire sur l'usage d'OpenCL pour ce type d'application (sources disponibles ici). Le programme analysé implémente trois méthodes en un seul outil réalisé en C++ et en OpenCL :
  • Un générateur de nombre aléatoires uniformément distribués à l'aide d'une méthode de Mersenne ;
  • Une transformé de Box-Muller, pour une génération nombre aléatoire selon un distribution normale ;
  • Et une estimation du prix des actions en utilisant le modèle de Black-Scholes.
La fonction qui a été étudiée est écrite en OpenCL et est exécutée par chacun des threads (fonction décrite dans "montecarlo.cl"). Cette fonction réalise une accumulation sur une seule variable lors d'une itération d'environ 140 000 cycles.

Évolution de la valeur de la variable au fil des itérationsCette variable augmente quasi-linéairement durant les itérations (figure ci-contre), elle est ensuite moyennée à la toute fin du programme. Elle peut donc, au fil des itération, causer des problèmes d'absorption si les valeurs qui lui sont accumulées ne sont plus du même ordre de grandeur qu'elle.


Ecart en valeur absolue entre la valeur idéale et la valeur calculée










Sur la figure ci-contre nous avons représenté en abscisse les itérations du programme, et en ordonnée l'écart (en valeur absolue) sur la variable entre sa valeur calculée par l'ordinateur et celle attendue en mathématiques.

On constate que l'écart entre les deux valeurs n'est ni constant, ni évident à comprendre. En effet si au début les variations sur cette variable semblent faibles, les écarts sont par la suite de plus en plus grands. Ce phénomène témoigne donc d'une volatilité progressive de la précision qui dans certains moment est très bonne (l'écart se réduit à presque zéro), et d'autre où brusquement la précision se dégrade rapidement.

Heureusement, dans cet exemple les écarts, bien que significatifs, n'impactent pas gravement le comportement du programme.

Ce phénomène peut s'expliquer en partie par les variation entre les exposants de la variable que l'on mesure et de la valeur qu'on lui ajoute lors d'une itération. Lors de ces changements le nombre de décimales tronquées varient lui aussi entrainant la variation des écarts entre le résultats attendu et le résultat calculé.

Il apparaît assez facilement que le comportement de la précision des calculs est indépendant de la forme du résultat attendu du calcul. Autrement dit, ce n'est pas parce que le résultat est quasi-linéaire que l'erreur sur ce résultat le sera. Dans cette exemple il est très compliqué de trouver une fonction modélisant fidèlement le comportement de l'erreur. Qui plus est cette fonction n'aura de validité que pour ce calcul et ne pourra pas être généralisée.

Le calcul de la précision n'est trivial, ni intuitif pour un être humain. Chaque programme va être sujet à un comportement spécifique, et chaque optimisation devra l'être aussi.


Remerciements : Intel, Vadim Kartoshkin (Intel), Jérôme Piat (Perfcraft).