我在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到它之前的增量的方差。当布朗运动似乎满足其他理论时,我似乎无法弄清楚为什么会发生这种情况。在给定时间运动的方差。有什么明显的东西我在这里不见了吗?
答案 0 :(得分:1)
我会做三件事:
1)选择较小的布朗路径的时间步长。模拟一条路径中的步骤越多,每条路径中增量的计算方差就越准确(使用var(var(inc))
检查)。这意味着对于每个路径,您将获得更多类似的增量方差结果。
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))
进行检查。