← Back to blog

Garman–Kohlhagen Model: Formula, Greeks, and Python

August 16, 2026
Garman–Kohlhagen Model: Formula, Greeks, and Python

The Garman–Kohlhagen model is Black–Scholes adapted for European FX options, with one structural change: the foreign interest rate enters as a continuous dividend yield on the foreign currency. That substitution produces closed-form call and put prices that any quant can compute in seconds.

Call price: C = S · e^(−rf·T) · N(d1) − K · e^(−rd·T) · N(d2)

Put price: P = K · e^(−rd·T) · N(−d2) − S · e^(−rf·T) · N(−d1)

Where:

d1 = [ln(S/K) + (rd − rf + σ²/2) · T] / (σ · √T)

d2 = d1 − σ · √T

Inputs at a glance:

  • S — spot rate, quoted as domestic currency per unit of foreign currency
  • K — strike rate, same quoting convention as S
  • rd — domestic risk-free rate, continuously compounded
  • rf — foreign risk-free rate, continuously compounded
  • σ — annualized implied volatility of the spot rate
  • T — time to expiry in years
  • N(·) — standard normal cumulative distribution function

Key Takeaways

The Garman–Kohlhagen model prices European FX options in closed form by treating the foreign risk-free rate as a continuous dividend yield, producing formulas that are directly implementable and verifiable through put-call parity.

PointDetails
Core substitutionReplace Black–Scholes dividend yield with rf; domestic rate discounts the strike, foreign rate discounts the spot.
European scope onlyGK does not price American, barrier, or path-dependent FX options; use tree or PDE methods for those.
Implement and testRun the EUR/USD worked example (call ≈ 0.0112 USD/EUR) as a unit test before connecting to live data.
Greeks for hedgingDelta gives the forward hedge ratio; Psi (foreign-rate sensitivity) is as large as Rho and should not be ignored.
Smile corrections neededUse Vanna-Volga or SABR adjustments for out-of-the-money strikes; GK with flat vol misprices the wings.

Table of Contents

What does the Garman–Kohlhagen model actually price?

Scope is narrow by design. The model prices European-style FX options only: the holder can exercise at expiry, not before. The premium is expressed in domestic currency per unit of foreign currency, which is the natural quoting convention for most currency pairs.

The economic intuition behind the foreign-rate treatment is clean. Holding foreign currency earns the foreign risk-free rate continuously, just as holding a dividend-paying stock earns a continuous yield. Under the domestic risk-neutral measure, that yield offsets part of the spot's expected growth, so the original 1983 paper by Mark Garman and Steven Kohlhagen frames rf exactly like a continuous dividend yield. The result: every Black–Scholes result carries over once you replace the dividend yield q with rf.

Covered interest parity ties the forward rate to spot through F = S · e^((rd − rf) · T). That relationship is embedded in d1 and d2 — when you substitute the forward, the formula collapses to a discounted expected payoff under the forward measure, which is why GK and forward-based pricing are fully consistent.

Pro Tip: Always confirm the quoting convention before feeding S and K into the model. EUR/USD quoted as 1.08 means one euro costs 1.08 US dollars — so if you are pricing from a USD-domestic perspective, S = 1.08 and K is the USD strike per euro. Swapping the convention flips call and put roles and produces nonsense prices.


How are the formulas and notation conventions defined?

The formulas below use continuous compounding throughout. No annual-to-periodic conversion is needed; just express rd and rf as continuously compounded rates and T as a fraction of a year (e.g., 90 days = 90/365).

Call: C = S · e^(−rf·T) · N(d1) − K · e^(−rd·T) · N(d2)

Put: P = K · e^(−rd·T) · N(−d2) − S · e^(−rf·T) · N(−d1)

The MetricGate implementation guide states the forward explicitly as F = S · e^((rd − rf) · T), which lets you rewrite d1 as:

d1 = [ln(F/K) + (σ²/2) · T] / (σ · √T)

That form is numerically cleaner because it separates the rate-differential effect from the volatility term.

SymbolDefinitionUnits / Convention
SSpot FX rateDomestic per unit foreign, e.g., USD per EUR
KStrike rateSame convention as S
rdDomestic risk-free rateContinuously compounded, annualized
rfForeign risk-free rateContinuously compounded, annualized
σVolatility of spot returnsAnnualized, log-normal
TTime to expiryYears (actual/365 or actual/360 per market)
N(·)Standard normal CDFEvaluated at d1 or d2
FForward FX rateS · e^((rd − rf) · T)

