【发布时间】:2020-02-06 04:36:02
【问题描述】:
对于 fportfolio 包,您需要输入回报的时间序列,它会在内部计算预期回报和时间序列的方差,然后用于诸如投资组合前沿或 tangencyportfolio 之类的函数。但在我的情况下,我已经有了预期的回报矩阵和方差协方差矩阵,我想使用 fportfolio 的函数。我怎样才能做到这一点?提前致谢。
【问题讨论】:
-
请提供一个您想要达到的目标的最小示例。
对于 fportfolio 包,您需要输入回报的时间序列,它会在内部计算预期回报和时间序列的方差,然后用于诸如投资组合前沿或 tangencyportfolio 之类的函数。但在我的情况下,我已经有了预期的回报矩阵和方差协方差矩阵,我想使用 fportfolio 的函数。我怎样才能做到这一点?提前致谢。
【问题讨论】:
我不使用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
【讨论】: