Hi Benji- you're in luck. I've done exactly this sort of thing in the
past. Here is the code that I wrote to do the job:

BuildPCACurves <- function(data, ncomps = 3){
  if (class(data) != 'matrix'){A <- as.matrix(data)} else A <- data
  M <- t(A) %*% A
  eigens <- eigen(M)$vectors
  eigens[,1] <- -eigens[,1]
  selectors <- matrix(0, nrow = ncol(A), ncol = ncol(A))
  diagentries <- c(rep(1, ncomps), rep(0, ncol(A) - ncomps))
  diag(selectors) <- diagentries
  coefficients <- A %*% eigens
  newcurves <- coefficients %*% selectors %*% t(eigens)
  coef2 <- apply(coefficients, 2, diff)
  means <- apply(coef2, 2, mean)
  stdevs <- apply(coef2, 2, sd)
  RMSE <- sqrt(sum((apply(newcurves - A, 2, sum)) ^ 2))
  output = list(original = A, rebuilt = newcurves, means =
means[1:ncomps], stds = stdevs[1:ncomps], RMSE = RMSE)
  return(output)
}

This doesn't use the actual "princomp" function in R, but it does
exactly the same thing; it just uses the underlying matrix theory behind
PCA itself.

On Tue, 2010-02-16 at 19:15 -0500, Benji Famel wrote:

> I like the idea, and I have attached a sample of data.  I think this
> should work as the file is not a binary one.  The data represents
> daily NYMEX data for Natural gas.
> The columns are flat prices (not returns) and represent:
> 1. Date
> 2. Prompt contract
> 3. Back contract (2nd month out)
> 4. Far contract (3d month out)
> 5. etc.
> After transferring the data to R through RExcel as MktData,  I execute
> the following code:
> 
> MktReturns.d <- MktData
> 
> # ----------- Data Preparation  ------------------
> for (i in 1:ncol(MktData) ) {
>   MktReturns.d[,i] <- Fin.Calcs.logreturns(x=MktData[,i],  deltaT= 1, pad=T)
>  }
> MktReturns.d <- na.omit(MktReturns.d)
> 
> #PERFORM PCA ON DAILIES    (good for 1 day risk... if I wanted the
> weekly risk, I would work with weekly returns)
> pcdat.d <- princomp(MktReturns.d, cor=TRUE) 	# - It will use
> correlation matrix so NO need to scale
> the.summary.d <- summary(pcdat.d) 	# - It will print standard
> deviation and proportion of variances for each component
> the.loadings.d <- loadings(pcdat.d) 	# - it will give information how
> much each variable contribute to each component.
> the.scores.d <- pcdat.d$scores 		# - It will plot scores of each
> observation for each variable
> whichQuantile <- quantile(rnorm(1000000),probs=c(0.95))
> 
> PC <- exp(whichQuantile*t(pcdat.d[[2]])*sqrt(pcdat.d[[1]])*sd(MktReturns.d))
> # note that if I wanted to work with daily returns but calculate the 1
> week risk, I woudl be multiplying above with sqrt(5)
> 
> Hope this helps.
> 
> Benji
> 
> On Tue, Feb 16, 2010 at 6:54 PM, Brian G. Peterson <brian@braverock.com> wrote:
> > Why don't you disguise a subset of your data and provide a working example?
> >
> > Both you and the list will get more out of it if we can all work on
> > something that is actually executable in R, per the posting guide.
> >
> > Your problem is interesting and relevant, so put a little more effort into
> > it, and I'm sure you'll get collaborators in working through it.
> >
> > Regards,
> >
> >  - Brian
> >
> > Benji Famel wrote:
> >>
> >> Hello,
> >>
> >> my apologies if I do something wrong - first posting for me.
> >>
> >> I am trying to apply PCA on the daily history of a bunch of forward
> >> curves and run into my depths of ignorance.  I would appreciate some
> >> help...
> >>
> >> My aim is to use PCA for risk control.  I.e. estimate the
> >> eigenverctors and eigenvalues and build the principal components at
> >> some confidence level, e.g. 95%.  If, for example, we were looking at
> >> the first 3 components only, I would
> >> - estimate PC1up, PC1dn, PC2up, PC2dn, PC3up and PC3dn.
> >>
> >> Let's assume that
> >> - PC1up is worse for my position than PC1dn,
> >> - PC2up is worse than PC2dn and
> >> - PC3dn is worse than PC3up
> >> I would then 'add' these worse for me components (PC1up, PC2up and
> >> PC3dn) and run my position through them to get a measure of risk at
> >> that confidence level.
> >>
> >> To do the PCA, I first foundthe log returns, let's call them Returns.
> >> I then do:
> >> pcdat <-princomp(Returns, cor=TRUE)
> >> and calculate the principal components like this (this is where I am
> >> very foggy...):
> >>
> >> PC <- exp(someQuantile*t(pcdat[[2]])*sqrt(pcdat[[1]])*sd(Returns))   #
> >> somQuantile = 1.64 for a 95% CL
> >>
> >>
> >> As much as I looked around, people discuss the benefits of PC but not
> >> how to recombine the principal components at some confidence interval
> >> to get a shocked curve.
> >>
> >> Could anyone help?
> >>
> >> Thank you,
> >> Benji
> >>
> >> _______________________________________________
> >> R-SIG-Finance@stat.math.ethz.ch mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> >> -- Subscriber-posting only. If you want to post, subscribe first.
> >> -- Also note that this is not the r-help list where general R questions
> >> should go.
> >
> >
> > --
> > Brian G. Peterson
> > http://braverock.com/brian/
> > Ph: 773-459-4973
> > IM: bgpbraverock
> >
> _______________________________________________
> R-SIG-Finance@stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> -- Subscriber-posting only. If you want to post, subscribe first.
> -- Also note that this is not the r-help list where general R questions should go.



	[[alternative HTML version deleted]]

