投资组合分析包中的自定义预期 returns
Custom expected returns in the Portfolio Analytics package
我无法将自定义预期 returns 合并到投资组合分析包中。通常预期 returns 是一些专业的预期/观点或与基本面指标分开计算。投资组合分析允许创建自定义矩函数来计算过去 returns 的矩,但我不明白如何将已计算的 returns 合并到优化问题中。感谢任何帮助,这里是一个小示例数据集:
#Download package and sample returns
library(PortfolioAnalytics)
library(PerformanceAnalytics)
data(edhec)
returns <- tail(edhec[,1:4], 10)
#Example expected return xts that I'm usually working with. Calculated separately.
N <- 10
M <- 4
views <- as.xts(data.frame(matrix(rnorm(N*M,mean=0,sd=0.05), N, M)), order.by = index(returns))
colnames(views) <- colnames(returns)
让我们创建具有一些目标的基本投资组合。
pf <- portfolio.spec(assets = colnames(returns))
pf <- add.constraint(portfolio = pf, type = "full_investment")
pf <- add.constraint(portfolio = pf, type = "long_only")
pf <- add.objective(portfolio = pf, type = "return", name = "mean")
pf <- add.objective(portfolio = pf, type = "risk", name = "StdDev")
现在我想在每个时期优化投资组合 pf 并考虑账户观点(预期 returns 那个时期)但我 运行 在这一点上没有想法。
我现在意识到,在设置赏金后,问题已经得到解答 here。我会尽量总结一下。
当您调用 optimize.portfolio
时,有一个可选参数 momentFUN
,它定义了您投资组合的时刻。它的参数之一是 momentargs
,你可以在 optimize.portfolio
.
中传递它
首先,您需要选择一组预期returns。我假设您的 views
时间序列中的最后一个条目:
my.expected.returns = views["2009-08-31"]
您还需要自己的协方差矩阵。我会根据你的 returns
:
来计算
my.covariance.matrix = cov(returns)
最后,您需要定义 momentargs
,这是一个由 mu
(您期望的 returns)、sigma
(您的协方差矩阵)组成的列表,以及第三和第四时刻(我们将其设置为零):
num_assets = ncol(current.view)
momentargs = list()
momentargs$mu = my.expected.returns
momentargs$sigma = my.covariance.matrix
momentargs$m3 = matrix(0, nrow = num_assets, ncol = num_assets ^ 2)
momentargs$m4 = matrix(0, nrow = num_assets, ncol = num_assets ^ 3)
现在您已准备好优化您的投资组合:
o = optimize.portfolio(R = returns, portfolio = pf, momentargs = momentargs)
当您使用 ROI 进行优化并且您达到了 momentargs = expectations
的预期时,您需要添加
add.objective(eff.port, type = "return", name = "mean")
在optimize.portfolio
第382行左右的函数代码中,声明在objective为return。即使您已经将其声明为约束条件。
我无法将自定义预期 returns 合并到投资组合分析包中。通常预期 returns 是一些专业的预期/观点或与基本面指标分开计算。投资组合分析允许创建自定义矩函数来计算过去 returns 的矩,但我不明白如何将已计算的 returns 合并到优化问题中。感谢任何帮助,这里是一个小示例数据集:
#Download package and sample returns
library(PortfolioAnalytics)
library(PerformanceAnalytics)
data(edhec)
returns <- tail(edhec[,1:4], 10)
#Example expected return xts that I'm usually working with. Calculated separately.
N <- 10
M <- 4
views <- as.xts(data.frame(matrix(rnorm(N*M,mean=0,sd=0.05), N, M)), order.by = index(returns))
colnames(views) <- colnames(returns)
让我们创建具有一些目标的基本投资组合。
pf <- portfolio.spec(assets = colnames(returns))
pf <- add.constraint(portfolio = pf, type = "full_investment")
pf <- add.constraint(portfolio = pf, type = "long_only")
pf <- add.objective(portfolio = pf, type = "return", name = "mean")
pf <- add.objective(portfolio = pf, type = "risk", name = "StdDev")
现在我想在每个时期优化投资组合 pf 并考虑账户观点(预期 returns 那个时期)但我 运行 在这一点上没有想法。
我现在意识到,在设置赏金后,问题已经得到解答 here。我会尽量总结一下。
当您调用 optimize.portfolio
时,有一个可选参数 momentFUN
,它定义了您投资组合的时刻。它的参数之一是 momentargs
,你可以在 optimize.portfolio
.
首先,您需要选择一组预期returns。我假设您的 views
时间序列中的最后一个条目:
my.expected.returns = views["2009-08-31"]
您还需要自己的协方差矩阵。我会根据你的 returns
:
my.covariance.matrix = cov(returns)
最后,您需要定义 momentargs
,这是一个由 mu
(您期望的 returns)、sigma
(您的协方差矩阵)组成的列表,以及第三和第四时刻(我们将其设置为零):
num_assets = ncol(current.view)
momentargs = list()
momentargs$mu = my.expected.returns
momentargs$sigma = my.covariance.matrix
momentargs$m3 = matrix(0, nrow = num_assets, ncol = num_assets ^ 2)
momentargs$m4 = matrix(0, nrow = num_assets, ncol = num_assets ^ 3)
现在您已准备好优化您的投资组合:
o = optimize.portfolio(R = returns, portfolio = pf, momentargs = momentargs)
当您使用 ROI 进行优化并且您达到了 momentargs = expectations
的预期时,您需要添加
add.objective(eff.port, type = "return", name = "mean")
在optimize.portfolio
第382行左右的函数代码中,声明在objective为return。即使您已经将其声明为约束条件。