Как настроить функцию, которая имитирует VaR, используя индекс в качестве множителя - PullRequest
1 голос
/ 23 апреля 2019

Я выполняю симуляцию mvnorm с тремя переменными.Я хочу, чтобы mu_3v было умножено на [1:62] и stdv_3 на sqrt из [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 Ответ

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

Как то так?Обратите внимание, что я заполнил некоторые случайные значения для целей тестирования, поскольку вы не указали корреляционные переменные в своем примере кода!Но это должно помочь вам, я думаю :) Дайте мне знать, если что-то неясно!(Еще добавлено небольшое обновление, 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]
}




Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...