Hi, I am currently trying to understand the response of the example code in here:
Firstly, I would like to know if it is possible and how to retrieve the normal volatilities.
I would also like to understand what is the content of 'calibrationParameters', the data structure is not well defined and there are negative values.
Finally, this volatility data is Bid, Ask or Mid? Is there any way to indicate it in the header?
Indeed, as the model is calibrated from market data, we would expect a perfect market vol repricing, from one shift to another one.
Page 7 of the attached document will give you the SABR formulas calibrated against market log and normal vols. Generally speaking the SABR formulas return a different volatility depending on the chosen epsilon/shift, so even if the model parameters are adapted, different shifts will yield slightly different calibrated volatilities.
The calibrated volatility differs significantly (up to 1bp) when the shift moves from 3% to say, 2%. In that case on EUR, it means we can't calibrate on the -2% (ATM relative) strike. So the calibration takes into account less market swaption smile points. In my view that can explain noticeable differences in calibrated volatility.
When the shift is less important (say 3% to 3.1%) the impact is less important (from my tests, less than 0.1 bp).
About your question on RDP data retrieval endpoints, i'm afraid i can't help. I believe that there is a Git repository with data retrieval samples. I think you can find several topics on this forum that address data retrieval questions
1/ The response contains a section 'description' with:
"inputVolatilityType": "NormalizedVolatility" => we use normal volatility as input vol for the SABR cube calibration
"outputVolatilityType": "NormalizedVolatility" =>volatility contained in 'ndimensionalArray' is normal.
The 'calibration parameters' section contains SABR parameters for each SwaptionExpiry/SwapTenor: ATM vol, Beta, VolVol, Correl (which explains the negative values), and ATM swap rates.
2/ The volatility is Mid because the market volatilities used as inputs for the calibration are Mid.
About the calibration parameters data structure and price side, we will take into account your feedbacks to better describe the service response.
Thank you for your quick response, it was clarifying, however, some new doubts came up.
1/ If the volatilities are normal, what is actually "shiftPercent" and "strippingShiftPercent"? Is shifted SABR being used?
2/ In the response, there is a section called "constituents" that appers to have what we need, i.e. both normal and lognormal volatilities, but the data appear as null.
3/ Is it possible to retrieve lognormal volatilities? How?
4/ Is there any sort of documentation to know which settings can be added to the payload of the request and their meaning?
1/ shiftPercent is a user-defined shift (in %) applied to swaption market strikes, in order to allow the calibration of SABR on negative strikes. strippingShiftPercent is the same but applied to caps strikes, when caps are used in the SABR calibration process.
- If the request 'surfaceParameters' contains 'includeCapletsVolatility':true , then we first strip caplets volatilities, lift it at ATM swaptions vol level, and calibrate the SABR model. That's a proxy of swaption skews
- If the request 'surfaceParameters' contains 'includeCapletsVolatility':false, then we directly calibrate the SABR cube on swaption skews. When swaption skews contributions are directly available we calibrate on skews by default.
2/ For the moment the constituents data is not exposed because it's sensitive data that requires user permissioning. We will expose it based on user permissions, but that won't happen before Q4.
This end point is primarily designed to return a calibrated SABR cube, not the market data the cube is calibrated from, even we will soon expose it in the response. The end point returns calculated data.
If you are interested in market normal and lognormal vol i advise you to pull ICAP, Tullett or Fenics data from RDP data retrieval end points.
3/ You have to ways to do that:
- in 'surfaceLayout', you can set 'format':'List' in order to get lognormal vols
- or in 'surfaceParameters' you can set 'outputVolatilityType':'LogNormalVolatility'
4/ The available documentation is here: Documentation | Refinitiv Developers . But it probably requires some updates.
You can also have a look at Swagger definition:
Thanks again for your detailed response. I have an extra question regarding point 1:
What I have understood about what you said about SABR calibration on negative strikes is that you are using the shifted SABR to allow for negative strikes:
So, to get the normal volatilities, I assume you are using the famous Hagan formula but adding
s to the strike and the forward swap rate. However, I am wondering why this shift has influence on the output volatility data. I suppose that the resulting volatility data are normal volatilities that must be introduced in the Bachelier formula to price a swaption with a given tenor, expiry, and strike (without taking any shift into account in the Bachelier formula). Therefore, I didn't expect the volatility output data to change when the shift changes, but it does.
Furthermore, I would like to ask you how to pull data from the RDP data retrieval endpoints that you mentioned in your response. Is that the same as the API playground? Is there any documentation about how to use that service? I have used the RDP Library in C# to retrieve data but I don't know if this is what you are referring to.