Differentiate the Black–Scholes price with respect to spot, volatility, calendar time, and the rate. Evaluate the resulting formulas at the same inputs used for the price. State the units for each Greek. A mathematical vega of corresponds to about in option value for a one-percentage-point volatility increase.
Differentiate the price and check the units
From , the identity cancels the chain-rule terms in the spot derivative. Hence . Put–call parity gives , and differentiating either delta yields for both. Differentiating with respect to volatility gives for both.
Define . Calendar theta is for the call and for the put. Finally, and . These expressions assume positive spot, strike, time to maturity, and volatility.
To see why call delta simplifies, differentiate each term in . The derivative of the leading produces . The two CDF derivatives are proportional to the same . Their coefficients cancel by the density identity above. Gamma then comes from differentiating the remaining . For the put you can use and differentiate the parity equation. It immediately tells you that put delta is call delta minus one and that their gammas and vegas agree.
Evaluate the Greeks at one common set of inputs
Set , , , and . The call and put deltas are approximately and . Both gammas are approximately and both vegas are approximately for a unit change in decimal volatility. The call theta is about per year, or per calendar day using a 365-day convention. The put theta is about per year in this example. Multiply per-share Greeks by the contract multiplier to obtain exposures for one contract.
Python and finite-difference checks
from math import exp, log, sqrt
from scipy.stats import norm
def greeks(spot, strike, maturity, rate, vol, *, call=True):
root_t = sqrt(maturity)
d1 = (log(spot / strike) + (rate + vol**2 / 2) * maturity) / (vol * root_t)
d2 = d1 - vol * root_t
present_strike = strike * exp(-rate * maturity)
density = norm.pdf(d1)
sign = 1 if call else -1
return {
"delta": sign * norm.cdf(sign * d1),
"gamma": density / (spot * vol * root_t),
"vega_per_point": spot * density * root_t / 100,
"theta_per_day": (
-spot * density * vol / (2 * root_t)
- sign * rate * present_strike * norm.cdf(sign * d2)
) / 365,
"rho_per_point": sign * maturity * present_strike * norm.cdf(sign * d2) / 100,
}
print(greeks(100, 100, 1, 0.05, 0.20))Change one input at a time in the options pricer if you want a visual check of the signs of delta and vega.