The domestic perspective is USD; the premium comes out in USD per EUR.


What assumptions does the model make, and where does it break?

The Garman–Kohlhagen model inherits every Black–Scholes assumption and adds FX-specific constraints on top.

Standard assumptions:

  • Spot rate follows geometric Brownian motion (lognormal returns)
  • Volatility is constant over the option's life
  • rd and rf are constant and continuously compounded
  • Markets are frictionless: no transaction costs, taxes, or restrictions on short selling
  • European exercise only
  • No-arbitrage holds continuously

FX-specific caveats that break the model in practice:

  • Volatility smile and skew. Real FX vol surfaces are not flat. Out-of-the-money puts on USD/JPY trade at materially higher implied vols than ATM options, which GK cannot capture with a single σ.
  • Interest-rate path dependency. For longer-dated options, stochastic rates matter. Academic work comparing GK to models with stochastic interest rates shows that the constant-rate assumption can distort prices when rate volatility is significant.
  • Central-bank interventions and jumps. Spot rates can gap on policy announcements. GK has no jump component.
  • Near-zero or negative rf. When rf approaches zero or goes negative (as EUR rates did for years), the e^(−rf·T) discount factor approaches 1 and d1 shifts. The formula remains mathematically valid, but implied-vol inversion can become numerically unstable near zero.
  • American-style options, barriers, and path-dependent payoffs require entirely different methods: binomial trees, finite-difference PDE solvers, or Monte Carlo.

Practical warning: if you are pricing a knock-in barrier or an American-style option and reach for GK, you will get the wrong answer. The model's European-only scope is not a footnote; it is a hard boundary.


What are the Greeks under Garman–Kohlhagen?

Greeks under GK follow directly from differentiating the pricing formulas. The FX context adds one rate sensitivity that equity options lack: Psi, the sensitivity to the foreign rate.

Primary Greeks (call):

  • Delta: ∂C/∂S = e^(−rf·T) · N(d1)
  • Gamma: ∂²C/∂S² = e^(−rf·T) · n(d1) / (S · σ · √T)
  • Vega: ∂C/∂σ = S · e^(−rf·T) · n(d1) · √T
  • Theta: ∂C/∂t = −[S · e^(−rf·T) · n(d1) · σ / (2√T)] − rd · K · e^(−rd·T) · N(d2) + rf · S · e^(−rf·T) · N(d1)
  • Rho (domestic): ∂C/∂rd = K · T · e^(−rd·T) · N(d2)
  • Psi (foreign): ∂C/∂rf = −S · T · e^(−rf·T) · N(d1)

For puts, apply put-call parity or differentiate the put formula directly: Delta(put) = e^(−rf·T) · [N(d1) − 1] = −e^(−rf·T) · N(−d1).

Hedging interpretations and sanity checks:

  1. Delta gives the hedge ratio in units of foreign currency. A delta of 0.52 on a EUR call means you hold 0.52 EUR per option to be delta-neutral in USD terms.
  2. Gamma tells you how fast delta moves; high gamma near expiry means frequent rebalancing.
  3. Vega is your exposure to a 1-percentage-point move in implied vol — critical for vol-surface risk.
  4. Rho and Psi map to cash-rate positions and forward hedges respectively. Psi is often larger than Rho for long-dated options.
  5. Put-call parity diagnostic: C − P = S · e^(−rf·T) − K · e^(−rd·T). If your implementation violates this by more than a rounding error, something is wrong with the discount factors or the N(·) evaluation.

Note on delta conventions: FX desks often quote delta as a percentage of the foreign notional (spot delta) or include the discount factor (forward delta). Confirm which convention your risk system expects before wiring Greeks into a hedge.


How do you implement Garman–Kohlhagen without common pitfalls?

Step-by-step implementation checklist:

  1. Normalize all inputs to continuous compounding. Convert money-market rates (simple) or swap rates (semi-annual) before passing them in.
  2. Confirm the spot quote direction. Domestic/foreign must be consistent between S and K.
  3. Compute d1 and d2 using the forward form (ln(F/K) + σ²T/2) / (σ√T) to avoid catastrophic cancellation when S ≈ K.
  4. Evaluate N(·) using a well-tested library function. Python's scipy.stats.norm.cdf is reliable; avoid hand-rolled polynomial approximations for tail values beyond ±4σ.
  5. Apply the discount factors e^(−rd·T) and e^(−rf·T) separately — never net them before multiplying.
  6. For implied-vol inversion, use Brent's method bracketed between 0.001 and 5.0 (annualized). Newton–Raphson converges faster but can diverge for deep in/out-of-the-money options with near-zero vega.

