could you please take a look at my code (which would only take a few minutes) and point out the problem? Thanks very much. Here is my code:
# download price data
data(SP500_symbols)
allStock <- stockDataDownload(stock_symbols = SP500_symbols,
from = "2010-01-01", to = "2019-12-31")
#tried to download all 505 stocks,
#but some cannot be downloaded so around 450+ stocks
#some stocks were not listed so I have to fill in the NAs with the earlist value
#fill NAs in adjusted prices with the next nearest value
allStock$adjusted <- na.locf(allStock$adjusted, fromLast = TRUE)
colSums(is.na(allStock$adjusted)) # all 0, indicating no NAs
anyNA(allStock$adjusted) #FALSE, indicating no NAs
#the following 2 functions have no problems as I copied the code from
#*Fast Design of Risk Parity Portfolios*
# define portfolios to be backtested
# risk parity portfolio
#this func returns a weight vector
risk_parity <- function(dataset, ...) {
prices <- dataset$adjusted
log_returns <- diff(log(prices))[-1]
Sigma <- cov(log_returns)
rpp <- riskParityPortfolio(Sigma)
return(rpp$w)
}
# tangency portfolio (maximum sharpe ratio)
# this func returns a weight vector
library(quadprog)
max_sharpe_ratio <- function(dataset, ...) {
prices <- dataset$adjusted
log_returns <- diff(log(prices))[-1]
N <- ncol(prices)
Sigma <- cov(log_returns)
mu <- colMeans(log_returns)
if (all(mu <= 1e-8))
return(rep(0, N))
Dmat <- 2 * Sigma
Amat <- diag(N)
Amat <- cbind(mu, Amat)
bvec <- c(1, rep(0, N))
dvec <- rep(0, N)
res <- solve.QP(Dmat = Dmat, dvec = dvec, Amat = Amat, bvec = bvec, meq = 1)
w <- res$solution
return(w/sum(w))
}
#when I run this, 'Error in (function (portfolio_fun, data, price_name, shortselling, leverage, : prices contain NAs.'
bt <- portfolioBacktest(list("risk parity portfolio" = risk_parity,
"tangency portfolio" = max_sharpe_ratio),
list(allStock),
benchmarks = c("index","1/N"),
lookback = 252,
optimize_every = 3*20, #quarterly
rebalance_every = 3*20,
shortselling = TRUE,
execution = 'next period')
Given this problem I tried to extract only two lists from allStock
variable, which is a list of 7 containing 'open''high' ... 'adjusted' and 'index'. Here is my code:
adjustedAndIndex <- list('adjusted' = allStock$adjusted, 'index' = allStock$index)
#run portfolioBacktest again
bt <- portfolioBacktest(list("risk parity portfolio" = risk_parity,
"tangency portfolio" = max_sharpe_ratio),
list(adjustedAndIndex),
benchmarks = c("index","1/N"),
lookback = 252,
optimize_every = 3*20, #quarterly
rebalance_every = 3*20,
shortselling = TRUE,
execution = 'next period')
And this time there's another problem, when I run round(backtestSummary(bt)$performance, 4)
,I expect to get the results like this:
# risk parity portfolio tangency portfolio 1/N index
#Sharpe ratio 1.1955 1.1966 1.2032 0.7928
#max drawdown 0.1851 0.2785 0.2167 0.1978
#annual return 0.1830 0.2493 0.2032 0.1139
#annual volatility 0.1531 0.2083 0.1689 0.1437
#Sortino ratio 1.6932 1.7286 1.7058 1.1063
#downside deviation 0.1081 0.1442 0.1191 0.1030
#Sterling ratio 0.9889 0.8951 0.9377 0.5758
#Omega ratio 1.2353 1.2321 1.2357 1.1565
#VaR (0.95) 0.0151 0.0206 0.0168 0.0150
#CVaR (0.95) 0.0226 0.0306 0.0249 0.0226
#rebalancing period 59.5526 59.5526 59.5526 2263.0000
#turnover 0.0015 0.0157 0.0013 0.0000
#ROT (bps) 4671.1538 577.7948 5974.2958 NA
#cpu time 0.0007 0.0007 0.0004 0.0010
#failure rate 0.0000 0.0000 0.0000 0.0000
But I only get
> round(backtestSummary(bt)$performance, 4)
risk parity portfolio tangency portfolio 1/N index
Sharpe ratio NA NA 1.0864 0.7928
max drawdown NA NA 0.2015 0.1978
annual return NA NA 0.1558 0.1139
annual volatility NA NA 0.1434 0.1437
Sortino ratio NA NA 1.5283 1.1063
downside deviation NA NA 0.1019 0.1030
Sterling ratio NA NA 0.7733 0.5758
Omega ratio NA NA 1.2153 1.1565
VaR (0.95) NA NA 0.0147 0.0150
CVaR (0.95) NA NA 0.0222 0.0226
rebalancing period NA NA 59.5526 2263.0000
turnover NA NA 0.0013 0.0000
ROT (bps) NA NA 4718.1301 NA
cpu time NA NA 0.0005 0.0010