[R-SIG-Finance] PCA in Risk Control with R
Benji Famel
benjifamel at gmail.com
Wed Feb 17 02:26:47 CET 2010
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:
> 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 at 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 at 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 at 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]]
>
> _______________________________________________
> R-SIG-Finance at 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.
More information about the R-SIG-Finance
mailing list