Option :: Option(){ T_ = 0.; timeStep_ = 0; size_ = 0; r_ = 0.; Coeff_ = pnl_vect_new(); }
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); }
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; }
Barrier_u :: Barrier_u() : Option() { strike_ = 0; Bu_ = pnl_vect_new(); }
Barrier_l :: Barrier_l() : Option() { Strike_ = 0; Coeff_ = pnl_vect_new(); Bl_ = pnl_vect_new(); }
Barrier_l :: Barrier_l() : Option() { strike_ = 0; Bl_ = pnl_vect_new(); }
Barrier_u :: Barrier_u() : Option() { Strike_ = 0; Coeff_ = pnl_vect_new(); Bu_ = pnl_vect_new(); }