Using optimize.portfolio
Roger, I believe what you'd need is some custom risk/return functions. I don't remember the exact syntax off the top of my head, but I do remember that Ross Bennett covers this in his course on Datacamp. I highly recommend it if you're going to be using PortfA.
On Fri, Jun 5, 2020 at 2:16 PM Roger Bos <roger.bos at gmail.com> wrote:
All,
I am comparing optimize.portfolio from the PortfolioAnalytics package to
portfolio.optim from the tseries package. portfolio.optim seems a bit
easier to use, but I like the set up of optimize.portfolio. I have created
a minimal reprex below that compares the output of both in case that helps
answer my questions.
Here are my two primary questions:
1) What if I wanted to pass a custom covariance matrix to
optimize.portfolio, like from a risk model. Is that possible? I can pass
it to portfolio.optim because covmat is one of the parameters.
2) What if I wanted to pass forecasted returns to optimize.portfolio? How
would that be done.
If there is anything that can be improved in this example, that would be
helpful as well. Thank you in advance for any assistance, Roger.
###
library(PortfolioAnalytics)
library(tidyquant)
symbols <-
c("MSFT","AAPL","AMZN","NVDA","CSCO","ADBE","AMGN","ORCL","QCOM","GILD")
getYahooReturns <- function(symbols, return_column = "Ad") {
returns <- list()
for (symbol in symbols) {
getSymbols(symbol, from = '2000-01-01', adjustOHLC = TRUE, env =
.GlobalEnv, auto.assign = TRUE)
return <- Return.calculate(Ad(get(symbol)))
colnames(return) <- gsub("\\.Adjusted", "", colnames(return))
returns[[symbol]] <- return
}
returns <- do.call(cbind, returns)
return(returns)
}
returns <- getYahooReturns(symbols)
returns <- returns[-1, ]
returns[is.na(returns)] <- 0
# portfolio.optim from tseries package
library(tseries)
sigma <- cov(returns)
reslow <- rep(0, ncol(returns))
reshigh <- rep(1, ncol(returns))
popt <- portfolio.optim(x = returns, covmat = sigma, reslow = reslow,
reshigh = reshigh)
popt$pw
pspec <- portfolio.spec(assets = symbols)
pspec <- add.constraint(portfolio=pspec, type="box",
min = 0, max = 1, min_sum = 0.99, max_sum = 1.01)
pspec <- add.objective(portfolio=pspec,
type="return",
name="mean")
pspec <- add.objective(portfolio=pspec,
type="risk",
name="var")
opt <- optimize.portfolio(R = returns,
portfolio = pspec,
optimize_method = "DEoptim", )
data.frame(optimize.portfolio = opt$weights, portfolio.optim =
round(popt$pw, 3))
[[alternative HTML version deleted]]
_______________________________________________ R-SIG-Finance at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.