#Tickers Sorted
Basic_Material_Tickers <- c("LIN US Equity", "SHW US Equity", "FCX US Equity", "NEM US Equity", "APD US Equity", "DOW US Equity", "NUE US Equity", "ECL US Equity", "DD US Equity", "IFF US Equity", "PPG US Equity", "LYB US Equity", "MOS US Equity", "ALB US Equity", "CF US Equity", "IP US Equity", "FMC US Equity", "CE US Equity", "EMN US Equity")
Communications_Tickers <- c("AMZN US Equity", "GOOGL US Equity", "GOOG US Equity", "FB US Equity", "CSCO US Equity", "DIS US Equity", "VZ US Equity", "CMCSA US Equity", "T US Equity", "BKNG US Equity", "NFLX US Equity", "TMUS US Equity", "CHTR US Equity", "WBD US Equity", "TWTR US Equity", "MSI US Equity", "EBAY US Equity", "GLW US Equity", "EXPE US Equity", "ANET US Equity", "MTCH US Equity", "CDW US Equity", "PARA US Equity", "VRSN US Equity", "OMC US Equity", "FDS US Equity", "NLOK US Equity", "IPG US Equity", "ETSY US Equity", "FOXA US Equity", "JNPR US Equity", "FFIV US Equity", "LUMN US Equity", "NWSA US Equity", "DISH US Equity", "FOX US Equity", "NWS US Equity")
Consumer_Cyclical_Tickers <- c("TSLA US Equity", "HD US Equity", "COST US Equity", "WMT US Equity", "MCD US Equity", "NKE US Equity", "LOW US Equity", "TGT US Equity", "SBUX US Equity", "TJX US Equity", "F US Equity", "DG US Equity", "GM US Equity", "MAR US Equity", "HLT US Equity", "ORLY US Equity", "CMG US Equity", "AZO US Equity", "DLTR US Equity", "ROST US Equity", "YUM US Equity", "FAST US Equity", "WBA US Equity", "PCAR US Equity", "APTV US Equity", "LUV US Equity", "DAL US Equity", "CMI US Equity", "CPRT US Equity", "TSCO US Equity", "DHI US Equity", "GWW US Equity", "ULTA US Equity", "LEN US Equity", "BBY US Equity", "GPC US Equity", "RCL US Equity", "DRI US Equity", "VFC US Equity", "POOL US Equity", "UAL US Equity", "MGM US Equity", "NVR US Equity", "CZR US Equity", "LYV US Equity", "BBWI US Equity", "KMX US Equity", "CCL US Equity", "LKQ US Equity", "AAP US Equity", "DPZ US Equity", "LVS US Equity", "AAL US Equity", "HAS US Equity", "WHR US Equity", "PHM US Equity", "BWA US Equity", "NWL US Equity", "TPR US Equity", "NCLH US Equity", "WYNN US Equity", "ALK US Equity", "PENN US Equity", "PVH US Equity", "RL US Equity", "UAA US Equity", "UA US Equity")
Consumer_NonCyclical_Tickers <- c("UNH US Equity", "JNJ US Equity", "PG US Equity", "PFE US Equity", "ABBV US Equity", "KO US Equity", "PEP US Equity", "LLY US Equity", "MRK US Equity", "TMO US Equity", "ABT US Equity", "BMY US Equity", "DHR US Equity", "PM US Equity", "MDT US Equity", "SPGI US Equity", "AMGN US Equity", "CVS US Equity", "ANTM US Equity", "PYPL US Equity", "MO US Equity", "ADP US Equity", "MDLZ US Equity", "ISRG US Equity", "ZTS US Equity", "SYK US Equity", "CI US Equity", "GILD US Equity", "BDX US Equity", "REGN US Equity", "VRTX US Equity", "EW US Equity", "CL US Equity", "EL US Equity", "BSX US Equity", "HUM US Equity", "HCA US Equity", "MCO US Equity", "ADM US Equity", "MRNA US Equity", "CNC US Equity", "KMB US Equity", "MCK US Equity", "ILMN US Equity", "SYY US Equity", "GIS US Equity", "CTVA US Equity", "IQV US Equity", "STZ US Equity", "DXCM US Equity", "GPN US Equity", "IDXX US Equity", "KR US Equity", "BAX US Equity", "CTAS US Equity", "VRSK US Equity", "HSY US Equity", "MNST US Equity", "BIIB US Equity", "KHC US Equity", "RMD US Equity", "TSN US Equity", "ZBH US Equity", "MKC US Equity", "EFX US Equity", "IT US Equity", "CHD US Equity", "WST US Equity", "URI US Equity", "ABC US Equity", "STE US Equity", "LH US Equity", "ALGN US Equity", "FLT US Equity", "WAT US Equity", "PKI US Equity", "MOH US Equity", "HOLX US Equity", "COO US Equity", "CLX US Equity", "K US Equity", "CAG US Equity", "PWR US Equity", "CAH US Equity", "CTLT US Equity", "DGX US Equity", "AVY US Equity", "SJM US Equity", "HRL US Equity", "TECH US Equity", "INCY US Equity", "TFX US Equity", "ABMD US Equity", "VTRS US Equity", "BF/B US Equity", "CRL US Equity", "HSIC US Equity", "RHI US Equity", "BIO US Equity", "TAP US Equity", "MKTX US Equity", "NLSN US Equity", "CPB US Equity", "LW US Equity", "UHS US Equity", "XRAY US Equity", "OGN US Equity", "ROL US Equity", "DVA US Equity", "EMBC US Equity")
Energy_Tickers <- c("XOM US Equity", "CVX US Equity", "COP US Equity", "EOG US Equity", "SLB US Equity", "PXD US Equity", "MPC US Equity", "OXY US Equity", "VLO US Equity", "WMB US Equity", "PSX US Equity", "DVN US Equity", "KMI US Equity", "HAL US Equity", "HES US Equity", "OKE US Equity", "BKR US Equity", "CTRA US Equity", "ENPH US Equity", "FANG US Equity", "MRO US Equity", "APA US Equity", "SEDG US Equity")
Financial_Tickers <- c("BRK/B US Equity", "V US Equity", "JPM US Equity", "MA US Equity", "BAC US Equity", "WFC US Equity", "PLD US Equity", "MS US Equity", "AMT US Equity", "AXP US Equity", "GS US Equity", "SCHW US Equity", "C US Equity", "BLK US Equity", "CB US Equity", "MMC US Equity", "CCI US Equity", "CME US Equity", "PNC US Equity", "USB US Equity", "ICE US Equity", "EQIX US Equity", "TFC US Equity", "PGR US Equity", "AON US Equity", "PSA US Equity", "COF US Equity", "AIG US Equity", "MET US Equity", "DLR US Equity", "TRV US Equity", "PRU US Equity", "WELL US Equity", "O US Equity", "SPG US Equity", "SBAC US Equity", "ALL US Equity", "AJG US Equity", "AFL US Equity", "DFS US Equity", "AVB US Equity", "BK US Equity", "WY US Equity", "MTB US Equity", "AMP US Equity", "SIVB US Equity", "TROW US Equity", "CBRE US Equity", "EQR US Equity", "FRC US Equity", "ARE US Equity", "WTW US Equity", "FITB US Equity", "EXR US Equity", "STT US Equity", "HIG US Equity", "MAA US Equity", "VTR US Equity", "NTRS US Equity", "ESS US Equity", "DRE US Equity", "RF US Equity", "CFG US Equity", "SYF US Equity", "HBAN US Equity", "CINF US Equity", "NDAQ US Equity", "RJF US Equity", "KEY US Equity", "PEAK US Equity", "BXP US Equity", "PFG US Equity", "CPT US Equity", "UDR US Equity", "KIM US Equity", "IRM US Equity", "SBNY US Equity", "BRO US Equity", "HST US Equity", "WRB US Equity", "L US Equity", "CBOE US Equity", "CMA US Equity", "RE US Equity", "REG US Equity", "AIZ US Equity", "LNC US Equity", "GL US Equity", "ZION US Equity", "FRT US Equity", "BEN US Equity", "IVZ US Equity", "VNO US Equity")
Industrial_Tickers <- c("UNP US Equity", "RTX US Equity", "HON US Equity", "UPS US Equity", "CAT US Equity", "DE US Equity", "LMT US Equity", "MMM US Equity", "GE US Equity", "BA US Equity", "CSX US Equity", "NOC US Equity", "WM US Equity", "NSC US Equity", "ETN US Equity", "ITW US Equity", "GD US Equity", "EMR US Equity", "FDX US Equity", "LHX US Equity", "APH US Equity", "JCI US Equity", "TEL US Equity", "A US Equity", "PH US Equity", "CARR US Equity", "TT US Equity", "TDG US Equity", "OTIS US Equity", "MTD US Equity", "ROK US Equity", "AME US Equity", "RSG US Equity", "BLL US Equity", "ODFL US Equity", "KEYS US Equity", "VMC US Equity", "MLM US Equity", "FTV US Equity", "TDY US Equity", "SWK US Equity", "DOV US Equity", "AMCR US Equity", "J US Equity", "IR US Equity", "WAB US Equity", "EXPD US Equity", "TRMB US Equity", "GRMN US Equity", "PKG US Equity", "TXT US Equity", "XYL US Equity", "IEX US Equity", "JBHT US Equity", "CHRW US Equity", "GNRC US Equity", "HWM US Equity", "WRK US Equity", "MAS US Equity", "NDSN US Equity", "SNA US Equity", "ALLE US Equity", "FBHS US Equity", "SEE US Equity", "HII US Equity", "PNR US Equity", "MHK US Equity", "AOS US Equity", "VNT US Equity")
Technology_Tickers <- c("AAPL US Equity", "MSFT US Equity", "NVDA US Equity", "AVGO US Equity", "ACN US Equity", "ADBE US Equity", "INTC US Equity", "CRM US Equity", "QCOM US Equity", "TXN US Equity", "AMD US Equity", "INTU US Equity", "IBM US Equity", "ORCL US Equity", "AMAT US Equity", "NOW US Equity", "ADI US Equity", "MU US Equity", "LRCX US Equity", "FIS US Equity", "ATVI US Equity", "FISV US Equity", "ROP US Equity", "KLAC US Equity", "NXPI US Equity", "SNPS US Equity", "CTSH US Equity", "CDNS US Equity", "ADSK US Equity", "PAYX US Equity", "HPQ US Equity", "FTNT US Equity", "MCHP US Equity", "MSCI US Equity", "EA US Equity", "CERN US Equity", "ANSS US Equity", "HPE US Equity", "ZBRA US Equity", "SWKS US Equity", "AKAM US Equity", "TER US Equity", "MPWR US Equity", "BR US Equity", "WDC US Equity", "STX US Equity", "NTAP US Equity", "TYL US Equity", "EPAM US Equity", "LDOS US Equity", "JKHY US Equity", "TTWO US Equity", "PAYC US Equity", "CTXS US Equity", "QRVO US Equity", "PTC US Equity", "CDAY US Equity", "DXC US Equity", "IPGP US Equity")
Utilities_Tickers <- c("NEE US Equity", "DUK US Equity", "SO US Equity", "D US Equity", "SRE US Equity", "AEP US Equity", "EXC US Equity", "XEL US Equity", "PEG US Equity", "ED US Equity", "WEC US Equity", "ES US Equity", "AWK US Equity", "EIX US Equity", "DTE US Equity", "FE US Equity", "AEE US Equity", "ETR US Equity", "PPL US Equity", "CMS US Equity", "CEG US Equity", "CNP US Equity", "EVRG US Equity", "ATO US Equity", "LNT US Equity", "AES US Equity", "NI US Equity", "NRG US Equity", "PNW US Equity")
SPY_Tickers <- c("SPY US EQUITY", "SPY US EQUITY")
#fields needed
fieldRets <- "PX_last"
dateStart <- as.Date("2021-01-01")
dateEnd <- as.Date("2022-05-02")
#Get Prices
SPY_Prices <- bdh(SPY_Tickers, fieldRets,
                             start.date = dateStart,
                             end.date = dateEnd,
                             options = c("currency"="USD"))
