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