二叉树模型
考虑到欧式期权的特性,忽略中间过程,直接关注末期状态及其概率分布。
function price=bino(s,k,r,t,v,n)
dt=t/n;
u=exp(v*sqrt(dt));
d=1/u;
p=(exp(r*dt)-d)/(u-d);
for i=0:n
st(i+1)=s*power(u,n-i)*power(d,i);
prob(i+1)=nchoosek(n,i)*power(p,n-i)*power((1-p),i);
end
f=max(st-k,0);
price=prob*f'*exp(-r*t);
end
蒙特卡洛模拟
在此加入对偶变量,减小模拟结果的方差。
%Advanced Monte Carlo method
function eucall=blsmca(s,k,r,t,v,n)
randn('seed',0);
nt=(r-.5*v^2)*t;
sit=v*sqrt(t);
rand=randn(n,1);
discpayoff=exp(-r*t)*max(0,s*exp(nt+sit*rand)-k);
discpayoffl=exp(-r*t)*max(0,s*exp(nt+sit*(-rand))-k);
[eucall,varprice,ci]=normfit([discpayoff;discpayoffl]);
end
有限差分方法
在此为了减小运算量,采用显示有限差分法。(在隐式有限差分法中,需要求解方程)
function mx=fd(s,k,r,t,v)
smax=200;
ds=5;
dt=t/10;
M=round(smax/ds);
N=round(t/dt);
ds=smax/M;
dt=t/N;
mx=zeros(M+1,N+1);
mx(:,1)=smax:-ds:0;
mx(:,N+1)=max(mx(:,1)-k,0);
mx(1,2:N)=smax-k;
mx(M+1,2:N)=0;
vj=2:M;
a=1/(1+r*dt)*(-1/2*r*vj*dt+1/2*v^2*vj.^2*dt);
b=1/(1+r*dt)*(1-v^2*vj.^2*dt);
c=1/(1+r*dt)*(1/2*r*vj*dt+1/2*v^2*vj.^2*dt);
for i=N:-1:2
for
j=2:M
mx(j,i)=a(i)*mx(j-1,i+1)+b(i)*mx(j,i+1)+c(i)*mx(j+1,i+1);
end
end
end
另外,MATLAB中的blkprice函数和blsprice函数算出来得期权价值相差较大,个人觉得布莱克近似模型的有效性值得商榷。