Прежде всего, ваш код очень грязный!
Поэтому, пока я предоставляю вам решение, я также его очистил.
Вот несколько пунктов, которые охватывают все аспекты вашего вопроса:
- Поддерживаемые плагины
Поскольку вы используете не только DEoptim
solver, но и ROI
, вам необходимо загрузить рекомендуемые плагины поддержки для ROI
:
install.packages(c("fGarch",
"Rglpk",
"ROI.plugin.glpk",
"ROI.plugin.quadprog",
"ROI.plugin.symphony",
"pso",
"GenSA",
"corpcor",
"testthat",
"nloptr",
"MASS",
"robustbase")
)
Использование библиотек Вы должны загружать библиотеки один раз и в правильном порядке, поскольку некоторые библиотеки могут маскировать некоторые функции друг от друга.Вот рекомендуемый порядок:
library(ROI)
library(ggplot2)
library(quantmod)
library(PerformanceAnalytics)
library(random)
library(DEoptim)
library(fPortfolio)
library(PortfolioAnalytics)
library(dplyr)
Использование оператора pipe Обратите внимание, что загружена дополнительная библиотека dplyr
, необходимая для трубопровода (%>%
), т.е. сделать ваш код более эффективным и читабельным!:
#vector of stocks in my portfolio of
tickers <- c("FB", "AAPL", "AMZN", "GM", "GOOGL", "SQ", "NVDA","RYAM", "AMAT", "IMMR","SOI","PETS")
#bind porfolio prices
portfolioPrices <- NULL
for(ticker in tickers) {
portfolioPrices <- cbind(portfolioPrices,
getSymbols.yahoo(ticker, from='2003-01-03', periodicity = 'daily', auto.assign=FALSE)[,4])
}
#portfolio returns
portfolioReturns <- na.omit(ROC(portfolioPrices))
print(portfolioReturns)
portf <- portfolio.spec(colnames(portfolioReturns)) %>%
add.constraint(type="weight_sum", min_sum=1, max_sum=1) %>%
add.constraint(type="box", min=.02, max=.60) %>%
add.constraint(type="transation_cost", ptc=.001) %>%
add.objective(type="return", name="mean") %>%
add.objective(type="risk", name="StdDev",target=.005)
Устранение избыточности Не уверен, почему нельзя использовать предыдущий случайный портфель rp
, который был введен в optPort
, в качестве ввода в opt_rebal
.
rp<-random_portfolios(portf, 10000, "sample")
#optimize portfolio using the "DEoptim solver"
optPort <- optimize.portfolio(portfolioReturns, portf, optimize_method = "DEoptim", trace=TRUE,
rp=rp)
#chart weights of optimized portfolio
chart.Weights(optPort)
summary(optPort)
# chart.RiskReward(optPort, risk.col = "StDev", return.col = "mean", chart.assets = TRUE)
#not sure why you cannot use the previous random portfolio!!
rp<-random_portfolios(portf, 10000, "sample")
Понимание использования графика Risk-Reward В этом вызове функции есть ошибка, которая, как я полагаю, связана с двойной целью вашего portf
, так какможет помешать вам получить эффективную границу.Не уверен насчет этого;это не обязательно, но задача для вас: -)
# chart.RiskReward(optPort, risk.col = "StDev", return.col = "mean", chart.assets = TRUE)
Понимание ROI ROI
отличается от других бэкэндов и поэтому требует отдельной спецификации портфеля portfolio.spec
и оптимизации портфеля optimize.portfolio
или optimize.portfolio.rebalancing
.
Вот один из способов его реализации (обратите внимание на спецификацию портфеля, в которой нет add.objective
внутри):
portf2 <- portfolio.spec(colnames(portfolioReturns)) %>%
add.constraint(type="weight_sum", min_sum=1, max_sum=1) %>%
add.constraint(type="box", min=.02, max=.60) %>%
add.constraint(type="transation_cost", ptc=.001)
#this optimises based on Sharpe Ratio
optPort2 <- optimize.portfolio(portfolioReturns, portf2, optimize_method = "ROI", trace=TRUE,
maxSR=TRUE)
#rebalance portfolo
opt_rebal <- optimize.portfolio.rebalancing(portfolioReturns,
portf2,
optimize_method="ROI",
rp=rp,
rebalance_on="years",
training_period=60,
rolling_window=60)
extractWeights(optPort)
chart.Weights(optPort)
#extract weights of rebalanced portfolio
extractWeights(opt_rebal)
Вывод:
> extractWeights(opt_rebal)
FB.Close AAPL.Close AMZN.Close GM.Close GOOGL.Close SQ.Close NVDA.Close RYAM.Close AMAT.Close
2017-12-29 0.6 0.2 0.02 0.02 0.02 0.02 0.02 0.02 0.02
2018-12-31 0.6 0.2 0.02 0.02 0.02 0.02 0.02 0.02 0.02
2019-09-20 0.6 0.2 0.02 0.02 0.02 0.02 0.02 0.02 0.02
IMMR.Close SOI.Close PETS.Close
2017-12-29 0.02 0.02 0.02
2018-12-31 0.02 0.02 0.02
2019-09-20 0.02 0.02 0.02
Вы можетеПрочитайте документацию о optimize.portfolio
, чтобы узнать, какие ограниченные типы задач выпуклой оптимизации можно решить.