Скользящее окно для ковариационной матрицы

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

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

data <- matrix(rnorm(100), 20, 5) #data represents the returns of 5 assets over 20 days

Я хочу откалибровать ковариационную матрицу доходности за 5 дней, принимая во внимание дни 1, 2, 3, 4, 5. Затем я хочу откалибровать другую матрицу ковариаций с учетом дней 4, 5, 6, 7, 8. И так далее, используя скользящее окно (я пытался сделать это с помощью цикла for).

window.size <- 5

Но установив размер окон равным 5, код считает для первой матрицы дни 1, 2, 3, 4, 5, а для второй матрицы код считает дни 2, 3, 4, 5, 6 (не 4 дня). , 5, 6, 7, 8, что хочу). Это моя проблема. Я не знаю, как изменить код, чтобы это «разделить» со 2-го на 4-й день. Как я могу справиться с этой проблемой?

window.size <- 5 #set the size of the window equal to 5 days
windows <- embed(1:nrow(data), window.size)
forApproach <- function(data, windows) {
  l <- vector(mode="list", length=nrow(windows))
  for (i in 1:nrow(data)) {
    l[[i]] <- cov(data[windows[i, ], ])
  }
}

person Rfun2018    schedule 15.04.2018    source источник
comment
Две вещи. 1) Кажется, ваш код на основе far-loop не работает. 2) Как вы хотите показывать результаты?   -  person MKR    schedule 15.04.2018
comment
Я хотел бы иметь список (переменная l в коде), в котором есть 6 матриц вариации-ковариации. Эти матрицы должны быть вычислены из 1: 5, 4: 8, 7:11, 10:14, 13:17, 16:20 (строки / дни) с учетом всех столбцов. Но приведенный выше код вычисляет матрицы с учетом 1: 5, 2: 6, 3: 7 (строки) и так далее.   -  person Rfun2018    schedule 15.04.2018
comment
Я хотел бы иметь список (переменная l в коде), в котором есть 6 матриц вариации-ковариации. Эти матрицы должны быть вычислены из 1: 5, 4: 8, 7:11, 10:14, 13:17, 16:20 (строки / дни) с учетом всех столбцов. Но приведенный выше код вычисляет матрицы с учетом 1: 5, 2: 6, 3: 7 (строки) и так далее. @ MKR   -  person Rfun2018    schedule 15.04.2018


Ответы (1)


Решением, расширяющим подход OP, является использование другой переменной skip. Основываясь на обратной связи, кажется, что OP хочет вычислить cov для первых 5 строк (1:5), а затем хочет skip 3 строки для вычисления cov для строк (4:9) и так далее.

Использование embed создало окно размером 5, но пропустило 1. Мы можем пропустить строки, чтобы найти selected_windows индекса строки, а затем применить функцию cov.

window.size <- 5
skip  <- 3
windows <- embed(1:nrow(data), window.size)
selected_windows <- windows[(1:nrow(windows) %% 3) == 1, ]

#       [,1] [,2] [,3] [,4] [,5]
# [1,]    5    4    3    2    1
# [2,]    8    7    6    5    4
# [3,]   11   10    9    8    7
# [4,]   14   13   12   11   10
# [5,]   17   16   15   14   13
# [6,]   20   19   18   17   16


#One can use for-loop or apply to calculate "cov" on group of rows and get the result
apply(selected_windows, 1, function(x)list(cov(data[x,])))
person MKR    schedule 15.04.2018