0

我在 MATLAB 中模拟布朗运动,但是我得到了一个奇怪的结果,布朗运动增量的方差随着时间的推移而增长,而它应该保持不变。例如我构建了一个布朗运动系统,

brown_drift = @(t,X) 0;
brown_vol = @(t,X) .2;
brown_sys = bm(brown_drift, brown_vol);

然后我用时间步长 1 和长度 10 插入 1000 次试验

inter_brown = interpolate(brown_sys, 0:1:10, zeros(1,1,1000),'Times',[0]);
inter_brown = squeeze(inter_brown);

布朗运动的增量应该是独立的,所以如果我构造一个增量矩阵并取方差,它们应该都相同并且等于波动率参数的平方。

inc = inter_brown(2:end,:)-inter_brown(1:end-1,:);
var(inc')
ans = 0.0374    0.1184    0.2071    0.2736    0.3516    0.4190    0.5511    0.5891    0.6767    0.7647

然而,它显然不满足简单理论的结果,即每个增量的方差应该为 0.2^2。看起来未来的每个增量都会将 2*0.2^2 添加到之前增量的方差中。当布朗运动似乎满足其他理论时,我似乎无法弄清楚为什么会发生这种情况,例如在给定时间的运动方差。我在这里有什么明显的遗漏吗?

4

1 回答 1

1

我会做三件不同的事情:

1)选择更小的布朗路径的时间步长。您模拟的一条路径中的步骤越多,计算出的每条路径中增量的方差就越准确(用 勾选var(var(inc)))。这意味着对于每条路径,您将获得更多相似的增量方差结果。

显示 100 条不同路径的差异。 一次用尖齿台阶,一次用更小的台阶。 您会看到,时间步长越小,方差的方差就越小。

2)如果您的时间大于 1,增量的方差也会以不同的方式缩放(请参阅随时间变化的波动性),因此您会根据初始时间尺度得到不同的结果。IE

interpolate(brown_sys, 0:0.1:10, zeros(1,1,1000),'Times',[0]);

将导致大约0.4

interpolate(brown_sys, 0:0.1:100, zeros(1,1,1000),'Times',[0]);

将导致方差为 4。所以只需将时间更改为:

interpolate(brown_sys, 0:dt:1, zeros(1,1,1000),'Times',[0]);

你应该选择dt非常小的地方,即dt = 0.001

3)您应该考虑的方差inc而不是转置的方差。因为inter_brown您获得的矩阵在每一列上都有一个模拟路径。所以属于一条路径的步骤应该在一列中。因此,您计算的矩阵inc包含根据列中一条路径的增量。var()矩阵计算存储在一列中的样本的方差。因此,如果您想知道第一条路径增量的方差,则必须调用类似var(inc(:,1)):调用var(inc)为您提供了每条路径的差异。你可以用plot(var(inc)). 然后,您将看到增量的方差0.04与预期的一样。检查它mean(var(inc))

于 2016-07-28T23:29:07.467 回答