1
第七章 期权定价的二叉树和三叉树方法
在这一章中,我们利用二叉树和三叉树方法为期权定价。在第
2.1节中我们已经介绍了利用基础途径的二叉树方法解决期权价格不
确定性的模型。二叉树方法依赖于对相关随机过程的离散化并利用计
算和内存的结合以满足易于管理的要求。我们也在 2.6.1 节中看到在
一个单步二叉树格定价中利用无套利进行期权定价更为简便。为了获
得一个实用的定价程序,我们必须把原来的单步格方法扩展到多步格
方法,但是我们必须校对格使它能够反映出相关模型,且这个模型是
连续时间、连续状态的随机微分方程。然后我们就可以推广到多步的
二叉树格和三叉树格。
在 7.1 节中,我们从如何利用在离散概率分布的时刻下随机价格
波动校准简单的二叉树格。从这点来看,弄清楚网格技术和蒙特卡洛
模拟之间的联系是非常重要的,而利用时刻匹配技术缩减方差可以看
作一种快捷的抽样排序。然后我们讨论内存效率的实现是如何
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的,美式期权定价是 7.2 节的主题。同时,还是要注重它和其他技术
方法的联系。现在我们要做的本质上是一个非常简单满足动态规划原
则的程序,我们将在第 10 章程序中进一步拓展。在 7.3 节中,我们
把上述方法推广到双标的资产的情形,虽然这是一个最简单的情形,
但是我们可以从这个情形中看出内存控制是这一情形的基础。另一种
一般化的代表是三叉树格方法,三叉树格方法可以作为一种更普遍的
有限差分方法(具体将在 9.2.1 中叙述),最后,我们在 7.5 节中具
2
体讨论网格化方法的优势和劣势。
期权定价的二叉树和三叉树格方法
图 7.1 单时期二叉树格
7.1 二叉树定价方法
在 2.6.1 节中,我们已经考虑过单步二叉树方法在无套利情况下
的期权定价,这里我们为了方便直接利用图 7.1。其主要思想是复制
两个资产,一个是无风险资产,另一个是相关股票。利用这两项资产,
我们可以通过它们的组合塑造任何收益率的资产。如果我们令 u和d
为任意两个价格的角标,我们可以看到期权的价格应该为 0f 则,
])1([0 du
tr fppfef (7.1)
在
公式
小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载
7.1 中 uf 和 df 是标的资产在涨跌两种情况的期权价格,p是风
险中性前提下相关资产升值的概率。
du
de
p
tr
为了寻找一个更好的不确定性模型,我们可以增加分类的情况,
复制期权收益,甚至我们可以使用更多的资产,或允许中间日期交易。
第二种可能性更为实际,并且也是必不可少的,例如,对于在期权的
存续期内可以随时执行的美式期权来说。对其求极限,就会得到连续
3
时间模型,并且其最后收敛于 Black—sholes 方程。当 Black—sholes
方程没有解析解的时候,我们必须采取一些离散化的途径,比如说可
以通过蒙特卡洛模拟从而估计出风险中性条件下预期收益,或者建立
一个自适应网格的有限差分方法去解决相应的 PDE 模型。就像我们
在图 7.2 中展示的一样,多级二叉树格方法就是一种可以选择的离散
化方法。我们也可以考虑利用树图,但是要注意使计算方法易于控制。
二叉树格定价
图 7.2 新生成的二叉树图
这里我们为了方便令 du /1 。虽然这个不是必须的,但是在后面
我们可以看到,这个假设令模型简化了很多即每上一步紧接着下一步
都会得到相同的初始价格。
000 SduSudS
正如我们从图中看到的一样,我们仅用了有限个价格步。这个有
可能就是实施该方法的优势。但是,我们该怎么恰当的确定 u和 d 的
值呢,我们应该利用近似相关的连续过程去校对网格。
4
7.1.1 二叉树格的校对
二叉树格方法应该是风险中性过程一个良好的相似。
SdWrSdtdS
因此,我们应以这样的方式参数设置晶格,即保持着连续时间模型的
一些基本属性,这一过程就叫做校准。从 tS 开始,经过一个小的时间
步 t ,从 2.5 节我们可以看到新价格是一个随机变量 ttS ,且
),)2/((~)/log( 22 ttrNSS ttt
利用对数正态对数分布的特性,我们得到
tr
ttt eSSE
]/[ (7.2)
和
)1(]/[
22
ttr
ttt eeSSVar
(7.3)
一个合理的要求是这些离散的动态点必须和它们的时刻相匹配。要注
意的是,我们只有两个个等式,却有 3 个参数,p,u 和 d,所以三个变
量有一个为自由变量,我们令 du /1 ,这样做是为了计算简便,但不
是必须的。在网格点上,我们有:
tttt SdpSpuSE .)1(.][ ,
和(7.2)联立得
t
tr
tt SeSdpSpu
.)1(.
du
de
p
tr
注意, p是风险中性条件下的概率,它不依赖于真实浮动,为了和方
差匹配,在晶格上我们看到
tr
tttttttt eSdppuSSESESVar
2222222 ))1((][][)(
5
从(7.3)中我们也可以看到
)1(][
222
ttr
ttt eeSSVar
把最后两个等式联立可得
tr
tt
ttr
t eSdppuSeeS
2222222 ))1(()1(
2
最终得到
2222 )1( dppue ttr
将 p带入最后一个等式的右侧,化简得
du
eduddueu
d
du
eu
u
du
de trtrtrtr
222222
1)(
)()( 22
tt
tr
edu
du
duedu
最后我们得到这样的等式
ttre 22 1)( ttedu
其中,利用 du /1 ,可以转化为二次方程:
0)1(
222 tttrtr eeueu
t
方程的一个跟为
tr
trttrttr
e
eee
u
2
4)1()1( 2222
22
利用一阶条件拓展,只受 t 的影响,我们可以简化表达式,对平方根
近似化简可得
ttrtree trtr
t
22222 4)21(4))2(2(4)1(
2
因此
tre
ttr
u
2
2)2(2 2
6
)1)(
2
1(
2
trtttr
tttrtttr
2
1
2
1
22
但是对于二阶条件,我们对 te 拓展,最终获得参数
teu , ted ,
du
de
p
tr
, (7.4)
这就是著名的 CRR 公示
这里强调一下:这个方法以及文献中所用的参数都不是唯一的,
例如我们可以取 5.0p ,经计算可得:
5.0p ,
ttr
eu
)
2
(
2
,
ttr
ed
)
2
(
2
这就是杰诺-拉德参数,此外,我们一直在努力结束涉及计算以
及线性方程组的计算,通过对数转换的方法,我们尽量的避免这些困
难。在以后,我们都将采用这个方法。
假设无风险利率和波动是时间常数,我们所得的结果适用于整个
晶格参数,为一个期权定价,我们需要对标的资产制定一个网格,然
后从以往的时间倒推。事实上,期权价格在到期日的时候已经知道了,
那时已经给出了期权的收益。因此,我们利用方程(7.1)按每一个时
间步倒推递归,直到到达我们的初始节点。二叉树格方法在欧式看涨
期权得到最佳的应用。
例 7.1
假设我们假设为一个欧式看涨期权定价 500 KS , 1.0r ,
4.0 ,存续期为 5 个月,利用 B-S 模型,我们知道结果是:
>> )4.0,12/5,1.0,50,50(blspricecall
7
>> 1165.6call
如果我们想用二叉树格方法逼近结果的话,我们首先就要定义格
参数,假定每个时间步为一个月,然后
0833.012/1 t
1224.1 teu
8909.0/1 ud
5073.0
du
de
p
tr
对股票价格产生的格和选项值显示在图 7.3,在晶格的最右面是期权
的价格,为了便于计算,让我们考虑如何从最后一层至第二层逐层倒
推:
77.29]77.20*4927.007.39*5073.0[]77.20).1(07.39.[ 0833.0*1.0 eppe tr
在递归后,我们看到,由此计算出的期权价格大约为 6.36,结果不
太接近确切价格,一个更好的改进近似就是缩小时间步长。
为了更好的在 MATLAB 中实现这一方法,我们需要一个向前倒推的
代数式。令 ijf 为在节点的期权的价值,其中 j 为第 j 个时期
)~0( Nj ,i 表示为在 j 时期内上升了 i。我们利用倒推思想,N 是我
们考虑的时间步,因此总共有 N+1 格, TtN ,即整个期权存续期。
在这样的定义下,晶格点的标的资产价格即为 ijidSu ,在存续期内,
我们有:
},0max{, KdSuf
iNi
Ni
, Ni ,...,1,0
时间逆推(下降时间标 j),我们得到
].)1([ 1,1,1
jiji
tr
ij fppfef
(7.5)
这些工作在 MATLAB 中生成非常简单,代码在图 7.4 给出,唯一要注
8
意的一点是,矩阵索引在 MATLAB 中要从一开始,这需要一个微小的
调整。
7.3 欧式看涨期权的二叉树格
9
function [price, lattice] = LatticeEurCall(SO,K,r,T,sigma,N)
deltaT = T/N;
u=exp(sigma * sqrt (deltaT)) ;
d=l/u;
p=(exp(r*deltaT) - d)/(u-d) ;
lattice = zeros(N+l,N+l);
for i=O:N
end
for j=N-1 : -1 : 0
for i=O:j
lattice(i+l,N+l)=max(O , SO*(u-i)*(d-(N-i)) - K);
lattice(i+l,j+l) = exp(-r*deltaT) * ...
(p * lattice(i+2,j+2) + (1-p) * lattice(i+l,j+2));
end
end
price = lattice(1,l) ;
图 7.4 MATLAB代码—为欧式看涨期权定价
欧式看涨期权接收到通常我们所定义的参数和在此情况下的时
间步 N,通过增加最后一个参数,我们得到了更为精确的价格(同一
计算时间的增加)。
>> )5,4.0,12/5,1.0,50,50(calllatticeEurcall
>> call
6.3595
>> )500,4.0,12/5,1.0,50,50(calllatticeEurcall
>> call
6.1140
更有趣的是探讨二叉树方法计算的价格如何收敛于正确价格的。
我们可以通过图 7.5 的代码和图 7.6 的结果输出来看出。在这种情况
下,我们看到随着时间步的增加的震荡情况。
我们刚才讨论的执行结果也有一些缺陷。首先,它使用的是一个
10
大型的矩阵存储格,但是其中近一半为空,我们把返回的整个存储格
作为一个输出参数,这个也许对与之相关的图 7.3 非常有用,但是可
能在实际运用中毫无作用,实际上为我们只需要连续的两个存储层存
储所需资料就能有所改善。在内循环中,我们用贴现系数乘以时间的
风险中性概率,我们可以通过循环外计算节省时间。我们将努力在
7.3 节中进行改进,在下一节中,我们将把二叉树方法运用到其它非
标准型期权定价中。
C0mpLatticeBLS.m
SO = 50;
K = 50;
r = 0.1;
sigma = 0.4;
T = 5/12;
N=50 ;
BlsC = blsprice (SO,K,r ,T, Sigma) ;
LatticeC = zeros(1,N);
for i=(l:N)
end
plot(l:N, ones(l,N)*BlsC);
hold on;
plot(l:N, LatticeC);
Latt iceC (i) = Latt iceEurCal1 (SO, K , r , T, sigma, i)
图 7.5 脚本检查减少 t 的二叉树格的精确性
图 7.6 二叉树方法中精确价格和增加了时间步后相似价格的差距
11
7.1.2 把俩者结合起来,为后付费期权定价
在这里,我们无红利股票的付费后期权1。后付费期权的特点是预
先不支付担保金,当合约成立以后,将在以后支付。如果期权的存期
满后,则期权必须执行,并归还担保金,否则期权就毫无价值可言,
因为没有担保金。请注意,期权持有者的净盈利可以是负数,当期权
的收益小于担保金的时候就会出现净盈利为负。在无套利的情况下,
如果净回报总是为负,我们不能拥有一份在 0t 时刻价值为 0的合约,
我们怎么样才能找到公平的担保金价值呢?
给出一个担保金为 P,则回报是:
对于每一个给定的价格 P,我们都可以利用二叉树方法算出期权
价格,现在我们必须寻找到一个值 P,使得在风险中性的前提下,于
TS 相关的期望回报为 0 :
0)];([
PSfE T
注意这里的贴现因子,因为利率是恒定的,因此贴现因子并没有任何
作用。为了解决这个含 P的方程,我们对晶格利用二分法解决非线性
方程组(见 3.4.1 节)。首先,我们建立一个函数对给定 P条件下的
期望进行估计;MATLAB 代码在图 7.7 中给出。让我们考虑一个标的
资产为股票的期权,股票的价格为 12 美元,波动率为 20%;无风险
利率为 10%;执行价格为 14 美元;存续期为 10 个月。我们用二叉树
方法为其定价,取时间步长为一个月,所以总共有 10 个时间步。当 P
1 这个例子是建立在(参考文献 5 第 13 章 练习 11)
12
给定的时候,我们可以建立匿名函数返回贴现后的回报。然后我们利
用二分法,以 fzero 为出发点进行探讨。
>>f = @(PI Lll(P,12,14,0.1, 0.2, 10/12, 10)
f =
@(P) Lll(P,l2,14,0.1, 0.2, 10/12, 10)
>> fzero(f ,2)
ans
2.0432
exercise 11 chapter 13 from Luenberger, Investment Science
% exercise 11, chapter 13, from Luenberger, Investment Science
function ExpPayoff = L11(premium,S0,K,r,sigma,T,N)
deltaT = T/N;
u=exp(sigma * sqrt(deltaT));
d=1/u;
p=(exp(r*deltaT) - d)/(u-d);
lattice = zeros(N+1,N+1);
for i=0:N
if (S0*(u^i)*(d^(N-i)) >= K)
lattice(i+1,N+1)=S0*(u^i)*(d^(N-i)) - K - premium;
end
end
for j=N-1:-1:0
for i=0:j
lattice(i+1,j+1) = p * lattice(i+2,j+2) + (1-p) * lattice(i+1,j+2);
end
end
ExpPayoff = lattice(1,1);
图 7.7 用二叉树方法为后支付期权定价的 MATLAB代码
7.1.3 二叉树方法的一个执行改进
我们原来使用过的改进后的二叉树方法现在也可以改进了(从
CPU 运行时间和内存要求上)。首先,循环中没有必要重复计算贴现
的概率,我们可以乘以贴现因子和概率一次来计算。此外,我们可以
看到,随着对二叉树晶格的校准,即令 ud=1,我们可以使用向量而
13
不是二维矩阵来记忆资产价格从而节约存储。例如在图 7.3 中,我们
看到只有 11 个不同的值用于标的资产价格。用此种格校准,如果有
N 个时间步,则我们就有了 2N+1 个不同的价格。因此,他们可以存
储在单一列中,可以节省相当大的存储空间。如果我们需要 1000 步
来准确估计,那么 1000*1000 的矩阵就和 2001 项的向量有了很大的
差距。一个可行性
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
存储价格的方法可以见图 7.8。这些数字如图
所示是在矢量的位置。1 是存储中的最小值,造成步骤序列是下跌序
列。我们可以看到奇数项对应的是最后一层,偶数项对应的是倒数第
二层。在格上是奇数还是偶数取决于时间步。
图 7.8 节省存储的二叉树格
同样方法可以用来存储期权价值。原则上,我们应该使用俩个向
量对应时间的连续俩个层。但是,我们可以利用让偶数的元素一层,
奇数的元素另一层,这样就可以使用含有 2N+1 个元素的向量了。由
此产生的代码可以看图 7.9。下面是我们上述工作的一些评论。
*我们预先计算的,包括贴现概率等等的数量不变(在代码第一部
14
分)。
*当我们编写标的资产价格的载体 SVals 时,我们从最小的元素
开始,即
NdS0 ;然后乘以 u;为了更好的准确性,最好把 0S 存到中间
元素 SVals(N+1)中,然后继续正推或者倒推。
*注意的是我们在与调用值(通过索引)计算的时候分为 2 步,
其数额为交替奇数和偶数索引值连续对应层。
*当到期时间为 T 的时候,我们只须考虑 CVals 数组中的 2(N-T)
+1 个核心元素。期权的价格是储存在格中的,它对应的是与之相对
应的格位置。
我们可以检查一下一个计算上更有效率的版本。
blsprice(50,50,0.1,5/12,0.4)
ans = function price = SmartEurLattice(S0,K,r,T,sigma,N)
% Precompute invariant quantities
deltaT = T/N;
u=exp(sigma * sqrt(deltaT));
d=1/u;
p=(exp(r*deltaT) - d)/(u-d);
discount = exp(-r*deltaT);
p_u = discount*p;
p_d = discount*(1-p);
% set up S values
SVals = zeros(2*N+1,1);
SVals(1) = S0*d^N;
for i=2:2*N+1
SVals(i) = u*SVals(i-1);
end
% set up terminal CALL values
CVals = zeros(2*N+1,1);
for i=1:2:2*N+1
CVals(i) = max(SVals(i)-K,0);
end
% work backwards
15
for tau=1:N
for i= (tau+1):2:(2*N+1-tau)
CVals(i) = p_u*CVals(i+1) + p_d*CVals(i-1);
end
end
price = CVals(N+1);
SVals(i) = u*SVals(i-l);
CVals(i) = max(SVals(i)-K,O) ;
for i= (tau+l):2: (2*N+l-tau)
end
CVals(i) = p-u*CVals(i+l) + p-d*CVals(i-l) ;
end
price = CVals(N+l);
6.1165
>> tic,LatticeEurCa11(50,50,0.1,5/12,0.4,2000~,toc)
ans =
6.1159
Elapsed time is 0.262408 seconds.
>> tic,SmartEurLattice(50,50,0.1,5/12,0.4,2000),toc
ans =
6.1159
Elapsed time is 0.069647 seconds.
图 7.9 欧式看涨期权二叉树方法的改进代码
我们可以通过矢量代码寻求进一步的改善,或者采取不同的方
法。我们不会追求这样的方法以避免模糊的代码,但是我们把握容易
的方法以寻求进一步改进。也许在节省 CPU 处理时间上效果并不明
显,但是当处理多维期权定价的时候对内存的节省就显得非常必要。
7.2 用二叉树方法对美式期权定价
利用二叉树技术为美式期权定价我们已经在上一节讲过,是相当
简单的。唯一个关键点就是如何解释早期的运动2。在这里,我们解
决的是标的资产为无红利支付股票的普通美式看跌期权的定价问题。
2 相对应的看涨期权我们不敢兴趣,因为我们可以证明,美式看涨期权提前执行时没有意义的,除非在期
权存续期内存在股息支付。
16
考虑在最后一个晶格层的点(1,N)。如果期权获利,这显然是最佳的
执行点。因此,在最后一层我们有:
}0,max{ iNiN SKf
iNi
iN dSuS
是该节点的标的资产价格。现在我们考虑一个在倒数第二
层的点。如果期权没有获利即 KS Ni 1, ,我们就不执行。如果期权已
经盈利,我们就想知道是现在立即执行好,还是将来在某个机会执行
获取更大的收益更好。换句话说,我们必须解决一个最优停止问题,
在每个时间步上,我们必须观察这个动态系统,从而决定是否应该立
即执行,以保持现有收益,或者继续存有期权。
解决这个问题有个简单的方法,就是通过比较直接的回报(期权
的内在价值)和继续持有的价值。如果我们继续持有资产,我们拥有
的资产价值为:
)( ,,11, NidNiu
trc
Ni fpfpef
(备注:相应的看涨期权我们不感兴趣,因为可以证明,提前执行是
从来没有最优选择的,除非股息在期权的存续期支付。)
这里 up 和 dp 都是风险中性概率,我们应该执行,如果内在价值大于
继续持有的价值。因此期权在从第二到最后一层节点上的价值为
)},(,max{ ,11,1, Nidiu
tr
NiNi fpNfpeSKf
同样的事情会在任意层的递归过程中发生。这意味着,我们应该从最
后一层开始,在那里期权的价值就是期权的收益。然后我们应该对时
间 倒 推 通 过 对 通 常 期 望 稍 加 修 改 的 方 程 ( 7.5 )
)}.)1((,max{ 1,1,1,
jiji
tr
ijji fppfeSKf
(7.6)
17
这种想法看似简单,但它是一个所谓动态规划原则的普遍运用。我们
将会在第 10 章看到动态规划原则在理论上多么的有效,但是有时却
由于”维数灾”而很难运用。在二叉树格中,我们使用了一个对相关
随机过程的简单离散化,动态规划看起来微不足道。事实上,我们的
推理有些误导,因为我们已经采取了期权持有的观点是愿意行使其期
权的最佳状态。但我们要问为什么我们只注重预期价值,而忽略风险
厌恶。一个严谨的理由其实没那么简单,它应该包括无套利理论和期
权卖方应该也关系他最糟糕的情况,就是期权持有人最优化执行他的
期权。
撇开理论的问题,其实很容易采用我们已经做出来的欧式看涨期
权和美式看跌期权。结果代码显示在图 7.10.我们以不同的方式轻微
初始化晶格,但唯一显著的变化就是后面的时间步长,我们比较了持
有价值和内在价值。
金融工具箱为我们提供了一个 binprice 函数,利用该函数可以给
普通美式看涨和看跌期权定价且允许连续红利。我们可以通过比较美
式看跌期权格定价和 binprice 去检验我们的实现:
>> SO = 50;
>> K = 50;
>> r = 0 . 0 5 ;
>> T = 5/12;
>> sigma = 0.4;
>> N = 1000;
>> price = AmPut Lattice (SO, K, r , T , sigma, N)
price =
>> [p, 01 = binprice(SO,K,r,T,T/N,sigma,O);
4.6739 416
18
OPTION PRICING BY BINOMIAL AND TRINOMIAL LATTICES
function price = AmPutLattice(SO,K,r,T,sigma,N)
% Precompute invariant quantities
deltaT = T/N;
u=exp(sigma * sqrt(de1taT)) ;
d=l/u;
p=(exp(r*deltaT) - d)/(u-d) ;
discount = exp(-r*deltaT);
p-u = discount*p;
p-d = discount*(l-p) ;
% set up S values
SVals = zeros (2*N+1,1> ;
SVals(N+l) = SO;
for i=l:N
SVals(N+l+i) = u*SVals(N+i);
SVals (N+l-i) = d*SVals (N+2-i) ;
end
% set up terminal values
PVals = zeros (2*N+1,1) ;
for i=1:2:2*N+1
end
% work backwards
for tau=l:N
PVals(i) = max(K-SVals(i) ,O) ;
for i= (tau+l) :2: (2*N+l-tau)
hold = p-u*PVals(i+l) + p-d*PVals(i-l);
PVals(i) = max(hold, K-SVals(i));
end
end
price = PVals(N+l);
图 7.10 二叉树方法为美式看跌期权定价的 matlab代码。
>> o ( l , l )
ans =
4.6739
该函数 binprice 需要一个标志,表明如果选择看跌(标志设置为
0)或选择看涨(标志设置为 1)。此条件为上面条件的一个快速反应。
这里计算函数 binprice 需要期权的存续期 T 和时间步长,令 NTdt / 。
19
我们忽略了可用于分红比例的期权参数。输出的 binprice 是俩个价格,
一个是标的资产的价格,一个是期权的价值;重要的一点是当时间步
很小的时候,利用分号控制屏幕上的输出。
7.3 利用二叉树方法为双标的期权定价
为了说明晶格技术扩展到多维期权,这里我们考虑两种资产的美
式利差期权。这种期权的回报为:
}0,max{ 21 KSS
基本方法可以推广到许多种期权,但是不包括强依赖路径的期权。为
了进一步推广,我们也考虑持续股息收益率 1q 和 2q 。其实我们并没有
对问题进行很大的改变,因为我们只是调整了风险中性的动态,这里
我们关于它的方程(2.42)。
111111 )( dWSdtSqrdS
222222 )( dWSdtSqrdS
这里两个维纳过程是相互关联的,且 dtdWdW 21 (见 2.5.5 节)
为了避免我们在校准过程中涉及到非线性问题所遇到的困难,我
们对资产价格进行对数化处理。令 ii Sx log ,利用伊藤引理,我们
得到两个随机微分方程:
11111 dWdtSvdX
212212 dWdtSvdX
这里 2,1,2/2 iqrv iii
现在,作为典型的二叉树格,我们假设这两个资产上升或者下降
在价格方面的对数数额为 ix ,校准格。我们对一 ,二阶的距进行匹
20
配。这两只股票可能上行或者低走。因此每个节点有 4 个数值和 4 个
概率 uup , udp , dup , ddp 。我们首先需要一个关于增量 iX 预期的匹配
条件:
tvxppxppXE ddduuduu 1111 )()(][
2222 )()(][ vxppxppXE ddduuduu
这里我们要区别随机变量 iX 和他们的现值 ix 。然后我们需要一个相
似的二阶条件:
ttvtxppppXE ddduuduu
2
1
22
1
2
1
2
1
2
1 )())((])[(
ttvtxppppXE ddduuduu
2
2
22
2
2
2
2
2
2
2 )())((])[( ,
这里我们用到了常用恒等式 ][][)( 22 XEXEXVar ,我们也忽略了高阶
无穷小的 t 。当概率趋近于 1 的时候,这些方程将被极大的简化:
tx 11 , tx 22
我们还应该说明协方差,以及与它等价的交叉向量:
.)()(].[ 21
2
21212121 ttvvtXXppppXXE ddduuduu
现在我们对 4 个未知概率有 4 个等式:
1
1
tv
pppp ddduuduu
2
2
tV
pppp ddduuduu
ddduuduu pppp
1 ddduuduu pppp
这些方程可以通过反转矩阵解决,或者通过适当的线性方程组组合。
21
得出:
})(1{
4
1
2
2
1
1
tpuu
})(1{
4
1
2
2
1
1
tpud
})(1{
4
1
2
2
1
1
tpdu
})(1{
4
1
2
2
1
1
tpdd
这些条件有个直观的解释。就是当相对波动较大的时候,与其正相关
的概率也跳跃较大。例如在 1S 向上浮动, 2S 向下浮动的概率下, 2p 即
成为一个负标志(即向上浮动越大,就越向下跳),并呈负相关关系,
使得这一联动成为可能,类似的考虑也适合于 p, d ,u 。即当 p,
d,u 越小,正相关的浮动就越大。
二叉树格方法的需要仔细的内存管理控制,因为我们不能随意的
存储一个多维矩阵。由于上线俩个资产的浮动的绝对值是相同的,我
们就可以利用我在已在 7.1.3 中相同的方法。由此产生的代码将显示
在图 7.1.1 中(参数不言自明)。首先我们计算不变的量。注意,在
二叉树方法中,我们运用的是价格,不是价格的对数。因此,上升的
价格为:
22
tx
i
ii eeu
这里 2,1,/1 iud ii 。概率的百分号在主循环之外。两个相关资产的价
值存储在两个向量 S1val 和 S2vals,这个定价的方法完全相似于对普
通期权的定价。期权的价格将存储于二叉树格矩阵中,这个矩阵经过
期权收益的初始化,这里令 i 指资产 1,j 指资产 2。我们可以用两
个连续的一次矩阵,因此奇数层和偶数层都是连续层且交替使用。因
为这是一个美式期权,我们在风险中性的前提下计算出来的继续持有
的价值要和与期权的内在价值进行比较。
为了检测执行的具体情况,我们用下面这个例子3
>> s10 = 100;
>> s20 = 100;
>> K = 1;
>> r = 0 . 0 6 ;
>> sigmal = 0.2;
>> sigma2 = 0.3;
>> rho = 0.5;
>> q l = 0.03;
>> q2 = 0.04;
>> AmSpreadLattice (S10 ,S20 ,K,r ,T, sigmal , sigma2,rho ,ql .q2,N)
>> T = 1;
>> N = 3 ;
ans =
10.0448
function price = AmSpreadLattice 610, S20 ,K ,r ,T, sigma1 , sigma2 ,rho ,ql, q2, N)
1 Precompute invariant quantities
deltaT = T/N;
nu1 = r - ql - 0.5*sigmal-2;
nu2 = r - q2 - 0.5*sigma2-2;
ul = exp(sigmal*sqrt(deltaT)) ;
dl = l / u l ;
u2 = exp(sigma2*sqrt(deltaT));
d2 = l/u2;
discount = exp(-r*deltaT) ;
3 该例子引用于(藏考文献一 p47-51)
23
p-uu = discount*O.25*(1 + sqrt(deltaT)*(nul/sigmal + nu2/sigma2) + rho);
p-ud = discount*O.25*(1 + sqrt(deltaT)*(nul/sigmal - nu2/sigma2) - rho);
p-du = discount*0.25*(1 + sqrt(deltaT)*(-nul/sigmal + nu2/sigma2) - rho);
p-dd = discount*O.25*(1 + sqrt(deltaT)*(-nul/sigmal - nu2/sigma2) + rho);
% set up S values
Slvals = zeros(2*N+l,l);
S2vals = zeros(2*N+1,1) ;
Slvals(1) = SlO*dl-N;
S2vals(l) = S20*d2-N;
for i=2:2*N+1
Slvals(i) = ul*Slvals(i-l) ;
S2vals(i) = u2*S2vals(i-l) ;
end
% set up terminal values
Cvals = zeros(2*N+1,2*N+i);
for i=1:2:2*N+1
for j=1: 2 : 2*N+1
end
end
% roll back
for tau= 1 : N
Cvals(i, j) = max(Slvals(i)-S2vals(j)-K,O);
for i= (tau+l) :2: (2*N+l-tau)
for j= (tau+l) :2: (2*N+l-tau)
hold = p-uu * Cvals(i+l,j+l) + p-ud * Cvals(i+l,j-1) + ...
p-du * Cvals(i-l,j+l) + p-dd * Cvals(i-1,j-1);
Cvals(i,j) = max(ho1d. Slvals(i) - S2vals(j) - K);
end
end
end
price = Cvals(N+l,N+l);
图 7.11 利用二叉树方法给美式利差期权定价的 matlab 代码
显然,三个步骤是不够获得可以接受的近似结果的,但是通过
层与层检查,并通过这个例子了解矩阵 Cvals 管理存储格。在 matlab
中,我们可以逐步调试,就可以显示我们得到的基本信息。最初的晶
格是为清晰度准备的,我们用一个星号标记其中无关的数据(当显示
与调试你会看到一些数字有 Cvals):
24
经过一次循环,一次次逼近结果,相关数据是:
请注意,新的价值是作为临近 4 个值的平均值获得的,其中存储
的数据在下一时间层,然后回到一个步骤,我们有:
格中最后的结果为:
我们可以看到,我们正在处理一个金字塔结构的递归排序工作,
我们经历了一个比较小的可以接受的内存浪费。
25
图 7.12单时段三叉树
7.4 三叉树方法定价
在二叉树上衍生三叉树想法是十分自然的。每个节点有 3 个下节
点,即价格向上,向下和保持不变(这只是一种可能的选择)。晶格
的校准以这样一种方式以便重组和匹配基本连续随机变量的前两个
时刻。增加的新自由度,可用于改善衔接或提出额外条件。这种方法
的最大作用是对障碍期权,我们可以在晶格中求障碍值。
这里非常方便的处理随机微分过程。经过一个小的时间步,我们
有 3 个方向移动,相对应的价格对数增量形式为 x ,0, x 三种,
与之相应的价格本身的乘法。这三种等价的方向对应的风险中性概率
为 up , mp 和 dp 。树图的结构见图 7.12。这里给出一般方程:
dWvdtdX ,
这里 2/2 rv ,我们写出这时刻相对应的方程为:
tvxppxpXE dmu 0][
222222 )()(0)(])[( tvtxppxpXE dmu
1 dmu ppp
求解得:
26
图 7.12 单步三叉树
图 7.13 三叉树方法的全例
我们看到更多的自由度来决定 x 。事实上,这证明了我们可以独
立的选择 x 和 t 。通常我们取 tx 3 。这种关系在我们处理有限差
分的时候非常好用。我们也应该注意到,一个随意的取值会导致负的
概率。作为一个例子,我们考虑给一个标的资产为无红利支付股票的
偶是看涨期权定价: 1000 S , 100K , 06.0r , 1T ,以及 3.0 。如
果我们建一个 2.0x 的三叉树格,我们得到图 7.13,这里:
3878.0up , 2494.0mp , 3628.0dp
实现这一三叉树算法的 MATLAB 代码见图 7.14.像往常一样,概率的
百分比不计入主循环。这里我们有个观察数据是必需的,不像二叉树,
27
我们必须储存俩个连续的时间层,因为在奇数列和偶数列之间没有互
换。从此,我们使用的是两列数组有 2n + 1 行,其中的列的作用可
能在现在或将来。我们利用增量模 2 交换的作用两个层次:是由变量
索引了解和 kthen,对值 1 和 2 交替。下面是改进后格计算:
>> S O =100 ;
>> K=100;
>> r=0.06;
>> T = l ;
>> sigma=0.3;
>> deltaX = 0.2;
>> EuCallTrinomial(SO,K,r,T,sigma,N,deltaX)
ans =
>> N=3;
14.6494
function price = EuCallTrinomial(SO,K,r,T,sigma,N,deltaX)
% Precompute invariant quantities
deltaT = T/N;
nu = r - 0.5*sigma-2;
discount = exp(-r*deltaT) ;
p-u = discount*0.5*((sigma^2*deltaT+nu^2*deltaT-2)/deltaX^2 + ...
nu*deltaT/deltaX) ;
p-rn = discount*(l - (sigma^2*deltaT+nu^2*deltaT-2)/deltaX-2);
p-d = discount*0.5*((sigma^2*deltaT+nu^2*deltaT^2)/deltaX^2 - . . .
% set up S values (at maturity)
Svals = zeros(2*N+l, 1) ;
Svals(1) = SO*exp(-N*deltaX);
exp-dX = exp(de1taX);
for j=2: 2*N+1
Svals(j) = exp-dX*Svals(j-1) ;
end
% set up lattice and terminal values
Cvals = z