示例#1
0
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);
}
示例#2
0
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;
  }
}
示例#3
0
static float normsinvf(float p) {
	return static_cast<float>(normsinv(p));
}
示例#4
0
static void inverse(T* data, size_t count) {
    LCG<T> r;
    for (size_t i = 0; i < count; i++)
        data[i] = normsinv(r());
}