我试图在滚动窗口上创建协方差矩阵,以计算下一个时间段的投资组合权重。
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})。
有人可以帮我解决这个问题,以便获得各个滚动窗口的权重吗?
感谢您的帮助。
最诚挚的问候
答案 0 :(得分: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循环。