Black-Scholes Formula and European Option Pricing › Introduction to the Greeks

Michael BrenndoerferNovember 28, 202517 min read
Quantitative FinanceAll chapters
Part 5 of 15Stochastic Calculus and Pricing Theory
Chapter 30Black-Scholes Formula and European Option Pricing › Introduction to the Greeks
Reading section 7 of 11 · Introduction to the Greeks · 17 minSection 7 of 11 · 17 min

Book contents

Section 7 of 11 · 17 min read

Black-Scholes Formula and European Option Pricing › Introduction to the GreeksOne section · Sections in this chapter7 / 11 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

The Greeks are partial derivatives of the option price with respect to various inputs. They quantify how sensitive an option's model price is to small changes in those inputs. Understanding the Greeks is essential for risk management and hedging. Each Greek measures a different dimension of local, model-based sensitivity; this set does not capture every risk, including model misspecification or liquidity risk.

The Greeks derive their importance from the dynamic nature of hedging. As we learned when studying the derivation of the Black-Scholes PDE, perfect replication within that model requires continuous adjustment of a hedge portfolio. Delta gives the model's stock hedge ratio, while the other Greeks help assess how that hedge and the option value respond as inputs change. These sensitivities do not eliminate errors from discrete rebalancing or departures from the model's assumptions.

The Greeks

The Greeks are usually named after Greek letters and measure the sensitivity of option prices to changes in underlying parameters. The five primary Greeks are Delta, Gamma, Theta, Vega (whose name is not a Greek letter), and Rho.

Delta: Sensitivity to Stock Price

Delta (Δ\Delta) measures the local rate of change of the option price with respect to the stock price, holding the other inputs fixed. Multiplying delta by a stock-price change gives a first-order estimate of the option-price change, not an exact repricing for a finite $1 move. Delta answers the practical question: if the stock moves a little, how much does your option position change in value?

Δcall=∂C∂S=N(d1)\Delta_{\text{call}} = \frac{\partial C}{\partial S} = N(d_1)

where:

  • Δcall\Delta_{\text{call}}: delta of the call option
  • CC: call option price
  • SS: stock price
  • N(d1)N(d_1): cumulative normal distribution value at d1d_1

The result that call delta equals N(d1)N(d_1) comes directly from differentiating the Black-Scholes formula. The derivative of the first term S⋅N(d1)S \cdot N(d_1) with respect to SS is not simply N(d1)N(d_1) because d1d_1 itself depends on SS. However, when we carefully apply the chain rule, the additional terms cancel out, leaving just N(d1)N(d_1). This cancellation is not coincidental; it reflects a deep property of the Black-Scholes formula related to the self-financing nature of the replicating portfolio.

Δput=∂P∂S=N(d1)−1=−N(−d1)\begin{aligned} \Delta_{\text{put}} &= \frac{\partial P}{\partial S} \\ &= N(d_1) - 1 \\ &= -N(-d_1) \end{aligned}

where:

  • Δput\Delta_{\text{put}}: delta of the put option
  • PP: put option price
  • SS: stock price
  • N(d1)N(d_1): cumulative normal distribution value at d1d_1
  • N(−d1)N(-d_1): cumulative normal distribution value at −d1-d_1

Call deltas range from 0 to 1, while put deltas range from -1 to 0 in this non-dividend model. A spot-at-the-money call often has delta near 0.5 for short remaining maturity and modest carry, but its exact delta is N((r/σ+σ/2)τ)N((r/\sigma+\sigma/2)\sqrt{\tau}). Delta gives a first-order estimate for a small stock move. A deep in-the-money call approaches delta 1, while a deep out-of-the-money call approaches delta 0.

Delta also has an interpretation as a hedge ratio: to hedge a short call position, you should hold Δ\Delta shares of stock. If you sell a call with delta 0.5, you need to buy 0.5 shares to neutralize your exposure to small stock price movements. This hedge ratio must be continuously updated as the stock price moves and as time passes, which is why delta hedging is dynamic rather than static.

Gamma: Sensitivity of Delta to Stock Price

