【问题标题】:how to use fportfolio package in R for non time series input?如何在 R 中使用 fportfolio 包进行非时间序列输入?
【发布时间】:2020-02-06 04:36:02
【问题描述】:

对于 fportfolio 包,您需要输入回报的时间序列,它会在内部计算预期回报和时间序列的方差,然后用于诸如投资组合前沿或 tangencyportfolio 之类的函数。但在我的情况下,我已经有了预期的回报矩阵和方差协方差矩阵,我想使用 fportfolio 的函数。我怎样才能做到这一点?提前致谢。

【问题讨论】:

  • 请提供一个您想要达到的目标的最小示例。

标签: r portfolio


【解决方案1】:

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

所以现在我们有了Sm。我们首先创建您的输入矩阵;叫它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

【讨论】:

    猜你喜欢
    • 2017-12-21
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2015-06-21
    • 2019-02-10
    • 2012-12-25
    相关资源
    最近更新 更多