MATLAB 中的循环问题

Looping issue in MATLAB

这是我正在处理的一个非常基本的问题。

我模拟了一个包含 6 个变量的数据集,我想测量每个向量的动态极值短缺。

我试图以某种方式循环以下代码,最终变量 ES 将呈现一个矩阵,该矩阵具有 T 行和 6 列,遍历模拟矩形矩阵中的所有数据点。

clc
clear
%% Simulate data set
mu = [0 0 0 0 0 0];
A = rand(6);
Sigma= A * A';

%% Simulation of variables
rng('default')  % For reproducibility
Data = mvnrnd(mu,Sigma,1000);
r=Data(:,1);

我想使用 r = Data,因为估计在所有列而不是每一列上运行,并且最终的 ESmatrix 将所有列绘制在一个图中。

 T= length(r);
    conditionalvariance=[];
    p= [0.025];
    VarMdl = garch(1,1)
    Mdl = arima('ARLags',1,'Variance',VarMdl);
    EstMdl = estimate(Mdl,r);
    [res,v,logL] = infer(EstMdl,r);
    conditionalvariance=[conditionalvariance,v];
    Sigma=conditionalvariance;
    ESdynamic=[];
    VaRdynamic=[];
    bpoe=[];
    for J= 1:T
    [Var_Normal, ES_Normal]=hNormalVaRES(Sigma(J),p);
    VaR=Var_Normal;
    ES=ES_Normal;
    disp(J)
    disp('');
    ESdynamic=[ESdynamic,ES];
    VaRdynamic=[]
    end
    ES=ESdynamic;
    Local Functions:
    function [VaR,ES] = hNormalVaRES(Sigma,p)
        % Compute VaR and ES for normal distribution
        % See [4] for technical details
        
        VaR = -norminv(p);
        ES = -Sigma*quad(@(q)q.*normpdf(q),-6,-VaR)/p;
    
    end

当我绘制(ES)时,我想要一个包含 6 个变量的图。

请帮我解决这个循环问题。

不确定情节是否应该看起来像这样,但是使用额外的外部 for 循环来索引 p 和 运行 的值可以使用函数多次来实现这个结果。为了绘制相同的轴,在第一个 plot() 调用之后引入了 hold on 属性。也不确定 p = [0.5, 0.1, 0.05, 0.025, 0.01, 0.001] 是否正确,因为您提到它是针对六个不同的 p 值。在问题中它有 0.1 作为 0,1.

clc
clear
% Simulate data set
mu = [0 0 0 0 0 0];
A = rand(6);
Sigma= A * A';

% Simulation of variables
rng('default')  % For reproducibility
Data = mvnrnd(mu,Sigma,1000);
r=Data(:,1);
T= length(r);
conditionalvariance=[];
p = [0.5, 0.1, 0.05, 0.025, 0.01, 0.001];


VarMdl = garch(1,1)
Mdl = arima('ARLags',1,'Variance',VarMdl);
EstMdl = estimate(Mdl,r);
[res,v,logL] = infer(EstMdl,r);
conditionalvariance=[conditionalvariance,v];
Sigma=conditionalvariance;
ESdynamic=[];
VaRdynamic=[];
bpoe=[];

for P_Index = 1: +1: length(p) 
P_Value = p(P_Index);
for J= 1:T
[Var_Normal, ES_Normal]=hNormalVaRES(Sigma(J),P_Value);
VaR = Var_Normal;
ES = ES_Normal;
disp(J)
disp('');
ESdynamic = [ESdynamic,ES];
VaRdynamic = []
end
ES_Matrix(:,P_Index) = ESdynamic';
plot(ES_Matrix(:,P_Index));
hold on

ESdynamic = [];
end 
hold off

function [VaR,ES] = hNormalVaRES(Sigma,p)
    % Compute VaR and ES for normal distribution
    % See [4] for technical details
    
    VaR = -norminv(p);
    ES = -Sigma*quad(@(q)q.*normpdf(q),-6,-VaR)/p;

end

运行 使用 MATLAB R2019b