# Compute implied volatility surface of a put option from a call option

Suppose the function double bsCall(double S0, const double &K, double T, double r, double sigma) computes analytically the Black-Scholes price of a call option and double impVolCall(double S0, const double &K, double T, double r, double C) calculates the implied volatility. Using the put-call parity, one can define the function that returns the put implied volatility in this way:

double ImpliedVolPut(double S0, const double &K, double T, double r, double C)
{
double x = impVolCall(S0, K, T, r, C + S0 - K*exp(-r*T));
return x;
}


Moreover, I have a function that computes European Call/Put option price for the Heston model semi-analytically:

hestonClosedPrice(double lambda, double vbar, double eta, double rho, double v0, double r, double tau, double S0, double K, char optionType)

My question is why the volatility surface obtained for different values of K and T for the call and put options look the same:

std::vector<double> hestonPrice(std::vector<double> k, std::vector<double> t)
{
if(optionType == 'Call'){
HestonPrice(k[i],t[j]) = hestonClosedPrice(lambda, vbar, eta, rho, v0, r, t[j], S0, k[i], 'Call');
}
else{
HestonPrice(k[i],t[j]) = hestonClosedPrice(lambda, vbar, eta, rho, v0, r, t[j], S0, k[i], 'Put');
}
if (optionType == "Call") {
hestonIVS = impVolCall(S0, k, t, r, HestonPrice(k[i],t[j]));
} else if (optionType == "Put") {
hestonIVS = impVolPut(S0, k, t, r, HestonPrice(k[i],t[j]));
}

...
}


Intuitively, one should have that the lower the strike, the higher the call implied vol and the lower the put implied vol. The option pricer for both call and put is correct.

• I believe the code and that the underlying model is Heston is irrelevant to your question, which is why European puts and calls have the same IV (in theory). Maybe you can edit your question and leave only the real question in the text?
– user34971
Jul 10, 2019 at 18:12
• @ilovevolatility yes I see your point! And actually I get this result because I use the put-call parity, which works for the same level of volatility. I just find a bit counterintuitive that for strikes less than ATM values, ITM calls and OTM puts have the same implied volatility. An ITM option has a positive intrinsic value compared to an OTM that has zero intrinsic value. Therefore, I expected the value (or implied volatility) of an ITM call to be higher than then value (or implied volatility) of an OTM put. Jul 10, 2019 at 20:08
• I think I understand your point, but the answer to that, however counter intuitive it may seem is that if puts and calls satisfy put-call parity with different implied volatilities then there would be arbitrage. If you want me to show that put call parity implies IVs must be the same let me know and I'll put it in a proper answer.
– user34971
Jul 11, 2019 at 6:50
• @ilovevolatilit, thanks! I'm aware of the result but somehow it seems like I forgot about its main implication. Thanks for pointing it out. Jul 11, 2019 at 9:25