library(timeSeries)
## Warning: package 'timeSeries' was built under R version 3.6.3
## Loading required package: timeDate
library(fPortfolio)
## Warning: package 'fPortfolio' was built under R version 3.6.3
## Loading required package: fBasics
## Warning: package 'fBasics' was built under R version 3.6.3
## Loading required package: fAssets
## Warning: package 'fAssets' was built under R version 3.6.3
library(quantmod)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following object is masked from 'package:timeSeries':
## 
##     time<-
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Registered S3 method overwritten by 'xts':
##   method     from
##   as.zoo.xts zoo
## Loading required package: TTR
## 
## Attaching package: 'TTR'
## The following object is masked from 'package:fBasics':
## 
##     volatility
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## Version 0.4-0 included new data defaults. See ?getSymbols.
library(caTools)
## Warning: package 'caTools' was built under R version 3.6.3
library(dplyr) 
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:xts':
## 
##     first, last
## The following objects are masked from 'package:timeSeries':
## 
##     filter, lag
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(PerformanceAnalytics)
## 
## Attaching package: 'PerformanceAnalytics'
## The following objects are masked from 'package:timeDate':
## 
##     kurtosis, skewness
## The following object is masked from 'package:graphics':
## 
##     legend
library(ggplot2)
library(tidyverse)
## -- Attaching packages ------------------------------------------------------------------------------- tidyverse 1.3.0 --
## v tibble  2.1.3     v purrr   0.3.3
## v tidyr   1.0.0     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.4.0
## -- Conflicts ---------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks timeSeries::filter(), stats::filter()
## x dplyr::first()  masks xts::first()
## x dplyr::lag()    masks timeSeries::lag(), stats::lag()
## x dplyr::last()   masks xts::last()
tickers <- c("AMZN", "MSFT","AAPL")

#calculate returns: Daily

portfolioPrices <- NULL
for(ticker in tickers) {
  portfolioPrices <- cbind(portfolioPrices,
                           getSymbols(ticker, src = "yahoo", from='2016-01-03', periodicity = 'daily', auto.assign=FALSE)[,4])
}  
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
## 
## This message is shown once per session and may be disabled by setting 
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.

#delete all dates with no prices

portfolioPrices <- portfolioPrices[apply(portfolioPrices,1,function(x) all(!is.na(x))),]

#rename columns

colnames(portfolioPrices) <- tickers

#calculate Return: Daily ROC

portfolioReturns <- na.omit(ROC(portfolioPrices, type="discrete"))
portfolioReturns <- as.timeSeries(portfolioReturns)

#keep only the dates that have closing prices from all tickers

colnames(portfolioReturns) <- tickers
portfolioReturns <- as.timeSeries(portfolioReturns)

#calculate and plot frontier and efficient portfolio

effFrontier <- portfolioFrontier(portfolioReturns, constraints = "Longonly")

plot(effFrontier, 1)
plot(effFrontier,c(1,2,3,4))

#plot frontier weights

frontierweights <- getWeights(effFrontier) # get allocations for each instrument
colnames(frontierweights) <- tickers
risk_return <- frontierPoints(effFrontier)  
write.csv(risk_return, "risk_return.csv")

#output correlation

or_matrix <- cor(portfolioReturns)
cov_matrix <- cov(portfolioReturns)
write.csv(cov_matrix, "covmatrix.csv")

#annualize data

riskReturnPoints <- frontierPoints(effFrontier)
annualizedPoints <- data.frame(targetRisk=riskReturnPoints[, "targetRisk"] * sqrt(252),
                               targetReturn=riskReturnPoints[, "targetReturn"] * 252)
plot(annualizedPoints)

#plot sharpe ratios for each point on efficient frontier

riskFreeRate <- 1
plot((annualizedPoints[, "targetReturn"]-riskFreeRate) / annualizedPoints[,"targetRisk"], 
     xlab="point on efficient frontier", ylab="Sharpe ratio")

#plot frontier weights

barplot(t(frontierweights), main = "Frontier weights", col=cm.colors(ncol(frontierweights)+2), legend=colnames(frontierweights))

#get Minimum Variance Portfolio, Tangency Portfolio

