Работа с ChartSeries в Quantmod

Я новичок в R, и мне было очень полезно пользоваться вашим сайтом. К сожалению, вот уже два дня я борюсь с кодом, поэтому хотел задать несколько вопросов. Я пытался создать хорошие графики, чтобы поместить их в PDF-лист, но у меня небольшие проблемы со всеми пакетами, которые я использовал. Итак, я хочу создать один лист PDF с тремя графиками и одной корреляционной таблицей. Ниже приведен созданный мной пример, который очень похож на то, что я хочу сделать, но есть несколько вещей, которые я хотел бы изменить. Я использую chartSeries в Quantmod для графиков, а для таблицы я использую текстовый график.

Несколько вопросов:

  1. Можно ли убрать дату в правом верхнем углу графиков?
  2. Вместо текста Last xxxx (текст зеленой серии) я хотел бы получить название самой серии, например MSFT, это выполнимо?
  3. Как я могу дать имена осям, например Дата возврата?
  4. На графике совокупной разницы я использую addVo (), и эта функция дает прекрасный график barPlot. В других графиках я не использую addVo (), просто addTA и type = 'h', и вы можете увидеть разницу между графиками столбцов / гистограмм. Можно ли с помощью addTA получить тот же сюжет, что и в addVo?
  5. Есть ли способ лучше подогнать корреляционную таблицу и / или сделать это более профессионально. Может быть, другая функция лучше?

Лучший,

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()

person Denni17    schedule 30.07.2012    source источник


Ответы (1)


Несколько хороших вопросов.

Q1: № quantmod:::chartSeries.chob имеет этот код:

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)

Т.е. бит начала (xx) / конца (xx) жестко запрограммирован.

Q2. Опять же, похоже, что это жестко запрограммировано (та же функция):

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)
}

(Я не смог найти ничего в моих исследованиях исходного кода, чтобы помочь с Q3 / Q4 / Q5, извините)

person Darren Cook    schedule 31.07.2012
comment
Привет, Даррен! Большое спасибо за ответы, по крайней мере, хорошо знать, что это невозможно. Я был бы признателен, если бы кто-нибудь мог ответить на другие вопросы. - person Denni17; 31.07.2012