# Pricing American Option Using an Exisiting Boundary

I want to price American Option by applying an existing boundary to a set of randomly generated paths. The boundary can be obtained from a binomial method. For example, a call option with one year maturity can be exercised at the end of each four month (3 exercise points), the spot and strike price is both at \$100 dollar, with continuous dividend at 10%, risk free rate at 5% and volatility at 20%. The following bound can be obtained from the binomial method: For the first exercise point, the option should be exercised if the stock price is greater than 113.9557.The second is 110.2940 and the last is 100.0000. The option value obtained from the binomial method is 5.73.

However, when I apply this bound to 10000 random generated path, I get a value around 9.5. I don't know what can cause this highly biased value? Thanks in advance for any suggestions and solutions.

The code for generating the path is:

b=10000;
payoff=Stockpath=matrix(S0[q], nrow=b, ncol=t+1);
optionvalue=matrix(0,nrow=b,ncol=1);
prev.theta=theta.maxexp=matrix(300, nrow=1, ncol=t+1);
theta.maxexp[4]=K; #initiate the bound
exercise=matrix(0,nrow=b,ncol=t+1);
exerciseindex=matrix(4,nrow=b,ncol=1);

for (p in 2:ncol(Stockpath)){
steptemp=tstep*(p-1);
for (i in 1:b/2){
x=rnorm(1, mean=0, sd=1);
Stockpath[i,p]=S0[q]*exp((r-delta-sigma^2/2)*steptemp+sigma*sqrt(steptemp)*x);
Stockpath[i+b/2,p]=S0[q]*exp((r-delta-sigma^2/2)*steptemp+sigma*sqrt(steptemp)*(-x));
payoff[i,p]=max(Stockpath[i,p]-K,0);
payoff[i+b/2,p]=max(Stockpath[i+b/2,p]-K,0);
}
}


The code for applying the bound is:

for (step in t:2){
exercise[,step]=ifelse(Stockpath[,step]>temp.theta[step],1,0)
}
exercise[which(apply(exercise,1,sum)==0),t+1]=1;
index=which(apply(exercise,1,sum)>1);
colindex=apply(exercise,1,function(x) min(which(x==1)));
exercise=matrix(0,nrow=b,ncol=t+1);
for (i in 1:b)  exercise[i,colindex[i]]=1;

optionvalue=exercise*payoff;
exerciseindex=exercise*matrix(c(0:t+1),ncol=4,nrow=b,byrow=TRUE);
dicountfactor=exercise*exp(-r*(exerciseindex-1)/t);
dicountfactor[which(dicountfactor[,1]>0),1]=1;
optionvalue=optionvalue*dicountfactor;
mean(apply(optionvalue,1,sum));#The option value