0

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

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

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

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增量的方差。当布朗运动似乎满足其他理论时,我似乎无法弄清楚为什么会发生这种情况。在给定时间运动的方差。有什么明显的我在这里失踪?

回答

1

有三件事情我会做出不同:

1)选择你的你的布朗路径更小的时间步长。您可以模拟一条路径中更多的步骤,从而更准确地计算每条路径中增量的计算方差(请参阅var(var(inc)))。这意味着对于每条路径,您将得到更多类似结果的增量差异。

Shows variance for 100 different paths. One time with tine steps and one time with even tinier steps. You see that the smaller the timestep is, the smaller the variance of the variances gets.

2)同样增量的变化是不同的比例,如果你的时间大于1(见Volatility over time),所以你会根据您的初始时间尺度得到不同的结果。即

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))检查。

+0

谢谢。我不认为我之前很清楚,我不关心路径中的差异。我担心从t-1到t的给定增量的方差,所以我需要取转置矩阵的方差。 – Ivan

+0

只要时间间隔不相交,维纳增量的方差也是dt^2。所以你可以考虑从t-1到t或从t-2到t-1的增量等等。基本上,如果你计算'var(inc(randi(numel(inc(:)),1,100)))'例如,那么你将获得正确的值。然而,非常有趣的是,通过查看所有路径上特定时间的增量,随着时间的推移,方差在增加。我无法解释,但我确信你不需要考虑“inc”转置。你确定这是你想要的吗? –