Skip to content

PCA in Risk Control with R

7 messages · Benji Famel, Brian G. Peterson, Sarbo +1 more

#
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
#
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:

  
    
#
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 at braverock.com> wrote:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: NYMEX curves.csv
Type: application/octet-stream
Size: 376188 bytes
Desc: not available
URL: <https://stat.ethz.ch/pipermail/r-sig-finance/attachments/20100216/33a4c680/attachment.obj>
#
Sarbo,

Thank you. This answers how you rebuild the curve.

Now this may be a silly question but how do you shock the resulting  
curve to a given conf level?

Thanks again,

Benji.
Sent from my mobile device.
On Feb 16, 2010, at 8:02 PM, Sarbo <cmdr_rogue at hotmail.com> wrote:

            
#
hello Julien,

Thank you for your response.  I get Point 1.

On point 2, stating your comment in another way (to make sure I
understand it): since we do not have a distribution of the normal
modes, no scale factor exists by which to shock them.

Here is my thinking:
1. Work with returns
2 .Calculate the sigma of these returns (assuming a normal for ease)
3. Scale by sigma (which explains why it appears as a mult factor in step 5)
4. Calculate the normal modes
5. Return to original coordinate system by  (this might be somewhat
incorrect but, if not, then it provides a way to stress at a given
confidence level):
 PCA| i,m = exp( FI(0.995) * N|i,m * S|m * SQRT(L|i) )

i = i-th Principal component
m = forward month
FI = inv normal at a CL
N|i,m = eigenvectors
S|mm = std dev
L|i = eigenvalue

So my way of stressing is scaling up that S by the "2.57" (the
FI(0.995)).  Is this wrong?  Am I missing something?

Benji


On Wed, Feb 17, 2010 at 3:38 AM, julien cuisinier
<j_cuisinier at hotmail.com> wrote: