tags:

views:

83

answers:

1

I am looking for a standardized method for arranging data in relative time. Applications include accounting data such as FY1,FY2,etc... and economic data such as the term structure of interest rates using the 1 year, 2 year, 3 year, etc...

I would like to be able to compare a set of time series data that is current and several historic time series sets that represent similar situations or historic norms. I was looking at xts but it looks like I need to use an absolute time reference.

I would eventually like to use Quantmod's charting functions or graphs with equivalent capability to visualize the data. Since chartSeries requires a time series object, does anyone know how to do this? Even a point in the right direction would be helpful. Thanks.

require(quantmod)
symbols=c("DGS1","DGS2","DGS3","DGS5","DGS7","DGS10","DGS20")
getSymbols(symbols,src="FRED")
one.h=mean(na.omit(DGS1));two.h=mean(na.omit(DGS2));three.h=mean(na.omit(DGS3));five.h=mean(na.omit(DGS5));seven.h=mean(na.omit(DGS7));ten.h=mean(na.omit(DGS10));twenty.h=mean(na.omit(DGS20))
historic=c(one.h,two.h,three.h,five.h,seven.h,ten.h,twenty.h)
current=c(last(DGS1),last(DGS2),last(DGS3),last(DGS5),last(DGS7),last(DGS10),last(DGS20))
years=c(1,2,3,5,7,10,20)
plot(years,current,type="o",pch=20,ann=FALSE)
lines(years,historic,type="o",pch=20,col="red",lty=3)
title(main="Term Structure of Interest Rates",col.main="red", font.main=4)
title(xlab="Years to Maturity",ylab="Interest Rate",col.lab=rgb(0,0.5,0))
legend(3, c("Current","Historic"),cex=0.8,col=c("black","red"),pch=20)

Problem: I would like to be able to select a time period such as September of 2007 and grab each daily yield curve to plot against the current yield curve. I'm sure I could use several pages of first and last functions but that would be more work than building it in Excel.

+1  A: 

xts requires an explicit time index but it's based on zoo, which has no such requirement. So zoo will allow you to do something like this, as long as the index is ordered:

> x <- zoo(rnorm(5),sprintf("FY%02d",1:5))
> y <- zoo(rnorm(5),sprintf("FY%02d",1:5))
> merge(x,y)
               x           y
FY01  0.32707886 -1.81414982
FY02 -0.95177700  0.37772862
FY03 -0.03052571 -1.13047719
FY04  1.19139973  0.96962871
FY05 -0.76484142 -0.08187144

The downside is that you won't be able to use those objects with quantmod::chartSeries because it requires an xts object. I doubt this answers your question, but I hope it gives you some ideas.

EDIT to incorporate OP's example:

library(quantmod)
symbols=c("DGS1","DGS2","DGS3","DGS5","DGS7","DGS10","DGS20")
getSymbols(symbols,src="FRED")
all <- na.omit(merge(DGS1,DGS2,DGS3,DGS5,DGS7,DGS10,DGS20))

years <- c(1,2,3,5,7,10,20)
# use xts indexing, since getSymbols returns xts
histDate <- "2007-09-01/2007-09-10"
# create zoo objects for non-time-based indexing
hist <- zoo(t(all[histDate]), order.by=years)
curr <- zoo(t(last(all)), order.by=years)

currHist <- merge(curr,hist)
plotCol <- rainbow(NCOL(currHist))
plot(currHist, screens=1, col=plotCol, pch=20, type="o", ann=FALSE)
title(main="Term Structure of Interest Rates",col.main="red", font.main=4)
title(xlab="Years to Maturity",ylab="Interest Rate",col.lab=rgb(0,0.5,0))
legend(15,1.5,colnames(currHist),cex=0.8,col=plotCol,pch=20)
Joshua Ulrich
Thanks. I'm starting to realize why so few people in finance don't go beyond Excel.
ProbablePattern
Don't kid yourself; it's not limited to people in finance. ;-) Someone could probably provide a better solution if you could give an example of the problem you're trying to solve. And since `chartSeries` wasn't designed for the type of problem you have, try `plot.zoo(..., screens=1)`.
Joshua Ulrich
THanks for the example. I hope my edits help.
Joshua Ulrich
Thanks! Learning "merge" definitely shortens a lot!
ProbablePattern