Я не пользуюсь fportfolio
;но если вам нужны только средние значения и дисперсионно-ковариационная матрица, вы можете смоделировать возвраты, которые имеют точно желаемую статистику.
Предположим, у вас есть ожидаемая дисперсионно-ковариационная матрица S
и ожидаемый вектор возврата m
. Я составляю пример данных для 5 активов. (Я только создаю матрицу A
, потому что это простой способ вычислить действительную матрицу дисперсии-ковариации.)
na <- 5
nobs <- 6
A <- array(rnorm(nobs*na),
dim = c(nobs, na))*0.01
S <- cov(A)
m <- runif(na, min = 0, max = 0.0005)
Так что теперь у нас есть S
и m
. Мы начнем с создания вашей входной матрицы;назовите его B
.
B <- array(rnorm( nrow(S)+1 * nrow(S)),
dim = c(nrow(S)+1, nrow(S)))
Поскольку в конечном итоге он должен содержать именно вашу статистику, мы должны очистить его: удалить все остаточные корреляции, установить все значения волатильности равными 1, а средние значения равными 0.
B <- B %*% backsolve(chol(cov(B)),
diag(1, nrow(S)))
B <- t(B) - colMeans(B)
B <- B / apply(B, 1, sd)
B <- t(B)
Проверка. (Из-за числовой точности среднее значение не будет точно равно 0 и т. Д.)
round(apply(B, 2, sd), 10)
## [1] 1 1 1 1 1
round(apply(B, 2, mean), 10)
## [1] 0 0 0 0 0
round(cov(B), 10)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 0 0 0 0
## [2,] 0 1 0 0 0
## [3,] 0 0 1 0 0
## [4,] 0 0 0 1 0
## [5,] 0 0 0 0 1
А теперь убедитесь, что B
имеет правильные свойства.
B <- B %*% chol(S)
B <- t(B) + m
B <- t(B)
all.equal(cov(B), S)
## [1] TRUE
all.equal(colMeans(B), m)
## [1] TRUE