0

我正在尝试对局部波动率模型进行蒙特卡罗模拟,即

dSt = sigma(St,t) * St dWt .

不幸的是,不能应用 Matlab 包类 sde,因为它的功能相当复杂。

出于这个原因,我使用 Euler-Mayurama 方法手动模拟这个 SDE。更具体地说,我使用 Ito 的公式来获取日志过程的 SDEXt=log(St)

dXt = -1/2 sigma^2(exp(Xt),t) dt + sigma(exp(Xt),t) dWt

代码如下:

function [S]=geom_bb(sigma,T,N,m)
 % T.. Time horizon, sigma.. standard deviation, N.. timesteps, m.. dimensions

 X=zeros(N+1,m);
 dt=T/N;
 t=(0:N)'*dt;
 dW=randn(N,m);

 for j=1:N
   X(j+1,:)=X(j,:) - 1/2* sigma(exp(X(j,:)),t(j))^2 * sqrt(dt) + sigma(exp(X(j,:)),t(j))*dW(j,:);
 end

 S=exp(X*sqrt(dt));
end

此代码对小 sigma 工作得相当好,但是对于 10 左右的 sigma,进程 S 总是趋于零。这不应该发生,因为 S 是鞅,因此期望 = 1(至少对于常数 sigma)。然而 X 应该被正确模拟,因为平均值是准确的。

谁能帮我解决这个问题?这仅仅是由于数字舍入错误吗?是否应该首选另一种模拟方法来解决此问题?

4

1 回答 1

1

首先,您确定循环外的 S=exp(X*sqrt(dt)) 正在执行您想要的操作吗?为什么不在循环中开始呢?在任何情况下,您都在循环内使用 exp(X) for sigma(),现在缺少 sqrt(dt)。

除此之外,改进行为的建议方法:改用Milstein方案,增加时间步数,确保您的 sigma() 值与您的时间步相称。10 的 Sigma 意味着 1000% 的波动率,即每天 60% 的波动。假设 dt 超过几分钟,这根本不可能。

于 2014-12-30T21:20:39.600 回答