Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Working with chartSeries in quantmod

Tags:

r

quantmod

I'm a newbie to R and it has been very helpful to use your website. Unfortunately I've been struggling with my code now for two days so I wanted to ask few questions. I've been trying to create nice graphs to put into a pdf sheet but I'm having little problems with all the packages I've been using. So what I want to accomplish is create one pdf sheet with three graphs and one correlation table. Below is an example I created which is very similar to what I want to do but there are few things I would like to change. I'm using chartSeries in quantmod for the graphs and for the table I'm using textplot.

Few questions:

  1. Is it possible to remove the date in the upper right corner of the graphs?
  2. Instead of the text Last xxxx (the green series text) I would like to get the name of the series itself, e.g. MSFT, is that doable?
  3. How can I give the axes names, e.g. Return, Date?
  4. In the Cumulative Difference graph I'm using the addVo() and that function gives this nice barPlot. In the other graphs I'm not using addVo() just addTA and type='h' and you can see the difference of the bar/histogram plots. Is it possible to get the same plot using addTA as in addVo?
  5. Is there a way to fit the correlation table better and/or do it more professional. Is maybe another function better?

Best,

OTB

install.packages("quantmod")
install.packages("gplots")
library(quantmod)
library(gplots)

#setwd("..........")

getSymbols("MSFT")
getSymbols("AAPL")
getSymbols("COKE")
getSymbols("PEP")

#Get the return
MSFT.Return <- diff(MSFT)/lag(MSFT)
AAPL.Return <- diff(AAPL)/lag(AAPL)
COKE.Return <- diff(COKE)/lag(COKE)
PEP.Return <- diff(PEP)/lag(PEP)

#Get the return for last two months and only get close price return.
#because in my data I only have the close price. 
MSFT.Close <- MSFT.Return['2012-06-01::2012-07-27', 'MSFT.Close']
AAPL.Close <- AAPL.Return['2012-06-01::2012-07-27', 'AAPL.Close']
COKE.Close <- COKE.Return['2012-06-01::2012-07-27', 'COKE.Close']
PEP.Close <- PEP.Return['2012-06-01::2012-07-27', 'PEP.Close']

pdf(sprintf("%s.pdf","ExampleGraph"), width=11.69, height=8.27)

layout(matrix(1:8, nrow=4)) 

#Get the difference in return
techDifference <- MSFT.Close - AAPL.Close
bevDifference <- COKE.Close - PEP.Close

#Rename columns
colnames(MSFT.Close)[1] <- "MSFT"
colnames(AAPL.Close)[1] <- "AAPL"
colnames(techDifference)[1] <- "Difference"

colnames(COKE.Close)[1] <- "COKE"
colnames(PEP.Close)[1] <- "PEP"
colnames(bevDifference)[1] <- "Difference"

#Combine into two tables
tech <- cbind(MSFT.Close,AAPL.Close,techDifference)
bev <- cbind(COKE.Close,PEP.Close,bevDifference)

#Plot charts
chartSeries(tech, order=1,up.col='green', name='MSFT & AAPL', layout=NULL,
TA=c("addTA(tech,order=2,on=1,layout=NULL);
addTA(tech$Difference,legend='Difference',type='h',layout=NULL)"))

chartSeries(bev, order=1,up.col='green', name='COKE & PEP', layout=NULL,
TA=c("addTA(bev,order=2,on=1,layout=NULL);
addTA(bevDifference$Difference,legend='Difference',type='h',layout=NULL)"))

#Take the cumulative difference for each sector 
techCumulative <- cumsum(abs(techDifference))
bevCumulative <- cumsum(abs(bevDifference))
diffCumulative <- techCumulative - bevCumulative 

#Rename columns
colnames(techCumulative)[1] <- "Tech"
colnames(bevCumulative)[1] <- "Beverage"
#If I set the name as Volume, I can use addVo() and get nice barplot.
#Problem with that is the legend name will be Volume but I would like to
#have it Difference and of course I'm using wrong column name. 
colnames(diffCumulative)[1] <- "Volume"

#Combine into one table
cumulative <- cbind(techCumulative,bevCumulative,diffCumulative)

#Plot chart
chartSeries(cumulative,order=1,up.col='green', name='Cumulative Difference', layout=NULL,
TA=c("addTA(cumulative,order=2,on=1,layout=NULL)", addVo()))

#Get the correlation matrix
correlationTable <- cbind(tech[,1:2],bev[,1:2])
correlation <- cor(correlationTable)
corTable <- as.table(correlation)
corrFormatted <- formatC(corTable, format = "f", digits = 3)
textplot(corrFormatted,valign="top",col.data=colors()[300],
col.rownames=colors()[300],col.colnames=colors()[300])
title("Correlation",cex.main=2.5,col.main=colors()[300])

dev.off()
like image 301
Denni17 Avatar asked Oct 23 '22 15:10

Denni17


1 Answers

Some good questions.

Q1: No. quantmod:::chartSeries.chob has this code:

old.adj <- par('adj')
par('adj'=0)
do.call('title',list(x@name, col.main=x@colors$fg.col))
par('adj'=1)
do.call('title',list(paste('[',start(xx),'/',end(xx),']', sep='')
                  ,col.main=x@colors$main.col))
par('adj'=old.adj)

I.e. the start(xx)/end(xx) bit is hard-coded.

Q2. Again, it appears to be hard-coded (same function):

if(x@type=='line') {
    lines(x.pos,Closes,col=x@colors$up.col,[email protected])
    main.key <- c(list(list(legend=
                       paste('Last',last(Closes)),
                       text.col=x@colors$up.col)),main.key)
}

(I couldn't find anything in my studies of the source code to help with Q3/Q4/Q5, sorry)

like image 139
Darren Cook Avatar answered Oct 27 '22 09:10

Darren Cook