资源描述
第八章 蒙特卡洛期权定价方法
在金融计算中蒙特卡洛模拟是一种重要的工具:可以用来评估投资组合管理规则、为期权定价、模拟套期保值交易策略、估计风险价值。蒙特卡洛方法主要的优势在于对大多数情况都适用、易于使用、灵活。它把随机波动性和奇异期权的很多复杂特性都考虑进去了,更倾向于使用处理高维问题,而网格和PDF分析框架却不适用。蒙特卡洛模拟潜在的劣势在于它的计算量大。多次的重复需要完善我们所关注的置信区间的估计。利用方差缩减技术和低差异序列可以部分的解决这个问题。本章的目的是解释这些技术在一些例子上的应用,包括一些路径依赖型期权。这章是第四章的延伸,在第四章里我们讨论了蒙特卡洛积分。需要强调的是蒙特卡洛方法是概念上的一个数字积分工具,即使我们适用更多的“模拟”或“抽样”。在使用低差异序列而不是伪随机生成时这需要牢记。
如果可能,我们可以把模拟的结果和分析公式进行比较。很明显我们这样做的目标是一个纯粹的教学。如果你要计算一个矩形房间的面积,你只需要用房间的长度乘以房间的宽度即可,而不必要计算有多少次一块标准砖与这个表面相匹配。尽管如此,你还是应该学会在一些简单案例中首先适用模拟的方法,在这些简单的例子中我们可以检验答案的一致性;更进一步,我们也要看为达到方差减小的目的分析公式可用于的模拟期权可能更有力的控制变量。
蒙特卡洛应用的出发点是生成样本路径,这个生成的样本路径给予一个描述价格(或利率)动态的随机微分方程。在8.1节我们解释几何布朗运动的路径生成;在一个具体例子中模拟两个对冲策略,我们也会讨论布朗桥,它是适时推进模拟样本的一个替代方案。在8.2节将讨论交换期权,它被用作为一个如何将这种方法推广到多维过程的一个简单实例。在8.3节我们考虑一个弱路径依赖型期权的例子,这是个下跌敲出看跌期权;我们加入了有条件的蒙特卡洛和为减小方差抽样的重要性。在8.4节将讨论到强路径依赖型期权,同时我们证明了运用控制变量和低差异序列为算术平均亚式期权定价。我们以概述由蒙特卡洛抽样产生的估计期权敏感性的基本问题来结束本章;在8.5节我们考虑一个普通的看涨期权A的简单案例。
在第10.4节将讨论到随机模拟期权定价的另一个应用,它应用于美式期权;而一个简单的模拟方法在早期的应用中不可实行,并且这个问题在随机动态优化的框架里被强制转换。
8.1 路径生成
蒙特卡洛期权定价方法的应用的出发点是对样本基本因素路径的产生。对于一般的期权就像在第四章里面一样不需要产生路径:只需要关注标的资产到期日的价格。但是如果路径依赖型期权,我们就需要整条路径或者至少需要在给定时刻的一系列价值。如果服从几何布朗运动,情况的处理就非常简单。 事实上,必须认识到在路径生成中有两个误差源:样本误差、离散误差。
样本错误时因为蒙特卡洛方法的随机性,这个问题可以通过减小方差的办法得到缓解。为了理解什么是离散错误,我们考虑一个典型的离散连续时间模型,例如:伊藤随机微分方程:
根据最简单的离散的方法欧拉公式,得到以下离散时间模型:
是离散时间步,且这种方法在概念上与有限差分类似,并且在确定性微分方程上的应用会产生一个截尾误差,在离散步长很小的时候这个误差可以忽略不计【1】。当我们讨论随机过程收敛性时是一个非常重要的概念,但是我们可以猜想我们能够通过从标准正态分布中抽取随机变量来模拟一个与连续时间方程的解密切相关的离散时间随机过程。随着样本路径和复制次数的增加,我们也就能够减小样本误差。
虽然可以更正式地证明上述理由,但我们应该认识到离散误差至可能改变特征解的概率分布例如,几何布朗运动模型:
欧拉公式
这是非常容易掌握和执行的,但是每个值的边缘分布比起对数正态分布更普通。事实上,取很小的就可以减小误差,但是很费时。在一个特定的案例中,我们可以通过伊藤引理的一个简单应用来同时消除随机误差,但对大多数情况而言这种方法不可取。对于复杂的随机微分方程,我们必须生成整条样本路径。
8.1.1 模拟几何布朗运动
利用伊藤引理,我们可以把(8.1)转换为下面这种形式:
我们还记得,利用对数正态分布性质【2】,令
有:
当完全合并时(8.2)非常有用,得到:
为了模拟在时间段(0,T)上的资产价格的路径,我们必须用一个间步长把时间离散化。从最后一个等式以及标准Wiener过程(见2.5节),得到
而是一个标准正态随机变量。以等式(8.5)为基础,很容易生成资产价格的样本路径。
在图8.1中给出了生成服从几何布朗运动的资产价格的样本路径的令。函数AssetPaths产生一个样本路径矩阵,在这个矩阵里,模拟的资产价格按行存储且每一列类似于一个时间瞬间。第一列包含了对所有路径来说相同的值和初始价格。我们必须给这个函数赋值,始价格S0,漂移率mu,波动性sigma,时间范围T,时间步长的数量NSteps,模拟次数NRep1.值得注意的是该函数把参数作为已知的然后计算参数
例如,生成并且绘制三条为期一年的样本路径,初始价格$50,均值为0.1,标准差0.3(以一年为基础),假定时间步长为一天【3】
绘制的结果如图8.2所示。如果用另一种状态为randn标准型生成随机数,将会得到不同的结果。
function SPaths=AssetPaths(S0,mu,sigma,T,NSteps,NRepl)
SPaths = zeros(NRepl, 1+NSteps);
SPaths(:,1) = S0;
dt = T/NSteps;
nudt = (mu-0.5*sigma^2)*dt;
sidt = sigma*sqrt(dt);
for i=1:NRepl
for j=1:NSteps
SPaths(i,j+1)=SPaths(i,j)*exp(nudt + sidt*randn);
end
end
图8.1 用蒙特卡洛模拟生成资产价格路径的MATLAB命令
图8.2 用蒙特卡洛模拟生成的样本路径
function SPaths=AssetPathsV(S0,mu,sigma,T,NSteps,NRepl)
dt = T/NSteps;
nudt = (mu-0.5*sigma^2)*dt;
sidt = sigma*sqrt(dt);
Increments = nudt + sidt*randn(NRepl, NSteps);
LogPaths = cumsum([log(S0)*ones(NRepl,1) , Increments] , 2);
SPaths = exp(LogPaths);
Spaths(:,1) = S0;
图 8.3 生成资产价格路径的矢量命令
图8.1中的命令是基于两个循环嵌套。有时在MATLAB中使用矢量命令会更有效。为了使用矢量命令,可以便于把等式(8.5)重写为
为了对行进行加总(默认的是对列进行加总),我们可以生成资产价格对数的差分然后把可选参数设置为2利用cumsum函数。函数AssetPathsV的结果如图8.3所示。值得注意的是在最后一行我们把初始价格写在第一列。原因如下:
最好避免这个误差(在这里看是微不足道,但以后会发现并不是这样的。)
我们可以比较这两组实现的速度:
在这种情况下我们不能看出矢量命令的优势。我们应该注意到处理tic和toc的返回时间是受后台操作系统的许多变量控制的,但是在写这本书的第一版时,矢量命令是有明显的优势的。并且,事实上,在很多情况下这种优势也是存在的。问题是硬件和软件(在在这种情况下,MATLAB的解释程序已经有了改进,这个是可以论证的)的改进可能使得一些程序不再适用。有时一个完全的矢量命令需要很多的矩阵,这不适合计算机的主存储器。在这种情况下,利用虚拟内存磁盘空间可能会使得运行减缓。所以我们必须知道所有可能的问题,但是最终是由这个问题的有效率的实证检验所决定的。
8.1.2 模拟套期保值策略
利用函数生成样本路径,我们可以首先为普通的欧式看涨期权比较套期保值策略。从第二章我们了解到期权价格基本上是一个delta套期保值策略并且对看涨期权来说连续时间的套期保值策略需要持有标的资产的大量。一个简单的策略就是止损策略【4】。这种方法是说当期权价格在执行价格以上时我们需要一个轧平头寸(即买入股票),并且当期权价格在执行价格以下时我们需要一个裸型头寸(即卖出股票)。在实际操作中,当标的资产的价格高于执行价格K时就买入股票,反之当股票价格低于执行价格K时就卖出股票。这个方法很直观但是它用在连续时间分析中并不是那么容易的【5】。尽管如此,我们可以评判这种方法在离散时间中使用蒙特卡洛模拟时的作用。在离散时间中存在一个执行的问题就是在执行价格我们并不能真正的买卖股票:当我们发现价格高于临界值时我们买入得价格大大高于K,然而我们卖出股票的价格却是比临界值稍微低一点点。所以即使不考虑同样会影响delta套期保值的交易费用,在使用止损策略时同样存在一个潜在的问题。
在图8.4中给出了用来估计止损策略的平均成本的一个MATLAB程序。该函数包括了可能由函数AssetPaths生成的样本路径矩阵。值得注意的是在这种情况下,在模拟中必须使用的是真正意识上的漂移率mu而不是像期权价格那样。为了检验这些命令,需要注意这里的步数(时间间隔)等于路径矩阵的列数减一。如果我们要购买标的股票,就需要把借入的资金考虑在内。但是一旦假定存在确定且连续的利率,就不需要把借入的资金考虑在内,因为我们能够很容易的记录交易中的现金流量并且把它们折现到t=0时刻,就已经预先把DiscountFactors这些折现因素考虑在内了。使用一个状态变量Covered去判断执行价格上涨或下跌。既然在购买股票股票时现金流对购买者来说是负的,而在出售股票时则是正的,那么期权“价格”就通过平均现金流的变动趋势来评价。同样需要注意在到期日的状况:如果到期日期权的价格高于执行价格,那么期权持有者就会行权,我们也会得到的是本应该包含在现金流中的执行价格
function P = StopLoss(S0,K,mu,sigma,r,T,Paths)
[NRepl,NSteps] = size(Paths);
NSteps = NSteps - 1; % true number of steps
Cost = zeros(NRepl,1);
dt = T/NSteps;
DiscountFactors = exp(-r*(0:1:NSteps)*dt);
for k=1:NRepl
CashFlows = zeros(NSteps+1,1);
if (Paths(k,1) >= K)
Covered = 1;
CashFlows(1) = -Paths(k,1);
else
Covered = 0;
end
for t=2:NSteps+1
if (Covered == 1) & (Paths(k,t) < K)
% Sell
Covered = 0;
CashFlows(t) = Paths(k,t);
elseif (Covered == 0) & (Paths(k,t) > K)
% Buy
Covered = 1;
CashFlows(t) = -Paths(k,t);
end
end
if Paths(k,NSteps + 1) >= K
% Option is exercised
CashFlows(NSteps + 1) = ...
CashFlows(NSteps + 1) + K;
end
Cost(k) = -dot(DiscountFactors, CashFlows);
end
P = mean(Cost);
图8.4 估计止损策略的平均成本的MATLAB程序
既然我们知道有时候用矢量命令更方便,那么在图8.5中我们也用矢量命令表示出来了。这里主要的不同之处是使用了变量OldPrice,它本质上是节点路径的转换复制,在节点处价格处于临界状态,上涨或者下跌。价格上升的次数我们用UpTimes来记录,上升时现金流对持有者是不利得;同理用DownTimes来记录下跌的次数。
function P = StopLossV(S0,K,mu,sigma,r,T,Paths)
[NRepl,NSteps] = size(Paths);
NSteps = NSteps - 1;
Cost = zeros(NRepl,1);
CashFlows = zeros(NRepl,NSteps+1);
dt = T/NSteps;
DiscountFactors = exp(-r*(0:1:NSteps)*dt);
OldPrice = [zeros(NRepl,1), Paths(:,1:NSteps)];
UpTimes = find(OldPrice < K & Paths >= K);
DownTimes = find(OldPrice >= K & Paths < K);
CashFlows(UpTimes) = -Paths(UpTimes);
CashFlows(DownTimes) = Paths(DownTimes);
ExPaths = find(Paths(:,NSteps+1) >= K);
CashFlows(ExPaths,NSteps+1) = CashFlows(ExPaths,NSteps+1) + K;
Cost = -CashFlows*DiscountFactors';
P = mean(Cost);
图8.5 止损套期保值策略的矢量命令
现在我们可以检验这两个程序是否是一致的,以及矢量是否存在优势。
不同于资产路径的生成在这里我们可以从矢量命令中看出优势。使用矢量程序生成资产路径我们也可以在这里发现为什么正确分配初始资产价格很可能很重要,正如我们在图8.3最后一行命令中所做的那样。在这种情况下期权的价格正好符合这个价格,那么我们总是会购买初始股票;但是如果初始股票价格使49.9999我们则不够买股票,并且一个在这个过程中一个明显的但被忽略的误差已经产生了很严重的后果。
function P = DeltaHedging(S0,K,mu,sigma,r,T,Paths)
[NRepl,NSteps] = size(Paths);
NSteps = NSteps - 1;
Cost = zeros(NRepl,1);
CashFlows = zeros(1,NSteps+1);
dt = T/NSteps;
DiscountFactors = exp(-r*(0:1:NSteps)*dt);
for i=1:NRepl
Path = Paths(i,:);
Position = 0;
Deltas = blsdelta(Path(1:NSteps),K,r,T-(0:NSteps-1)*dt,sigma);
for j=1:NSteps;
CashFlows(j) = (Position - Deltas(j))*Path(j);
Position = Deltas(j);
end
if Path(NSteps+1) > K
CashFlows(NSteps+1) = K - (1-Position)*Path(NSteps+1);
else
CashFlows(NSteps+1) = Position*Path(NSteps+1);
end
Cost(i) = -CashFlows*DiscountFactors';
end
P = mean(Cost);
图8.6 估计delta套期保值策略
现在我们应该比较止损策略的成本、delta套期保值策略的成本以及理论的期权价格。估计delta套期保值策略的平均成本的程序已经在图8.6中给出了。这个程序跟止损策略有点类似,但它不是向量。在样本路径每一个点上为了获得期权 而调用函数blsdelta时使用的向量是我们所处理过的唯一的向量。注意必须用趋于到期日的当前资产价格和当前时间来计算;我们使用金融工具blsdelta函数。给赋一个新的值就会更新股票的当前Position,也会产生没有被考虑在内的现金流。
图8.7给出了比较两个套期保值策略作用的脚本。运行这个脚本,我们可以得到以下的结果:
% HedgingScript.m
S0 = 50;
K = 52;
mu = 0.1;
sigma = 0.4;
r = 0.05;
T = 5/12;
NRepl =10000;
NSteps = 10;
C = blsprice(S0,K,r,T, sigma);
fprintf(1, '%s %f\n', 'true price = ', C);
%
randn('state',0);
Paths=AssetPaths(S0,mu,sigma,T,NSteps,NRepl);
SL = StopLossV(S0,K,mu,sigma,r,T,Paths);
fprintf(1, 'cost of stop/loss (S) = %f\n', SL);
DC = DeltaHedging(S0,K,mu,sigma,r,T,Paths);
fprintf(1, 'cost of delta-hedging = %f\n', DC);%
NSteps = 100;
randn('state',0);
Paths=AssetPaths(S0,mu,sigma,T,NSteps,NRepl);
SL = StopLossV(S0,K,mu,sigma,r,T,Paths);
fprintf(1, 'cost of stop/loss (S) = %f\n', SL);
DC = DeltaHedging(S0,K,mu,sigma,r,T,Paths);
fprintf(1, 'cost of delta-hedging = %f\n', DC);
图8.7 比较套期保值策略的脚本
在第一组运行中我们使用十个套期保值步骤,在第二组中使用100个套期保值步骤。我们发现止损策略不像delta套期保值成本那样收敛于真实的期权价格。事实上,需要在不同的设置下进行这种比较,并且也应该包括该套期保值成本的可变性。
8.1.3 布朗桥
在前面几节中,我们依据收益与时间密切相关的自然过程生成了一个资产路径。事实上,Wiener过程倾向于一些能够用不同的方法生成样本路径的特殊性质。假如有一个左边和右边的终点分别为和的时间间隔且存在一个中间瞬时时间,使得。在生成的标准路径中,我们能够很自然地生成Wiener过程:以及最终的。利用所谓的布朗桥,我们可以在条件及处生成。可以看出在这两个值的条件下是一个正常变量,其期望值为
方差为
这是由多元正态分布的条件分布的一些性质所决定的。以上这些公式【6】都是很直观的,我们就不必要再去证明了。的条件期望值是通过和线性插值求出的;方差在两个端点和附近较小,在整个时间间隔中间确实最大值。
利用布朗桥,我们可以通过二分法生成样本路径。假定,抽取样本;再次抽取样本。假定和,抽样;假定和,抽样,等等。实际上,我们可以用非均匀时间步骤生成我们想要的任何序列样本路径。有人也许会问为什么如此复杂的结构却这么有用。至少有以下两点原因:
它可以通过分层使得方差减小。在多维中运用分层很困难,但是我们可以对资产价格终值进行分层,并且可以利用其中点对其进行分层。然后利用布朗桥生成中间值。
在低差异序列结合中布朗桥构造也很有用。在4.6节中我们发现简单低差异序列在高纬定义域内运用很困难,因为不能完全包含一些维度。利用布朗桥,我们可以通过以样本点作为基点用高效率序列去描述Wiener过程路径;然后我们用其他序列甚至是蒙特卡洛抽样来填补路径。
在图8.8中给出了用布朗桥的方法生成标准Wiener过程路径的一个MATLAB程,但是只有在二等分的时间间隔[0,T](例如,时间间隔的数量是2的幂)这种特殊例子中才适用;在更多通常的设置中可能适用。在这种情况之下,我们可以把上面的公式简化为样本;如果令,则有
其中,Z服从标准正态分布。在这个程序中假定时间间隔T的长度和把程序分隔开来次间隔的NSteps数量,并且这个程序运行出一个包含一条样本路径的向量。假定时间间隔次数为8(必须是2的幂)。那么我们就必须执行3次二等分。
给定初始条件,必须先抽取样本,即是跳过一个长度为T的时间间隔,在这个程序中即为TJump。因为我们输入了9个要素矢量值(从index 1开始,包括),为了输入新的值,我们必须跳过矢量中的八个值。跳过的值的数量是记为
然后我们开始第一个循环。在第一阶段,只能抽取样本,给定和。给定状态和,我们必须生成一个新的值并且在状态中保存起来,。在本例中即为4+1=5。在这里我们只生成了一个值,并且把两个跳跃都除以2。
在第二次迭代中,我们必须抽取样本,给定和,抽取样本,给定和。将会执行两次嵌套循环,且指数left,right和i都会增加4。
在第三次和最后一次迭代中生成了剩余四个值。
我们要求读者通过这个程序逐步利用调试器来验证以上我们所说的模式。在图8.8我们也给出了验证所生成的随机过程的边缘分布式正确的的脚本。期望值应该为0,标准差应该为时间的平方根:
我们发现出去样本误差,这个结果看起来是正确的。给定一个生成标准Wiener过程的方法,很容易就可以模拟出几何布朗运动。在图8.9中给出了这个程序,并且使用了一种类似于矢量方法中的AssetPathsV. 值得注意的一点是使用函数diff在对数资产价格中生成矢量Increments. 事实上在标准蒙特卡洛中我们用连续递增生成基本Wiener过程;利用布朗桥结构在不同的瞬时时间我们很直接的得出了这个过程的不同值,且必须使用函数diff去取得相对差异。在一些情况之下,diff与cumsum起相反的作用,从以下这个例子中我们可以看出来:
% CheckBridge.m
randn('state',0);
NRepl = 100000;
T = 1;
NSteps = 4;
WSamples = zeros(NRepl, 1+NSteps);
for i=1:NRepl
WSamples(i,:) = WienerBridge(T, NSteps);
end
m = mean(WSamples(:,2:(1+NSteps)))
sdev = sqrt(var(WSamples(:,2:(1+NSteps))))
sqrt((1:NSteps).*T/NSteps)
图8.8 检验利用布朗桥为标准Wiener过程生成的路径
function SPaths = GBMHaltonBridge(S0, mu, sigma, T, NSteps, NRepl)
if round(log2(NSteps)) ~= log2(NSteps)
fprintf('ERROR in GBMBridge: NSteps must be a power of 2\n');
return
end
dt = T/NSteps;
nudt = (mu-0.5*sigma^2)*dt;
SPaths = zeros(NRepl, NSteps+1);
W = WienerHaltonBridge(T,NSteps,NRepl);
Increments = nudt + sigma*diff(W);
LogPath = cumsum([log(S0) , Increments]);
SPaths = exp(LogPath);
Spaths(:,1) = S0;
图8.9 利用布朗桥为几何布朗运动抽样
8.2 为交换期权定价
本节的目的是为了表明蒙特卡洛模拟在多维期权中也很适用。我们将会使用一个简单的例子来比较估计值和为了达到这个目的的精确值。我们给一个由两个资产组成的欧式交换期权定价,根据风险中性原则,这个两个资产的价格可以用一个二维几何布朗运动来建模:
function p = Exchange(V0,U0,sigmaV,sigmaU,rho,T,r)
sigmahat = sqrt(sigmaU^2 + sigmaV^2 - 2*rho*sigmaU*sigmaV);
d1 = (log(V0/U0) + 0.5*T*sigmahat^2)/(sigmahat*sqrt(T));
d2 = d1 - sigmahat*sqrt(T);
p = V0*normcdf(d1) - U0*normcdf(d2);
图8.10 分析交换期权定价的命令
其中这两个Wiener过程有瞬时相关。该期权在到期日T的收益为,我们可以发现该期权是差价期权的一个特殊例子,差价期权的收益取决于两个资产价格之差(在7.3节中我们讨论过一个美式差价期权。)之所以称为“交换”是因为在到期日可以用一个资产跟另一个资产互换。例如,如果持有资产U和一个交换期权,在到期日的收益将是
对该期权而言,有一个由Black-Scholes公式直接演化而来的分析定价公式:
我们给出这样的公式是因为这个收益有一个同质形式,在考虑了两个价格【7】比V/U后这个同质形式可以简化相应的偏微分方程。在图8.10中给出了计算这个公式的MATLAB命令。
在使用蒙特卡洛中我们唯一需要考虑的一点是如何为两个相关的Wiener过程生成样本路径。在4.3.4节中我们对多维正态分布使用过同样的方法。我们应该为相关关系为且服从标准正态分布的两个变量的相应协方差矩阵找到Cholesky因子:
function [p,ci] = ExchangeMC(V0,U0,sigmaV,sigmaU,rho,T,r,NRepl)
eps1 = randn(1,NRepl);
eps2 = rho*eps1 + sqrt(1-rho^2)*randn(1,NRepl);
VT = V0*exp((r - 0.5*sigmaV^2)*T + sigmaV*sqrt(T)*eps1);
UT = U0*exp((r - 0.5*sigmaU^2)*T + sigmaU*sqrt(T)*eps2);
DiscPayoff = exp(-r*T)*max(VT-UT, 0);
[p,s,ci] = normfit(DiscPayoff);
图8.11 用蒙特卡洛模拟为交换期权定价的命令
这个可以由简单乘法得到验证,其中
因此,为了模拟二维相关Wiener过程,我们必须生成服从标准正态分布的两个独立变量和,并且用
来实现路径的生成。
在本例中,我们只需要生成在到期日两个资产价格的联合样本。在图8.11中给出了最终的MATLAB命令。同样可以检验我们的结果:
%DOPutMC.m
function [P,CI,NCrossed] = DOPutMC(S0,K,r,T,sigma,Sb,NSteps,NRepl)
% Generate asset paths
[Call,Put] = blsprice(S0,K,r,T,sigma);
Payoff = zeros(NRepl,1);
NCrossed = 0;
for i=1:NRepl
Path=AssetPaths1(S0,r,sigma,T,NSteps,1);
crossed = any(Path <= Sb);
if crossed == 0
Payoff(i) = max(0, K - Path(NSteps+1));
else
Payoff(i) = 0;
NCrossed = NCrossed + 1;
end
end
[P,aux,CI] = normfit( exp(-r*T) * Payoff);
图8.12 离散障碍期权的基本形式的蒙特卡洛模拟
8.3 为下跌敲出看跌期权定价
在本节中,我们将讨论一个弱路径依赖型期权的例子,即下跌敲出看跌期权,在这种前提假设下在每个交易日末都会检验那个障碍。在2.7.1节中我们发现了连续监控的分析公式是如何被调整去反映离散监控的;我们将使用函数DOPut去检验蒙特卡洛模拟的结果。有一点非常重要那就是在实际中的障碍期权可能对随机波动很敏感;在为障碍期权定价时可以同时使用蒙特卡洛模拟和随机波动模型。
8.3.1 基本形式蒙特卡洛
在图8.12中给出了基本形式蒙特卡洛模拟的执行命令。参数NSteps用来表明障碍水平应该检验多少次股票价格。当触及障碍期权时收益设置为0。注意在期权有效期中即使障碍是交叉的我们仍然要模拟整条路径;部分路径确实是没有用的,但是这样做是为了可以用AssetPaths和任何矢量因素来简化命令。函数DOPutMC也表明了路径的NCrossed数量,在这条路径中障碍处于交叉状态。
现在为距到期日还有两个月的期权定价,假定每个月包含30天且每天都会检验障碍。障碍为$40:
8.3.2 条件蒙特卡洛
从4.5.1节中我们知道对立抽样在这个例子中也许并不十分有效,因为收益与相关的到期资产价格是非单调的。如同整条资产价格路径一样这里的问题就变得越来越复杂。也可以用控制变量;类似普通看跌期权控制变量的一个替代是可以通过B-S公式计算出来的,而这个价格能够由Black-Scholes公式计算出来。不管怎样,两个期权之间的相关关系如何是值得探讨的。因此,我们尝试一种不同的方法,即在4.5.4节中已经解释过的条件方差减小方法。为了这个目的,我们将会发现计算下跌敲入看跌期权的价格是很方便的。为这个敲入期权定价其实是等同于为相应的敲出期权定价,因为我们知道
假定我们把这个期权有效期用长度为的时间间隔加以离散化(在本例中即为一天),使得并且考虑在天数上的资产价格路径:
以此路径为基础,我们估计期权价格,如下
现在令为障碍第一次触及时的时间的阶数,按照惯例,如果在期权有效期内障碍不交叉则令。在时刻期权生效,并且从这以后这个期权就跟普通的看跌期权一样。所以在障碍交叉【8】时的交叉时刻和价格条件下,我们可以使用Black-Scholes公式来估计收益的期望值。因此,如果障碍在到期日前交叉,有
其中是执行价格为K,初始标的价格为以及存续期为的普通看跌期权的Black-Scholes价格;指数项把折现考虑在内,从到期日折现到交叉时刻。给定一个模拟路径S,则使用以下作为估计式:
不同于对立抽样,条件蒙特卡洛运用这个问题的特定的知识;我们知道得越多,那么数值积分就会越少。在图8.13给出了执行方差减小技术的命令DOPutMCCond。值得注意的一点是,为了有效性,最好是在用向量参数时只用一次函数blsprice,而不是每次复制的时候都用一次。所以把股票价格记为StockVals和把下跌敲入看跌期权已经被激活的时刻记为Times。如果障碍没有交叉,则估计式就为0。同样也要注意blsprice里的向量有NCrossed的元素,然而包含估计值的向量Payoff的大小却是NRep1。
%DOPutMCCond.m
function [Pdo,CI,NCrossed] = ...
DOPutMCCond(S0,K,r,T,sigma,Sb,NSteps,NRepl)
dt = T/NSteps;
[Call,Put] = blsprice(S0,K,r,T,sigma);
% Generate asset paths and payoffs for the down and in option
NCrossed = 0;
Payoff = zeros(NRepl,1);
Times = zeros(NRepl,1);
StockVals = zeros(NRepl,1);
for i=1:NRepl
Path=AssetPaths1(S0,r,sigma,T,NSteps,1);
tcrossed = min(find( Path <= Sb ));
if not(isempty(tcrossed))
NCrossed = NCrossed + 1;
Times(NCrossed) = (tcrossed-1) * dt;
StockVals(NCrossed) = Path(tcrossed);
end
end
if (NCrossed > 0)
[Caux, Paux] = blsprice(StockVals(1:NCrossed),K,r,...
T-Times(1:NCrossed),sigma);
Payoff(1:NCrossed) = exp(-r*Times(1:NCrossed)) .* Paux;
end
[Pdo, aux, CI] = normfit(Put - Payoff);
图8.13 离散障碍期权的条件蒙特卡洛模拟
8.3.3 重要性抽样
最后一个运行表明条件方差减小技术也许的确有效,但是还是不能太高兴。首先,一次运行必不能代表一切。更糟的是,在运行了很多次复制(200,000)后,只有在249次复制中障碍才交叉。这就意味着大部分的复制是白费功夫的【9】。换句话说,利用这个期权的数据,障碍交叉是不容易出现的。这就是一个重要抽样可以弥补的典型例子(参见4.5.6节)。
如果改变资产价格的漂移那么障碍交叉就会变得更有可能【10】。我们需要倒退一步去考虑一下为生成资产价格路径S我们所做的事情。对每一个时间步骤,生成一个正态变量,其期望值为
方差为,所有的变量都是相互独立的,并且生成的资产价格设置为
令Z为正态变量的向量,并且令f(Z)为它的联合密度。如果我们采用修正期望值
可以预测障碍交叉的次数将会更多。令g(Z)为正态变量的联合密度生成了这个修正期望值。然后我们必须找出一个修正项,似然比,从而得出正确的重要抽样估计式。结合重要抽样和刚刚描述的条件期望,有(如果障碍在到期日之前交叉):
在上面这些表达式中我们应该注意z和Z之间的区别;在给定的条件信息下,第一组样本事实上都是真的数字组合并且可以从期望中提了出来。在执行过程中,我们必须生成期望值为的正态变量以及用似然比乘以从样本角度看来是随机变量【11】的条件估计。现在一个唯一公开的问题就是如何计算似然比。在附录B中我们考虑了期望值为协方差为的多元正态联合分布:
在本例中,因为相互独立的随机变量,协方差矩阵式元素为的
展开阅读全文