Я учусь, как использовать пакет 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 или бесконечным. «