SPY_Prices <- lapply(SPY_Prices, function(d) xts(d[,-1], order.by=as.Date(d[,1])))
SPY_Prices <- do.call(merge, SPY_Prices) 
SPY_Prices <- SPY_Prices[,1]

Basic_Material_Prices <- bdh(Basic_Material_Tickers, fieldRets,
                             start.date = dateStart,
                             end.date = dateEnd,
                             options = c("currency"="USD"))
Basic_Material_Prices <- lapply(Basic_Material_Prices, function(d) xts(d[,-1], order.by=as.Date(d[,1])))
Basic_Material_Prices <- do.call(merge, Basic_Material_Prices) 
Basic_Material_Prices[is.na(Basic_Material_Prices)] <- 0

Communications_Prices <- bdh(Communications_Tickers, fieldRets,
                             start.date = dateStart,
                             end.date = dateEnd,
                             options = c("currency"="USD"))
Communications_Prices <- lapply(Communications_Prices, function(d) xts(d[,-1], order.by=as.Date(d[,1])))
Communications_Prices <- do.call(merge, Communications_Prices)
Communications_Prices[is.na(Communications_Prices)] <- 0
                                 
                            
Consumer_Cyclical_Prices <- bdh(Consumer_Cyclical_Tickers, fieldRets,
                                start.date = dateStart,
                                end.date = dateEnd,
                                options = c("currency"="USD"))
