/* A Deterministic Path on Binomial Tree */ new; cls; S0=50; r=0.10; sig=0.40; T=5/12; nn=10; i=floor(2^nn*rndu(1,1)); S=bsampler(S0,sig,T,nn,i); print S; print/ld "p=" pb(S0,r,sig,T,nn,i); library pgraph; graphset; title("A Path on Binomial Tree"); ylabel("S"); xlabel("t"); xy(seqa(0,T/nn,nn+1),S); /* ** bsampler.txt - Deterministic Binomial Path Sampler. ** (C) Copyright 2005 Yosuke Amijima. All Rights Reserved. ** ** Purpose: Gets a deterministic path on binomial tree for given i. ** ** Format: S=bsampler(S0,sig,T,nn,i); ** ** Input: S0 scalar, initial value ** ** sig scalar, volatility ** ** T scalar, maturity ** ** nn scalar, number of time steps ** ** i scalar, deterministic order (0,1,2,...,2^nn-1) ** ** ** Output: S vector, (nn+1) x 1 of resulting values including S0 ** ** Notice: This procedure uses 'bisampler' inside. ** ** Parameter nn should not be large because a path could blow up if ** you use Light version of GAUSS or memory is limited. It depends. ** This comes from matrix transformation in procedure bisampler. */ proc bsampler(S0,sig,T,nn,i); local S,delt,u; S=bisampler(i,nn); S=S-1*(S.==0); delt=T/nn; u=exp(sig*sqrt(delt)); S=S0*u^cumsumc(S); S=S0|S; retp(S); endp; /* ** bsampler.txt - Probability of the Deterministic Binomial Path. ** (C) Copyright 2005 Yosuke Amijima. All Rights Reserved. ** ** Purpose: Gets the probability of the path. ** ** Format: p=pb(S0,r,sig,T,nn,i); ** ** Input: S0 scalar, initial value ** ** r scalar, risk-free interest rate ** ** sig scalar, volatility ** ** T scalar, maturity ** ** nn scalar, number of time steps ** ** i scalar, deterministic order (0,1,2,...,2^nn-1) ** ** ** Output: p scalar, probability of the path ** ** Notice: This procedure uses 'bisampler' inside. ** */ proc pb(S0,r,sig,T,nn,i); local delt,a,u,d,p,S; delt=T/nn; a=exp(r*delt); u=exp(sig*sqrt(delt)); d=1/u; p=(a-d)/(u-d); S=bisampler(i,nn); p=p*(S.==1)+(1-p)*(S.==0); p=prodc(p); retp(p); endp; /* ** bisampler.txt - Deterministic Binomial 0-1 Sampler. ** (C) Copyright 2005 Yosuke Amijima. All Rights Reserved. ** ** Purpose: Gets deterministic binomial 0-1 index numbers for given i in a very easy way. ** ** Format: x=bisampler(i,nr); ** ** Input: i scalar, deterministic order (0,1,2,...,2^nr-1) ** ** nr scalar, number of rows ** ** ** Output: x vector, nr x 1 of resulting 0-1 index vector ** */ proc bisampler(i,nr); local x,j; if i<0 or i>(2^nr-1) or i-floor(i)/=0; errorlog "ERROR: Parameter i must be an integer(0,1,2,...,2^nn-1)."; retp("."); endif; x=zeros(nr,1); j=nr; do until j==1; x[j]=floor(i/(2^(j-1))); i=i-(x[j]*(2^(j-1))); j=j-1; endo; x[1]=i; retp(rev(x)); endp;