QuantLib notes. The QuantLib.FxBlackVolatilitySurface and QuantLib.GarmanKohlagenProcess classes handle the dual-rate structure natively. The most common mistake is passing a flat yield curve built from a simple rate without specifying the correct day-count convention (Actual/360 vs. Actual/365). Mismatched day counts produce a systematic pricing error that grows with tenor.

Python/SciPy sketch (structure, not full production code):

from scipy.stats import norm
import math

def gk_call(S, K, rd, rf, sigma, T):
    F = S * math.exp((rd - rf) * T)
    d1 = (math.log(F / K) + 0.5 * sigma**2 * T) / (sigma * math.sqrt(T))
    d2 = d1 - sigma * math.sqrt(T)
    return math.exp(-rd * T) * (F * norm.cdf(d1) - K * norm.cdf(d2))

Pro Tip: When inverting to implied vol, always check that the market premium exceeds the intrinsic value (max(S·e^(−rf·T) − K·e^(−rd·T), 0) for a call) before running the root-finder. Feeding a sub-intrinsic premium produces no real solution and will cause your solver to return a boundary value silently.


Worked numeric example: pricing a EUR/USD call

Inputs:

ParameterValue
S (EUR/USD spot)1.0850
K (strike)1.1000
rd (USD, continuous)0.0511
rf (EUR, continuous)0.0368
σ (implied vol)0.075
T (3 months)0.25

Step-by-step calculation:

  1. Forward rate: F = 1.0850 · e^((0.0511 − 0.0368) · 0.25) = 1.0850 · e^(0.003575) ≈ 1.0889
  2. d1 = [ln(1.0889/1.1000) + (0.075²/2) · 0.25] / (0.075 · √0.25) = [−0.01018 + 0.000703] / 0.0375 ≈ −0.2533
  3. d2 = −0.2533 − 0.0375 ≈ −0.2908
  4. N(d1) = N(−0.2533) ≈ 0.4001; N(d2) = N(−0.2908) ≈ 0.3856
  5. Discount factors: e^(−0.0511·0.25) ≈ 0.9873; e^(−0.0368·0.25) ≈ 0.9908
  6. Call = 1.0850 · 0.9908 · 0.4001 − 1.1000 · 0.9873 · 0.3856 ≈ 0.4300 − 0.4188 ≈ 0.0112 USD per EUR
Intermediate valueResult
Forward F1.0889
d1−0.2533
d2−0.2908
N(d1)0.4001
N(d2)0.3856
Call premium0.0112 USD/EUR

Sanity check: Put-call parity gives P = C − S · e^(−rf·T) + K · e^(−rd·T) = 0.0112 − 1.0750 + 1.0864 ≈ 0.0226 USD/EUR. Verify your put formula returns the same value.

Pro Tip: Run this exact example as a unit test when you first implement GK. If your call price differs from 0.0112 by more than 0.0002, recheck your day-count convention and whether you are using continuously compounded rates.


How do practitioners use Garman–Kohlhagen in live markets?

GK is the workhorse baseline for FX option desks. Traders quote in implied volatility, not premium, precisely because GK provides a clean bijection between the two given a fixed set of inputs. That makes vol the natural unit for communication and risk management.

Implied vol surface construction:

  • Collect market premiums for a grid of tenors (1W, 1M, 3M, 6M, 1Y, 2Y) and strikes (or delta levels: 10Δ, 25Δ, ATM, 25Δ, 10Δ).
  • Invert each premium to implied vol using GK.
  • Interpolate across the surface using a method consistent with your smile model (cubic spline, SABR, or Vanna-Volga).

ATM and delta conventions matter. FX markets define ATM as the delta-neutral straddle (DNS), not the at-the-money-forward. The 25Δ risk reversal and butterfly quotes encode skew and kurtosis. Converting between delta and strike requires iterating GK itself, since delta depends on d1 which depends on the strike.

Smile corrections. GK with a flat vol misprices out-of-the-money options. The standard market fix is Vanna-Volga, which adds corrections proportional to Vanna (∂²C/∂S∂σ) and Volga (∂²C/∂σ²). For longer-dated options or currencies with strong rate dynamics, SABR or local-volatility models are more appropriate. The comparison of GK to stochastic-rate models confirms that rate volatility becomes a meaningful pricing factor for maturities beyond one year.

