9 const double SQRT2PI = 2.506628274631;
18 switch (option_type) {
20 return ( S>K ? S-K : 0.0 );
22 return ( S>K ? 0.0 : K-S );
33 return exp( -0.5*z*z ) / ( sd *
SQRT2PI );
55 unsigned int * seed_d,
57 const double * strike,
58 const int * option_type,
65 int tid = blockIdx.x*blockDim.x + threadIdx.x;
66 int nthreads = blockDim.x*gridDim.x;
69 double lamz = parms[ 1];
70 double az = parms[ 2];
71 double bz = parms[ 3];
72 double cz = parms[ 4];
73 double dz = parms[ 5];
74 double ez = parms[ 6];
75 double wz = parms[ 7];
76 double lamy = parms[ 8];
77 double ay = parms[ 9];
78 double by = parms[10];
79 double cy = parms[11];
80 double dy = parms[12];
81 double ey = parms[13];
82 double wy = parms[14];
83 double muJ = parms[15];
84 double sigJ = parms[16];
85 double xi = exp( muJ + 0.5* sigJ*sigJ ) - 1.0;
87 for (
int i=tid; i<nsim; i+=nthreads) {
92 double logS = state_d[0*nsim+i];
93 double hz = state_d[1*nsim+i];
94 double hy = state_d[2*nsim+i];
96 for (
int t=0; t<T; t++) {
97 double R, m, z, y, z1, z2, u, nj, pj;
98 m = r + (lamz - 0.5)*hz + (lamy - xi)*hy;
105 for (
int j=0; j<
JMAX; j++) {
106 u -= pj = (j==0 ? exp(-hy) : pj*hy/j );
112 y = nj*muJ + sqrt(nj*sigJ*sigJ)*z2;
116 hy = wy + by*hy + ay/hz*(z-cy*hz)*(z-cy*hz) + dy*(y - ey)*(y - ey );
117 hz = wz + bz*hz + az/hz*(z-cz*hz)*(z-cz*hz) + dz*(y - ez)*(y - ez );
119 if ( hz < 0.000004 ) { hz = 0.000004; }
120 if ( hy < 0.00 ) { hy = 0.00; }
121 if ( hy > 1.00 ) { hy = 1.00; }
124 for (
int j=0; j<noption; j++) {
125 payoff_d[j*nsim+i] =
get_payoff( exp(logS), strike[j], option_type[j] );
127 state_d[0*nsim+i] = logS;
128 state_d[1*nsim+i] = hz;
129 state_d[2*nsim+i] = hy;