The functions in the previous post have been updated to put in the additional constraints that no portfolio weights can be negative, that is short selling is not allowed.

After the data is downloaded from the web and stored in CSV file as explained in an earlier post. define the functions and test the program as follows :

> logRet <- GetData20("US5.csv")

> ##logRet <- GetData20("India5.csv")

> PlotData20(logRet)

Unlike the case were shorts are allowed, in this case, not every desired portfolio return is feasibile when shorts are not allowed. Here we search through a range of returns from -0.0005 to + 0.0002 and detect which return gives us the minimum variance. The means that are infeasible are flagged as sucn and ignored.

> z10 <- EFMinVar20(logRet,-0.0005,0.0002, Shorts = FALSE)

infeasible : -5e-04

.....

infeasible : -0.000242857142857143

Dataframe z10 contains the range of feasible returns and the corresponding variance. The portofolio weights are printed out as follows. The first one though technically negative is very, very small.

> z10$wP

[1] -1.386988e-17 4.295438e-02 1.356919e-01 4.977252e-01 3.236285e-01

we note the return achieved at the point of minimum variance

> cminRet <- (z10$minPoint)$minRet

> cminRet

[1] 0.0001285714

> EFMinVar20Plot(z10)

The efficient frontier is plotted, but this is not very useful because the range of returns that we have taken are "below" the minvariance point.

So in the next few lines, we have defined a range of returns that goes above, or higher than, the return for minimum variance

> cminRet <- (z10$minPoint)$minRet

> maxR <- cminRet + max(0.001,cminRet+ 2*abs(cminRet))

> z10a <- EFMinVar20(logRet,cminRet, maxR, Shorts = FALSE)

infeasible : 0.000761224489795919

.......

infeasible : 0.00112857142857143

> EFMinVar20Plot(z10a)

Next we identify the maximum Sharpe ratio, identify the tangency portfolio and draw the capital market line. Note that the risk free rate is 0.0001

> z12 <- EFSharpe20(logRet,cminRet,maxR,0.0001,Shorts = FALSE)

infeasible : 0.000761224489795919

....

infeasible : 0.00112857142857143

> z12$wTP

[1] 2.515328e-01 0.000000e+00 -1.456853e-17 7.484672e-01 -6.938894e-18

> sum(z12$wTP)

[1] 1

> (z12$maxSharpe)$smuP

[1] 0.0005163265

> (z12$maxSharpe)$svarP

[1] 0.0002621069

> maxSharpeRet <- (z12$maxSharpe)$smuP

> EFSharpe20Plot(z12)

Please note that by setting SHORTS = TRUE, this set of functions should be able to recreate the results given in the previous post.

-------------------------------------------------------------------------------------------

These programs can be run on StatAce, the free hosted R environment and get the same result.

