braverock/PortfolioAnalytics

Optimize with rebalancing weights not adding up to 1 (minimum variance).

SeveralAbility opened this issue · 0 comments

I have an issue that I can't seem to solve where when running my data through optimize.portfolio.rebalancing with the objective being to minimise variance, I get the warning message

In Return.portfolio.geometric(R = R, weights = weights, wealth.index = wealth.index,  :
  The weights for one or more periods do not sum up to 1: assuming a return of 0 for the residual weights

When I run the same data but with the objective to maximise return I do not get this error. I've tried to give a snippet my code that doesn't below, I've also attached the csv file I used to input the values.

library(PortfolioAnalytics)
library(PerformanceAnalytics)
library(ROI)
library(ROI.plugin.glpk)
library(ROI.plugin.quadprog)
library(openxlsx)
library(zoo)
library(xts)
library(ggplot2)
Raw.Data <- read.csv('~/Desktop/Portfolio Optimisation/Data/Combined Data.csv')
attach(Raw.Data)
dates <- seq(as.Date("2005-06-01"), length=188, by="months")
TimeSeries <- xts(x=Raw.Data[1:188,2:8], order.by=dates)
Returns.Extra.Row <- Return.calculate(TimeSeries, method = "discrete")
Returns <- Returns.Extra.Row[-c(1),]
fund.names <-colnames(Returns)
pspec <- portfolio.spec(assets=fund.names)
pspec <- add.constraint(portfolio=pspec, type="full_investment")
pspec <- add.constraint(portfolio=pspec,type="box",min=0,max=1)
Weight0.05 <- seq(from = 0.05, to = 0.05, length.out = 7)
Weight1.00 <- seq(from = 1.00, to = 1.00, length.out = 7)
min0.05_max1.00 <- pspec
min0.05_max1.00 <- add.constraint(portfolio=min0.05_max1.00, 
                                  type="box", 
                                  min=Weight0.05, 
                                  max=Weight1.00)

# Maximising return works as expected
MaximiseReturn_min0.05_max1.00 <- add.objective(portfolio=min0.05_max1.00, type="return", name="mean")
OptimiseMaximiseReturn_min0.05_max1.00 <- optimize.portfolio.rebalancing(R=Returns, portfolio=MaximiseReturn_min0.05_max1.00,optimize_method="ROI",rebalance_on="years",training_period=12)
SummaryOptimiseMaximiseReturn_min0.05_max1.00 <- summary (OptimiseMaximiseReturn_min0.05_max1.00)
chart.Weights(OptimiseMaximiseReturn_min0.05_max1.00, colorset = rainbow(7), cex.legend = 0.6)
plot.zoo(SummaryOptimiseMaximiseReturn_min0.05_max1.00$portfolio_returns, ylab = "Returns")
plot.zoo(cumsum(SummaryOptimiseMaximiseReturn_min0.05_max1.00$portfolio_returns), ylab = "Cumulative Returns")
plot.zoo(exp(cumsum(SummaryOptimiseMaximiseReturn_min0.05_max1.00$portfolio_returns)), ylab = "Compounded Cumulative Returns")

# Minimising variance not working as expected
MinimiseVariance_min0.05_max1.00 <- add.objective(portfolio=min0.05_max1.00, type="risk", name="StdDev")
OptimiseMinimiseVariance_min0.05_max1.00 <- optimize.portfolio.rebalancing(R=Returns, portfolio=MinimiseVariance_min0.05_max1.00,optimize_method="ROI",rebalance_on="years",training_period=12)
SummaryOptimiseMinimiseVariance_min0.05_max1.00 <- summary (OptimiseMinimiseVariance_min0.05_max1.00)
chart.Weights(OptimiseMinimiseVariance_min0.05_max1.00, colorset = rainbow(7), cex.legend = 0.6)
plot.zoo(SummaryOptimiseMinimiseVariance_min0.05_max1.00$portfolio_returns, ylab = "Returns")
plot.zoo(cumsum(SummaryOptimiseMinimiseVariance_min0.05_max1.00$portfolio_returns), ylab = "Cumulative Returns")
plot.zoo(exp(cumsum(SummaryOptimiseMinimiseVariance_min0.05_max1.00$portfolio_returns)), ylab = "Compounded Cumulative Returns")
# Running the code below shows that for some dates the weights are given as NA
SummaryOptimiseMinimiseVariance_min0.05_max1.00$weights

Combined Data.csv

Session info

R version 4.0.4 (2021-02-15)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.7

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ggplot2_3.3.3              openxlsx_4.2.3             ROI.plugin.quadprog_1.0-0 
 [4] ROI.plugin.glpk_1.0-0      ROI_1.0-0                  PortfolioAnalytics_1.1.0  
 [7] PerformanceAnalytics_2.0.4 foreach_1.5.1              xts_0.12.1                
[10] zoo_1.8-9                 

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.6       magrittr_2.0.1   munsell_0.5.0    colorspace_2.0-0 lattice_0.20-41 
 [6] R6_2.5.0         rlang_0.4.10     quadprog_1.5-8   fansi_0.4.2      tools_4.0.4     
[11] grid_4.0.4       gtable_0.3.0     utf8_1.2.1       registry_0.5-1   withr_2.4.1     
[16] ellipsis_0.3.1   iterators_1.0.13 tibble_3.1.0     lifecycle_1.0.0  crayon_1.4.1    
[21] zip_2.1.1        vctrs_0.3.6      Rglpk_0.6-4      codetools_0.2-18 glue_1.4.2      
[26] slam_0.1-48      stringi_1.5.3    pillar_1.5.1     compiler_4.0.4   scales_1.1.1    
[31] pkgconfig_2.0.3 

Any help would be appreciated, and since this is my first github post hopefully I've formatted everything correctly.