Как настроить функцию, имитирующую VaR, используя индекс в качестве множителя

#r

#r

Вопрос:

Я выполняю моделирование mvnorm с тремя переменными. Я хочу, mu_3v чтобы его умножали на [1:62] и stdv_3 на sqrt of [1:62] .

Для каждого сравнения я хочу, чтобы R извлекал столбец [,1] , [,2] и [,3] и добавлял его в отдельный фрейм данных. Давая мне конечный результат из 3 фреймов данных с 1:10000 смоделированными строками и 1:62 столбцами.

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

Текущий код:

 mu_3v = c(mu1_1, mu2_1, mu_H)

stdv_3 = c(s1_1, s2_1, s_H)

corMat = matrix(c(1, rho_1, rho_HvsF,
                  rho_1, 1, rho_HvsV,
                  rho_HvsF, rho_HvsV, 1), ncol = 3)

covMat = stdv_3 %*% t(stdv_3) * corMat

set.seed(10000)

sim3v <- mvrnorm(10000, mu = mu_3v, Sigma = covMat, empirical = TRUE)
  

Пример с 3 столбцами и 6 строками желаемого результата:

         x1           x2           x3    
1 -0.007123555 -0.009929272 -0.012024598
2 -0.021314259 -0.029997958 -0.036603619
3 -0.010374873 -0.014527330 -0.017656045
4  0.033366925  0.047332914  0.058106970
5 -0.004235795 -0.005845363 -0.007022851
6 -0.017374481 -0.024426270 -0.029779722

             y1            y2            y3
1  0.0013867871  0.0020744484  0.0026470862
2  0.0032006879  0.0046396915  0.0057888546
3  0.0005585690  0.0009031711  0.0012125704
4 -0.0004444398 -0.0005152975 -0.0005246917
5  0.0031730968  0.0046006719  0.0057410655
6 -0.0050500802 -0.0070286566 -0.0085018949

           z1            z2           z3
1  0.000532362  0.0008996895  0.001239865
2 -0.004274135 -0.0058977242 -0.007085233
3 -0.010928377 -0.0153082426 -0.018610717
4  0.046217388  0.0655080731  0.080368651
5  0.008414940  0.0120473379  0.014892890
6 -0.006425554 -0.0089402897 -0.010811599

  

Комментарии:

1. Привет, я не понимаю желаемый результат. Можете ли вы добавить его в свой вопрос

2. Привет, спасибо за ответ. Я добавил пример желаемого результата в соответствии с запросом.

Ответ №1:

Что-то вроде этого? Обратите внимание, что я ввел некоторые случайные значения для целей тестирования, поскольку вы не указали корреляционные переменные в своем примере кода! Но это должно вам помочь, я думаю 🙂 Дайте мне знать, если что-то неясно! (Все еще добавлено небольшое обновление, corMat должен быть в цикле..

 library(MASS)
set.seed(10000)

scaler <- 1:62
no_simul <- 10000

placeholder <- matrix(ncol=length(scaler), nrow=no_simul)
matrix_list <- list(mat1 = placeholder, mat2 = placeholder, mat3 = placeholder)

mu_3v = c(0.01, 0.07, 0.3)
stdv_3 = c(0.1, .2, 0.3)
corMat = matrix(c(1, 0.2, 0.25,
                  0.02, 1, -0.1,
                  0.5, -0.5, 1), ncol = 3)

for (j in 1:length(scaler)){
  stdv_3_temp <- stdv_3 * sqrt(scaler[j])
  covMat <- stdv_3_temp %*% t(stdv_3_temp) * corMat
  sim3v <- mvrnorm(no_simul, mu = mu_3v*scaler[j], Sigma = covMat, empirical = TRUE)
  matrix_list$mat1[ , j] <- sim3v[ , 1]
  matrix_list$mat2[ , j] <- sim3v[ , 2]
  matrix_list$mat3[ , j] <- sim3v[ , 3]
}