Как создать ковариационную матрицу скользящего окна и рассчитать соответствующие веса? - PullRequest
0 голосов
/ 21 апреля 2019

Я попытался создать ковариационные матрицы поверх скользящего окна, чтобы рассчитать вес портфеля на следующий период времени.

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}).

Кто-нибудь может мне помочь исправить это так, чтобы я получил веса для соответствующего скользящего окна?

Буду признателен за любую помощь.

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 22 апреля 2019

Для кого это может касаться, я понял, как это сделать.

Прежде всего, значение переменной 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.

...