Pro Tip: When feeding GK Greeks into a VaR system, use forward delta (delta · e^(−rf·T)) rather than spot delta if your VaR engine runs on forward P&L. Mixing conventions produces a systematic understatement of delta risk that compounds across a portfolio.

Integration with risk systems:

  • GK call/put prices feed mark-to-market P&L and position valuation.
  • Delta and Gamma feed the delta-hedging workflow and VaR-based hedging calculations.
  • Vega feeds vol-surface risk reports.
  • Rho and Psi feed interest-rate sensitivity reports, which matter for cross-currency basis risk.

How do GK outputs translate into corporate hedging decisions?

For a CFO or treasurer, the model's output is not an academic exercise. It is the input to a hedge cost-benefit decision.

Practical workflow:

  • Price candidate instruments. Use GK to price vanilla call or put options that bracket your expected cashflow exposure. Compare the premium to the cost of a forward hedge.
  • Compute hedge ratios. Delta gives the notional of spot or forward needed to delta-hedge the option position. For a EUR receivable hedged with a EUR put, a delta of −0.45 means you need a forward sale of 45% of the notional to neutralize first-order spot risk.
  • Estimate cost vs. protection. The option premium is the maximum loss on the hedge. A forward locks in a rate but eliminates upside. GK makes that trade-off explicit in dollar terms.
  • Simulate P&L and VaR. Feed GK prices and Greeks into your FX position valuation system to run scenario analysis and compute VaR across the hedged portfolio.
  • Select and execute. Match option tenor to cashflow timing. A 90-day EUR receivable pairs with a 3-month EUR put, not a 6-month one — the mismatch introduces basis risk that GK's Theta will quantify.

Pro Tip: Accounting rules (IFRS 9 or ASC 815) affect which hedge structures qualify for hedge accounting. A vanilla European option priced with GK often qualifies; an exotic or barrier structure may not. Confirm with your auditor before structuring the hedge, not after.

For corporates integrating GK outputs into a systematic hedging program, VaR-based hedging workflows and currency exchange accounting guidance provide the operational framework that connects model outputs to executed positions.


What most practitioners get wrong about Garman–Kohlhagen

The standard advice is to "use GK as your baseline and layer smile corrections on top." That is correct as far as it goes, but it understates how much the baseline matters.

Most implementation errors are not in the smile correction. They are in the baseline: wrong day-count convention, simple rates passed as continuous, or a spot quote direction that is inverted. A Vanna-Volga correction applied to a mispriced GK baseline produces a precisely wrong answer. The worked example in this article exists for exactly that reason: run it as a unit test before you touch the vol surface.

The second thing practitioners underestimate is the foreign-rate sensitivity, Psi. On a 1-year EUR/USD option, a 50-basis-point move in EUR rates shifts the option price by roughly the same order as a 50-basis-point move in USD rates. Yet most corporate risk reports show Rho and ignore Psi entirely. That gap matters most for companies with long-dated FX exposures, where rate differentials compound significantly.

GK is also not a model you graduate out of. Even desks running full stochastic-vol models use GK for fast Greeks, for communicating prices in implied-vol terms, and for sanity-checking exotic pricer outputs. Understanding it at the formula level, not just as a black box, is what separates a quant who can debug a pricing discrepancy from one who cannot.


Sources

The essential sources for implementing and citing the Garman–Kohlhagen model:


FAQ

What is the Garman–Kohlhagen model used for?

It prices European-style FX options in closed form by treating the foreign interest rate as a continuous dividend yield on the foreign currency, producing call and put premiums in domestic currency per unit of foreign currency.

How does Garman–Kohlhagen differ from Black–Scholes?

Black–Scholes uses a single risk-free rate; Garman–Kohlhagen uses two: the domestic rate discounts the strike and the foreign rate discounts the spot, reflecting the fact that holding foreign currency earns a return.

Can Garman–Kohlhagen handle negative interest rates?

The formula remains mathematically valid with negative rf, but implied-vol inversion can become numerically unstable near zero. Use a robust root-finder (Brent's method) and check that the market premium exceeds intrinsic value before inverting.

What is the forward rate in the Garman–Kohlhagen framework?

The forward FX rate is F = S · e^((rd − rf) · T), derived from covered interest parity. Substituting F into d1 gives a cleaner numerical form and makes the connection to forward-measure pricing explicit.

When should you use a different model instead of Garman–Kohlhagen?

Use local-volatility, SABR, or stochastic-vol models when pricing options with significant smile sensitivity, maturities beyond one year where rate volatility matters, or any non-European payoff structure such as barriers or American exercise.