σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademySkills
Ctrl K
AO
+1.2k Learners
LoginJoin ↗
Skills
AO
+1.2k Learners
Login
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python skill›Module 4 · Fixed income & options pricing›Topic 4.6·~40 minIntermediate

Option payoffs

Skill positionModule 4 of 11 · Topic 6 of 16
4.6 Option payoffs
—Lab score— / 100Total XP—Streak—

A right, not an obligation

An option gives its holder the right, but not the obligation, to trade an asset at a fixed price (the strike) on or before a date (the expiry). A call is the right to buy, a put the right to sell. At expiry the holder only uses the right when it pays. A call struck at 100 with the stock at 110 lets you buy at 100 what is worth 110: a payoff of 10. With the stock at 90 you simply do nothing and the payoff is 0, never negative. That one-sidedness is what makes options valuable.

call payoff = max(S - K, 0) put payoff = max(K - S, 0)
import numpy as np

spot = np.array([80, 90, 100, 110, 120.0])      # possible prices of the stock at expiry
strike = 100

call = np.maximum(spot - strike, 0)              # np.maximum works element by element: no loop, no if
put = np.maximum(strike - spot, 0)
print(call.tolist())     # [0.0, 0.0, 0.0, 10.0, 20.0]
print(put.tolist())      # [20.0, 10.0, 0.0, 0.0, 0.0]

Profit is payoff minus the premium

The option has a price today, the premium, so what you earn is the payoff minus what you paid. A call bought for 6 loses 6 whenever the stock ends below the strike and breaks even at strike + premium = 106. Combining options builds other shapes. A long straddle (call plus put at the same strike) profits from a big move in either direction and loses both premiums if the stock stays put. A bull call spread (long a call at 100, short a call at 110) costs less but caps the gain at the strike difference: you give up the upside above 110 to reduce the cost.

call_pnl = call - 6                                        # bought for a premium of 6
print(call_pnl.tolist())                                   # [-6.0, -6.0, -6.0, 4.0, 14.0]   break-even at 106

straddle = call + put - (4.0 + 3.5)                        # a call (4.0) and a put (3.5) at the same strike
print(straddle.tolist())                                   # [12.5, 2.5, -7.5, 2.5, 12.5]   wins on a move up or down

spread = np.maximum(spot - 100, 0) - np.maximum(spot - 110, 0) - (6.0 - 2.0)   # long the 100 call, short the 110 call
print(spread.tolist())                                     # [-4.0, -4.0, -4.0, 6.0, 6.0]   loss and gain are both capped
short_call = 6 - call                 # the seller of the call keeps the premium and pays the payoff
print(short_call.tolist())             # [6.0, 6.0, 6.0, -4.0, -14.0]   the exact mirror of the buyer's loss and gain
print(float(np.maximum(112 - 100, 0)))      # 12.0   a single price works as well as an array
Payoffs are not pricesA payoff diagram shows the value at expiry only. The price today, before expiry, is higher than the payoff because the stock may still move in your favour: that extra is the time value, and the next topics price it. The payoff is also written from the holder's point of view; the seller of the option has exactly the opposite profit and loss.
  • Call payoff max(S - K, 0), put payoff max(K - S, 0): np.maximum(..., 0) does it on a whole array.
  • Profit = payoff - premium; a straddle (call + put) bets on a large move, a bull call spread caps both cost and gain.
  • Payoffs are values at expiry; the price today is higher by the time value, which the next topics price.

Next up: put–call parity, the exact link between the price of a call and the price of a put.

Lab · what's graded

  • Pay out the right to buy with call_payoff25 pts
  • Pay out the right to sell with put_payoff25 pts
  • Bet on a big move either way with long_straddle_pnl25 pts
  • Cap the cost and the gain with bull_call_spread_pnl25 pts
Explorer · lab-71-1
▾ lab-71-1
…
bash · in-browser
learner@quantcraft:~/lab-71-1$
Python not loaded yetPythonLn 1, Col 1Spaces: 4UTF-8

Reset this topic?

Everything in lab-71-1 goes back to the starter files and the terminal is cleared. Your current solution will be lost — this can't be undone.

Will be reset
  • main.py → starter code
  • Terminal history and test output
  • Unsubmitted changes
Will be kept
  • Best lab score
  • Your XP and streak
  • Lecture progress and notes

Log in to run your code.

Every lecture is free to read. Create an account or log in to run code, run tests and submit this lab.

  • In-browser IDE with a bash terminal — nothing to install
  • Instant grading, XP and your place on the skill
Create an accountLog in
OR
Continue with GitHub