double montecarlo(int spot, double vol, double mu) { int i = 0; int j = 1; double alea = 0; double delta = 0.0; double Sn[N_DAYS]; double S = 0.0; double mean = 0.0; double brownian = 0.0; Sn[0] = (double)spot; while (i < N_SIM) { while (j < N_DAYS) { alea = (double)rand() / ((double)RAND_MAX - 1); brownian = normsinv(alea); delta = (vol * brownian) - ((vol * vol) / 2); Sn[j] = Sn[j-1] + (mu * j) + (vol * delta) + sqrt(j); j++; } mean = mean + Sn[j-1]; j = 1; i++; } mean = mean / N_SIM; return (mean); }
void BS::asset(std::vector<double> *path, double T, int N,MTRand *myGen){ double St = S_; double Zs,U; double sigmaW = sigma_*sqrt(T/double(N)); double varW = T/double(N); double drift = (r_ - pow(sigma_,2)/2)*varW; (*path)[0] = S_; for (int i = 1; i <= N; i++){ U = (*myGen)(); Zs = normsinv(U); St = St*exp(drift + sigmaW*Zs); (*path)[i] = St; } }
static float normsinvf(float p) { return static_cast<float>(normsinv(p)); }
static void inverse(T* data, size_t count) { LCG<T> r; for (size_t i = 0; i < count; i++) data[i] = normsinv(r()); }