QF-Learn

Put-call parity: the formula, why it holds, and how to use it

Put-call parity is the rule that a European call minus a European put, with the same strike and expiry, is worth the stock minus the present value of the strike: C − P = S − K·e−rT. If market prices break it, a trader can lock in a riskless profit, so in liquid markets they rarely break it for long.

It holds whatever model you believe in. It needs no volatility and no view on where the stock is going, only the fact that two positions with the same payoff must cost the same.

The put-call parity formula

C − P = S − K·e−rT

C and P are the call and put prices, S is the stock price, K the strike, r the continuously compounded risk-free rate and T the time to expiry in years. Rearranged as C + K·e−rT = P + S, it says a call plus cash equals a put plus the stock: a “fiduciary call” and a “protective put” are the same thing.

Why it must hold

Buy one call and sell one put with strike K. At expiry, if the stock is above K you exercise the call and the put expires: you gain S − K. If the stock is below K, the put is exercised against you and you pay K − S, which is again S − K. Either way the position pays exactly ST − K, the same as owning the stock and owing K at expiry. Owing K at expiry costs K·e−rT today, so the two positions must have the same price today.

Long call plus short put equals a forwardAt expiry a long call with strike 100 and a short put with strike 100 add up to a straight line, S minus 100, the payoff of owning the stock and owing 100.-40-20020406080100120140Strike 100Stock price at expiryPayoffLong callShort putCall − put = S − 100
The two kinked payoffs add up to a straight line: the payoff of a forward contract.

Worked example, and spotting a mispriced put

Take a stock at 100, a strike of 100, one year to expiry and a 5% rate. Under Black-Scholes with 20% volatility the call is 10.4506 and the put is 5.5735. Their difference is 4.8771, exactly 100 − 100·e−0.05. If the put were quoted at 5.00 instead, parity says it is 0.5735 too cheap:

Python
from math import exp, log, sqrt
from statistics import NormalDist

N = NormalDist().cdf
S, K, T, r, sigma = 100, 100, 1, 0.05, 0.20

d1 = (log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * sqrt(T))
d2 = d1 - sigma * sqrt(T)
call = S * N(d1) - K * exp(-r * T) * N(d2)
put = K * exp(-r * T) * N(-d2) - S * N(-d1)

print(f"C - P          = {call - put:.4f}")
print(f"S - K*e^(-rT)  = {S - K * exp(-r * T):.4f}")

# A put quoted at 5.00 instead of 5.5735 breaks parity:
market_put = 5.00
print(f"put implied by parity = {call - S + K * exp(-r * T):.4f}")
print(f"mispricing = {call - S + K * exp(-r * T) - market_put:.4f} per share")
Output
C - P          = 4.8771
S - K*e^(-rT)  = 4.8771
put implied by parity = 5.5735
mispricing = 0.5735 per share

To capture it: buy the put at 5.00, buy the stock at 100 and sell the call at 10.4506. That costs 94.5494, and at expiry the three together are worth exactly 100 whatever the stock does. Borrowing the 94.5494 at 5% costs 99.3971 to repay, leaving 0.6029 at expiry, which is 0.5735 in today’s money. In practice, bid-ask spreads, borrowing costs and fees eat most of such gaps, which is why they are small and short-lived.

What put-call parity is used for

When it does not hold exactly

Parity is exact for European options on a stock that pays no dividends. With known dividends, replace S with S minus the present value of the dividends before expiry. For American options, which can be exercised early, it becomes a pair of inequalities rather than an equation: S − K ≤ C − P ≤ S − K·e−rT for a stock without dividends. A binomial tree shows where that early-exercise value comes from.

Learn this on your phone, one short lesson at a time

QF-Learn turns topics like this into five-minute lessons with quizzes, finance games and certificates. It is free, and it is coming to Android and iOS. Leave your email and you will be first to get it.