第9章 期权定价的有限差分法
【本章精粹】
期权定价最终归结为一个二阶偏微分方程,而有限差分方法是计算偏微分方程的有效工具。因此,本章介绍3种常见的有限差分方法,并且给出了相关程序,让读者了解有限差分方法计算的基本原理,熟悉用显式法和隐式法计算欧式看涨期权价格。
9.1 有限差分计算方法的基本原理
偏微分方程在金融工程中占有重要位置,著名的Black-Scholes方程就是以二阶偏微分方程形式给出的。偏微分方程为求解复杂的金融衍生工具价格提供了有力手段,但是偏微分方程通常没有解析解,因此用数值计算方法求解衍生工具价格就成为金融工程的一项基本功。求解金融衍生工具价格与求解通常偏微分方程的区别主要在于一般偏微分方程是给定初值求解终值,而衍生品定价问题是给定终值求初值,属于倒向随机偏微分方程求解。
有限差分方法的核心思想是对导数进行离散化,把偏微分方程转化为差分方程,然后利用迭代法求解。
根据对偏导数离散方法的不同,有限差分方法可分为显式差分法、隐式差分法和内含差分法,下面分别进行介绍。
假设fi,j表示在i时刻股票价格为第j价位的期权价格,对f一阶导数进行如下差分:
fi,j1fi,jf (9-1) SSfi1,jfi,jf (9-2) tt式(9-1)、式(9-2)的差分方法称为显式差分法。也可以对一阶导数做如下差分:
fi,jfi,j1f (9-3) SSfi,jfi1,jf (9-4) tt式(9-3)、式(9-4)的差分方法称为隐式差分法。也可以做如下差分:
fi,j1fi,j1f (9-5) S2Sfi1,jfi1,jf (9-6) t2t式(9-5)、式(9-6)的差分方法称为内含差分法。
对二阶微分方程,用如下方法进行差分:
2ffi,j1fi,jfi,jfi,j1/S (9-7) S2SS整理得:
fi,j1fi,j12fi,j2f S2S2以上就是偏微分方程的常见离散方法。
9.2 显式有限差分计算法求解欧式看跌期权
下面利用显式差分法求解欧式看跌期权,对一阶偏导数、二阶导数离散方式如下:
fi,jfi1,jf (9-8) ttffi,j1fi,j1S2S 2ffi,j1fi,j12fi,jS2S2 将式(9-8)、式(9-9)、式(9-10)代入Black-Schole公式,有
fi,jfi1,jfi,j1fi,j11222fi,j1fi,j12ftrjS2S2jSi,jS2rfi,j 经过整理可得:
fa***i1,jjfi,j1bjfi,jcjfi,j1,i0,1,2,,N1;j1,2,3,,M1 a*j12t(2j2rj) b*1t(2j2jrj)
c*j12t(2j2rj) 将式(9-12)写成矩阵形式为
fN1,M1c***M1bMaM00fN1,MfN1,M211c***0M2bM2aM20fN1,M1fN1,M300c***M3bM3aM30fN1,M2**. 000c*M4bM4aMfN1,24fN1,1fN1,1000c**a*1b11fN1,0**c1b*MM1aM1000c***M2bM2aM20L00c***M3bM3aM30000c**a* M4bM4M4000c*1b**1a1(M1)(M1)则上式可以写成
(9-9) (9-10) (9-11) (9-12)
fN1,M1fN1,MffN1,M2N1,M1ffN1,M3N1,M2L(M1)(M1). fN1,2fN1,1ffN1,1N1,0也即
fN1LfN
对于欧式看涨期权,其终值条件为
f(S,T)max(KS,0)S0
下面考虑欧式看跌期权的边界条件,当股票价格St非常大时,看跌期权到期日价格为0,f(t,Smax)0;当股票价格为0时,St=0,那么到期日支付价值为K,贴现到t期有f(t,0)Ker(Tt),边界条件可以写成如下形式:
fi,M0
i=1,2,…,N
fi,0Ker(Ni)t i=0,1,2, …,N
fN,jmax(KjS) j=0,1,2, …,M
例9-1 已知股票价格为50元,欧式看跌期权的执行价格为50元,到期日为5个月,股票年波动率的标准差为0.3,无风险利率为10%,试用有限差分方法求解期权的价格。
解 下面是用Matlab编写的程序,程序文件名为osqq.m。
s0=50; %股价 k=50; %执行价
r=0.1; %无风险利率 sigma=0.3; %股票波动率 T=5/12; %续存期
smax=100; %确定股票价格的最大价格 ds=2; %股价离散步长 dt=5/1200; %时间离散步长
M=round(smax/ds); %计算股价离散步数 ds=smax/M; %股价离散实际步长 N=round(T/dt); %时间离散步数 dt=T/N; %时间离散实际步长 %%%%%%%%
matval=zeros(M+1,N+1);
vets=linspace(0,smax,M+1); %将区间[0,smax]分成M+1段 veti=0:N; vetj=0:M;
%建立偏微分方程边界条件
matval(:,N+1)=max(k-vets,0);
matval(1,:)=k*exp(-r*dt*(N-veti));
matval(M+1,:)=0; %%%%%%%%
%确定迭代矩阵系数
a=0.5*dt*(sigma^2*vetj-r).*vetj; b=1-dt*(sigma^2*vetj.^2+r);
c=0.5*dt*(sigma^2*vetj+r).*vetj; %%%%%%%
L=zeros(M-1,M+1); for i=2:M
L(i-1,i-1)=a(i);L(i-1,i)=b(i);L(i-1,i+1)=c(i); end
%%%%%%%%%%%%%% for i=N:-1:1
matval(2:M,i)=L*matval(:,i+1); end
jdown=floor(s0/ds); jup=ceil(s0/ds); if jdown==jup
price=matval(jdown+1,1)+(s0-jdown*ds)*(matval(jup+1,1)-matval(jup+1,1))/ds end
>> osqq
运行结果如下:
price = 2.8288
9.3 显式有限差分计算法求解美式看跌期权
这里采用与9.1节不同的离散方式,显式差分离散方法如下:
fi1,j1fi1,j1f (9-13) S2Sfi1,j1fi1,j12fi1,j2f (9-14) 22SS这样差分方程为
fi1,jfi,jtfi1,j1fi1,j12Sfi1,j1fi1,j112j2S2rfi,j 2S2rjS整理得:
fi,jajfi1,j1bjfi1,jcjfi1,j1 (9-15)
11122rjtjt 1rt221bj(12j2t)
1rt11122cjrjtjt
1rt22aj考虑到边界条件,fi,0k;fi,M0;i=0,1,2,…,N。 如果记
b1a2L00c1b2000c2aM200bM2aM10a1k00,g...
CM200bM2,M1。
对于第i个时刻的现金流Fi,j,Fi,jmax(kjS,fi,j),i,j1,2,记
F(F1,F2,,FM1)
则公式(9-15)有
FiLFi1g
例9-2 已知股票价格为50美元,美式看跌期权执行价格为50美元,到期日为5个月,股票年波动率的标准差为0.4,无风险利率为10%,试用有限差分方法求解期权的价格。
解 编写显式差分的Matlab程序如下。
s0=50;k=50;r=0.1;sigma=0.4;T=5/12; dt=T/10;ds=5; smax=100;
M=round(smax/ds); N=round(T/dt); ds=smax/M; dt=T/N; %%%%%%%% veti=1:N; vetj=1:M;
a=1/(1+r*dt)*(-1/2*r*vetj*dt+1/2*sigma^2*vetj.^2*dt); b=1/(1+r*dt)*(1-sigma^2*vetj.^2*dt);
c=1/(1+r*dt)*(1/2*r*vetj*dt+1/2*sigma^2*vetj.^2*dt); %%%%%%%
L=zeros(M-1,M-1);
L(1,1)=b(1);L(1,2)=c(1);
L(M-1,M-2)=a(M-1);L(M-1,M-1)=b(M-1); for j=2:M-2
L(j,j-1)=a(j);L(j,j)=b(j);L(j,j+1)=c(j); end
%%%%%%%%%%%%%%
f1=zeros(M-1,N+1);
f1(:,N+1)=max(k-vetj(1:M-1)*ds,0); f0=zeros(M-1,1); f0(1,1)=a(1)*k; for i=N:-1:1
f1(:,i)=L*f1(:,i+1)+f0; for j=1:M-1
if f1(j,i)<=k-vetj(j)*ds; f1(j,i)=k-vetj(j)*ds; end end end
f2(1,1:N+1)=50; f2(2:M,1:N+1)=f1; f2(M+1,1:N+1)=0 >> msqq
得到如表9-1所示的结果。
表9-1 计算结果 单位:美元
股价 时间 100 95 90 85 80 75 70 65 60 55 50 45 40 35 30 25 20 15 10 5 0 10 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.2770 6.7557 4.2568 2.5872 1.4787 0.9136 0.3241 0.4550 -0.1341 0.2824 -0.1067 0.0576 9 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.2013 6.6134 4.0818 2.3922 1.3670 0.6766 0.4574 0.0635 0.2046 -0.0475 0.0497 0 0 8 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.1279 6.4659 3.8859 2.2105 1.1650 0.6342 0.2288 0.1957 -0.0036 0.0479 0 0 0 7 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.0620 6.3097 3.6789 1.9878 1.0227 0.4444 0.2452 0.0403 0.0518 0 0 0 0 6 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.0122 6.1460 3.4398 1.7703 0.8101 0.3744 0.1004 0.0635 0 0 0 0 0 5 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.0000 5.9592 3.1788 1.5028 0.6519 0.2051 0.0887 0 0 0 0 0 0 4 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.0000 5.7474 2.8668 1.2436 0.4178 0.1426 0 0 0 0 0 0 0 3 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.0000 5.4984 2.5266 0.8986 0.2671 0 0 0 0 0 0 0 0 2 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.0000 5.2400 2.0725 0.5895 0 0 0 0 0 0 0 0 0 1 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.0000 5.0000 1.5560 0 0 0 0 0 0 0 0 0 0 0 50.0000 45.0000 40.0000 35.0000 30.0000 25.0000 20.0000 15.0000 10.0000 5.0000 0 0 0 0 0 0 0 0 0 0 0 0 可见,表9-1中第11行第1列的期权价格是4.2568美元。
9.4 隐式有限差分计算法求解欧式看跌期权
下面利用隐式有限差分计算法求解欧式看跌期权,对一阶偏导数、二阶导数离散方式如下:
fi1,jfi,jf (9-16) ttfi,j1fi,j1f (9-17) S2Sfi,j1fi,j12fi,j2f (9-18) S2S2将上面3个等式代入B-S公式,有:
fi1,jfi,jfi,j1fi,j11222fi,j1fi,j12fi,jrjSjSrfi,j (9-19) t2S2S2整理得:
fi1,jajfi,j1bjfi,jcjfi,j1 (9-20)
11ajrjt2j2t (9-21)
2222b*j1jtrt (9-22)
11cjrjt2j2t (9-23)
22改写为矩阵形式为
b1a200c1b2000c2aM200bM2aM10fi,1fi1,1a1fi1,0ff00i,2i1,2 ....=...-...CM2fi,M2fi1,M20cfbM2fi,M1fi1,M1M1i1,M00bM2aM1fi,1a1fi1,00fi,200(i) ,f...,g...CM20fi,,M2cfbM2M1i1,Mfi,M1记为
b1a2L00c1b2000c2aM2则有
Lf(i)f(i1)g
例9-3 已知股票价格为50元,欧式看跌期权的执行价格为50元,到期日为5个月,股票年波动率的标准差为0.4,无风险利率为10%,试用有限差分方法求解期权的价格。
解 下面是用Matlab编写的程序,程序文件名为yhcf.m。
s0=50; %股价 k=50; %执行价
r=0.1; %无风险利率 sigma=0.4; %股票波动率 T=5/12; %续存期
smax=100; %确定股票价格的最大价格
ds=0.5; %股价离散步长 dt=5/2400; %时间离散步长
M=round(smax/ds); %计算股价离散步数 ds=smax/M; %股价离散实际步长 N=round(T/dt); %时间离散步数 dt=T/N; %时间离散实际步长 matval=zeros(M+1,N+1);
vets=linspace(0,smax,M+1); %将区间[0,smax]分成M+1段 veti=0:N; vetj=0:M;
%建立偏微分方程边界条件
matval(:,N+1)=max(k-vets,0);
matval(1,:)=k*exp(-r*dt*(N-veti)); matval(M+1,:)=0; %%%%%%%%
%确定迭代矩阵系数
a=0.5*(r*dt*vetj-sigma^2*dt*vetj.^2); b=1+sigma^2*dt*vetj.^2+r*dt;
c=-0.5*(r*dt*vetj+sigma^2*dt*vetj.^2);
coeff=diag(a(3:M),-1)+diag(b(2:M))+diag(c(2:M-1),1); [L,U]=lu(coeff) %%%%%%%
aux=zeros(M-1,1); for i=N:-1:1
aux(1)=-a(2)*matval(1,i)
matval(2:M,i)=U\\(L\\(matval(2:M,i+1)+aux)); end
jdown=floor(s0/ds); jup=ceil(s0/ds); if jdown==jup
price=matval(jdown+1,1) else
price=matval(jdown+1,1)+(s0-jdown*ds)*(matval(jup+1,1)-matval(jup+1,1))/ds end
>> yhcf
运行结果如下:
price = 4.0718
9.5 隐式有限差分计算法求解美式看跌期权
与9.4节的方法一样,根据式(9-20)、式(9-21)、式(9-22)、式(9-23),下面考虑美式看跌期权的边界条件。
T时刻看跌期权到期现金流为max(KST,0),其中ST为T时刻的股票价格,则:
fN,jmax(KjS,0) j=0,1,2,…,M (9-24)
当股票价格为0时,看跌期权价格为K,则:
fi,0K i=0,1,2,…,N (9-25)
当股票价格趋于无穷大时,看跌期权价格趋于0,因此有近似值:
fi,M0 i=1,2,…,N
下面考虑美式期权提前执行条件,当计算fi,j时,有
fi,jmax(fi,j,KjS) (9-26)
注意,式(9-26)右边的fi,j是递推公式结果,左边才是i时刻j价位的期权价格。 例9-4 已知股票价格为50元,美式看跌期权的执行价格为50元,到期日为5个月,股票年波动率的标准差为0.4,无风险利率为10%,试用有限差分方法求解期权的价格。
解 下面是用Matlab编写的程序,程序文件名是yhcf.m。
s0=50; %股价 k=50; %执行价
r=0.1; %无风险利率 sigma=0.4; %股票波动率 T=5/12; %续存期
smax=100; %确定股票价格的最大价格 ds=0.5; %股价离散步长 dt=5/2400; %时间离散步长
M=round(smax/ds); %计算股价离散步数 N=round(T/dt); %时间离散步数 ds=smax/M; %股价离散实际步长 dt=T/N; %时间离散实际步长
%%%%%%%%
%确定迭代矩阵系数 for j=1:M
a(j)=0.5*r*j*dt-0.5*sigma^2*j^2*dt b(j)=1+sigma^2*j^2*dt+r*dt
c(j)=-0.5*r*j*dt-0.5*sigma^2*j^2*dt end
%%%%%%%
L=zeros(M-1,M-1);
L(1,1)=b(1);L(1,2)=c(1);
L(M-1,M-2)=a(M-1),L(M-1,M-1)=b(M-1); for j=2:M-2
L(j,j-1)=a(j);L(j,j)=b(j);L(j,j+1)=c(j) end
for j=1:M-1
f(j,N+1)=max(k-j*ds,0) end
for i=N:-1:1
F(1)=f(1,i+1)-a(1)*k;F(2:M-1)=f(2:M-1,i+1) f(1:M-1,i)=L^(-1)*F
for j=1:M-1
if f(j,i) 运行结果如下: price = 4.07 9.6 Crank-Nicolson方法求解欧式障碍期权 Crank-Nicolson方法是内含有限差分与外推有限差分的平均值,是比较精确的一种数值解法。 隐含有限差分方程为 fi,jajfi1,j1bjfi1,jcjfi,1,j1 (9-27) 外推有限差分方程为 *fi1,ja*jfi,j1b*jfi,jcjfi,j1 (9-28) 将式(9-27)和式(9-28)相加,得: **fi,jfi1,jajfi1,j1bjfi1,jcjfi,1,j1a*jfi,j1bjfi,jcjfi,j1 整理得: jfi1,j1(1j)fi1,ji1,j1jfi,j1(1j)jfi,jjfi,j1 jt22(jrj) 4tj(2j2r) 2tj(2j2rj) 4M1fi1M2fi 111122M10000000000M21M1M1 M21M100方程的矩阵形式为 111122M20000f(i)(fi,1,fi,2,020000M21M2M1 M21M100,fi,M1)T 考虑欧式下跌出局看跌期权,障碍值为Sb,S≥Sb,障碍期权的现金流为 f(t,Smax)0,f(t,Sb)0 例9-5 已知股票价格为50元,欧式看跌期权的执行价格为50元,到期日为5个月,股票年波动率的标准差为0.4,无风险利率为10%,试用有限差分方法的Crank-Nicolson方法求解欧式障碍期权的价格。 解 下面是用Matlab编写的程序,程序文件名为cncf.m。 s0=50; %股价 k=50; %执行价 r=0.1; %无风险利率 sigma=0.4; %股票波动率 T=5/12; %续存期 smax=100; %确定股票价格的最大价格 ds=5; %股价离散步长 dt=5/2400; %时间离散步长 M=round((smax-sb)/ds); %计算股价离散步数 ds=(smax-sb)/M; %股价离散实际步长 N=round(T/dt); %时间离散步数 dt=T/N; %时间离散实际步长 matval=zeros(M+1,N+1); vets=linspace(0,smax,M+1); %将区间[0,smax]分成M+1段 veti=0:N; vetj=vets/ds; %建立偏微分方程边界条件 matval(:,N+1)=max(k-vets,0); matval(1,:)=0; matval(M+1,:)=0; %%%%%%%% %建立对角矩阵 alpha=0.25*dt*(sigma^2*vetj.^2-r*vetj); beta=-dt*0.5*(sigma^2*vetj.^2+r); gama=0.25*dt*(sigma^2*vetj.^2+r*vetj); M1=-diag(alpha(3:M),-1)+ diag(1-beta(2:M))-diag(gama(2:M-1),1); [L,U]=lu(M1); M2=-diag(alpha(3:M),-1)+ diag(1+beta(2:M))+diag(gama(2:M-1),1); for i=N:-1:1 matval(2:M,i)=U\\(L\\(M2*matval(2:M,i+1))); end jdown=floor((s0-sb)/ds); jup=ceil((s0-sb)/ds); if jdown==jup price=matval(jdown+1,1) else price=matval(jdown+1,1)+(s0-jdown*ds)*(matval(jup+1,1)-matval(jup+1,1))/ds end >> cncf 运行结果如下。 price = 0.5414 例9-6 已知股票价格为50元,美式看跌期权的执行价格为50元,到期日为5个月,股票年波动率的标准差为0.4,无风险利率为10%,试用有限差分方法的Crank-Nicolson方法求解美式看跌期权的价格。 解 下面是用Matlab编写的程序,程序文件名为cncf1.m。 clc;clear; s0=50; %股价 k=50; %执行价 r=0.1; %无风险利率 sigma=0.4; %股票波动率 T=5/12; %续存期 Sb=40; %sb是障碍值 smax=100; %确定股票价格的最大价格 ds=0.5; %股价离散步长 dt=T/10; %时间离散步长 N=round(T/dt); %时间离散步数 M=round(smax/ds); %计算股价离散步数 ds=smax/M; %股价离散实际步长 dt=T/N; %时间离散实际步长 veti=1:M-1; vetj= vetj'; %%%%%%%% alpha=dt/4*(sigma^2*vetj.^2-r*vetj); beta=-dt/2*(sigma^2*vetj.^2+r); gama=dt/4*(sigma^2*vetj.^2+r*vetj); H=diag(alpha(2:M-1),-1)+ diag(beta(1:M-1))+diag(gama(1:M-2),1); M1=eye(M-1)-H;M2=eye(M-1)+H; f=zeros(M+1,N+1); f(1,:)=k; f(M+1,:)=0; f(2:M,N+1)=max(k-vets*ds,0); g=zeros(1,M-1)';g(1)=2*k*alpha(1); for i=N:-1:1 f(2:M,i)=M1^(-1)*[M2*f(2:M,i+1)+g]; f(2:M,i)=max(f(2:M,i),k-vetj*ds); end >> cncf1 运行结果如下。 股价为50元对应的期权价格为4.16。 思 考 题 已知股票价格为50元,执行价格为52元,到期日为6个月,股票年波动率的标准差为30%,无风险利率为3%,试用有限差分方法计算美式看跌期权的价格,并和Black-Scholes期权定价公式的计算结果比较。 因篇幅问题不能全部显示,请点此查看更多更全内容