Skip to content
All library documents

Shifting a Black Volatility Surface to Compute Option Greeks

Article Quant Q&A · Author: volPMNYC

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.