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」轉置。你確定這是你想要的嗎? –