#Fields Needed
fieldRets <- "PX_last"
dateStart <- as.Date("2016-01-01")
dateEnd <- as.Date("2022-06-21")
window <- 24
#Pull Media and Entertainment Data from Bulk Data of Tickers and Weights
ME <- filter(Easy_SPY_Sectored_Out, GICS_INDUSTRY_GROUP_NAME=="Media & Entertainment")
ME['Weight'] <- ME$`True Weight`/sum(ME$`True Weight`)
ME <- ME[c(1,4)]
ME <- sort.data.frame(ME, by = "ID")
#Get Prices
ME_Prices <-
bdh(
ME$ID,
fieldRets,
start.date = dateStart,
end.date = dateEnd,
options = c("currency" = "USD")
)
ME_Prices <-
lapply(ME_Prices, function(d)
xts(d[, -1], order.by = as.Date(d[, 1])))
ME_Prices <- do.call(merge, ME_Prices)
ME_Prices[is.na(ME_Prices)] <- 0
#Get Returns
ME_Returns <- ROC(ME_Prices)
ME_Returns[is.na(ME_Returns)] <- 0
ME_Returns[!is.finite(ME_Returns)] <- NA
#Create Equal Weight Portfolio
ME_Equal_Weights <- rep(1 / ncol(ME_Returns), ncol(ME_Returns))
ME_Equal_Weight_Portfolio <-
Return.portfolio(ME_Returns, ME_Equal_Weights)
#Create Index Weighted Portfolio
ME_Base_Port <- Return.portfolio(ME_Returns, ME$Weight)
#Create Portfolio Constraints and Objectives
ME_Portt <- portfolio.spec(names(ME_Returns))
ME_Portt <-
add.constraint(ME_Portt,
type = "weight_sum",
min_sum = .98,
max_sum = 1.01)
ME_Portt <- add.constraint(ME_Portt, type = "long_only")
ME_Portt <-
add.constraint(ME_Portt,
type = "box",
min = 0.01,
max = .5)
ME_Portt <- add.objective(ME_Portt, type = "return", name = "mean")
#Create Random Portfolios for Optimization
ME_rp <- random_portfolios_v2(ME_Portt, 150, "simplex", TRUE)
#Know How Many Portfolios Were Created
ME_nrow <- nrow(ME_rp)
ME_nrow <- as.data.frame(ME_nrow)
#Rename Rows and Columns For Later Code
colnames(ME_nrow) <- "Media and Entertainment"
rownames(ME_nrow) <- "Number of Portfolio's"
#Find Optimal Portfolios Through Time
ME_opt_rebal <- optimize.portfolio.rebalancing(
ME_Returns,
ME_Portt,
optimize_method = "random",
rp = ME_rp,
rebalance_on = "months",
training_period = 6,
rolling_window = 6
)
#Get Rebalance Weights
ME_RebalanceWeights <- extractWeights(ME_opt_rebal)#Get Rebalanced Portfolio
ME_rebal_returns <-
Return.portfolio(ME_Returns, weights = ME_RebalanceWeights)
#Rename Column Names
names(ME_rebal_returns) <- "Rebalanced Portfolio"
names(ME_Equal_Weight_Portfolio) <- "Equal Weight Portfolio"
names(ME_Base_Port) <- "Index Weighted Portfolio"
#Bind Together Each Portfolio for Comparison
ME_Rebal_VS_reg <-
cbind(ME_rebal_returns,
ME_Equal_Weight_Portfolio,
ME_Base_Port,
SPY_Returns)
ME_Rebal_VS_reg[!is.finite(ME_Rebal_VS_reg)] <- NA
ME_Rebal_VS_reg <- na.omit(ME_Rebal_VS_reg)
#Create Cumulative Returns Through Time for Graphing
ME_CBIND_Cummalative <- cumsum(ME_Rebal_VS_reg)
#Get Tail of Cumulative Return For Later
ME_CBIND_Tail <- tail(ME_CBIND_Cummalative, 1)
ME_CBIND_Tail$S.P.500 <- NULL
ME_CBIND_Tail <- as.data.frame(ME_CBIND_Tail)
rownames(ME_CBIND_Tail) <- "Media Entertainment"
#Pull Highest Performing Portfolio from CBIND
if (max(ME_CBIND_Tail) == ME_CBIND_Tail$Rebalanced.Portfolio) {
ME_MAX <- ME_Rebal_VS_reg[, 1]
} else{
if (max(ME_CBIND_Tail) == ME_CBIND_Tail$Equal.Weight.Portfolio){
ME_MAX <- ME_Rebal_VS_reg[,2]
} else {
if (max(ME_CBIND_Tail) == ME_CBIND_Tail$Index.Weighted.Portfolio)
{
ME_MAX <- ME_Rebal_VS_reg[,3]
}
}
}#Chart Portfolio Performance Through Time
ME_Performance <- highchart(type = "stock") %>%
hc_add_series(ME_CBIND_Cummalative$Rebalanced.Portfolio, name = "Rebalanced") %>%
hc_add_series(ME_CBIND_Cummalative$Equal.Weight.Portfolio, name = "Equal Weight") %>%
hc_add_series(ME_CBIND_Cummalative$Index.Weighted.Portfolio, name = "Index Weights") %>%
hc_add_series(ME_CBIND_Cummalative$S.P.500, name = "S&P 500") %>%
hc_title(text = "Media and Entertainment Portfolio's") %>%
hc_legend(enabled = TRUE) %>%
hc_add_theme(hc_theme_538())#Return Frequency Table Charted
ME_R_Frequency <- hchart(density(ME_CBIND_Cummalative$Rebalanced.Portfolio),
type = "area",
name = "Rebalanced Portfolio") %>%
hc_add_theme(hc_theme_538()) %>%
hc_add_series(density(ME_CBIND_Cummalative$Equal.Weight.Portfolio),
type = "area",
name = "Equal Weight Portfolio") %>%
hc_add_series(density(ME_CBIND_Cummalative$Index.Weighted.Portfolio),
type = "area",
name = "Index Weighted Portfolio") %>%
hc_add_series(density(ME_CBIND_Cummalative$S.P.500), type = "area", name = "S&P 500") %>%
hc_title(text = "Return Frequency Table for Media and Entertainment Portfolio's")#Create Rolling Standard Deviation
ME_Sd <- rollapply(ME_Rebal_VS_reg, FUN = sd, width = window) %>%
na.omit
ME_Sd <- round(ME_Sd, 6) * 100#Chart 24 Month Rolling Volatility
ME_Volatility <- highchart(type = "stock") %>%
hc_title(text = "24 Month Rolling Volatility for Media and Entertainment Portfolio's") %>%
hc_add_series(ME_Sd$Rebalanced.Portfolio, name = "Rebalanced Portfolio") %>%
hc_add_series(ME_Sd$Equal.Weight.Portfolio, name = "Equal Weight Portfolio") %>%
hc_add_series(ME_Sd$Index.Weighted.Portfolio, name = "Index Weighted Portfolio") %>%
hc_add_series(ME_Sd$S.P.500, name = "S&P 500") %>%
hc_add_theme(hc_theme_538()) %>%
hc_yAxis(labels = list(format = "{value}%"),
opposite = FALSE) %>%
hc_navigator(enabled = FALSE) %>%
hc_scrollbar(enabled = FALSE) %>%
hc_exporting(enabled = TRUE) %>%
hc_legend(enabled = TRUE) %>%
hc_add_theme(hc_theme_538())#Change Standard Deviation Object to a Data Frame For Graphing
ME_Sd_df <- as.data.frame(ME_Sd)
ME_Sd_df <- rowid_to_column(ME_Sd_df)
ME_Sd_df <- ME_Sd_df[, -1]ME_SD_Frequency <- hchart(density(ME_Sd_df$Rebalanced.Portfolio),
type = "area",
name = "Rebalanced Portfolio") %>%
hc_add_theme(hc_theme_538()) %>%
hc_add_series(density(ME_Sd_df$Equal.Weight.Portfolio),
type = "area",
name = "Equal Weight Portfolio") %>%
hc_add_series(density(ME_Sd_df$Index.Weighted.Portfolio),
type = "area",
name = "Index Weighted Portfolio") %>%
hc_add_series(density(ME_Sd_df$S.P.500), type = "area", name = "S&P 500") %>%
hc_title(text = "Standard Deviation Frequency Table for Media and Entertainment Portfolio's")#Create Rolling Skew
ME_Skew <-
rollapply(ME_Rebal_VS_reg, FUN = skewness, width = window) %>%
na.omit()
ME_Skew <- round(ME_Skew, 4)ME_SK <- highchart(type = "stock") %>%
hc_title(text = "24 Month Rolling Skew for Media and Entertainment Portfolio's") %>%
hc_add_series(ME_Skew$Rebalanced.Portfolio, name = "Rebalanced Portfolio") %>%
hc_add_series(ME_Skew$Equal.Weight.Portfolio, name = "Equal Weight Portfolio") %>%
hc_add_series(ME_Skew$Index.Weighted.Portfolio, name = "Index Weighted Portfolio") %>%
hc_add_series(ME_Skew$S.P.500, name = "S&P 500") %>%
hc_add_theme(hc_theme_538()) %>%
hc_yAxis(labels = list(format = "{value}%"),
opposite = FALSE) %>%
hc_navigator(enabled = FALSE) %>%
hc_scrollbar(enabled = FALSE) %>%
hc_exporting(enabled = TRUE) %>%
hc_legend(enabled = TRUE) %>%
hc_add_theme(hc_theme_538())ME_SK_Frequency <- hchart(density(ME_Skew$Rebalanced.Portfolio),
type = "area",
name = "Rebalanced Portfolio") %>%
hc_add_theme(hc_theme_538()) %>%
hc_add_series(density(ME_Skew$Equal.Weight.Portfolio),
type = "area",
name = "Equal Weight Portfolio") %>%
hc_add_series(density(ME_Skew$Index.Weighted.Portfolio),
type = "area",
name = "Index Weighted Portfolio") %>%
hc_add_series(density(ME_Skew$S.P.500), type = "area", name = "S&P 500") %>%
hc_title(text = "Skew Frequency Table for Media and Entertainment Portfolio's")#Create Rolling Kurtosis
ME_Kurtosis <- rollapply(ME_Rebal_VS_reg, FUN = kurtosis, width = window) %>%
na.omit()
ME_Kurtosis <- round(ME_Kurtosis, 4)ME_K <- highchart(type = "stock") %>%
hc_title(text = "24 Month Rolling Kurtosis for Media and Entertainment Portfolio's") %>%
hc_add_series(ME_Kurtosis$Rebalanced.Portfolio, name = "Rebalanced Portfolio") %>%
hc_add_series(ME_Kurtosis$Equal.Weight.Portfolio, name = "Equal Weight Portfolio") %>%
hc_add_series(ME_Kurtosis$Index.Weighted.Portfolio, name = "Index Weighted Portfolio") %>%
hc_add_series(ME_Kurtosis$S.P.500, name = "S&P 500") %>%
hc_add_theme(hc_theme_538()) %>%
hc_yAxis(labels = list(format = "{value}%"),
opposite = FALSE) %>%
hc_navigator(enabled = FALSE) %>%
hc_scrollbar(enabled = FALSE) %>%
hc_exporting(enabled = TRUE) %>%
hc_legend(enabled = TRUE) %>%
hc_add_theme(hc_theme_538())ME_K_Frequency <- hchart(density(ME_Kurtosis$Rebalanced.Portfolio),
type = "area",
name = "Rebalanced Portfolio") %>%
hc_add_theme(hc_theme_538()) %>%
hc_add_series(density(ME_Kurtosis$Equal.Weight.Portfolio),
type = "area",
name = "Equal Weight Portfolio") %>%
hc_add_series(density(ME_Kurtosis$Index.Weighted.Portfolio),
type = "area",
name = "Index Weighted Portfolio") %>%
hc_add_series(density(ME_Kurtosis$S.P.500), type = "area", name = "S&P 500") %>%
hc_title(text = "Kurtosis Frequency Table for Media and Entertainment Portfolio's")