Gamma (Γ\Gamma) measures the local rate of change of delta with respect to the stock price, holding the other inputs fixed. Multiplying gamma by a small stock-price change approximates the change in delta. This second-order sensitivity helps assess how stable the delta hedge will be. High gamma means that even small moves in the stock price can significantly change the delta, requiring frequent rebalancing of the hedge.

Γ=∂2V∂S2=N′(d1)SσT−t\Gamma = \frac{\partial^2 V}{\partial S^2} = \frac{N'(d_1)}{S \sigma \sqrt{T-t}}

where:

  • Γ\Gamma: gamma of the option
  • VV: option price (call or put)
  • SS: stock price
  • N′(d1)N'(d_1): standard normal probability density at d1d_1
  • σ\sigma: volatility
  • T−tT-t: time to expiration

The function N′(x)=e−x2/2/2πN'(x)=e^{-x^2/2}/\sqrt{2\pi} is the standard normal probability density. Gamma measures the stock-price derivative of call delta N(d1)N(d_1), which is the call exercise probability under the share measure. It is not the derivative of the risk-neutral exercise probability N(d2)N(d_2).

Gamma is the same for calls and puts with the same strike and expiration. This equality follows from put-call parity: since C−P=S−Ke−rτC - P = S - Ke^{-r\tau}, and the right-hand side is linear in SS, the second derivative with respect to SS must be identical for calls and puts.

High gamma means delta changes rapidly with the stock price, requiring frequent hedge rebalancing. As expiration approaches, gamma becomes concentrated near the money, but its exact maximum depends on the variable being changed. At fixed S,τ,r,σS,\tau,r,\sigma, gamma peaks across strikes at K=Sexp⁡((r+σ2/2)τ)K=S\exp((r+\sigma^2/2)\tau). At fixed K,τ,r,σK,\tau,r,\sigma, its peak across stock prices is S=Kexp⁡(−(r+3σ2/2)τ)S=K\exp(-(r+3\sigma^2/2)\tau). Long gamma gives positive local price curvature; total profit also depends on time decay, financing and the trading strategy.

Theta: Sensitivity to Time

Theta (Θ\Theta) measures the local rate of change of the option price as calendar time tt advances, holding the expiration date TT and the other inputs fixed. Since remaining maturity is T−tT-t, this is the negative of the derivative with respect to remaining maturity. Theta can have either sign: a negative value indicates time decay, while a positive value indicates a local increase in price as time passes. With time measured in years, the formula below gives theta per year.

Θcall=∂C∂t=−SN′(d1)σ2T−t−rKe−r(T−t)N(d2)\Theta_{\text{call}} = \frac{\partial C}{\partial t} = -\frac{S N'(d_1) \sigma}{2\sqrt{T-t}} - rKe^{-r(T-t)}N(d_2)

where:

  • Θcall\Theta_{\text{call}}: theta of the call option
  • SS: stock price
  • N′(d1)N'(d_1): standard normal PDF at d1d_1
  • σ\sigma: volatility
  • T−tT-t: time to expiration
  • rr: risk-free rate
  • KK: strike price
  • N(d2)N(d_2): cumulative normal CDF at d2d_2

The formula consists of two components, each with a distinct economic interpretation:

  • −SN′(d1)σ2T−t-\frac{S N'(d_1) \sigma}{2\sqrt{T-t}}: Represents the erosion of value due to the resolution of uncertainty (time decay at fixed volatility). As time passes, there is less time for favorable price movements to occur. This term is always negative, which reflects the fact that options lose optionality value over time.
  • −rKe−r(T−t)N(d2)- rKe^{-r(T-t)}N(d_2): Represents the financing contribution from deferring the strike payment. For positive rates, the call's deferral benefit shrinks as expiration approaches. This contribution vanishes at zero rates and reverses sign at negative rates. In put theta, the financing term has the opposite sign because puts involve receiving rather than paying the strike.

Theta is often negative for long option positions, but time decay is not universal. A sufficiently deep in-the-money European put can have positive theta when interest rates are positive, because receiving the strike sooner can outweigh the loss of optionality. Near expiration, at-the-money options can have especially large negative theta, making time decay a practical concern for their holders.

The Black-Scholes PDE links theta and gamma through Θ+12σ2S2Γ=r(V−SΔ)\Theta + \tfrac{1}{2}\sigma^2 S^2\Gamma = r(V-S\Delta), where VV is the option value. The right-hand side accounts for financing the delta-hedged position. Positive gamma therefore does not, by itself, force theta to be negative; the option value, delta, stock price, and interest rate also enter the relationship.

Vega: Sensitivity to Volatility

Vega (ν\nu or V\mathcal{V}) is the local derivative of option value with respect to volatility expressed as a decimal. Despite being called "vega," this Greek is not named after an actual Greek letter, but the convention is so established that the name persists. Vega is useful when a position expresses a view on volatility. Future realized volatility must be estimated, while implied volatility can be inferred from an option's quoted market price when that price lies within the model's admissible range.

ν=∂V∂σ=ST−t⋅N′(d1)\nu = \frac{\partial V}{\partial \sigma} = S \sqrt{T-t} \cdot N'(d_1)

where:

  • ν\nu: vega of the option
  • VV: option price
  • SS: stock price
  • T−tT-t: time to expiration
  • N′(d1)N'(d_1): standard normal PDF at d1d_1

A change in decimal volatility of 0.010.01, such as 20%20\% to 21%21\%, is one percentage point. Traders commonly quote vega as the raw derivative divided by 100100. Multiplying that quotation by a one-percentage-point change gives a first-order price estimate, not an exact finite-change gain.

Vega is the same for calls and puts and is positive in the stated pre-expiry domain: S>0S>0, T−t>0T-t>0 and N′(d1)>0N'(d_1)>0. Thus a small volatility increase raises both vanilla option prices with the other inputs fixed.

Vega is often concentrated near the money, but the location of its maximum depends on which inputs are held fixed. At fixed stock price, remaining maturity, interest rate and volatility, it peaks across strikes at d1=0d_1=0, or K=Sexp⁡((r+σ2/2)(T−t))K=S\exp((r+\sigma^2/2)(T-t)), not necessarily at K=SK=S. Increasing maturity raises the T−t\sqrt{T-t} factor but also changes N′(d1)N'(d_1), so vega need not increase over every maturity interval.

Trading volatility can involve exposure to changes in implied volatility or to differences between realized and implied volatility. The examples here isolate vega exposure, with the other inputs held fixed. For the non-dividend-paying European call and put here, with S,K>0S,K>0, positive volatility and time remaining before expiry, a long option has positive vega; holding the other inputs fixed, a rise in implied volatility raises its model value. A short option has the opposite exposure. Total profit also depends on stock moves, time decay, financing and other changes.

Rho: Sensitivity to Interest Rate

Rho (ρ\rho) is the local derivative of option price with respect to the interest rate expressed as a decimal. Its contribution to risk depends on the size of the rate change and the contract's maturity. Comparisons with other Greeks require specified input changes because the derivatives use different units.

ρcall=∂C∂r=K(T−t)e−r(T−t)N(d2)\rho_{\text{call}} = \frac{\partial C}{\partial r} = K(T-t)e^{-r(T-t)}N(d_2)

where:

  • ρcall\rho_{\text{call}}: rho of the call option
  • KK: strike price
  • T−tT-t: time to expiration
  • rr: risk-free rate
  • N(d2)N(d_2): cumulative normal CDF at d2d_2

Call rho is positive because higher interest rates reduce the present value of the strike payment while leaving the current stock price unchanged. A call holder benefits from this because they pay the strike in the future, and higher rates make that future payment cheaper in today's dollars.

ρput=∂P∂r=−K(T−t)e−r(T−t)N(−d2)\rho_{\text{put}} = \frac{\partial P}{\partial r} = -K(T-t)e^{-r(T-t)}N(-d_2)

where:

  • ρput\rho_{\text{put}}: rho of the put option
  • PP: put option price
  • KK: strike price
  • T−tT-t: time to expiration
  • rr: risk-free rate
  • N(−d2)N(-d_2): cumulative normal CDF at −d2-d_2

Put rho is negative because the put holder receives the strike at exercise, and a higher rate reduces its present value. Rho contains a remaining-maturity factor, but discounting and N(d2)N(d_2) also depend on maturity. Its magnitude need not grow proportionally or increase over every maturity interval.

Interest-rate sensitivity reflects the cost of carrying a hedged option position. Longer-dated equity options can be more sensitive to rate changes than near-term options, although the exact maturity dependence is not universal. Assess the exposure using a specified rate change and the position's rho.

Computing the Greeks

Let's implement and calculate the Greeks for our example option:

In[19]:
Code
from numbers import Real


def black_scholes_greeks(S, K, T, r, sigma, option_type="call"):
    """
    Calculate price and Greeks for a European option before expiration.

    S, K, T (remaining maturity in years) and sigma must be positive real
    finite scalars; r must be real and finite. All numeric inputs must be
    representable as finite Python floats. option_type is the scalar string
    'call' or 'put'.
    Returns annual and daily calendar-time theta, raw vega and vega per
    percentage point. Expired payoffs belong to the separate pricing functions.
    This educational float implementation rejects unusable or nonfinite
    intermediates/results with a numerical range ValueError; it is not an
    arbitrary-range pricer. Benign underflow to zero is allowed.
    """
    if not all(isinstance(value, Real) for value in (S, K, T, r, sigma)):
        raise ValueError("S, K, T, r and sigma must be real finite scalars")
    try:
        S, K, T, r, sigma = map(float, (S, K, T, r, sigma))
    except (OverflowError, TypeError, ValueError) as error:
        raise ValueError("S, K, T, r and sigma must be real finite scalars") from error
    if not all(np.isfinite(value) for value in (S, K, T, r, sigma)):
        raise ValueError("S, K, T, r and sigma must be real finite scalars")
    if S <= 0 or K <= 0 or T <= 0 or sigma <= 0:
        raise ValueError(
            "S, K, T and sigma must be strictly positive before expiration"
        )
    if not isinstance(option_type, str) or option_type not in ("call", "put"):
        raise ValueError("option_type must be 'call' or 'put'")

    try:
        with np.errstate(over="raise", divide="raise", invalid="raise", under="ignore"):
            sqrt_T = np.sqrt(T)
            d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * sqrt_T)
            d2 = d1 - sigma * sqrt_T

            # Standard normal PDF at d1
            n_d1 = norm.pdf(d1)

            # Common terms
            discount = np.exp(-r * T)
            if not all(np.isfinite(value) for value in (d1, d2, discount)):
                raise ValueError(
                    "Inputs exceed the numerical range of this implementation"
                )

            if option_type == "call":
                price = S * norm.cdf(d1) - K * discount * norm.cdf(d2)
                delta = norm.cdf(d1)
                theta = -S * n_d1 * sigma / (2 * sqrt_T) - r * K * discount * norm.cdf(
                    d2
                )
                rho = K * T * discount * norm.cdf(d2)
            else:
                price = K * discount * norm.cdf(-d2) - S * norm.cdf(-d1)
                delta = norm.cdf(d1) - 1  # Equivalent to -N(-d1)
                theta = -S * n_d1 * sigma / (2 * sqrt_T) + r * K * discount * norm.cdf(
                    -d2
                )
                rho = -K * T * discount * norm.cdf(-d2)

            # Gamma and Vega are the same for calls and puts
            gamma_denominator = S * sigma * sqrt_T
            if not np.isfinite(gamma_denominator) or gamma_denominator <= 0:
                raise ValueError(
                    "Inputs exceed the numerical range of this implementation"
                )
            gamma = n_d1 / gamma_denominator
            vega = S * sqrt_T * n_d1

            # Convert theta to daily and vega to per one percentage point of volatility
            theta_daily = theta / 365
            vega_percent = vega / 100

            greeks = {
                "price": price,
                "delta": delta,
                "gamma": gamma,
                "theta": theta,
                "theta_daily": theta_daily,
                "vega": vega,
                "vega_pct": vega_percent,
                "rho": rho,
            }
            if not all(np.isfinite(value) for value in greeks.values()):
                raise ValueError(
                    "Inputs exceed the numerical range of this implementation"
                )
    except (OverflowError, FloatingPointError, ZeroDivisionError) as error:
        raise ValueError(
            "Inputs exceed the numerical range of this implementation"
        ) from error
    return greeks


call_greeks = black_scholes_greeks(S, K, T, r, sigma, "call")
put_greeks = black_scholes_greeks(S, K, T, r, sigma, "put")
Out[20]:
Console
Greeks for European Options
=======================================================
Greek        Call                 Put                 
-------------------------------------------------------
Price        $4.5817              $6.9892             
Delta        0.4612               -0.5388             
Gamma        0.0281               0.0281              
Theta (ann)  -7.6919              -2.5715             
Theta (day)  -0.0211              -0.0070             
Vega (/1pp)  0.2808               0.2808              
Rho          20.7672              -30.4366

Let's interpret these values:

Out[21]:
Console

First-order estimates from the Greeks (other inputs held fixed):
-------------------------------------------------------
• If the stock rises $1, the call gains approximately $0.46
  and the put loses approximately $0.54
• Over one day, the call loses approximately $0.0211
• If volatility rises one percentage point (20% to 21%), the call gains approximately $0.2808
• Gamma of 0.0281 means delta changes ~0.03
  for each $1 move in the stock

Visualizing Delta Across Strikes

In[22]:
Code
# Calculate delta across strikes
strike_range = np.linspace(70, 130, 100)
call_deltas = []
put_deltas = []

for k in strike_range:
    cg = black_scholes_greeks(S, k, T, r, sigma, "call")
    pg = black_scholes_greeks(S, k, T, r, sigma, "put")
    call_deltas.append(cg["delta"])
    put_deltas.append(pg["delta"])
Out[23]:
Visualization
Line chart showing call delta decreasing from near 1 toward 0 and put delta from near 0 toward -1 as strike increases from 70 to 130.
Call and put delta as a function of strike price. Deep in-the-money calls have delta near 1, while deep out-of-the-money calls have delta near 0. Put delta follows a parallel pattern shifted by -1.

The plot illustrates how delta varies across different strike prices. For deep in-the-money calls (low strikes), delta approaches 1, indicating the option moves tick-for-tick with the stock. For deep out-of-the-money calls (high strikes), delta approaches 0. This plot varies strike while keeping the stock price fixed. Gamma instead measures how delta changes with the stock price, holding strike and the other inputs fixed.

Out[24]:
Visualization
Line chart showing gamma versus strike price for four remaining maturities: about 1 week, 3 months, 6 months, and 1 year. The shortest-maturity curve has a sharp peak near the spot price of 100, while longer-dated options have flatter, wider profiles.
Gamma across strike prices for options with different times to expiration. Near-expiration options exhibit dramatically higher gamma near the strike, which reflects the knife-edge nature of exercise decisions as expiration approaches.
Out[25]:
Visualization
Heatmap of gamma sampled at stock prices from 80 to 120 and remaining maturities from 0.24 to 12 months. The strongest values occur near the 105-dollar strike at short maturities, with lower values farther from that region.
Gamma sensitivity across stock price and time to expiration. The concentration of high gamma values (dark red) for at-the-money options near expiration creates the 'gamma mountain,' indicating regions of highest hedging instability.
Out[26]:
Visualization
Line chart of daily theta in dollars versus days to expiration from 0 to 365. Theta is most negative near zero days and approaches zero for longer-dated options, with an annotation highlighting the acceleration near expiration.
Theta (daily time decay) for at-the-money options as expiration approaches. The decay accelerates dramatically in the final weeks, illustrating why short-dated options are often described as 'melting ice cubes.

The next chapter covers the Greeks in detail, including their use in hedging strategies, portfolio risk management, and the dynamics of delta-hedged positions.