我不使用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
and 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