Example Code for Media and Entertainment

Code

#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)

Weights Charted

Code 2

#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]
    }
  }
}

Performance

#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

#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

#Create Rolling Standard Deviation 
ME_Sd <- rollapply(ME_Rebal_VS_reg, FUN = sd, width = window) %>%
  na.omit
ME_Sd <- round(ME_Sd, 6) * 100

24 Month Rolling Volatility

#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())

Convert Standard Deviation to a Data Frame for Graping

#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]

Standard Deviation Frequency Table

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")

Rolling Skew

#Create Rolling Skew 
ME_Skew <-
  rollapply(ME_Rebal_VS_reg, FUN = skewness, width = window) %>%
  na.omit()
ME_Skew <- round(ME_Skew, 4)

Rolling Skew Through Time

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())

Skew Frequency

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 Skew

#Create Rolling Kurtosis
ME_Kurtosis <- rollapply(ME_Rebal_VS_reg, FUN = kurtosis, width = window) %>%
  na.omit()
ME_Kurtosis <- round(ME_Kurtosis, 4)

Rolling Kurtosis Through Time

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())

Kurtosis Frequency

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")

Telecommunication Services

Weights Charted Through Time

Performance

Return Frequency

Rolling Volatility

Standard Deviation Frequency

24 Month Rolling Skew

Skew Frequency

24 Month Rolling Kurtosis

Kurtosis Frequency

Automobile and Components

Weight Charted Through Time

Performance

Return Frequency

Rolling Volatility

Standard Deviation Frequency

24 Month Rolling Skew

Skew Frequency

24 Month Rolling Kurtosis

Kurtosis Frequency

Consumer Durables and Apparel

Weight Charted Through Time

Performance

Return Frequency

Rolling Volatility

Standard Deviation Frequency

24 Month Rolling Skew

Skew Frequency

24 Month Rolling Kurtosis

Kurtosis Frequency

Retail