2015-06-17 79 views
0

我試圖從我的模擬數據計算各種投資組合的cVaR(風險條件值)水平。Matlab計算for-loop中分佈分位數的平均值

我可以是一個單件組合使用下面的代碼做:

% Without a for-loop for series 1 

test2 = test(:,1) 

VaR_Calib_EVT = 100 * quantile(test2, VarLevel_Calib); 
help1   = sum(test2(:) <VaR_Calib_EVT/100); 
cVaR_Calib_EVT = sum(test2(test2 <VaR_Calib_EVT/100)/help1); 

然而,把一個for循環左右(見下面的代碼)時,在cVaR_Calib_EVT的輸出值,除了錯誤單元格(1,1)中的值。

VarLevel_Calib   = 0.05; 
test      = trnd(3,780,16); 
nIndices     = 16; 

for i=1:nIndices 
    VaR_Calib_EVT (:,i) = 100 * quantile(test(:,i), VarLevel_Calib); 
    help1   (:,i) = sum(test(:,i)<(VaR_Calib_EVT(:,i)/100)); 
    cVaR_Calib_EVT (:,i) = sum(test(test(:,i) <VaR_Calib_EVT(:,i)/100)/help1(:,i)); 
end 

我在做什麼錯?

最佳, 卡羅琳

+1

你是什麼意思「正確執行」?請更具體地說明你的輸出有什麼問題,你檢查了什麼,等等。 – Ratbert

+0

嗨,雷伯特,謝謝你的幫助。我已經調整了我的問題,希望現在更有意義。 – Carolin

+0

再一次地,您能否在句子「... cVaR_Calib_EVT中的輸出值是錯誤的,除了...」之外解釋「錯誤」的含義?你必須明白,我們不知道你想要做什麼以及你期望的結果。對我來說,你的代碼非常好,因爲它沒有錯誤。 – Ratbert

回答

1

test變量是一個三維變量,所以當你

test2 = test(:,1); 

然後

test2(:) <VaR_Calib_EVT/100 

它並不等同於你的第二個例如當你做

test(:,i)<(VaR_Calib_EVT(:,i)/100) 

要複製第一個示例的結果,您可以明確地在循環內執行test2賦值,該賦值應該按預期方式執行。

但是請注意,僅使用兩個索引來指定三維矩陣的某些部分可能會以意想不到的方式運行,而長期解決方案是明確指定要包含的矩陣的哪些成員。如果你這樣做,你將能夠安全地擴展你的單個示例到循環中。

+0

謝謝xenoclast :-) – Carolin

+0

不客氣! – xenoclast