Consumer_Cyclical_Prices <- lapply(Consumer_Cyclical_Prices, function(d) xts(d[,-1], order.by=as.Date(d[,1])))
Consumer_Cyclical_Prices <- do.call(merge, Consumer_Cyclical_Prices)
Consumer_Cyclical_Prices[is.na(Consumer_Cyclical_Prices)] <- 0


Consumer_NonCyclical_Prices <- bdh(Consumer_NonCyclical_Tickers, fieldRets,
                                   start.date = dateStart,
                                   end.date = dateEnd,
                                   options = c("currency"="USD"))
Consumer_NonCyclical_Prices <- lapply(Consumer_NonCyclical_Prices, function(d) xts(d[,-1], order.by=as.Date(d[,1])))
Consumer_NonCyclical_Prices <- do.call(merge, Consumer_NonCyclical_Prices)
Consumer_NonCyclical_Prices[is.na(Consumer_NonCyclical_Prices)] <- 0


Energy_Prices <- bdh(Energy_Tickers, fieldRets,
                     start.date = dateStart,
                     end.date = dateEnd,
                     options = c("currency"="USD"))
Energy_Prices <- lapply(Energy_Prices, function(d) xts(d[,-1], order.by=as.Date(d[,1])))
Energy_Prices <- do.call(merge, Energy_Prices)
Energy_Prices[is.na(Energy_Prices)] <- 0


Financial_Prices <- bdh(Financial_Tickers, fieldRets,
                        start.date = dateStart,
                        end.date = dateEnd,
                        options = c("currency"="USD"))
Financial_Prices <- lapply(Financial_Prices, function(d) xts(d[,-1], order.by=as.Date(d[,1])))
Financial_Prices <- do.call(merge, Financial_Prices)
Financial_Prices[is.na(Financial_Prices)] <- 0


Industrial_Prices <- bdh(Industrial_Tickers, fieldRets,
                         start.date = dateStart,
                         end.date = dateEnd,
                         options = c("currency"="USD"))
Industrial_Prices <- lapply(Industrial_Prices, function(d) xts(d[,-1], order.by=as.Date(d[,1])))
Industrial_Prices <- do.call(merge, Industrial_Prices)
Industrial_Prices[is.na(Industrial_Prices)] <- 0


Technology_Prices <- bdh(Technology_Tickers, fieldRets,
                         start.date = dateStart,
                         end.date = dateEnd,
                         options = c("currency"="USD"))
Technology_Prices <- lapply(Technology_Prices, function(d) xts(d[,-1], order.by=as.Date(d[,1])))
Technology_Prices <- do.call(merge, Technology_Prices)
Technology_Prices[is.na(Technology_Prices)] <- 0


Utilities_Prices <- bdh(Utilities_Tickers, fieldRets,
                        start.date = dateStart,
                        end.date = dateEnd,
                        options = c("currency"="USD"))
Utilities_Prices <- lapply(Utilities_Prices, function(d) xts(d[,-1], order.by=as.Date(d[,1])))
Utilities_Prices <- do.call(merge, Utilities_Prices)
Utilities_Prices[is.na(Utilities_Prices)] <- 0
#Get Returns
Basic_Material_Returns <- ROC(Basic_Material_Prices)
Basic_Material_Returns[is.na(Basic_Material_Returns)] <- 0

Communications_Returns <- ROC(Communications_Prices)
Communications_Returns[is.na(Communications_Returns)] <- 0

Consumer_Cyclical_Returns <- ROC(Consumer_Cyclical_Prices)
Consumer_Cyclical_Returns[is.na(Consumer_Cyclical_Returns)] <- 0

Consumer_NonCyclical_Returns <- ROC(Consumer_NonCyclical_Prices)
Consumer_NonCyclical_Returns[is.na(Consumer_NonCyclical_Returns)] <- 0

