Serving the Quantitative Finance Community

 
User avatar
jherekhealy
Topic Author
Posts: 20
Joined: December 11th, 2017, 2:25 pm

CMS Convexity challenge

March 30th, 2018, 11:43 am

I am trying to reproduce the numbers of the paper "Smiling at convexity: bridging swaption skews and CMS adjustments" by Mercurio and Pallavicini, in the simple case (Black), but I don't manage to.

I tried the 10y tenor. I consider quarterly payments for both legs of the CMS swap (delta=0.25) and yearly payments (tau=1) for the fixed leg of the underlying EUR libor swap, which I think is correct as per the paper and market conventions. I have tried other values but they don't work better.

The Black convexity adjustments I obtain for 1y,5y,10y,20y,30y maturities are
0.0001672940378088883, 0.0009574359283918777, 0.001829981588776476 , 0.0029763899004401494, 0.004132008024684085. They look in line with their Table 5.

Now what I don't match is the Black CMS spread (equation 9). For 10y10y, I get for the CMS leg  4.143912241342802  and for the floating leg 3.6194594935882707 which leads to a spread of 52.44527477545314 in ACT/365, while it should be between 58 and 62.6. Other maturities are off by a similar margin.

I follow their proposed method to compute this, in particular, it depends on the convexity adjustment at each fixing date, which is in general not known and where a cubic spline interpolation is used (with first knot time 0 with value 0) - this is described in step 2 and 3 page 8, although using a constant vol for all fixing dates leads to a very similar adjustment.

My code is fairly rough, but daycount or interpolation does not seem to affect the results much and I suspect that taking holidays into account would not either.

I am wondering if my calculations are seriously off or if there is a problem with the market data given in the paper.

P.S.:
their yield curve in ACT/365
t := []float64{0, 0.008219178082192, 0.013698630136986, 0.03013698630137, 0.087671232876712, 0.361643835616438, 0.63013698630137, 0.876712328767123, 1.12328767123288, 1.37808219178082, 1.62739726027397, 1.87397260273973, 2.12328767123288, 3.01917808219178, 4.01643835616438, 5.01369863013699, 6.01369863013699, 7.01643835616438, 8.01643835616438, 9.02191780821918, 10.0191780821918, 11.0191780821918, 12.0191780821918, 13.0191780821918, 14.0191780821918, 15.0246575342466, 16.0219178082192, 17.0219178082192, 18.0219178082192, 19.0246575342466, 20.0301369863014, 21.027397260274, 22.0246575342466, 23.027397260274, 24.027397260274, 25.027397260274, 26.0328767123288, 27.0301369863014, 28.0301369863014, 29.0301369863014, 30.0301369863014, 40.0383561643836, 50.0438356164384, 60.0}
rates := []float64{0.0248,
        0.0248, 0.0248, 0.0243, 0.0243, 0.0263, 0.0275, 0.0284, 0.0292, 0.0298, 0.0303, 0.0307, 0.0311, 0.0321, 0.0329, 0.0336, 0.0342, 0.0348, 0.0353, 0.0359, 0.0364, 0.0368, 0.0372, 0.0376, 0.038, 0.0383, 0.0386, 0.0388, 0.039, 0.0392, 0.0393, 0.0395, 0.0396, 0.0396, 0.0397, 0.0397, 0.0397, 0.0397, 0.0397, 0.0397, 0.0397, 0.0393, 0.0388, 0.0388}
their vol term structure
atmVols := []float64{0.155, 0.15, 0.138, 0.125, 0.123}
atmTte := []float64{1.0, 5.0, 10.0, 20.0, 30.0}