Matlab计算for循环中分布分位数的均值

Matlab Calculating mean of distribution quantile in a for-loop

我正在尝试根据各种投资组合的模拟数据计算投资组合 cVaR(条件风险价值)水平。

我可以使用以下代码为一个投资组合执行此操作:

% 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

我做错了什么?

最好的, 卡罗琳

你的test变量是三维变量,所以当你

test2 = test(:,1);

然后

test2(:) <VaR_Calib_EVT/100

这与你在第二个例子中做的不一样

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

要复制第一个示例的结果,您可以在循环内显式执行 test2 赋值,这应该会按预期执行。

但是请注意,仅使用两个索引来指定 3 维矩阵的部分可能会以意想不到的方式表现,长期解决方案是明确指定 test 矩阵的哪些成员想要包括。如果这样做,您将能够安全地将单个示例扩展到循环中。