Beispiel #1
0
Option :: Option(){
  T_ = 0.;
  timeStep_ = 0;
  size_ = 0;
  r_ = 0.;
  Coeff_ = pnl_vect_new();
}
Beispiel #2
0
static void derive_approx_fonction(PnlBasis *B, PnlVect *D, PnlVect *alpha, double t, double x)
{
  double sum0, sum1, sum2, sum3;
  double arg[2];
  PnlMat *Hes = pnl_mat_new();
  PnlVect *grad = pnl_vect_new();
  arg[0] = t; arg[1] = x;
  sum0=0.0;//calcule la valeur de la fonction
  sum1=0.0;//calcule la valeur de sa derivee en x
  sum2=0.0;//calcule la valeur de sa derivee seconde en x
  sum3=0.0;//calcule la valeur de sa derivee en t

  /* sum0 = pnl_basis_eval (B, alpha, arg);
   * sum1 = pnl_basis_eval_D (B, alpha, arg, 1);
   * sum2 = pnl_basis_eval_D2 (B, alpha, arg, 1, 1);
   * sum3 = pnl_basis_eval_D (B, alpha, arg, 0);
   *
   * LET(D,0)=sum0;
   * LET(D,1)=sum1;
   * LET(D,2)=sum2;
   * LET(D,3)=sum3; */

  pnl_basis_eval_derivs (B, alpha, arg, &sum0, grad, Hes);
  LET(D,3) = GET(grad,0);
  LET(D,1) = GET(grad,1);
  LET(D,0) = sum0;
  LET(D,2) = PNL_MGET(Hes, 1, 1);
  LET(D,4) = PNL_MGET(Hes, 0, 1);

  pnl_mat_free (&Hes);
  pnl_vect_free (&grad);

}
static void prix(PnlMat *res, PnlMat *res_no_call, int M, int N, PnlMat *asset, PnlVectInt *res_theta, double spot, double T, param *P, PnlBasis *basis)
{
  int i,j;
  double Sij,mu_ij,v0;
  PnlVect *Si,*V_iplus1,*alpha, *c_iplus1;//(ligne i de la matrice)
  PnlMat MSi;
  double h=T/N;
  Si=pnl_vect_new();
  c_iplus1=pnl_vect_create(M);
  alpha=pnl_vect_new();
  V_iplus1=pnl_vect_new();
  pnl_mat_resize(res,N+1,M);
  prix_no_call(res_no_call,M,N,asset,spot,T,P,basis);
  for(j=0;j<M;j++) pnl_mat_set(res,N,j,(pnl_mat_get(res_no_call,N,j)));
  for(i=N-1;i>=1;i--)
    {
      for(j=0;j<M;j++) pnl_vect_set(c_iplus1,j,c(pnl_mat_get(asset,i+1,j),spot,P)*h);
      pnl_mat_get_row(Si,asset,i);
      pnl_vect_mult_double(Si,1.0/spot);
      pnl_mat_get_row(V_iplus1,res,i+1);
      pnl_vect_plus_vect(V_iplus1,c_iplus1);
      MSi = pnl_mat_wrap_vect(Si);
      pnl_basis_fit_ls(basis,alpha,&MSi,V_iplus1);
      for(j=0;j<M;j++)
        {
          Sij=pnl_mat_get(asset,i,j)/spot;
          mu_ij=mu(spot,spot*Sij,P);
          if(i>=pnl_vect_int_get(res_theta,j)) { pnl_mat_set(res,i,j,pnl_mat_get(res_no_call,i,j));}
          else pnl_mat_set(res,i,j,MAX(low(spot*Sij,P),exp(-mu_ij*h)*pnl_basis_eval(basis,alpha,&Sij)));
        }
    }
  pnl_mat_get_row(V_iplus1,res,1);
  for(j=0;j<M;j++) pnl_vect_set(c_iplus1,j,c(pnl_mat_get(asset,1,j),spot,P)*h);
  pnl_vect_plus_vect(V_iplus1,c_iplus1);
  v0=pnl_vect_sum(V_iplus1)/M;
  v0=MAX(low(spot,P),exp(-mu(spot,spot,P)*h)*v0);
  for(j=0;j<M;j++)
    {
      if(pnl_vect_int_get(res_theta,j)==0) pnl_mat_set(res,0,j,pnl_mat_get(res_no_call,i,j));
      else pnl_mat_set(res,0,j,v0);
    }
  pnl_vect_free(&Si);
  pnl_vect_free(&c_iplus1);
  pnl_vect_free(&V_iplus1);
  pnl_vect_free(&alpha);
}
Beispiel #4
0
double Barrier::payoff(const PnlMat *path) {
	PnlVect * lastrow = pnl_vect_new();
	pnl_mat_get_row(lastrow, path, TimeSteps_-1);
	double prod = pnl_vect_scalar_prod(lastrow, payOffCoeff_) - S_;
	pnl_vect_free(&lastrow);
	if (std::max(prod,0.0) == 0.0) {
	  return 0.0;
	}
	for (int i = 0; i < size_; i++) {
	  for (int j = 0; j < TimeSteps_; j++) {
	    if (MGET(path, j, i) < GET(lowerBarrier_, i) || MGET(path, j, i) > GET(upperBarrier_, i)) {
	      return 0.0;
	    }
	  }
	}
	return prod;
}
Beispiel #5
0
Barrier_u :: Barrier_u() : Option() {
  strike_ = 0;
  Bu_ = pnl_vect_new();
}
Beispiel #6
0
Barrier_l :: Barrier_l() : Option() {
  Strike_ = 0;
  Coeff_ = pnl_vect_new();
  Bl_ = pnl_vect_new();
}
Beispiel #7
0
Barrier_l :: Barrier_l() : Option() {
  strike_ = 0;
  Bl_ = pnl_vect_new();
}
Beispiel #8
0
Barrier_u :: Barrier_u() : Option() {
  Strike_ = 0;
  Coeff_ = pnl_vect_new();
  Bu_ = pnl_vect_new();
}