如何创建滚动窗口协方差矩阵并计算各自的权重?

问题描述 投票:0回答:1

我试图在滚动窗口上创建协方差矩阵,以计算下一段时间的投资组合权重。

covMat  = cov(mon_ret) ;  

  [corMat, std] = corrcov(covMat);

  port_size = length(covMat) ; 

  Aeq = ones(1,port_size);
  Beq = 1;

  lbnds = zeros(1,port_size);
  ubnds = ones (1,port_size);

  n = 70;
  m = 60;

  n1 = 1.0/port_size;

  w0 = repmat(n1, port_size, 1);

for mth = 1 : n - m
   covMat_1 = arrayfun(@(k)cov(mon_ret(k:m+k-1,:)),1:(n-m+1),'UniformOutput',false);
   mvfunction = @(w_mv) mv(covMat_1{1,mth}, w_mv);

    w_mv_1 = arrayfun(@(w_mv)fmincon(mvfunction, w0, ...
    [], [], Aeq, Beq, lbnds, ubnds, []),1:(n-m+1),'UniformOutput',false) ;   
end

因此,covMat_1提供1X11“单元格”,每个单元格包含特定滚动窗口的协方差矩阵。

但是当我试图创建变量w_mv_1,其目标是获得所有新计算的投资组合权重时,我得到一个1X11“单元格”,每个单元格包含为covMat_1(covMat {1,1)的第一个协方差矩阵计算的权重})。

任何人都可以帮我解决这个问题,以便获得相应滚动窗口的权重吗?

我很感激每一个帮助。

最好的祝福

matlab portfolio rolling-computation covariance-matrix
1个回答
0
投票

对于它可能关心的人,我想出了如何做到这一点。

首先,变量w_mv_1的值是一个单元数组,它不包含第一个协方差矩阵的权重,而不是第十个协方差矩阵的权重。

无论如何这是解决方案:

covMat_1 = arrayfun(@(k)cov(mon_ret(k:m+k-1,:)),1:(n-m+1),'UniformOutput',false);
w_mv_1 = arrayfun(@(k)fmincon(@(w_mv) mv(covMat_1{1,k}, w_mv), w0, ...
    [], [], Aeq, Beq, lbnds, ubnds, []),1:(n-m+1),'UniformOutput',false) ;

显然,“arrayfun”存在问题,因为我将错误的变量放入其中。使用此代码,它可以在没有for循环的情况下工作。

© www.soinside.com 2019 - 2024. All rights reserved.