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)