This is part 1 of 4 posts that I would like to share on FX Volatility surfaces. The posts assume that the reader is familiar with the concept of volatility skew. There are many excellent references out there and I don’t want to repeat what you can already find in texts.

This part will focus on how FX traders build a volatility surface. Beginning with three data points \(25\Delta\) put(\(75\Delta\) call) volatility, at-the-money volatility and \(25\Delta\) call(\(75\Delta\) put) volatilities, we are to interpolate the curve. The curve should be arb free. Traders use a thumb-rule called the Vanna-Volga method.

VV is extremely intuitive. The idea is to construct a portfolio of \(1\) long call, short \(\Delta\) units of the stock and short the three calls (\(25\Delta\), \(50\Delta\) and \(75\Delta\)) in the proportion \((x_{1},x_{2},x_{3})\). For the portfolio to be arb-free, we set vega, volga and vanna to zero. This yields \((x_{1},x_{2},x_{3})\). The weights can be used to compute the vanna-volga adjustment. The market price of the option is simply the sum of the Black Scholes Price and the vanna-volga adjustment.

I could write a first order approximation of the adjustment as :

\(\text{Adjustment}= \text{Vega}\times(\text{IV} – \text{Flat volatility }\sigma_{atm})\)

And a second order one as :

\(\begin{aligned}
\text{Adjustment} &= \text{Vega}\times(\text{IV} – \text{Flat volatility }\sigma_{atm}) \\
&+ \text{Volga}\times(IV – \text{Flat volatility }\sigma_{atm})^{2}
\end{aligned}\)

Solving the above for IV, it’s easy to extract a first-order and second-order approximation.

This document outlines the Vanna-Volga method and a sample code snippet in Python. In my next post, I plan to write on other stochastic volatility models and their C++ implementation.