Energy_Returns <- ROC(Energy_Prices)
Energy_Returns[is.na(Energy_Returns)] <- 0

Financial_Returns  <- ROC(Financial_Prices)
Financial_Returns[is.na(Financial_Returns)] <- 0

Industrial_Returns <- ROC(Industrial_Prices)
Industrial_Returns[is.na(Industrial_Returns)] <- 0

Technology_Returns <- ROC(Technology_Prices)
Technology_Returns[is.na(Technology_Returns)] <- 0

Utilities_Returns <- ROC(Utilities_Prices)
Utilities_Returns[is.na(Communications_Returns)] <- 0

SPY_Returns <- ROC(SPY_Prices)
SPY_Returns[is.na(Communications_Returns)] <- 0
names(SPY_Returns) <- "S&P 500"

Create Portfolios Equal and Rebalanced

#Basic Materials
Equal_Weight_BM <- rep(1 / ncol(Basic_Material_Prices), ncol(Basic_Material_Prices))
BM_Benchmark_Portfolio <- Return.portfolio(Basic_Material_Returns, Equal_Weight_BM)

Portt_BM <- portfolio.spec(names(Basic_Material_Returns))
Portt_BM <- add.constraint(Portt_BM,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt_BM <- add.constraint(Portt_BM, type = "long_only")
Portt_BM <- add.constraint(Portt_BM, type = "box", min = 0.001, max = .3)
Portt_BM <- add.objective(Portt_BM, type = "return", name = "mean")

rp_BM <- random_portfolios(Portt_BM, 1000000, "simplex")
opt_rebal_BM <- optimize.portfolio.rebalancing(Basic_Material_Returns,
                                               Portt_BM,
                                               optimize_method = "DEoptim",
                                               rp = rp_BM,
                                               rebalance_on = "months",
                                               training_period = 2,
                                               rolling_window = 3)

RebalanceWeights_BM <- extractWeights(opt_rebal_BM)
rebal_returns_BM <- Return.portfolio(Basic_Material_Returns, weights = RebalanceWeights_BM)
## Warning 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
names(rebal_returns_BM) <- "Rebalanced Basic Materials Portfolio"
names(BM_Benchmark_Portfolio) <- "Equal Weight Basic Materials Portfolio"
Rebal_VS_reg <- cbind(rebal_returns_BM, BM_Benchmark_Portfolio, SPY_Returns)
Rebal_VS_reg[!is.finite(Rebal_VS_reg)] <- NA
Rebal_VS_reg <- na.omit(Rebal_VS_reg)
charts.PerformanceSummary(Rebal_VS_reg)

chart.Weights(opt_rebal_BM)

colSums(Rebal_VS_reg)
##   Rebalanced.Basic.Materials.Portfolio Equal.Weight.Basic.Materials.Portfolio 
##                              0.4819920                              0.2522564 
##                                S.P.500 
##                              0.1133325
#Optimize Communications
Equal_Weight_Communications <- rep(1 / ncol(Communications_Prices), ncol(Communications_Prices))
Communications_Benchmark_Portfolio <- Return.portfolio(Communications_Prices,
                                                      weights = Equal_Weight_Communications)
Portt_COMM <- portfolio.spec(names(Communications_Returns))
Portt_COMM <- add.constraint(Portt_COMM,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt_COMM <- add.constraint(Portt_COMM, type = "long_only")
Portt_COMM <- add.constraint(Portt_COMM, type = "box", min = 0.001, max = .3)
Portt_COMM <- add.objective(Portt_COMM, type = "return", name = "mean")

rp_COMM <- random_portfolios(Portt_COMM, 1000000, "simplex")
opt_rebal_COMM <- optimize.portfolio.rebalancing(Communications_Returns,
                                               Portt_COMM,
                                               optimize_method = "DEoptim",
                                               rp = rp_COMM,
                                               rebalance_on = "months",
                                               training_period = 2,
                                               rolling_window = 3)

RebalanceWeights_COMM <- extractWeights(opt_rebal_COMM)
rebal_returns_COMM <- Return.portfolio(Communications_Returns, weights = RebalanceWeights_COMM)
## Warning 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
names(rebal_returns_COMM) <- "Rebalanced Communications Portfolio"
names(Communications_Benchmark_Portfolio) <- "Equal Weight Communications Portfolio"
Rebal_COMM_VS_reg <- cbind(rebal_returns_COMM, BM_Benchmark_Portfolio, SPY_Returns)
Rebal_COMM_VS_reg[!is.finite(Rebal_COMM_VS_reg)] <- NA
Rebal_COMM_VS_reg <- na.omit(Rebal_COMM_VS_reg)
charts.PerformanceSummary(Rebal_COMM_VS_reg)

chart.Weights(opt_rebal_BM)

colSums(Rebal_COMM_VS_reg)
##    Rebalanced.Communications.Portfolio Equal.Weight.Basic.Materials.Portfolio 
##                            -0.03513008                             0.30464569 
##                                S.P.500 
##                             0.20202333
#consumer Cyclical Optimization
Equal_Weight_Consumer_Cyclical <- rep(1 / ncol(Consumer_Cyclical_Prices), ncol(Consumer_Cyclical_Prices))
Consumer_Cyclical_Benchmark_Portfolio <- Return.portfolio(Consumer_Cyclical_Returns,
                                                       weights = Equal_Weight_Consumer_Cyclical)
Portt_Consumer_Cyclical <- portfolio.spec(names(Consumer_Cyclical_Returns))
Portt_Consumer_Cyclical <- add.constraint(Portt_Consumer_Cyclical,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt_Consumer_Cyclical <- add.constraint(Portt_Consumer_Cyclical, type = "long_only")
Portt_Consumer_Cyclical <- add.constraint(Portt_Consumer_Cyclical, type = "box", min = 0.001, max = .3)
Portt_Consumer_Cyclical <- add.objective(Portt_Consumer_Cyclical, type = "return", name = "mean")

rp_Consumer_Cyclical <- random_portfolios(Portt_Consumer_Cyclical, 1000000, "simplex")
opt_rebal_Consumer_Cyclical <- optimize.portfolio.rebalancing(Consumer_Cyclical_Returns,
                                                 Portt_Consumer_Cyclical,
                                                 optimize_method = "DEoptim",
                                                 rp = rp_Consumer_Cyclical,
                                                 rebalance_on = "months",
                                                 training_period = 2,
                                                 rolling_window = 3)
RebalanceWeights_Consumer_Cyclical <- extractWeights(opt_rebal_Consumer_Cyclical)
rebal_returns_Consumer_Cyclical <- Return.portfolio(Consumer_Cyclical_Returns, weights = RebalanceWeights_Consumer_Cyclical)
## Warning 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
names(rebal_returns_Consumer_Cyclical) <- "Rebalanced Consumer Cyclical Portfolio"
names(Consumer_Cyclical_Benchmark_Portfolio) <- "Equal Weight Consumer Cyclical Portfolio"
Rebal_ConsumerCyclical_VS_reg <- cbind(rebal_returns_Consumer_Cyclical, Consumer_Cyclical_Benchmark_Portfolio, SPY_Returns)
Rebal_ConsumerCyclical_VS_reg[!is.finite(Rebal_ConsumerCyclical_VS_reg)] <- NA
Rebal_ConsumerCyclical_VS_reg <- na.omit(Rebal_ConsumerCyclical_VS_reg)
charts.PerformanceSummary(Rebal_ConsumerCyclical_VS_reg)

chart.Weights(opt_rebal_Consumer_Cyclical)

colSums(Rebal_ConsumerCyclical_VS_reg)
##   Rebalanced.Consumer.Cyclical.Portfolio 
##                               0.04223191 
## Equal.Weight.Consumer.Cyclical.Portfolio 
##                               0.04083051 
##                                  S.P.500 
##                               0.11333255
#Consumer NonCyclical Optimization
Equal_Weight_Consumer_NonCyclical <- rep(1 / ncol(Consumer_NonCyclical_Prices), ncol(Consumer_NonCyclical_Prices))
Consumer_NonCyclical_Benchmark_Portfolio <- Return.portfolio(Consumer_NonCyclical_Returns,
                                                          weights = Equal_Weight_Consumer_NonCyclical)
Portt_Consumer_NonCyclical <- portfolio.spec(names(Consumer_NonCyclical_Returns))
Portt_Consumer_NonCyclical <- add.constraint(Portt_Consumer_NonCyclical,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt_Consumer_NonCyclical <- add.constraint(Portt_Consumer_NonCyclical, type = "long_only")
Portt_Consumer_NonCyclical <- add.constraint(Portt_Consumer_NonCyclical, type = "box", min = 0.001, max = .30)
Portt_Consumer_NonCyclical <- add.objective(Portt_Consumer_NonCyclical, type = "return", name = "mean")

rp_Consumer_NonCyclical <- random_portfolios(Portt_Consumer_NonCyclical, 1000000, "simplex")

opt_rebal_Consumer_NonCyclical <- optimize.portfolio.rebalancing(Consumer_NonCyclical_Returns,
                                                              Portt_Consumer_NonCyclical,
                                                              optimize_method = "DEoptim",
                                                              rp = rp_Consumer_NonCyclical,
                                                              rebalance_on = "months",
                                                              training_period = 6,
                                                              rolling_window = 3)

RebalanceWeights_Consumer_NonCyclical <- extractWeights(opt_rebal_Consumer_NonCyclical)
rebal_returns_Consumer_NonCyclical <- Return.portfolio(Consumer_NonCyclical_Returns, weights = RebalanceWeights_Consumer_NonCyclical)
## Warning 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
names(rebal_returns_Consumer_NonCyclical) <- "Rebalanced Consumer NonCyclical Portfolio"
names(Consumer_NonCyclical_Benchmark_Portfolio) <- "Equal Weight Consumer NonCyclical Portfolio"
Rebal_ConsumerNonCyclical_VS_reg <- cbind(rebal_returns_Consumer_NonCyclical, Consumer_NonCyclical_Benchmark_Portfolio, SPY_Returns)
Rebal_ConsumerNonCyclical_VS_reg[!is.finite(Rebal_ConsumerNonCyclical_VS_reg)] <- NA
Rebal_ConsumerNonCyclical_VS_reg <- na.omit(Rebal_ConsumerNonCyclical_VS_reg)
charts.PerformanceSummary(Rebal_ConsumerNonCyclical_VS_reg)

chart.Weights(opt_rebal_Consumer_NonCyclical)

#Energy Optimization
Equal_Weight_Energy <- rep(1 / ncol(Energy_Prices), ncol(Energy_Prices))
Energy_Benchmark_Portfolio <- Return.portfolio(Energy_Returns,
                                                          weights = Equal_Weight_Energy)
Portt_Energy <- portfolio.spec(names(Energy_Returns))
Portt_Energy <- add.constraint(Portt_Energy,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt_Energy <- add.constraint(Portt_Energy, type = "long_only")
Portt_Energy <- add.constraint(Portt_Energy, type = "box", min = 0.001, max = .3)
Portt_Energy <- add.objective(Portt_Energy, type = "return", name = "mean")

rp_Energy <- random_portfolios(Portt_Energy, 1000000, "simplex")
opt_rebal_Energy <- optimize.portfolio.rebalancing(Energy_Returns,
                                                                 Portt_Energy,
                                                                 optimize_method = "DEoptim",
                                                                 rp = rp_Energy,
                                                                 rebalance_on = "months",
                                                                 training_period = 2,
                                                                   rolling_window = 3)
RebalanceWeights_Energy <- extractWeights(opt_rebal_Energy)
rebal_returns_Energy <- Return.portfolio(Energy_Returns,
                                                       weights = RebalanceWeights_Energy)
## Warning 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
names(rebal_returns_Energy) <- "Rebalanced Energy Portfolio"
names(Energy_Benchmark_Portfolio) <- "Equal Weight Energy Portfolio"
Rebal_Energy_VS_reg <- cbind(rebal_returns_Energy, Energy_Benchmark_Portfolio, SPY_Returns)
Rebal_Energy_VS_reg[!is.finite(Rebal_Energy_VS_reg)] <- NA
Rebal_Energy_VS_reg <- na.omit(Rebal_Energy_VS_reg)
charts.PerformanceSummary(Rebal_Energy_VS_reg)

chart.Weights(opt_rebal_Energy)

#Financial Optimization
Equal_Weight_Financial <- rep(1 / ncol(Financial_Prices), ncol(Financial_Prices))
Financial_Benchmark_Portfolio <- Return.portfolio(Financial_Returns,
                                               weights = Equal_Weight_Financial)
Portt_Financial <- portfolio.spec(names(Financial_Returns))
Portt_Financial <- add.constraint(Portt_Financial,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt_Financial <- add.constraint(Portt_Financial, type = "long_only")
Portt_Financial <- add.constraint(Portt_Financial, type = "box", min = 0.001, max = .3)
Portt_Financial <- add.objective(Portt_Financial, type = "return", name = "mean")

rp_Financial <- random_portfolios(Portt_Financial, 1000000, "simplex")
opt_rebal_Financial <- optimize.portfolio.rebalancing(Financial_Returns,
                                                   Portt_Financial,
                                                   optimize_method = "DEoptim",
                                                   rp = rp_Financial,
                                                   rebalance_on = "months",
                                                   training_period = 2,
                                                   rolling_window = 3)
RebalanceWeights_Financial <- extractWeights(opt_rebal_Financial)
rebal_returns_Financial <- Return.portfolio(Financial_Returns,
                                         weights = RebalanceWeights_Financial)
## Warning 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
names(rebal_returns_Financial) <- "Rebalanced Financial Portfolio"
names(Financial_Benchmark_Portfolio) <- "Equal Weight Financial Portfolio"
Rebal_Financial_VS_reg <- cbind(rebal_returns_Financial, Financial_Benchmark_Portfolio, SPY_Returns)
Rebal_Financial_VS_reg[!is.finite(Rebal_Financial_VS_reg)] <- NA
Rebal_Financial_VS_reg <- na.omit(Rebal_Financial_VS_reg)
sum(Rebal_Financial_VS_reg$Rebalanced.Financial.Portfolio)
## [1] 0.114486
sum(Rebal_Financial_VS_reg$Equal.Weight.Financial.Portfolio)
## [1] 0.2017364
charts.PerformanceSummary(Rebal_Financial_VS_reg)

chart.Weights(opt_rebal_Financial)

#Industrial Optimization
Equal_Weight_Industrial <- rep(1 / ncol(Industrial_Prices), ncol(Industrial_Prices))
Industrial_Benchmark_Portfolio <- Return.portfolio(Industrial_Returns,
                                                  weights = Equal_Weight_Industrial)
Portt_Industrial <- portfolio.spec(names(Industrial_Returns))
Portt_Industrial <- add.constraint(Portt_Industrial,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt_Industrial <- add.constraint(Portt_Industrial, type = "long_only")
Portt_Industrial <- add.constraint(Portt_Industrial, type = "box", min = 0.001, max = .3)
Portt_Industrial <- add.objective(Portt_Industrial, type = "return", name = "mean")

rp_Industrial <- random_portfolios(Portt_Industrial, 1000000, "simplex")
opt_rebal_Industrial <- optimize.portfolio.rebalancing(Industrial_Returns,
                                                       Portt_Industrial,
                                                      optimize_method = "DEoptim",
                                                      rp = rp_Industrial,
                                                      rebalance_on = "months",
                                                      training_period = 2,
                                                      rolling_window = 3)
RebalanceWeights_Industrial <- extractWeights(opt_rebal_Industrial)
rebal_returns_Industrial <- Return.portfolio(Industrial_Returns,
                                            weights = RebalanceWeights_Industrial)
## Warning 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
names(rebal_returns_Industrial) <- "Rebalanced Industrial Portfolio"
names(Industrial_Benchmark_Portfolio) <- "Equal Weight Industrial Portfolio"
Rebal_Industrial_VS_reg <- cbind(rebal_returns_Industrial, Industrial_Benchmark_Portfolio, SPY_Returns)
Rebal_Industrial_VS_reg[!is.finite(Rebal_Industrial_VS_reg)] <- NA
Rebal_Industrial_VS_reg <- na.omit(Rebal_Industrial_VS_reg)
charts.PerformanceSummary(Rebal_Industrial_VS_reg)

chart.Weights(opt_rebal_Industrial)

#Technology Optimization
Equal_Weight_Tech <- rep(1 / ncol(Technology_Prices), ncol(Technology_Prices))
Tech_Benchmark_Portfolio <- Return.portfolio(Technology_Returns,
                                                   weights = Equal_Weight_Tech)
Portt_Tech <- portfolio.spec(names(Technology_Returns))
Portt_Tech <- add.constraint(Portt_Tech,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt_Tech <- add.constraint(Portt_Tech, type = "long_only")
Portt_Tech <- add.constraint(Portt_Tech, type = "box", min = 0.001, max = .3)
Portt_Tech <- add.objective(Portt_Tech, type = "return", name = "mean")

rp_Tech <- random_portfolios(Portt_Tech, 1000000, "simplex")
opt_rebal_Tech <- optimize.portfolio.rebalancing(Technology_Returns,
                                                       Portt_Tech,
                                                       optimize_method = "DEoptim",
                                                       rp = rp_Tech,
                                                       rebalance_on = "months",
                                                       training_period = 2,
                                                       rolling_window = 3)
RebalanceWeights_Tech <- extractWeights(opt_rebal_Tech)
rebal_returns_Tech <- Return.portfolio(Industrial_Returns,
                                             weights = RebalanceWeights_Tech)
## Warning in Return.portfolio(Industrial_Returns, weights =
## RebalanceWeights_Tech): number of assets in beginning_weights is less than
## number of columns in returns, so subsetting returns.
## Warning 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
names(rebal_returns_Tech) <- "Rebalanced Technology Portfolio"
names(Tech_Benchmark_Portfolio) <- "Equal Weight Technology Portfolio"
Rebal_Tech_VS_reg <- cbind(rebal_returns_Tech, Tech_Benchmark_Portfolio, SPY_Returns)
Rebal_Tech_VS_reg[!is.finite(Rebal_Tech_VS_reg)] <- NA
Rebal_Tech_VS_reg <- na.omit(Rebal_Tech_VS_reg)
charts.PerformanceSummary(Rebal_Tech_VS_reg)

chart.Weights(opt_rebal_Tech)

#Utilities Optimization
Equal_Weight_Utilities <- rep(1 / ncol(Utilities_Prices), ncol(Utilities_Prices))
Utilities_Benchmark_Portfolio <- Return.portfolio(Utilities_Returns,
                                             weights = Equal_Weight_Utilities)
## Warning in Return.portfolio(Utilities_Returns, weights =
## Equal_Weight_Utilities): NA's detected: filling NA's with zeros
Portt_Utilities <- portfolio.spec(names(Utilities_Returns))
Portt_Utilities <- add.constraint(Portt_Utilities,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt_Utilities <- add.constraint(Portt_Utilities, type = "long_only")
Portt_Utilities <- add.constraint(Portt_Utilities, type = "box", min = 0.001, max = .3)
Portt_Utilities <- add.objective(Portt_Utilities, type = "return", name = "mean")

rp_Utilities <- random_portfolios(Portt_Utilities, 1000000, "sample")
opt_rebal_Utilities <- optimize.portfolio.rebalancing(Utilities_Returns,
                                                 Portt_Utilities,
                                                 optimize_method = "random",
                                                 rp = rp_Utilities,
                                                 rebalance_on = "months",
                                                 training_period = 2,
                                                 rolling_window = 3)
RebalanceWeights_Utilities <- extractWeights(opt_rebal_Utilities)
rebal_returns_Utilities <- Return.portfolio(Utilities_Returns,
                                       weights = RebalanceWeights_Utilities)
## Warning in Return.portfolio(Utilities_Returns, weights =
## RebalanceWeights_Utilities): NA's detected: filling NA's with zeros
## Warning 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
names(rebal_returns_Utilities) <- "Rebalanced Utilities Portfolio"
names(Utilities_Benchmark_Portfolio) <- "Equal Weight Utilities Portfolio"
Rebal_Utilities_VS_reg <- cbind(rebal_returns_Utilities, Utilities_Benchmark_Portfolio, SPY_Returns)
Rebal_Utilities_VS_reg[!is.finite(Rebal_Utilities_VS_reg)] <- NA
Rebal_Utilities_VS_reg <- na.omit(Rebal_Utilities_VS_reg)
charts.PerformanceSummary(Rebal_Utilities_VS_reg)

chart.Weights(opt_rebal_Utilities)

#comparisons between equal and rebalanced

  #Basic Materials
sum(Rebal_VS_reg$Rebalanced.Basic.Materials.Portfolio)
## [1] 0.481992
sum(Rebal_VS_reg$Equal.Weight.Basic.Materials.Portfolio)
## [1] 0.2522564
  #Communications
sum(Rebal_COMM_VS_reg$Rebalanced.Communications.Portfolio)
## [1] -0.03513008
sum(Rebal_COMM_VS_reg$Equal.Weight.Basic.Materials.Portfolio)
## [1] 0.3046457
  #Consumer Cyclical
sum(Rebal_ConsumerCyclical_VS_reg$Rebalanced.Consumer.Cyclical.Portfolio)
## [1] 0.04223191
sum(Rebal_ConsumerCyclical_VS_reg$Equal.Weight.Consumer.Cyclical.Portfolio)
## [1] 0.04083051
  #Consumer NonCyclical
sum(Rebal_ConsumerNonCyclical_VS_reg$Rebalanced.Consumer.NonCyclical.Portfolio)
## [1] 0.09273022
sum(Rebal_ConsumerNonCyclical_VS_reg$Equal.Weight.Consumer.NonCyclical.Portfolio)
## [1] 0.08621858
  #Energy
sum(Rebal_Energy_VS_reg$Rebalanced.Energy.Portfolio)
## [1] 0.7234351
sum(Rebal_Energy_VS_reg$Equal.Weight.Energy.Portfolio)
## [1] 0.6491774
  #Financial
sum(Rebal_Financial_VS_reg$Rebalanced.Financial.Portfolio)
## [1] 0.114486
sum(Rebal_Financial_VS_reg$Equal.Weight.Financial.Portfolio)
## [1] 0.2017364
  #Industrial
sum(Rebal_Industrial_VS_reg$Rebalanced.Industrial.Portfolio)
## [1] 0.01600307
sum(Rebal_Industrial_VS_reg$Equal.Weight.Industrial.Portfolio)
## [1] 0.09931117
  #technology
sum(Rebal_Tech_VS_reg$Rebalanced.Technology.Portfolio)
## [1] 0.1213703
sum(Rebal_Tech_VS_reg$Equal.Weight.Technology.Portfolio)
## [1] -0.01843905
  #Utilities
sum(Rebal_Utilities_VS_reg$Rebalanced.Utilities.Portfolio)
## [1] 0.1097959
sum(Rebal_Utilities_VS_reg$Equal.Weight.Utilities.Portfolio)
## [1] 0.1045225
#Rebalanced Performance Portfolio
RebalPort <- cbind(Rebal_VS_reg$Rebalanced.Basic.Materials.Portfolio,
                  Rebal_COMM_VS_reg$Rebalanced.Communications.Portfolio,
                  Rebal_ConsumerCyclical_VS_reg$Rebalanced.Consumer.Cyclical.Portfolio,
                  Rebal_ConsumerNonCyclical_VS_reg$Rebalanced.Consumer.NonCyclical.Portfolio,
                  Rebal_Energy_VS_reg$Rebalanced.Energy.Portfolio,
                  Rebal_Financial_VS_reg$Rebalanced.Financial.Portfolio,
                  Rebal_Industrial_VS_reg$Rebalanced.Industrial.Portfolio,
                  Rebal_Tech_VS_reg$Rebalanced.Technology.Portfolio,
                  Rebal_Utilities_VS_reg$Rebalanced.Utilities.Portfolio)

Equal_Weight_Rebal_Port <- rep(1 / ncol(RebalPort), ncol(RebalPort))
BestPort_Benchmark_Portfolio <- Return.portfolio(RebalPort)
## Warning in Return.portfolio(RebalPort): NA's detected: filling NA's with zeros
Portt_RBP <- portfolio.spec(names(RebalPort))
Portt_RBP <- add.constraint(Portt_RBP,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt_RBP <- add.constraint(Portt_RBP, type = "long_only")
Portt_RBP <- add.constraint(Portt_RBP, type = "box", min = 0, max = .50)
Portt_RBP <- add.objective(Portt_RBP, type = "return", name = "mean")

rp_RBP <- random_portfolios(Portt_RBP, 1000000, "simplex")

opt_rebal_RBP <- optimize.portfolio.rebalancing(RebalPort,
                                               Portt_RBP,
                                               optimize_method = "DEoptim",
                                               rp = rp_RBP,
                                               rebalance_on = "months",
                                               training_period = 2,
                                               rolling_window = 3)

RebalanceWeights_RBP <- extractWeights(opt_rebal_RBP)

rebal_returns_RBP <- Return.portfolio(RebalPort, weights = RebalanceWeights_RBP)
## Warning in Return.portfolio(RebalPort, weights = RebalanceWeights_RBP): NA's
## detected: filling NA's with zeros
## Warning 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
names(rebal_returns_RBP) <- "Rebalanced Portfolio"
names(BestPort_Benchmark_Portfolio) <- "Equal Weight Rebal Portfolio"

Rebal_RBP_VS_reg <- cbind(rebal_returns_RBP, BestPort_Benchmark_Portfolio, SPY_Returns)
Rebal_RBP_VS_reg[!is.finite(Rebal_RBP_VS_reg)] <- NA
Rebal_RBP_VS_reg <- na.omit(Rebal_RBP_VS_reg)

charts.PerformanceSummary(Rebal_RBP_VS_reg)

chart.Weights(opt_rebal_RBP)

CAPM.beta(rebal_returns_RBP, SPY_Returns)
## [1] 0.667456
table(RebalanceWeights_RBP)
## RebalanceWeights_RBP
##                   0               0.002               0.004 0.00451532039756628 
##                  12                   5                   4                   1 
##               0.006               0.008                0.01               0.012 
##                   2                   3                   2                   3 
##               0.014               0.016               0.018                0.02 
##                   4                   1                   1                   3 
##               0.022               0.024               0.026  0.0291324803838506 
##                   3                   2                   1                   1 
##                0.03               0.032  0.0321760716910247  0.0326470946893096 
##                   1                   2                   1                   1 
##               0.034  0.0344619171188534               0.036               0.038 
##                   1                   1                   1                   2 
##                0.04  0.0418151248084297               0.042               0.044 
##                   4                   1                   2                   2 
##               0.046                0.05               0.054               0.056 
##                   2                   1                   1                   1 
##  0.0592615427202035                0.06               0.062               0.064 
##                   1                   2                   1                   1 
##  0.0654098414330211               0.068  0.0694722047501588                0.07 
##                   1                   1                   1                   1 
##   0.071735375836568               0.074               0.086               0.088 
##                   1                   1                   2                   1 
##                0.09               0.092  0.0944812487382145               0.098 
##                   1                   1                   1                   1 
##               0.102               0.104               0.116               0.118 
##                   1                   1                   1                   1 
##               0.128               0.136               0.138                0.14 
##                   1                   1                   2                   1 
##   0.141058071400039               0.144               0.148               0.152 
##                   1                   1                   1                   1 
##                0.16                0.17   0.172419916407423               0.176 
##                   1                   1                   1                   1 
##               0.178   0.182999893501607   0.186629881375585               0.188 
##                   1                   1                   1                   2 
##   0.190706373303354               0.194                 0.2               0.202 
##                   1                   1                   1                   1 
##               0.204               0.208                0.21               0.218 
##                   1                   1                   1                   1 
##               0.228                0.23               0.232               0.238 
##                   1                   2                   1                   1 
##               0.264               0.298               0.308               0.326 
##                   1                   1                   1                   1 
##                0.33               0.352               0.354               0.358 
##                   1                   1                   1                   1 
##               0.362               0.368               0.376                0.39 
##                   1                   1                   1                   1 
##               0.392                0.42               0.428                0.45 
##                   1                   1                   1                   1 
##               0.458               0.462               0.484 
##                   1                   1                   1