mvp <- minvariancePortfolio(portfolioReturns, spec = portfolioSpec(), constraints = "Longonly")
mvp
## 
## Title:
##  MV Minimum Variance Portfolio 
##  Estimator:         covEstimator 
##  Solver:            solveRquadprog 
##  Optimize:          minRisk 
##  Constraints:       
## 
## Portfolio Weights:
##   AMZN   MSFT   AAPL 
## 0.3091 0.3720 0.3189 
## 
## Covariance Risk Budgets:
##   AMZN   MSFT   AAPL 
## 0.3091 0.3720 0.3189 
## 
## Target Returns and Risks:
##   mean    Cov   CVaR    VaR 
## 0.0011 0.0156 0.0385 0.0247 
## 
## Description:
##  Sun Apr 05 23:54:30 2020 by user: Anand
tangencyPort <- tangencyPortfolio(portfolioReturns, spec = portfolioSpec(), constraints = "Longonly")
tangencyPort
## 
## Title:
##  MV Tangency Portfolio 
##  Estimator:         covEstimator 
##  Solver:            solveRquadprog 
##  Optimize:          minRisk 
##  Constraints:       
## 
## Portfolio Weights:
##   AMZN   MSFT   AAPL 
## 0.4625 0.4782 0.0593 
## 
## Covariance Risk Budgets:
##   AMZN   MSFT   AAPL 
## 0.4846 0.4665 0.0489 
## 
## Target Returns and Risks:
##   mean    Cov   CVaR    VaR 
## 0.0011 0.0160 0.0390 0.0256 
## 
## Description:
##  Sun Apr 05 23:54:30 2020 by user: Anand
mvpweights <- getWeights(mvp)
tangencyweights <- getWeights(tangencyPort)

#calculate weekly returns

portfolioPrices <- NULL
for(ticker in tickers) {
  portfolioPrices <- cbind(portfolioPrices,
                           getSymbols.yahoo(ticker, from='2016-01-03', periodicity = 'weekly', auto.assign=FALSE)[,4])
}

#delete all dates with no prices

portfolioPrices <- portfolioPrices[apply(portfolioPrices,1,function(x) all(!is.na(x))),]

#rename columns

colnames(portfolioPrices) <- tickers

#calculate Return: Weekly ROC

portfolioReturns <- na.omit(ROC(portfolioPrices, type="discrete"))
portfolioReturns <- as.timeSeries(portfolioReturns)

#keep only the dates that have closing prices from all tickers

colnames(portfolioReturns) <- tickers
portfolioReturns <- as.timeSeries(portfolioReturns)

#calculate and plot frontier and efficient portfolio

effFrontier <- portfolioFrontier(portfolioReturns, constraints = "Longonly")

plot(effFrontier, 1)
plot(effFrontier,c(1,2,3,4))

#plot frontier weights

frontierweights <- getWeights(effFrontier) # get allocations for each instrument
colnames(frontierweights) <- tickers
risk_return <- frontierPoints(effFrontier)  
write.csv(risk_return, "risk_return.csv")  

#output correlation

or_matrix <- cor(portfolioReturns)
cov_matrix <- cov(portfolioReturns)
write.csv(cov_matrix, "covmatrix.csv")

#annualize data

riskReturnPoints <- frontierPoints(effFrontier)
annualizedPoints <- data.frame(targetRisk=riskReturnPoints[, "targetRisk"] * sqrt(252),
                               targetReturn=riskReturnPoints[, "targetReturn"] * 252)
plot(annualizedPoints)

#plot sharpe ratios for each point on efficient frontier

riskFreeRate <- 1
plot((annualizedPoints[, "targetReturn"]-riskFreeRate) / annualizedPoints[,"targetRisk"], 
     xlab="point on efficient frontier", ylab="Sharpe ratio")

#plot frontier weights

barplot(t(frontierweights), main = "Frontier weights", col=cm.colors(ncol(frontierweights)+2), legend=colnames(frontierweights))

#get Minimum Variance Portfolio, Tangency Portfolio

mvp <- minvariancePortfolio(portfolioReturns, spec = portfolioSpec(), constraints = "Longonly")
mvp
## 
## Title:
##  MV Minimum Variance Portfolio 
##  Estimator:         covEstimator 
##  Solver:            solveRquadprog 
##  Optimize:          minRisk 
##  Constraints:       
## 
## Portfolio Weights:
##   AMZN   MSFT   AAPL 
## 0.1353 0.5889 0.2758 
## 
## Covariance Risk Budgets:
##   AMZN   MSFT   AAPL 
## 0.1353 0.5889 0.2758 
## 
## Target Returns and Risks:
##   mean    Cov   CVaR    VaR 
## 0.0053 0.0291 0.0781 0.0422 
## 
## Description:
##  Sun Apr 05 23:54:32 2020 by user: Anand
tangencyPort <- tangencyPortfolio(portfolioReturns, spec = portfolioSpec(), constraints = "Longonly")
tangencyPort
## 
## Title:
##  MV Tangency Portfolio 
##  Estimator:         covEstimator 
##  Solver:            solveRquadprog 
##  Optimize:          minRisk 
##  Constraints:       
## 
## Portfolio Weights:
##   AMZN   MSFT   AAPL 
## 0.2496 0.5920 0.1584 
## 
## Covariance Risk Budgets:
##   AMZN   MSFT   AAPL 
## 0.2736 0.5861 0.1403 
## 
## Target Returns and Risks:
##   mean    Cov   CVaR    VaR 
## 0.0054 0.0294 0.0770 0.0392 
## 
## Description:
##  Sun Apr 05 23:54:32 2020 by user: Anand
mvpweights <- getWeights(mvp)
tangencyweights <- getWeights(tangencyPort)

