PortfolioAnalytics в R - optimize.portfolio () приводит к NaN для годовой доходности - PullRequest
0 голосов
/ 05 ноября 2018

Я учусь, как использовать пакет PortfolioAnalytics в R, чтобы перебалансировать портфель каждые кварталы. Я собрал данные о 19 акциях с большой капитализацией в США и Китае с использованием пакета qmao, а затем вычислил квартальную доходность. Все отлично работает, пока я не вызову функцию optimize.portfolio.rebalancing(). Он продолжал давать мне следующее сообщение об ошибке вместе с NaN в результате для Annualized Portfolio Rebalancing Return:

Расчет VaR дает ненадежный результат (риск более 100%) для колонка: 1: 1.12020244277128 Расчет ES дает ненадежный результат (риск более 100%) для столбца: 1: расчет 1,14791543855955 VaR дает ненадежный результат (риск более 100%) для столбца: 1: 1.13372707060527 Расчет ES дает ненадежный результат (риск более 100%) для столбца: 1: 1.14960946412769

Полный код для воспроизведения

#get the stock price data for 19 large-cap stocks from 2008/10/29 to 2018/11/04 and compute its quarterly return.
#Make the boxplot of the quarterly return for all 19 stocks. 
library(qmao)
library(quantmod)
library(data.table)
library(scales)
library(ggplot2)
library(car)
library(PortfolioAnalytics)
library(foreach)
library(iterators)
library(ROI)
library(ROI.plugin.quadprog)
library(ROI.plugin.glpk)
library(doParallel)
registerDoParallel()

symbols <- c("IBM", "GOOG", "JPM", "BAC", "TGT", "WMT", "AAPL", "TSLA", "AMZN", "PG", "EBAY", "NKE", "MSFT", "GE", "TCEHY", "SBUX", "GM", "TM", "BABA")
data.env <- new.env()
startDate = as.Date("2008-10-29") #Specify what date to get the prices from
endDate = as.Date("2018-11-04")
getSymbols(symbols, env = data.env ,from= startDate ,to= endDate)
pf <- PF(symbols,env = data.env,silent=TRUE) # consolidated xts-object
pfMth <- pf[endpoints(pf,on='quarters'),]   # get quarterly endpoints
pfMthRets <- ROC(pfMth,type='discrete')   
pfMthRets <- pfMthRets[complete.cases(pfMthRets),]
tail(pfMthRets)

#compute S&P 500 quarterly return from 2008/10/29 to 2018/11/04
startDate = as.Date("2008-10-29") #Specify what date to get the prices from
endDate = as.Date("2018-11-04")
sp500 <- getSymbols("^GSPC",auto.assign = FALSE ,from= startDate ,to= endDate)
sp500 <- PF("sp500",env = sp500,silent=TRUE) # consolidated xts-object
sp500Mth <- sp500[endpoints(sp500,on='quarters'),]   # get monthly endpoints
sp500MthRets <- ROC(sp500Mth,type='discrete')   
sp500MthRets <- sp500MthRets[complete.cases(sp500MthRets),]

#constraint the portfolio of stock with certain constraints and solve for the optimal portfolio (in terms of minimum variance and maximum return)
returns <- pfMthRets[, 1:ncol(pfMthRets)]
colnames(returns) <- c("IBM", "GOOG", "JPM", "BAC", "TGT", "WMT", "AAPL", "TSLA", "AMZN", "PG", "EBAY", "NKE", "MSFT", "GE", "TCEHY", "SBUX", "GM", "TM", "BABA")
portf.dn <- portfolio.spec(assets = colnames(returns))
# Add constraint such that the portfolio weights sum to 0*
portf.dn <- add.constraint(portf.dn, type="active")
# Add box constraint such that no asset can have a weight of greater than
# 20% or less than -20%
portf.dn <- add.constraint(portf.dn, type="box", min=-0.2, max=0.2)
# Add constraint such that the portfolio beta is between -0.25 and 0.25
betas <- t(CAPM.beta(pfMthRets,sp500MthRets)) #beta = cov(Ra,Rb)/var(R)
portf.dn <- add.constraint(portf.dn, type="factor_exposure", B=betas,
                           lower=-0.25, upper=0.25)

# Add objective to maximize portfolio return with a target of 0.15
portf.dn <- add.objective(portf.dn, type="return", name="mean")
# Add objective to minimize portfolio StdDev with a target of 0.005
portf.dn <- add.objective(portf.dn, type="risk", name="var")
# transaction cost constraint
portf.dn <- add.constraint(portfolio = portf.dn, type = "transaction_cost", ptc=0.01)

# Run the optimization with rebalancing every quarters
opt.dn <- optimize.portfolio.rebalancing(R=pfMthRets, portf.dn,
                             optimize_method="random",rebalance_on = "quarters",maxSR = TRUE,
                             training_period = 3)
opt.dn

Мои вопросы:

(1) Мне также кажется, что у нас есть нет подсказок, чтобы знать, какие из данных ограничений и целей приводят к возможным решениям (например, мы можем иметь 10 ограничений, 2 простые цели (минимизировать риск и максимизировать доходность при определенном уровне риска), а затем получить NaN для весов, присвоенных 19 акциям выше). Так, как мы определяем, какое ограничение добавить, чтобы сделать его осуществимым?

(2) Если я хочу построить эффективную границу каждые кварталы, как я могу это сделать? Я пытался сделать это с meanSigma.ef = create.EfficientFrontier(R=pfMthRets, portfolio=portf.dn, type="mean-StdDev", n.portfolios = 25), но я получаю сообщение об ошибке «Ошибка в seq.default (from = minret, to = maxret, length.out = n.portfolios):« from »не может быть NA, NaN или бесконечным. «

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...