com M = 412,  N = 100
all M
dec vect  v(M)  simul1(M)  simul2(M)  u1(M)  u2(M)  v1(M)  v2(M)  j1(M)  j2(M)  j3(M) s(M)  estr(M)
com K = 40.0, S0 = 40.0
set ST 1 N = 0.
set Call 1 N = 0.
OPEN DATA "C: \ Desktop\ heterosc_option.xls"
CALENDAR 1978 1 12
DATA(FORMAT=xls,ORG=COL) / f1 f2 y r

set temp1 = 0.
set temp2 = 0.
set temp3 = 0.
set temp4 = 0.
set temp5 = 0.
com mux = 0
set x = 100*log(y/y{1})
nonlin nu  a20 a21 a22 beta10 beta11 beta12 beta20 beta21 beta22 lambda10 lambda11 lambda12 lambda20 lambda21 lambda22 $
alpha11 alpha12 alpha21 alpha22  alpha31 alpha32 alpha41 alpha42 gama11 gama12 gama21 gama22
frml d1 = beta10^2+(beta11^2)*(temp1{1}-gama11)^2+(beta12^2)*temp2{1}+(alpha11^2)*f1{1}^2+(alpha12^2)*f2{1}^2
frml d2 = beta20^2+(beta21^2)*(temp1{1}-gama12)^2+(beta22^2)*temp3{1}+(alpha21^2)*f1{1}^2+(alpha22^2)*f2{1}^2
frml k1 = lambda10^2+(lambda11^2)*(temp1{1}-gama21)^2+(lambda12^2)*temp4{1}+(alpha31^2)*f1{1}^2+(alpha32)^2*f2{1}^2
frml k2 = lambda20^2+(lambda21^2)*(temp1{1}-gama22)^2+(lambda22^2)*temp5{1}+(alpha41^2)*f1{1}^2+(alpha42^2)*f2{1}^2
frml sigmaTx1 = (beta10*lambda10)+(beta11*lambda11)*(temp1{1}-gama11)*(temp1{1}-gama21)+(beta12*lambda12)*sqrt(temp2{1})*sqrt(temp4{1})+(alpha11*alpha31)*f1{1}^2+(alpha12*alpha32)*f2{1}^2
frml sigmaTx2 = (beta20*lambda20)+(beta21*lambda21)*(temp1{1}-gama12)*(temp1{1}-gama22)+(beta22*lambda22)*sqrt(temp3{1})*sqrt(temp5{1})+(alpha21*alpha41)*f1{1}^2+(alpha22*alpha42)*f2{1}^2
frml muT = a20+a21*f1{1}+a22*f2{1}
frml m11 = exp(-nu*mux+nu^2*d1/2)
frml m22 = exp(-nu*mux+nu^2*d2/2)
frml m33 =  %cdf((muT-mux-nu*(sigmaTx1-d1))/sqrt(k1+d1-2*sigmaTx1))
frml m44 =  %cdf(-(muT-mux-nu*(sigmaTx2-d2))/sqrt(k2+d2-2*sigmaTx2))
frml m31 =  %cdf((muT-mux)/sqrt(k1+d1-2*sigmaTx1))
frml m41 =  %cdf(-(muT-mux)/sqrt(k2+d2-2*sigmaTx2))
frml c = 1/(m31+m41)
frml m1 = c*(m11*m33+m22*m44)
frml m12 = exp((1-nu)*mux+(1-nu)^2*d1/2)
frml m21 = exp((1-nu)*mux+(1-nu)^2*d2/2)
frml m13 =  %cdf((muT-mux+(1-nu)*(sigmaTx1-d1))/sqrt(k1+d1-2*sigmaTx1))
frml m14 =  %cdf(-(muT-mux+(1-nu)*(sigmaTx2-d2))/sqrt(k2+d2-2*sigmaTx2))
frml m31 =  %cdf((muT-mux)/sqrt(k1+d1-2*sigmaTx1))
frml m41 =  %cdf(-(muT-mux)/sqrt(k2+d2-2*sigmaTx2))
frml m2 = c*(m12*m13+m21*m14)
frml psinu0 = log(m2)
frml psinu1 = log(m1)
frml  Rt = r-psinu0+psinu1
frml e =x-Rt
frml g1 = (1.0/sqrt(d1))*%density(e/sqrt(d1))
frml g21 =  -(1+d1^(-1)*sigmaTx1)*e/sqrt(k1-d1^(-1)*sigmaTx1^2)
frml g22 = -(muT-mux)/sqrt(k1-d1^(-1)*sigmaTx1^2)
frml g2 = %cdf(g21+g22)
frml g3 =  %cdf((muT-mux)/sqrt(k1+d1-2*sigmaTx1))
frml g4 =  %cdf(-(muT-mux)/sqrt(k2+d2-2*sigmaTx2))
frml c1 = g3+g4
frml h13 =(1.0/sqrt(d2))*%density(e/sqrt(d2))
frml h21 =  (1+d2^(-1)*sigmaTx2)*e/sqrt(k2-d2^(-1)*sigmaTx2^2)
frml h22 = (muT-mux)/sqrt(k2-d2^(-1)*sigmaTx2^2)
frml h23 = %cdf(h21+h22)
frml L = (temp1=e), (temp2=d1), (temp3 = d2), (temp4 = k1), (temp5 = k2),  log((g1*g2)+(h13*h23))-log(c1)
com  nu=-0.5, a20=-1.0, a21=-0.1, a22=-0.2, beta10=-0.01, beta11= 0.2, beta12=-0.3, beta20=0.01, beta21= -0.1 , beta22= -0.8, $
lambda10=1.0, lambda11=0.1  , lambda12=-0.3, lambda20=-1.0 , lambda21=-1.0  , lambda22=-0.4 ,$
alpha11=-0.01 ,alpha12=-0.01, alpha21=-0.05, alpha22=0.01, alpha31=-0.5, alpha32= 0.6, alpha41=1.0, alpha42= 1.0, $
gama11=-0.1, gama12=1.0,  gama21=-1.0 , gama22=-1.0
maximize(pmethod=simplex, piters=50,  iters = 5000, method=bfgs, cvcrit=0.000001 ) L 12 *
set muxstr1 = mux -nu*d1
set muxstr2 = mux -nu*d2
set lambda01 = (muT-muxstr1)/sqrt(k1-d1^(-1)*sigmaTx1^2)
set lambda02 = (muT-muxstr2)/sqrt(k2-d2^(-1)*sigmaTx2^2)
set lambda1 = sqrt(d1)*(1+d1^(-1)*sigmaTx1)/sqrt(k1-d1^(-1)*sigmaTx1^2)
set lambda2 = sqrt(d2)*(1+d2^(-1)*sigmaTx2)/sqrt(k2-d2^(-1)*sigmaTx2^2)
set as = -lambda01/sqrt(1+lambda1^2)
set bs = -lambda02/sqrt(1+lambda2^2)
set cs = 1/sqrt(1+lambda1^2)
set ds = 1/sqrt(1+lambda2^2)
set g3s = %cdf((muT-muxstr1)/sqrt(k1+d1-2*sigmaTx1))
set g4s =%cdf(-(muT-muxstr2)/sqrt(k2+d2-2*sigmaTx2))
set pis = g3s/(g3s+g4s)
set pistr11 = pis*exp(-nu*mux+nu^2*d1/2)
set pistr22 = (1-pis)*exp(-nu*mux+nu^2*d2/2)
set g33s =  %cdf((muT-mux-nu*(sigmaTx1-d1))/sqrt(k1+d1-2*sigmaTx1))
set g44s =  %cdf(-(muT-mux-nu*(sigmaTx2-d2))/sqrt(k2+d2-2*sigmaTx2))
set pistr1 = pistr11/(pistr11*g33s/g3s+pistr22*g44s/g4s)
set pistr2 = pistr22/(pistr11*g33s/g3s+pistr22*g44s/g4s)
set temp22 = 0.
set temp33 = 0.
set temp44 = 0.
set temp55 = 0.
report(action = define, hlabels= || 'ST', 'Call'||)
do i =1,N
com v(i) = %ran(1.0)
com simul1(i)= %uniform(0,1)
com u1(i) = %invnormal(%cdf(as)+(1-%cdf(as))*simul1(i))
com u2(i) = %invnormal(%cdf(bs)*simul1(i))
com simul2(i)= %uniform(0,1)
com j1(i) = %sign(simul2(i)-pistr1(i))
com j2(i) = j1(i)+1
com j3(i) = %sign(j2(i))
com s(i) = cs*(lambda1*u1(i)+v(i))*(1-j3(i)) + ds*(lambda2*u2(i)+v(i))*j3(i)
com estr(i) =  (sqrt(d1)*s(i)+muxstr1)*(1-j3(i)) + (sqrt(d2)*s(i)+muxstr2)*j3(i)
com d11(i) = beta10^2+(beta11^2)*(estr(t)-gama11)^2+(beta12^2)*temp22{1}+(alpha11^2)*f1{1}^2+(alpha12^2)*f2{1}^2
com d22(i) = beta20^2+(beta21^2)*(estr(t)-gama12)^2+(beta22^2)* temp33{1}+(alpha21^2)*f1{1}^2+(alpha22^2)*f2{1}^2
com k11(i) = lambda10^2+(lambda11^2)*(estr(t)-gama21)^2+(lambda12^2)* temp44{1}+(alpha31^2)*f1{1}^2+(alpha32)^2*f2{1}^2
com k22(i) = lambda20^2+(lambda21^2)*(estr(t)-gama22)^2+(lambda22^2)*temp55{1}+(alpha41^2)*f1{1}^2+(alpha42^2)*f2{1}^2
com sigmaTx11(i) = (beta10*lambda10)+(beta11*lambda11)*(estr(t)-gama11)*(estr(t)-gama21)+(beta12*lambda12)*sqrt(temp22{1})*sqrt(temp44{1})+(alpha11*alpha31)*f1{1}^2+(alpha12*alpha32)*f2{1}^2
com sigmaTx22(i) = (beta20*lambda20)+(beta21*lambda21)*(estr(t)-gama12)*(estr(t)-gama22)+(beta22*lambda22)*sqrt(temp33{1})*sqrt(temp55{1})+(alpha21*alpha41)*f1{1}^2+(alpha22*alpha42)*f2{1}^2
com mstr1(i) = exp(-nu*muxstr1+nu^2*d11/2)
com mstr2(i) = exp(-nu*muxstr2+nu^2*d22/2)
com mstr3(i) =  %cdf((muT-mux-(1-nu)*(sigmaTx11-d11))/sqrt(k11+d11-2*sigmaTx11))
com mstr4(i) =  %cdf(-(muT-mux-(1-nu)*(sigmaTx22-d22))/sqrt(k22+d22-2*sigmaTx22))
com mstr31(i) =  %cdf((muT-mux)/sqrt(k11+d11-2*sigmaTx11))
com mstr41(i) =  %cdf(-(muT-mux)/sqrt(k22+d22-2*sigmaTx22))
com psinustr1(i) = mstr1*mstr3*exp(-muxstr1+d11/2)
com psinustr2(i) = mstr2*mstr4*exp(-muxstr2+d22/2)
com psinustr(i) = log(pistr1*psinustr1/mstr31+pistr2*psinustr2/mstr41)
com Rtstr(i) = r-psinustr+estr(t)
com ST(i) = (temp22=d11), (temp33 = d22), (temp44 = k11), (temp55 = k22), S0*exp(Rtstr)
com Call(i) = (temp22=d11), (temp33 = d22), (temp44 = k11), (temp55 = k22), exp(-r)*%max(0,ST-K)/N

              report(row = new, atcol = 1) ST Call
              com ST(i) = ST,  Call(i) = Call
              report(row=current, atcol=1, align=decimal) ST
              report(row=current, atcol=2, align = decimal) Call
              report(action = format, align = center, width = 9)
               }
               }
              end do
print / ST Call
              open copy file_100.xls
              report(action=show,window = 'Option Price')
              report(action=show,format=xls,unit=copy)










