我正在尝试从各种投资组合的模拟数据中计算投资组合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
我做错了什么?
最佳, 卡罗琳
答案 0 :(得分:1)
你的test
变量是一个三维变量,所以当你做
test2 = test(:,1);
然后
test2(:) <VaR_Calib_EVT/100
当你做
时,它与你的第二个例子不同test(:,i)<(VaR_Calib_EVT(:,i)/100)
要复制第一个示例的结果,您可以在循环内明确执行test2
赋值,这应该按预期执行。
但请注意,仅使用两个索引来指定三维矩阵的某些部分可能会以意想不到的方式运行,而长期解决方案是明确指定您想要的test
矩阵的哪些成员包括。如果这样做,您将能够安全地将您的单个示例扩展到循环中。