#calculate monthly return

portfolioPrices <- NULL
for(ticker in tickers) {
  portfolioPrices <- cbind(portfolioPrices,
                           getSymbols.yahoo(ticker, from='2016-01-03', periodicity = 'monthly', auto.assign=FALSE)[,4])
}

#delete all dates with no prices

portfolioPrices <- portfolioPrices[apply(portfolioPrices,1,function(x) all(!is.na(x))),]

#rename columns

colnames(portfolioPrices) <- tickers

#calculate Return: Monthly ROC

portfolioReturns <- na.omit(ROC(portfolioPrices, type="discrete"))
portfolioReturns <- as.timeSeries(portfolioReturns)

#keep only the dates that have closing prices from all tickers

colnames(portfolioReturns) <- tickers
portfolioReturns <- as.timeSeries(portfolioReturns)

#calculate and plot frontier and efficient portfolio

effFrontier <- portfolioFrontier(portfolioReturns, constraints = "Longonly")

plot(effFrontier, 1)
plot(effFrontier,c(1,2,3,4))

#plot frontier weights

frontierweights <- getWeights(effFrontier) # get allocations for each instrument
colnames(frontierweights) <- tickers
risk_return <- frontierPoints(effFrontier)  
write.csv(risk_return, "risk_return.csv")

#output correlation

or_matrix <- cor(portfolioReturns)
cov_matrix <- cov(portfolioReturns)
write.csv(cov_matrix, "covmatrix.csv")

#annualize data

riskReturnPoints <- frontierPoints(effFrontier)
annualizedPoints <- data.frame(targetRisk=riskReturnPoints[, "targetRisk"] * sqrt(252),
                               targetReturn=riskReturnPoints[, "targetReturn"] * 252)
plot(annualizedPoints)

#plot sharpe ratios for each point on efficient frontier

riskFreeRate <- 1
plot((annualizedPoints[, "targetReturn"]-riskFreeRate) / annualizedPoints[,"targetRisk"], 
     xlab="point on efficient frontier", ylab="Sharpe ratio")

#plot frontier weights

barplot(t(frontierweights), main = "Frontier weights", col=cm.colors(ncol(frontierweights)+2), legend=colnames(frontierweights))

#get Minimum Variance Portfolio, Tangency Portfolio

mvp <- minvariancePortfolio(portfolioReturns, spec = portfolioSpec(), constraints = "Longonly")
mvp
## 
## Title:
##  MV Minimum Variance Portfolio 
##  Estimator:         covEstimator 
##  Solver:            solveRquadprog 
##  Optimize:          minRisk 
##  Constraints:       
## 
## Portfolio Weights:
##   AMZN   MSFT   AAPL 
## 0.0835 0.9035 0.0130 
## 
## Covariance Risk Budgets:
##   AMZN   MSFT   AAPL 
## 0.0835 0.9035 0.0130 
## 
## Target Returns and Risks:
##   mean    Cov   CVaR    VaR 
## 0.0215 0.0497 0.0820 0.0770 
## 
## Description:
##  Sun Apr 05 23:54:34 2020 by user: Anand
tangencyPort <- tangencyPortfolio(portfolioReturns, spec = portfolioSpec(), constraints = "Longonly")
tangencyPort
## 
## Title:
##  MV Tangency Portfolio 
##  Estimator:         covEstimator 
##  Solver:            solveRquadprog 
##  Optimize:          minRisk 
##  Constraints:       
## 
## Portfolio Weights:
##   AMZN   MSFT   AAPL 
## 0.2302 0.7698 0.0000 
## 
## Covariance Risk Budgets:
##  AMZN  MSFT  AAPL 
## 0.265 0.735 0.000 
## 
## Target Returns and Risks:
##   mean    Cov   CVaR    VaR 
## 0.0222 0.0504 0.0889 0.0723 
## 
## Description:
##  Sun Apr 05 23:54:34 2020 by user: Anand
mvpweights <- getWeights(mvp)
tangencyweights <- getWeights(tangencyPort)