import umontreal.iro.lecuyer.rng.*; import umontreal.iro.lecuyer.probdist.NormalDist; import umontreal.iro.lecuyer.stat.Tally; import umontreal.iro.lecuyer.util.*; import umontreal.iro.lecuyer.charts.*; /* Programme générant un mouvement brownien géométrique et l'illustre avec un "scatterplot" */ public class Brownien { int s; // Number of observation times. double discount; // Discount factor exp(-r * zeta[t]). double[] muDelta; // Differences * (r - sigma^2/2). double[] sigmaSqrtDelta; // Square roots of differences * sigma. double[] logS; // Log of the GBM process: logS[t] = log (S[t]). // Array zeta[0..s+1] must contain zeta[0]=0.0, // plus the s observation times. public Brownien (double r, double sigma, double s0, int s, double[] zeta) { this.s = s; discount = Math.exp (-r * zeta[s]); double mu = r - 0.5 * sigma * sigma; muDelta = new double[s]; sigmaSqrtDelta = new double[s]; logS = new double[s+1]; double delta; for (int j = 0; j < s; j++) { delta = zeta[j+1] - zeta[j]; muDelta[j] = mu * delta; sigmaSqrtDelta[j] = sigma * Math.sqrt (delta); } logS[0] = Math.log (s0); } // Generates the process S. public void generatePath (RandomStream stream) { for (int j = 0; j < s; j++) logS[j+1] = logS[j] + muDelta[j] + sigmaSqrtDelta[j] * NormalDist.inverseF01 (stream.nextDouble()); } public static void main (String[] args) { // Lecture des paramètres entrés sur la ligne de commande if (args.length != 4) { System.err.println ("Usage: java Brownien "); System.exit (1); } double r = Double.parseDouble (args[0]); double sigma = Double.parseDouble (args[1]); double s0 = Double.parseDouble (args[2]); int s = Integer.parseInt (args[3]); //instants d'observations // obs[0][j] contient le j-ieme temps d'observations // obs[1][j] contient la valeur du mouvement a la j-ieme obs. double[][] obs = new double[2][s+1]; obs[0][0] = 0.0; for (int j=1; j<=s; j++) obs[0][j] = (double)j / (double)s; Brownien process = new Brownien (r, sigma, s0, s, obs[0]); process.generatePath(new MRG32k3a()); // allons placer dans obs[1] les differentes valeurs du S(t) for (int j=0; j<=s; j++) obs[1][j]=Math.exp( process.logS[j] ); // création et affichage du graphique new ScatterChart ("Mouvement brownien géométrique", "t", "S(t)", obs).view (800,600); } }