Tuesday, June 11, 2013

American trinomial pricing


function AmericanTrinomialPrice(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;
 for(i=N;i>=0;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-1;i>=0;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] = max(dis*(pu*C[i+1][j+1] + pm*C[i+1][j] + pd*C[i+1][j-1]),K-S[i][j]);
    }
  }

 return C;
}

No comments: