Skip to content
All library documents

Why Calls and Puts Share Implied Volatility Under Put-Call Parity

Article Quant Q&A · Author: FunnyBuzer

Summary

This note examines why call and put implied volatility surfaces can look the same when prices for both option types are computed under the Heston model. It describes converting a put price into an equivalent call price using put-call parity, then applying a call implied-volatility function to that adjusted price. The questioner observes similar surfaces and expects the strike patterns for calls and puts to differ.

The response explains that a call and put with the same strike and expiry should have the same implied volatility when put-call parity holds. Thus, the volatility smile or skew is shared across the two option types for matching contracts; the direction of the smile does not reverse simply because the option is a put. This conclusion assumes consistent pricing and parity inputs. The note does not diagnose the sample code or explore settings where market frictions, dividends, or mismatched conventions affect parity.

Key ideas

  • Put-call parity links call and put prices at the same strike and expiry.
  • When parity holds, matching calls and puts imply the same volatility.
  • A volatility skew is therefore shared by calls and puts rather than reversed by option type.
  • The explanation presumes consistent pricing inputs and matching contract terms.

Tags

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


# 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.

## Answer by Pecos (score 1)

https://quant.stackexchange.com/a/46545

A call and a put option with the same strike and same expiry should have the same implied volatility by put-call parity indeed. A call and a put are essentially the same when you hedge the initial delta in terms of greek exposures

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.