MATLAB中布朗运动增量的方差

时间:2016-07-28 22:24:41

标签: matlab differential-equations stochastic stochastic-process

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

1 个答案:

答案 0 :(得分: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))进行检查。