```
setwd("C:/Users/admin/Desktop/Data Analytics/QuantitativeFinance/QFLabs")
getwd()
library(ggplot2)
library(quadprog)
GetData20 <- function(CSVfile){
baseData <- read.csv(CSVfile)
N0 <- ncol(baseData)
Close <- baseData[, 3:N0]
logRet1 <- log(head(Close, -1) / tail(Close, -1))
return(logRet1)
}
PlotData20 <- function(logRet1){
Retn <- colMeans(logRet1)
Risk <- diag(var(logRet1))
RiskReturn <- as.data.frame(t(rbind(Retn,Risk)))
plot1 <- ggplot(data = RiskReturn,aes(x = Risk, y = Retn) )
plot1 <- plot1 + geom_point()
plot1 <- plot1 + xlab("Risk / Variance") + ylab("Daily Returns") + ggtitle("Risk/Returns")
plot1
}
rOptPort20 <- function(hRets,pRet, Shorts = TRUE){
Dmat <- 2*cov(hRets)
dvec <- rep(0,ncol(hRets))
if (Shorts){
##message("Shorts : TRUE") ## Shorts are allowed
Amat <- cbind(rep(1,ncol(hRets)),colMeans(hRets))
bvec <- c(1,pRet)
} else {
##message("Shorts = FALSE") ## Shorts are not allowed
Amat <- cbind(rep(1,ncol(hRets)),colMeans(hRets),diag(1,nrow = ncol(hRets)))
bvec <- c(1,pRet,rep(0,ncol(hRets)))
}
result = tryCatch({
solve.QP(Dmat = Dmat, dvec = dvec, Amat = Amat, bvec = bvec, meq =2)
}, warning = function(w){
message("warning : ",pRet)
return(NULL)
}, error = function(w){
message("infeasible : ", pRet)
return(NULL)
}, finally = {
}
)
if (!is.null(result)){
wP <- result$solution
varP <- result$value
}
else{
wP <- "error"
varP <- "error"
}
retList <- list(wP,varP)
names(retList) <- c("wP","varP")
return(retList)
}
EFMinVar20 <- function(hRets, minRet, maxRet,Shorts = FALSE){
smuP <- seq(minRet,maxRet,length=50)
svarP <- sapply(smuP,function(x) rOptPort20(hRets,x,Shorts)$varP)
EffF <- as.data.frame(cbind(smuP,svarP))
EffF0 <- as.data.frame(EffF[EffF$svarP != "error",])
EffF0 <- as.data.frame(apply(EffF0, 2, FUN = function(x) as.numeric(as.character(x))))
minVar <- min(EffF0$svarP)
L <- EffF0$svarP == minVar
minRet <- EffF0[L,]$smuP
minPoint <- as.data.frame(cbind(minRet,minVar))
minVarwP <- rOptPort20(hRets,minRet,Shorts)$wP
rList <-list(EffF0,minPoint,minVarwP)
names(rList) <- c("EFF","minPoint","wP")
return(rList)
}
EFMinVar20Plot <- function(list1){
ealred <- "#7D110C"
plot2 <- ggplot(data = list1$EFF,aes(x = svarP, y = smuP) )
plot2 <- plot2 + geom_point()
plot2 <- plot2 + geom_point(data = list1$minPoint, aes(x = minVar,y = minRet),color = "red", size=3)
plot2 <- plot2 + xlab("Variance") + ylab("Returns") + ggtitle("Efficient Frontier - MinVar")
plot2
}
EFSharpe20 <- function(hRets, minRet, maxRet,RF, Shorts = FALSE){
smuP <- seq(minRet,maxRet,length=50)
svarP <- sapply(smuP,function(x) rOptPort20(hRets,x,Shorts)$varP)
EffF <- as.data.frame(cbind(smuP,svarP))
EffF0 <- as.data.frame(EffF[EffF$svarP != "error",])
EffF0 <- as.data.frame(apply(EffF0, 2, FUN = function(x) as.numeric(as.character(x))))
sharpe <- (EffF0$smuP-RF)/EffF0$svarP
EFF <- as.data.frame(cbind(EffF0,sharpe,RF))
L <- EFF$sharpe == max(EFF$sharpe)
maxSharpe <- EFF[L,]
wTP <- rOptPort20(hRets,maxSharpe$smuP,Shorts)$wP
rList <-list(EFF,maxSharpe,wTP)
names(rList) <- c("EFF","maxSharpe","wTP")
return(rList)
}
EFSharpe20Plot <- function(list1){
plot2 <- ggplot(data = list1$EFF,aes(x = svarP, y = smuP) )
plot2 <- plot2 + geom_point()
plot2 <- plot2 + geom_point(data = list1$maxSharpe, aes(x = svarP,y = smuP),colour = "red", pch =24, size=3)
plot2 <- plot2 + geom_point(data = list1$maxSharpe, aes(x = 0,y = RF),color = "red", pch =24, size=3)
plot2 <- plot2 + xlab("Variance") + ylab("Returns") + ggtitle("Efficient Frontier - Sharpe")
plot2 <- plot2 + geom_abline(intercept = (list1$maxSharpe)$RF, slope = (list1$maxSharpe)$sharpe, colour = "red")
plot2
}
#Testing
logRet <- GetData20("US5.csv")
##logRet <- GetData20("India5.csv")
PlotData20(logRet)
## Shorts = FALSE
z10 <- EFMinVar20(logRet,-0.0005,0.0002, Shorts = FALSE)
z10$wP
cminRet <- (z10$minPoint)$minRet
cminRet
z11 <- rOptPort20(logRet,cminRet,Shorts = FALSE)
z11$wP
EFMinVar20Plot(z10)
cminRet <- (z10$minPoint)$minRet
maxR <- cminRet + max(0.001,cminRet+ 2*abs(cminRet))
z10a <- EFMinVar20(logRet,cminRet, maxR, Shorts = FALSE)
EFMinVar20Plot(z10a)
z12 <- EFSharpe20(logRet,cminRet,maxR,0.0001,Shorts = FALSE)
z12$wTP
sum(z12$wTP)
(z12$maxSharpe)$smuP
(z12$maxSharpe)$svarP
maxSharpeRet <- (z12$maxSharpe)$smuP
EFSharpe20Plot(z12)
```

After the data is downloaded from the web and stored in CSV file as explained in an earlier post. define the functions and test the program as follows :

> logRet <- GetData20("US5.csv")

> ##logRet <- GetData20("India5.csv")

> PlotData20(logRet)

Unlike the case were shorts are allowed, in this case, not every desired portfolio return is feasibile when shorts are not allowed. Here we search through a range of returns from -0.0005 to + 0.0002 and detect which return gives us the minimum variance. The means that are infeasible are flagged as sucn and ignored.

