I have a need to set-up a methodology to decompose the x-day yield curve moves into its underlying (3) PCAs. Specifically, for an example, to generate the 1-day moves in the EUR-swap yield curve; then explain each day's moves in terms of the 3 PCA's I have generated.
I have found that my PCA-based moves do not correspond to the realized moves; and I am not sure what I might have done wrong in my calculation methodology. My understanding is that, for a specified yield-curve move (from 1yr to 30yr), the moves across the term can be estimated from
yield(T) = w1 * PCA1(T) + w2 * PCA2(T) + w3 * PCA3(T)
where for example, w1, w2, w3 are the weights for each PCA1, 2 and 3. T is the tenor of the yield-rate, such as 1yr, 2yr... 30y.
My methodology is as follows
- extract EUR swap yield-rate data April 2016 - April 2019 (from 1yr to 30yr)
- extract 1-day move (absolute basis pt change)
- Extract sample set of 252 days (i.e. from April 2018 - April 2019).
- Generate the co-variance matrix of the term-structure movement (without removing the mean of the moves)
- Generate the eigenvalues, and eigenvectors (used python Numpy for this). Use the dominant 3 PCA, which is the parallel, twist and bowing movements. See picture of my PCA's below.
For the 1st day of my realized yield-move (such as 10th April 2019), I calculate the correlation between realized moves and PCA1, PCA2, PCA3. I obtain the following correlations : w1 = 0.70, w2 = 0.396, w3 - -0.342
With these weights, I should have been able to estimate the realized move, such that 1yr move = w1 * PCA1(1yr-pt) + w2 * PCA2(1yr-pt) + w3 * PCA3(1yr-pt).
However, my estimation is quite far off. I am not sure if my methodology had anything missing. I referred to some existing threads, but couldn't find something that addressed my practical calculations.