Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
As an extension to yesterday’s post Just Arriving is Not Enough, I wanted to show how minimizing drawdown is a much better technique to help control comfort and potentially increase ending wealth. CHTTX was one of the best performers of the four funds OAKMX, CHTTX, FAIRX, and FCTNX mentioned in Smart Money “Bouncing Back with the World’s Greatest Investors.” The fund suffered a brutal 60% drawdown though, and I’m guessing most of the original investors did not stick with the fund the entire time as the pain forced them out. However, if we can limit the drawdown to something better than the excruciating 60%, then the ride is much smoother, or if someone truly is comfortable with 60% drawdown, we can apply leverage (I absolutely do not recommend) to both tailor the smoothness of our ride and also significantly increase ending wealth.
From TimelyPortfolio |
From TimelyPortfolio |
We could apply up to 2.57 times leverage and incur the same drawdown as CHTTX, but let’s use a more conservative 2 times to see how it affects our simple system.
From TimelyPortfolio |
From TimelyPortfolio |
From TimelyPortfolio |
In addition, if I as the money manager apply some drawdown control to my clients’ portfolio, I can help maintain their confidence and also significantly increase their ending wealth by not forcing them to make a decision based on fear.
#look at funds run by Smart Money's "world's greatest investors" #http://www.smartmoney.com/invest/stocks/bouncing-back-with-the-worlds-greatest-investors-1309909342753/?cid=sm_dailyfinanceRSS #then apply a simple moving average system #to prove a point about controlling drawdown require(quantmod) require(PerformanceAnalytics) tckr<-c("OAKMX","CHTTX","FAIRX","FCNTX") start<-"1990-01-01" end<- format(Sys.Date(),"%Y-%m-%d") # yyyy-mm-dd # Pull tckr index data from Yahoo! Finance getSymbols(tckr, from=start, to=end, adjust=TRUE) RetToAnalyze<-merge(dailyReturn(OAKMX),dailyReturn(CHTTX), dailyReturn(FAIRX), dailyReturn(FCNTX)) colnames(RetToAnalyze)<-tckr #get very helpful Ken French data on Momentum Portfolios #to compare to the funds #http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/6_Portfolios_ME_Prior_12_2_Daily.zip my.url="http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/6_Portfolios_ME_Prior_12_2_Daily.zip" my.tempfile<-paste(tempdir(),"\\frenchmomentum.zip",sep="") my.usefile<-paste(tempdir(),"\\6_Portfolios_ME_Prior_12_2_Daily.txt",sep="") download.file(my.url, my.tempfile, method="auto", quiet = FALSE, mode = "wb",cacheOK = TRUE) unzip(my.tempfile,exdir=tempdir(),junkpath=TRUE) #read space delimited text file extracted from zip french_momentum <- read.table(file=my.usefile, header = TRUE, sep = "", as.is = TRUE, skip = 12, nrows=12061) colnames(french_momentum) <- c(paste("Small", colnames(french_momentum)[1:3],sep="."), paste("Large",colnames(french_momentum)[1:3],sep=".")) #get dates ready for xts index datestoformat <- rownames(french_momentum) datestoformat <- paste(substr(datestoformat,1,4), substr(datestoformat,5,6),substr(datestoformat,7,8),sep="-") #get xts for analysis french_momentum_xts <- as.xts(french_momentum[,1:6], order.by=as.Date(datestoformat)) #divide by 100 to get in decimal form french_momentum_xts <- french_momentum_xts/100 #get column 3 for small momentum and 6 for large momentum #to compare with the funds RetWithFrench <-merge(RetToAnalyze,french_momentum_xts[,c(3,6)]) #jpeg(filename="performance summary of funds.jpg",quality=100,width=6.25, height = 8, units="in",res=96) #charts.PerformanceSummary(RetWithFrench,ylog=TRUE, # main="Smart Money World's Greatest Investors???", # colorset=c("cadetblue","darkolivegreen3","goldenrod", # "purple","gray","beige")) #dev.off() #let's just use a Mebane Faber style 200 day moving average #to determine entry and exit #for the best performer CHTTX signal <- ifelse(CHTTX[,4]>runMean(CHTTX[,4],200),1,0) signal <- merge(lag(signal,k=1),RetWithFrench[,2]) retCHTTX <- merge(signal[,1] * signal[,2], signal[,2]) colnames(retCHTTX) <- c("CHTTXMeanSystem","CHTTX") #jpeg(filename="performance summary of chttx and mean system.jpg",quality=100,width=6.25, height = 8, units="in",res=96) charts.PerformanceSummary(retCHTTX,ylog=TRUE, main="Smart Money World's Greatest Investors??? CHTTX with 200 Day Mean System", colorset=c("cadetblue","purple")) #dev.off() #if the investor is comfortable with 60% drawdown #then they should be comfortable with leverage applied #to the simple mean system; 2.57 would make them even #in terms of max drawdown #jpeg(filename="worst drawdown of chttx and mean system.jpg",quality=100,width=6.25, height = 8, units="in",res=96) barplot(maxDrawdown(retCHTTX), main="Worst Drawdown Comparison", ylim=c(0,0.6)) dev.off() #print(maxDrawdown(retCHTTX[,2])/maxDrawdown(retCHTTX[,1])) #let's see now what it looks like with just 2 times leverage #applied to the simple mean system retCHTTX <- merge(signal[,1] * signal[,2], signal[,1] * 2 * signal[,2], signal[,2]) colnames(retCHTTX) <- c("CHTTXMeanSystem","CHTTXMean2xLeverage","CHTTX") #jpeg(filename="performance summary of chttx and mean system and leverage.jpg",quality=100,width=6.25, height = 8, units="in",res=96) charts.PerformanceSummary(retCHTTX,ylog=TRUE, main="Smart Money World's Greatest Investors??? CHTTX with 200 Day Mean System and 2x Leverage", colorset=c("cadetblue","darkolivegreen3","purple")) #dev.off() #check max drawdown #now by controlling drawdown we can end up with almost double the money #with still less total drawdown #jpeg(filename="worst drawdown of chttx and mean system with leverage.jpg",quality=100,width=6.25, height = 8, units="in",res=96) barplot(maxDrawdown(retCHTTX), main="Worst Drawdown Comparison", ylim=c(0,0.6)) #dev.off() jpeg(filename="cumulative return of chttx and mean system with leverage.jpg",quality=100,width=6.25, height = 8, units="in",res=96) barplot(Return.cumulative(retCHTTX), main="Cumulative Returns Comparison", ylim=c(0,5)) dev.off() print(Return.cumulative(retCHTTX[,2])/Return.cumulative(retCHTTX[,3]))
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.