Complex gamgamgamgam_mmpp(int i1,int i2,int i3,int i4) { return spa(i1,i2)*spa(i1,i2)*spa(i1,i2)/spa(i2,i3)/spa(i3,i4)/spa(i4,i1) * ( 0.5 * sij(i2,i3)/pow(sij(i1,i2),3) * ( pow(sij(i1,i3),2) + pow(sij(i2,i3),2) ) * ( pow(Clog(sij(i1,i3),sij(i2,i3)),2) + PISQ ) + sij(i2,i3)/sij(i1,i2)/sij(i1,i2) * (sij(i1,i3)-sij(i2,i3)) * ( Clog(sij(i1,i3),sij(i2,i3)) ) + sij(i2,i3)/sij(i1,i2) ) ; }
static double charact_funct1(double uu) { double a,b,rs,rsp,sig,tau,tpf1,tpf2, f10, c0, d0; dcomplex g,z,w,tp1,tp2,DD,CN,ans,d,expo; tau=T; a=k*teta; rs=rho*sigma; rsp=rs*uu; sig=sigma*sigma; b=k+lambda-rs; if(uu==0) { if(b==0) { c0=a*T*T/4.0; d0=T/2.0; } else { c0=0.5*a*(exp(-b*T)+b*T - 1.0)/b/b; d0=0.5*(1.0-exp(-b*T))/b; } f10=log(S/K)+(r-divid)*T+c0+d0*v; return f10; } z=Complex(-b,rsp); z=Cmul(z,z); w=RCmul(sig,Complex(-uu*uu,uu)); d=Csqrt(Csub(z,w)); tp1=Complex(d.r+b,d.i-rsp); tp2=Complex(-d.r+b,-d.i-rsp); g=Cdiv(tp2,tp1); expo=Cexp(RCmul(-tau,d)); DD=Csub(Complex(1,0),expo); DD=Cdiv(DD,Csub(Complex(1,0),Cmul(g,expo))); DD=Cmul(DD,RCmul(1.0/sig,tp2)); CN=Csub(Cmul(g,expo), Complex(1,0)); CN=Cdiv(CN,Csub(g, Complex(1,0) )); tpf1=a*(tau*tp2.r-2.0*Clog(CN).r)/sig; tpf2=a*(tau*tp2.i-2.0*Clog(CN).i)/sig; tpf2+=(r-divid)*uu*tau; ans=Complex(tpf1+v*DD.r,tpf2+v*DD.i+uu*log(S)); ans=Cmul(Cexp(ans),Cexp(Complex(0,-uu*log(K)))); ans=Cdiv(ans,Complex(0,uu)); return ans.r; }
///******************* Gamma-OU 1d Model*******************/// void phi_psi_gou1d(PnlVect *ModelParams, double t, dcomplex u, dcomplex *phi_i, dcomplex *psi_i) { double lambda, alpha, beta; double a_t; dcomplex z0, z1, z2, z3; lambda = GET(ModelParams, 1); alpha = GET(ModelParams, 2); beta = GET(ModelParams, 3); a_t = exp(-lambda*t); z0 = RCmul(a_t, u); z1 = RCsub(alpha, z0); z2 = RCsub(alpha, u); z3 = RCmul(beta, Clog(Cdiv(z1, z2))); *phi_i = z3; *psi_i = z0; }
void phi_psi_cir1d(PnlVect *ModelParams, double t, dcomplex u, dcomplex *phi_i, dcomplex *psi_i) { double lambda, theta, eta, SQR_eta; dcomplex z1, z2; double b_t, a_t; //x0 = GET(ModelParams, 0); lambda = GET(ModelParams, 1); theta = GET(ModelParams, 2); eta = GET(ModelParams, 3); SQR_eta = SQR(eta); a_t = exp(-lambda*t); if (lambda == 0.) b_t = t; else b_t = (1.-a_t)/lambda; z1 = RCsub(1., RCmul(2*SQR_eta*b_t, u)); *phi_i = RCmul(-lambda*theta/(2*SQR_eta), Clog(z1)); z1 = RCmul(a_t, u); z2 = RCsub(1., RCmul(2*SQR_eta*b_t, u)); *psi_i = Cdiv(z1, z2); }
static double charact_func(double k) { double X,tau,roeps,u,b,I,eps,eps2; dcomplex Ak,Bk,Ck,Dk,Lambdak,z1,z2,z3,zeta,psi_moins,psi_plus,expo,ans; dcomplex dlk; tau = T; eps = sigma; roeps = rho*eps; X = log(S/K) + (r - divid)*tau; eps2 = eps*eps; if(func_type==1) { u = 1.; b = kappa - roeps; I = 1.; } else if(func_type==2) { u = -1.; b = kappa; I = 0.; } else { printf("erreur : dans charact_func il faut initialiser func_type a 1 ou 2.\n"); exit(-1); } if(heston==1) { z1 = Complex(k*k,-u*k); z2 = Complex(b,-roeps*k); z2 = Cmul(z2,z2); zeta = Cadd(z2,RCmul(eps2,z1)); zeta = Csqrt(zeta); psi_moins = Complex(b,-roeps*k); psi_plus = RCmul(-1.,psi_moins); psi_moins = Cadd(psi_moins,zeta); psi_plus = Cadd(psi_plus,zeta); expo = Cexp( RCmul(-tau,zeta) ); z3 = Cadd( psi_moins , Cmul(psi_plus,expo) ); Bk = RCmul(-1.,z1); Bk = Cmul( Bk , Csub(Complex(1.,0),expo) ); Bk = Cdiv(Bk,z3); Ak = Cdiv( z3 , RCmul(2.,zeta) ); Ak = Clog(Ak); if(initlog>0) { dlk = Csub(Ak,lk_1); if(dlk.i < -M_PI) { bk = bk + 1; } else if(dlk.i > M_PI) { bk = bk - 1; } initlog++; lk_1 = Ak; } else { initlog++; lk_1 = Ak; } Ak = Cadd(Ak, Complex(0.,2*M_PI*bk)); Ak = RCmul( 2. , Ak ); Ak = Cadd( RCmul(tau,psi_plus) , Ak); Ak = RCmul( -kappa*teta/eps2 , Ak); } else { Ak = Complex(0.,0.); Bk = Complex( -0.5*tau*k*k , 0.5*tau*u*k ); } if(merton==1) { z1 = Complex( -0.5*v*v*k*k + I*(m0+0.5*v*v) , (m0+I*v*v)*k ); z1 = Cexp(z1); z2 = Complex(I,k); z2 = RCmul( exp(m0+0.5*v*v) -1, z2); z2 = Cadd( Complex(1.,0.) , z2 ); Lambdak = Csub(z1,z2); Ck = Complex(0.,0.); Dk = RCmul(tau,Lambdak); } else { Ck = Complex(0.,0.); Dk = Complex(0.,0.); } ans = Cadd( Ak , RCmul(V0,Bk) ); ans = Cadd( ans , Ck ); ans = Cadd( ans , RCmul(lambda0,Dk) ); ans = Cadd( ans , Complex(0.,k*X) ); ans = Cexp(ans); ans = Cdiv(ans,Complex(0.,k)); return ans.r; }
static double charact_func0(double k) { double X,tau,roeps,u,eps,eps2; dcomplex Ak,Bk,Ck,Dk,Lambdak,z1,z2,z3,zeta,psi_moins,psi_plus,expo,ans; dcomplex dlk; tau = T; eps = sigma; roeps = rho*eps; X = log(S/K) + (r - divid)*tau; u = kappa - roeps/2.; eps2 = eps*eps; if(heston==1) { zeta.r = k*k*eps2*(1.-rho*rho) + u*u + eps2/4.; zeta.i = 2.*k*roeps*u; zeta = Csqrt(zeta); psi_moins = Complex(u,roeps*k); psi_plus = RCmul(-1.,psi_moins); psi_moins = Cadd(psi_moins,zeta); psi_plus = Cadd(psi_plus,zeta); expo = Cexp( RCmul(-tau,zeta) ); z3 = Cadd( psi_moins , Cmul(psi_plus,expo) ); Bk = RCmul( -(k*k+0.25) , Csub(Complex(1.,0),expo) ); Bk = Cdiv(Bk,z3); Ak = Cdiv( z3 , RCmul(2.,zeta) ); Ak = Clog(Ak); if(initlog>0) { dlk = Csub(Ak,lk_1); if(dlk.i < -M_PI) { bk = bk + 1; } else if(dlk.i > M_PI) { bk = bk - 1; } initlog++; lk_1 = Ak; } else { initlog++; lk_1 = Ak; } Ak = Cadd(Ak, Complex(0.,2*M_PI*bk)); Ak = RCmul( 2. , Ak ); Ak = Cadd( RCmul(tau,psi_plus) , Ak); Ak = RCmul( -kappa*teta/eps2 , Ak); } else { Ak = Complex(0.,0.); Bk = Complex( -0.5*tau*(k*k+0.25) ,0.); } if(merton==1) { z1 = Complex( 0.5*m0-0.5*v*v*(k*k-0.25) , -k*(m0+0.5*v*v) ); z1 = Cexp(z1); z2 = Complex(0.5,-k); z2 = RCmul( exp(m0+0.5*v*v) - 1. , z2); z2 = Cadd( Complex(1.,0.) , z2 ); Lambdak = Csub(z1,z2); Ck = Complex(0.,0.); Dk = RCmul(tau,Lambdak); } else { Ck = Complex(0.,0.); Dk = Complex(0.,0.); } ans = Cadd( Ak , RCmul(V0,Bk) ); ans = Cadd( ans , Ck ); ans = Cadd( ans , RCmul(lambda0,Dk) ); ans = Cadd( ans , RCmul(X,Complex(0.5,-k) ) ); ans = Cexp(ans); ans = Cdiv(ans,Complex(k*k+0.25,0.)); if(probadelta == 1) { ans = Cmul( ans , Complex(0.5,-k) ); ans = RCmul( 1./S , ans ); } return ans.r; }