I am using 5 volatility points to build a volatility smile : put 10D, put 25D, ATMF, call 25D and call 10D. I have thus 5 pairs of data : (Delta, Vol) let's say for example (10;5.75) ; (25; 5.50) ; (50;5.25) ; (75;5.60) ; (90;5.70).
I am doing a simple lagrange interpolation as below :
x = np.array([10, 25, 50, 75, 90]) #LIST OF DELTA
y = np.array([])
for index, elt in enumerate(vols[currency][tenor]):
y=np.append(y,vols[currency][tenor][elt])
interpolation = lagrange(x, y) #TO KEEP
xpol = np.linspace(x[0], x[4], 90)
ypol_lag = interpolation(xpol)
plt.scatter(x, y, marker='s', c='r')
plt.plot(xpol, ypol_lag, "b")
plt.show()
Which returns a nice smile, very realistic given the Market data I can observe in Bloomberg :
Then, I am transforming each delta in strike given the formula provided by Wystup, 2010 :
Therefore I have all my pairs (Strike, vol), let's say for example : (10;1.1650) ; (25; 1.1710) ; (50;1.1800) ; (75;1.1840) ; (90;1.1950) (non real numbers).
If I plot these five numbers and interpolate them using the same function as I did for the deltas :
x = np.array([K10p, K25p, K50, K25c, K10c])
y = np.array([])
for index, elt in enumerate(vols[currency][tenor]):
y=np.append(y,vols[currency][tenor][elt])
interpolation = lagrange(x, y)
xpol = np.linspace(x[0], x[4], 90)
ypol_lag = interpolation(xpol)
plt.scatter(x, y, marker='s', c='r')
plt.plot(xpol, ypol_lag, "r")
plt.show()
Surprisingly, the interpolation curb is different and does not look like a smile :
I have no idea how to get a similar interpolation with the strikes...
Thank you.