Shifting a Black Volatility Surface to Compute Option Greeks
Summary
The discussion addresses how to estimate an option’s vega, volga, and vanna by repricing after perturbing the volatility input. When a product depends on an entire Black variance surface, replacing it with a single constant volatility can be unsuitable for non-vanilla products and can add pricing overhead.
The proposed design is a wrapper volatility term structure that holds a reference to the original surface and a volatility spread. It delegates ordinary interface methods to the base surface and returns volatility values adjusted by the spread. Repricing with this shifted surface supports finite-difference sensitivity calculations while preserving the product’s use of the full surface. The answer notes that the library has no such utility at the time of the discussion; the class would need to be implemented or requested as a feature. It does not provide a full implementation or quantify performance gains, and finite-difference results depend on the chosen shift size.
Key ideas
- Finite-difference option sensitivities can be estimated by repricing with a perturbed volatility surface.
- A single constant volatility may fail to represent products that depend on the full volatility surface.
- A wrapper term structure can delegate to a base surface while adding a spread to its volatility values.
- The suggested approach is conceptual and does not include a complete implementation or measured efficiency results.
Tags
Full text
# How to efficiently shift BlackVarianceSurface to compute the vega, volga and vanna of an option
# How to efficiently shift BlackVarianceSurface to compute the vega, volga and vanna of an option
I am working with a vol surface that was created as a BlackVarianceSurface. Now I would like to compute the "vol" greeks for a product and as such I need to shift that surface by a small dVol uniformally so that I can then compute: Vega = [Price(shifted surface) - Price(base surface)] / shift
And along the same lines I'd need to compute the second derivative (volga) and cross spot/vol derivative (vanna).
So far the only thing I've been able to find was to extract a constant vol from the surface for a vanilla option, and then reprice not with the whole surface but with a constantvol. => This only works for vanilla options and won't work for other products using the entire surface => This method is highly inefficient as it considerably slows down all pricing
Has anyone come across a more efficient method ? Is there a utility that shifts the entire surface at once ?
Thank you
## Answer by Luigi Ballabio (score 1)
https://quant.stackexchange.com/a/73467
There's no such utility in the library right now, but it can be written in a page or two of code.
It would work like, for instance, the SpreadedSwaptionVolatility works for swaption volatility; the idea is to write a class that inherits from the base `BlackVolTermStructure` class and takes the desired base volatility and spread.
Like `SpreadedSwaptionVolatility`, it would provide most of the required interface by delegating to the base volatility, as in
```
inline DayCounter SpreadedSwaptionVolatility::dayCounter() const {
return baseVol_->dayCounter();
}
```
while the methods returning the volatility would be implemented as
```
Volatility SpreadedSwaptionVolatility::volatilityImpl(const Date& d,
const Period& p,
Rate strike) const {
return baseVol_->volatility(d, p, strike, true) + spread_->value();
}
```
If you do write it, please consider contributing it to the library; if, instead, you're not familiar with C++, you can open an issue on the QuantLib GitHub repository and request the feature.Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.