Tuesday, June 11, 2013

European trinomial pricing


function EuropeanTrinomialPrice(T, stock, K, r, sigma, q, n,callput)
{
 N=n;  
 rate = r;
 div =q;
 dt = T/N;  

 x = sigma*Math.sqrt(3.0*dt); 
 v = rate - div - sigma*sigma*0.5;
 dis = Math.exp(-rate*dt); 
 edx = Math.exp(x);  


 pu = 0.5*(dt*(sigma*sigma + v*v*dt)/x/x + (v*dt/x));  //up probability
 pm = 1.0 - dt*(sigma*sigma + v*v*dt)/x/x;  //middle probability
 pd = 0.5*(dt*(sigma*sigma + v*v*dt)/x/x - (v*dt/x));  //down probability


 C=new Array;
 S=new Array;
 

 S[N]=new Array;

 for(i=-N;i<N+1;i++)
 {
  S[i]=new Array;
 }
 for(i=N;i>=0;i--)
  {

   S[i][-i] = stock*Math.exp(-i*x);   

   for(j=-i+1;j<=i;j++)
    {
     S[i][j]=S[i][j-1]*edx;  
    }
  }

 for(i=-N;i<N+1;i++)
 {
  C[i]=new Array;
 }
 C[N]=new Array;
 for(j=-N;j<=N;j++)
 {
  if (callput=="c")
  {
   C[N][j] = max(S[N][j]-K,0.0);
  }
  else
  {
   C[N][j] = max(K-S[N][j],0.0);
  }
 }

 for(i=N-1;i>=0;i--)
  {
   for( j=-i;j<=i;j++)
    {
     C[i][j] = dis*(pu*C[i+1][j+1] + pm*C[i+1][j] + pd*C[i+1][j-1]);
    }
  }


return C;
 

}

No comments: