#get price data
fieldRets <- "PX_last"
dateStart <- as.Date("2022-01-15")
dateEnd <- as.Date("2022-04-15")

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

SPYprices <- NULL
for(ticker in SP500) {
  SPYprices <- cbind(SPYprices,
                     getSymbols(ticker, from = dateStart, to = dateEnd, periodicity = "daily", auto.assign=FALSE)[,4])
}
#get daily returns
PortReturns <- na.omit(ROC(PortPrices))
SPYreturns <- na.omit(ROC(SPYprices))
PortWeightedReturns <- Return.portfolio(PortReturns, weights = Weighttt)
#daily log returns
highchart(type = "stock") %>%
  hc_add_series(PortReturns$BOIL.US.EQUITY,
                name = "ProShares Ultra Bloomberg Natural Gas ETF") %>%
  hc_add_series(PortReturns$FNGU.US.EQUITY,
                name = "Microsectors FANG+ Index 3x") %>%
  hc_add_series(PortReturns$LHX.US.EQUITY,
                name = "L3 Harris Technologies") %>%
  hc_add_series(PortReturns$QYLD.US.EQUITY,
                name = "Global X Nasdaq 100 Covered Call ETF") %>%
  hc_add_series(PortReturns$TIP.US.EQUITY,
                name = "IShares TIPS Bond ETF") %>%
  hc_add_series(PortReturns$UCO.US.EQUITY,
                name = "ProShares Ultra Bloomberg Crude Oil") %>%
  hc_add_series(PortReturns$VXX.US.EQUITY,
                name = "IPath Series B S&P 500 VIX") %>%
  hc_add_theme(hc_theme_flat()) %>%
  hc_navigator(enabled = FALSE) %>%
  hc_scrollbar(enabled = FALSE) %>%
  hc_exporting(enabled = TRUE) %>%
  hc_legend(enabled = TRUE)
charts.PerformanceSummary(PortReturns, main ="P/L Over Time")

#Benchmark Portfolio
EqualWeight <- rep(1 / ncol(PortReturns), ncol(PortReturns))

EqualReturns <- Return.portfolio(PortReturns, weights = EqualWeight)
#Rebalance Portfolio
Portt <- portfolio.spec(names(PortReturns))

Portt <- add.constraint(Portt,type = "weight_sum", min_sum =.99, max_sum  = 1.01)
Portt <- add.constraint(Portt, type = "long_only")
Portt <- add.constraint(Portt, type = "box", min = 0.07, max = .40)
Portt <- add.objective(Portt, type = "return", name = "mean")
Portt <- add.objective(Portt, type = "risk", name = "StdDev")

OptimalPort <- optimize.portfolio(PortReturns, Portt, optimize_method = "ROI", trace = TRUE)
OptimalPort
## ***********************************
## PortfolioAnalytics Optimization
## ***********************************
## 
## Call:
## optimize.portfolio(R = PortReturns, portfolio = Portt, optimize_method = "ROI", 
##     trace = TRUE)
## 
## Optimal Weights:
## BOIL.US.EQUITY FNGU.US.EQUITY  LHX.US.EQUITY QYLD.US.EQUITY  TIP.US.EQUITY 
##           0.40           0.07           0.07           0.07           0.07 
##  UCO.US.EQUITY  VXX.US.EQUITY 
##           0.26           0.07 
## 
## Objective Measure:
##     mean 
## 0.008562 
## 
## 
##  StdDev 
## 0.03632
rp <- random_portfolios(Portt, 1000,"sample")

opt_rebal <- optimize.portfolio.rebalancing(PortReturns, Portt,optimize_method = "random", rp=rp, rebalance_on = "days",training_period = 3, rolling_window = 10)

chart.Weights(opt_rebal)

RebalanceWeights <- extractWeights(opt_rebal)

rebal_returns <- Return.portfolio(PortReturns, weights = RebalanceWeights)
#rename columns
names(PortWeightedReturns) <- "Portfolio"
names(EqualReturns) <- "Equal Portfolio Returns"
names(SPYreturns) <- "SPY Benchmark"
names(rebal_returns) <- "Rebalanced Portfolio"
#Comparative Returns
BenchComp <- cbind(SPYreturns,PortWeightedReturns)
charts.PerformanceSummary(BenchComp, main ="P/L Over Time")

EqualComp <- cbind(EqualReturns,PortWeightedReturns)
charts.PerformanceSummary(EqualComp, main ="P/L Over Time")

REBALcomp <- cbind(rebal_returns,PortWeightedReturns)
charts.PerformanceSummary(REBALcomp, main ="P/L Over Time")

#Regression of Portfolio
Comb_Ret <- cbind(PortWeightedReturns, SPYreturns)

Comb_Ret %>% 
  ggplot(aes(x =Comb_Ret$Portfolio, y = Comb_Ret$SPY.Benchmark)) +
  geom_point(alpha = 0.3) +
  geom_smooth(method = lm) + 
  theme_classic()+ 
  labs(x = 'Benchmark Returns',
       y= 'Portfolio Returns',
       title = "Portfolio Returns vs Benchmark returns") +
  scale_x_continuous(breaks = seq(-0.1,0.1,0.01),
                     labels = scales::percent) +
  scale_y_continuous(breaks = seq(-0.1,0.1,0.01),
                     labels = scales::percent)

model <- lm(Comb_Ret$Portfolio ~ Comb_Ret$SPY.Benchmark)
model_alpha <- model$coefficients[1]
model_beta <- model$coefficients[2]
cat("The portfolio alpha is", model_alpha, "and the portfolio beta is", model_beta)
## The portfolio alpha is 0.003353449 and the portfolio beta is 0.5178993
#Portfolio Beta
CAPM.beta(PortWeightedReturns, SPYreturns, rfr/252)
## [1] 0.5178993
#beta in positive Market conditions only
CAPM.beta.bull(PortWeightedReturns, SPYreturns, rfr/252)
## [1] -0.136565
#beta in negative market conditions only
CAPM.beta.bear(PortWeightedReturns, SPYreturns, rfr/252)
## [1] 0.8500348
#Alpha of Portfolio
CAPM.alpha(PortWeightedReturns, SPYreturns, rfr/252)
## [1] 0.003299365
#Jensen Alpha calculation for Ferrari
CAPM.jensenAlpha(PortWeightedReturns, SPYreturns, rfr/252)
## [1] 1.06228
#Treynor Ratio
TreynorRatio(PortWeightedReturns,SPYreturns,Rf = rfr252)
## [1] 1.767614
#Active Premium over the market, this is annualized
ActivePremium(PortWeightedReturns, SPYreturns, scale = 252)
## [1] 1.148062
#SharpeRatio
SharpeRatio(PortWeightedReturns, Rf = rfr252)
##                                Portfolio
## StdDev Sharpe (Rf=0%, p=95%): 0.11651621
## VaR Sharpe (Rf=0%, p=95%):    0.07141679
## ES Sharpe (Rf=0%, p=95%):     0.05107619
#Information Ratio
InformationRatio(PortWeightedReturns, SPYreturns)
## [1] 2.935556
#standard deviation
PortSD <- StdDev(PortWeightedReturns)
PortSD <- round(PortSD * 100, 2)
PortSD
##        [,1]
## StdDev 2.48
PortSdFama <- FamaBeta(PortWeightedReturns, SPYreturns)
PortSdFama
##           Portfolio
## Portfolio  1.820998
#annualized returns
Return.annualized(PortWeightedReturns)
##                   Portfolio
## Annualized Return  0.970239
Return.annualized(EqualReturns)
##                   Equal Portfolio Returns
## Annualized Return                1.154973
Return.annualized(rebal_returns)
##                   Rebalanced Portfolio
## Annualized Return            0.4339424
#skewness
PortSkew <- skewness(PortWeightedReturns)
PortSkew
## [1] -0.4995225
#Correlation Matrix
chart.Correlation(PortReturns)