извлечение весов перефразированного портфеля - PullRequest
1 голос
/ 21 сентября 2019

Я провожу оптимизацию портфеля для ряда акций и пытаюсь определить вес перебалансированного портфеля.

Проблема, с которой я столкнулся: вместо того, чтобы получить вес перебалансированного портфеля, я получаю 3 даты.Код для проекта ниже.

library(ROI)
install.packages("DEoptim")
library(ggplot2)
install.packages("quantmod")
library(quantmod)
library(quantmod)
install.packages("PerfomanceAnalytics")
library(PerformanceAnalytics)
library(PortfolioAnalytics)
library(random)
install.packages("random")
library(random)
library(DEoptim)
install.packages("fPortfolio")
library(fPortfolio)
install.packages("foreach")
install.packages("doParallel")
library(PortfolioAnalytics)


#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))
portf <- add.constraint(portf, type="weight_sum", min_sum=.99, max_sum=1,01)
portf <- add.constraint(portf, type="box", min=.02, max=.60) 
portf<-add.constraint(portf,type="transation_cost", ptc=.001)
portf <- add.objective(portf, type="return", name="mean")
portf <- add.objective(portf, type="risk", name="StdDev",target=.005)

rp<-random_portfolios(portf, 10000, "sample")
#optimize portfolio using the "DEoptim solver"
optPort <- optimize.portfolio(portfolioReturns, portf, optimize_method = "DEoptim", trace=TRUE)

#chart weights of optimized portfolio

chart.Weights(optPort)
summary(optPort)


chart.RiskReward(optPort, risk.col = "StDev", return.col = "mean", chart.assets = TRUE)


rp<-random_portfolios(portf, 10000, "sample")
#rebalance portfolo
opt_rebal <- optimize.portfolio.rebalancing(portfolioReturns,
                                            portf,
                                            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))

Как я могу это исправить?

Ваша помощь будет принята с благодарностью.

Спасибо.

1 Ответ

0 голосов
/ 21 сентября 2019

Прежде всего, ваш код очень грязный!

Поэтому, пока я предоставляю вам решение, я также его очистил.

Вот несколько пунктов, которые охватывают все аспекты вашего вопроса:

  1. Поддерживаемые плагины

Поскольку вы используете не только 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, чтобы узнать, какие ограниченные типы задач выпуклой оптимизации можно решить.

...