> z10 <- EFMinVar20(logRet,-0.0005,0.0002, Shorts = FALSE)

infeasible : -5e-04

.....

infeasible : -0.000242857142857143

Dataframe z10 contains the range of feasible returns and the corresponding variance. The portofolio weights are printed out as follows. The first one though technically negative is very, very small.

> z10$wP

[1] -1.386988e-17 4.295438e-02 1.356919e-01 4.977252e-01 3.236285e-01

we note the return achieved at the point of minimum variance

> cminRet <- (z10$minPoint)$minRet

> cminRet

[1] 0.0001285714

> EFMinVar20Plot(z10)

The efficient frontier is plotted, but this is not very useful because the range of returns that we have taken are "below" the minvariance point.

So in the next few lines, we have defined a range of returns that goes above, or higher than, the return for minimum variance

> cminRet <- (z10$minPoint)$minRet

> maxR <- cminRet + max(0.001,cminRet+ 2*abs(cminRet))

> z10a <- EFMinVar20(logRet,cminRet, maxR, Shorts = FALSE)

infeasible : 0.000761224489795919

.......

infeasible : 0.00112857142857143

> EFMinVar20Plot(z10a)

Next we identify the maximum Sharpe ratio, identify the tangency portfolio and draw the capital market line. Note that the risk free rate is 0.0001

> z12 <- EFSharpe20(logRet,cminRet,maxR,0.0001,Shorts = FALSE)

infeasible : 0.000761224489795919

....

infeasible : 0.00112857142857143

> z12$wTP

[1] 2.515328e-01 0.000000e+00 -1.456853e-17 7.484672e-01 -6.938894e-18

> sum(z12$wTP)

[1] 1

> (z12$maxSharpe)$smuP

[1] 0.0005163265

> (z12$maxSharpe)$svarP

[1] 0.0002621069

> maxSharpeRet <- (z12$maxSharpe)$smuP

> EFSharpe20Plot(z12)

Please note that by setting SHORTS = TRUE, this set of functions should be able to recreate the results given in the previous post.

-------------------------------------------------------------------------------------------

These programs can be run on StatAce, the free hosted R environment and get the same result.

How long should we hold this portfolio weightage to get the expected return?

ReplyDeleteIEEE Project Domain management in software engineering is distinct from traditional project deveopment in that software projects have a unique lifecycle process that requires multiple rounds of testing, updating, and faculty feedback. A IEEE Domain project Final Year Projects for CSE system development life cycle is essentially a phased project model that defines the organizational constraints of a large-scale systems project. The methods used in a IEEE DOmain Project systems development life cycle strategy Project Centers in India provide clearly defined phases of work to plan, design, test, deploy, and maintain information systems.

DeleteThis is enough for me. I want to write software that anyone can use, and virtually everyone who has an internet connected device with a screen can use apps written in JavaScript. JavaScript Training in Chennai JavaScript was used for little more than mouse hover animations and little calculations to make static websites feel more interactive. Let’s assume 90% of all websites using JavaScript use it in a trivial way. That still leaves 150 million substantial JavaScript Training in Chennai JavaScript applications.

nice post

ReplyDeleteThanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic. SEO optimalisatie

ReplyDeleteI would like to thank you for the efforts you have made in writing this article. I am hoping the same best work from you in the future as well. Thanks... SEO

ReplyDeleteThis is a mind boggling stirring article.I am essentially happy with your incredible work.You put really outstandingly obliging information... SEO in New York

ReplyDeleteLike any other industry in the world, the online SEO business has its players. relevant comment

ReplyDeleteThese companies do not take any shortcuts, and usually have a team of professional content writers who will cater to the needs of the business in a comprehensive manner so that Search Engine Optimization does not become a headache for the company or client. business startup We have entered an era where business is no longer limited to where you are established.

ReplyDeleteThanks for a very interesting blog. What else may I get that kind of info written in such a perfect approach? I’ve a undertaking that I am simply now operating on, and I have been at the look out for such info. www.seorango.com

ReplyDeleteHello I am so delighted I located your blog, I really located you by mistake, while I was watching on google for something else, Anyways I am here now and could just like to say thank for a tremendous post and a all round entertaining website. Please do keep up the great work. https://cbtemailextractor.com/

ReplyDeleteThis is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free. Niche Relevant

ReplyDeleteTook me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also entertained! Ethiopian Policus

ReplyDeletehere is my great offer i will provide you 80 niche relevant hight quality blog comments with high authorize sites good for your website rank your site on google, bing, yahoo etc. All comments are manually No software use. Search Engine Optimization

ReplyDelete